阅读:2372回复:6
xp下如何枚举PCI设备??
看见98/me ddk中有PCIReadConfig函数,
但xp中对应的应该使用什么函数呢? btw: 原来我想在驱动中直接对0xCF8和0xCFC进行IO操作, 然后枚举PCI配置空间信息,但是发现对于寄存器地址>=4的空间, 这个方法都无法正确访问,所以只好寻求ddk中封装好了的函数 莫非直接io操作是否有什么限制? |
|
沙发#
发布于:2004-12-17 11:13
没有人知道吗?
查找所有pci设备可否借用ddk中的devcon例子呢? |
|
板凳#
发布于:2004-12-18 19:42
没有人知道吗? 为什么我采用直接IO操作,地址为0-3的寄存器内容可以正确读取,但高端地址寄存器都读不正确呢? |
|
地板#
发布于:2004-12-19 10:10
你怎么读的?
我试试都没有问题啊.... pci config space的读取方式有两种 你用的哪种? 代码发上来看看? |
|
地下室#
发布于:2004-12-19 13:45
你怎么读的? 先向0xCF8端口送32bit地址,其中地址构成为 高16位是:最高位是1,剩下的15位是bus值 低16位是:高8位由5位dev和3位func组成,低8位是register的地址 再从0xCFC端口读寄存器值 |
|
5楼#
发布于:2004-12-20 04:08
不对的说....
在我的记忆里面 cf8放的地址是dword对齐的... 然后你读取的时候 并不是读cfc的地址... 得有个dword的偏移计算在里面 就是说如果你要读第11个byte 那么cf8里面放 11 & 0xfc 读的port是cfc + 11 & 3 如下 int pcibios_read_config_byte (unsigned char bus, unsigned char dev_fn, unsigned char regnum, unsigned char *val) { outl(0x80000000 | (bus<<16) | (dev_fn << 8) | (regnum & 0xfc), PCI_CONFIG_ADDR); *val = inb(PCI_CONFIG_DATA + (regnum & 3)); return 0; } int pcibios_read_config_word (unsigned char bus, unsigned char dev_fn, unsigned char regnum, unsigned short *val) { outl(0x80000000 | (bus<<16) | (dev_fn << 8) | (regnum & 0xfc), PCI_CONFIG_ADDR); *val = inw(PCI_CONFIG_DATA + (regnum & 2)); return 0; } int pcibios_read_config_dword (unsigned char bus, unsigned char dev_fn, unsigned char regnum, unsigned int *val) { outl(0x80000000 | (bus<<16) | (dev_fn << 8) | (regnum & 0xfc), PCI_CONFIG_ADDR); *val = inl(PCI_CONFIG_DATA); return 0; } 这是type0的访问方式 还有type1的 还是读读spec吧 |
|
6楼#
发布于:2004-12-20 10:53
问题已经解决,一个小bug害死人啊!
&写成&&了 :( 多谢啊 :) [编辑 - 12/20/04 by bigbigboy] |
|