📄 winpciconfiglib.c
字号:
#include <ntddk.h>
#include "PeliCanDef.h"
#include "winpciConfigLib.h"
int pciFindDevice(int vendorId, int deviceId, int index, int * pBusNo, int * pDeviceNo, int * pFuncNo)
{
int bus, dev, func;
int venId,DevId;
DWORD dwAddr;
DWORD dwData;
debug_printf("pciFindDevice:%2.2X\t%2.2X\t", vendorId, deviceId);
/* 枚举PCI设备 */
for(bus = 0; bus <= PDI_BUS_MAX; ++bus)
{
for(dev = 0; dev <= PDI_DEVICE_MAX; ++dev)
{
for(func = 0; func <= PDI_FUNCTION_MAX; ++func)
{
/* 计算地址 */
dwAddr = MK_PCICFGADDR(bus, dev, func);
/* 获取厂商ID */
_outpd(PCI_CONFIG_ADDRESS, dwAddr);
dwData = _inpd(PCI_CONFIG_DATA);
/* 判断设备是否存在。FFFFh是非法厂商ID */
if ((WORD)dwData != 0xFFFF)
{
venId = (WORD)(dwData&PCI_VENID_MASK);
DevId = (WORD)dwData>>16;
debug_printf("venId, DevId:%2.2X\t%2.2X\t", venId, DevId);
if((venId == vendorId)&&(DevId == deviceId))
{
if(index > 0) //index表示了要找的是第几个设备,如果index=0表示要找的是该设备,否则将index--
{
index--;
continue;
}
/* bus/dev/func */
*pBusNo = bus;
*pDeviceNo = dev;
*pFuncNo = func;
// DbgPrint("bus,dev,func:%2.2X\t%2.2X\t%1X\t", bus, dev, func);
return OK;
}
}
}
}
}
return ERROR;
}
int pciConfigInLong(int busNo, int deviceNo, int funcNo, int address,UINT32 * pData)
{
DWORD dwAddr;
DWORD dwData;
debug_printf("pciConfigInLong::bus,dev,func:%d\t%d\t%d\t", busNo, deviceNo, funcNo);
/* 计算地址 */
dwAddr = MK_PCICFGADDR(busNo, deviceNo, funcNo);
dwAddr |= address;
_outpd(PCI_CONFIG_ADDRESS, dwAddr);
dwData = _inpd(PCI_CONFIG_DATA);
*pData = dwData;
return OK;
}
int pciConfigInByte(int busNo, int deviceNo, int funcNo, int address,UINT8 * pData)
{
DWORD dwAddr;
BYTE bData;
debug_printf("pciConfigInByte::bus,dev,func:%d\t%d\t%d\t", busNo, deviceNo, funcNo);
/* 计算地址 */
dwAddr = MK_PCICFGADDR(busNo, deviceNo, funcNo);
dwAddr |= address;
_outpd(PCI_CONFIG_ADDRESS, dwAddr);
bData = (BYTE)_inp(PCI_CONFIG_DATA);
*pData = bData;
return OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -