⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winpciconfiglib.c

📁 一个关于PCI CAN开发板的windows下的驱动程序,用DDK做的,希望对做PCI CAN板的朋友有用
💻 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 + -