我需要扫描我的PCI总线,并获取来自特定供应商特定设备的信息。
我的目标是找到AMD显卡的PCI区域大小,以便将该卡的PCI存储器映射到用户空间,以进行i2c传输并查看各种传感器的信息。
为了扫描PCI总线,我大约一年前下载并编译了适用于Windows x64的pciutils 3.1.7。据说它使用DirectIO。
这是我的代码。
正如您在我的 printf 行中看到的,我试图打印一些数据,我成功地打印了 device_id 和 base_addr,但是应该包含此设备的 PCI 区域大小的 size 总是为 0。我期望循环中的至少一个周期显示一个 size > 0。
我的代码基于一个 Linux 应用程序,它使用相同的代码,尽管它使用了随 Linux 一起提供的 pci.h 标头(显然 pciutils 具有相同的 API)。 显然,Windows(也就是我的情况下的 Windows 7 x64)不显示这个信息或者至少没有暴露给 PCIUtils。
您如何建议我获取这些信息? 如果有替代 PCIUtils 的 Windows 工具可以提供此信息,我将很高兴获得它们的链接。
编辑:我仍然没有找到解决方案。 如果有任何解决我的问题且适用于 32 位 Windows 的解决方案,将不胜感激。
为了扫描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,但是应该包含此设备的 PCI 区域大小的 size 总是为 0。我期望循环中的至少一个周期显示一个 size > 0。
我的代码基于一个 Linux 应用程序,它使用相同的代码,尽管它使用了随 Linux 一起提供的 pci.h 标头(显然 pciutils 具有相同的 API)。 显然,Windows(也就是我的情况下的 Windows 7 x64)不显示这个信息或者至少没有暴露给 PCIUtils。
您如何建议我获取这些信息? 如果有替代 PCIUtils 的 Windows 工具可以提供此信息,我将很高兴获得它们的链接。
编辑:我仍然没有找到解决方案。 如果有任何解决我的问题且适用于 32 位 Windows 的解决方案,将不胜感激。