bigbigboy
驱动牛犊
驱动牛犊
  • 注册日期2003-08-24
  • 最后登录2008-08-06
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2372回复:6

xp下如何枚举PCI设备??

楼主#
更多 发布于:2004-12-16 22:05
看见98/me ddk中有PCIReadConfig函数,
但xp中对应的应该使用什么函数呢?

btw:
原来我想在驱动中直接对0xCF8和0xCFC进行IO操作,
然后枚举PCI配置空间信息,但是发现对于寄存器地址>=4的空间,
这个方法都无法正确访问,所以只好寻求ddk中封装好了的函数
莫非直接io操作是否有什么限制?
bigbigboy
驱动牛犊
驱动牛犊
  • 注册日期2003-08-24
  • 最后登录2008-08-06
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-17 11:13
没有人知道吗?
查找所有pci设备可否借用ddk中的devcon例子呢?
bigbigboy
驱动牛犊
驱动牛犊
  • 注册日期2003-08-24
  • 最后登录2008-08-06
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-18 19:42
没有人知道吗?
查找所有pci设备可否借用ddk中的devcon例子呢?  

为什么我采用直接IO操作,地址为0-3的寄存器内容可以正确读取,但高端地址寄存器都读不正确呢?
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
地板#
发布于:2004-12-19 10:10
你怎么读的?

我试试都没有问题啊....

pci config space的读取方式有两种
你用的哪种?

代码发上来看看?
bigbigboy
驱动牛犊
驱动牛犊
  • 注册日期2003-08-24
  • 最后登录2008-08-06
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-19 13:45
你怎么读的?

我试试都没有问题啊....

pci config space的读取方式有两种
你用的哪种?

代码发上来看看?

先向0xCF8端口送32bit地址,其中地址构成为
高16位是:最高位是1,剩下的15位是bus值
低16位是:高8位由5位dev和3位func组成,低8位是register的地址
再从0xCFC端口读寄存器值
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
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吧
bigbigboy
驱动牛犊
驱动牛犊
  • 注册日期2003-08-24
  • 最后登录2008-08-06
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-20 10:53
问题已经解决,一个小bug害死人啊!
&写成&&了 :(
多谢啊 :)

[编辑 -  12/20/04 by  bigbigboy]
游客

返回顶部