我需要扫描我的 PCI 总线并从特定供应商处获取特定设备的信息。我的目标是找到 AMD 显卡的 PCI 区域大小,以便将该卡的 PCI 内存映射到用户空间,以便进行 i2c 传输并查看来自各种传感器的信息。
为了扫描 PCI 总线,我在一年前下载并编译了适用于 Windows x64 的 pciutils 3.1.7。据说它使用 DirectIO。
这是我的代码。
int scan_pci_bus()
{
struct pci_access *pci;
struct pci_dev *dev;
int i;
pci = pci_alloc();
pci_init(pci);
pci_scan_bus(pci);
for(dev = pci->devices; dev; dev = dev->next)
{
pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_CLASS | PCI_FILL_IRQ | PCI_FILL_BASES | PCI_FILL_ROM_BASE | PCI_FILL_SIZES | PCI_FILL_PHYS_SLOT);
if(dev->vendor_id == 0x1002 && dev->device_id == 0x6899)
{
//Vendor is AMD, Device ID is a AMD HD5850 GPU
for(i = 0; i < 6; i++)
{
printf("Region Size %d %x ID %x\n", dev->size[i], dev->base_addr[i], dev->device_id);
}
}
}
pci_cleanup(pci);
return 0;
}
正如您在我的 printf 行中看到的那样,我尝试打印一些数据,我正在成功打印device_id
,base_addr
但是size
应该包含此设备的 PCI 区域大小始终为 0。我预计,循环中至少有一个循环显示大小 > 0。
我的代码基于使用相同代码的 Linux 应用程序,尽管它使用 Linux 附带的 pci.h 标头(pciutils 显然具有相同的 API)。显然,Windows(在我的情况下是 Windows 7 x64)没有显示此信息,或者至少没有暴露给 PCIUtils。
你建议我如何获得这些信息?如果有 Windows 的 pciutils 的替代品并提供此信息,我很高兴获得它们的链接。
编辑:我仍然没有找到解决方案。如果我的问题有任何解决方案并且也适用于 32 位 Windows,我们将不胜感激。