PCI バスをスキャンして、特定のベンダーから特定のデバイスに関する情報を取得する必要がありました。私の目標は、i2c 転送を行い、さまざまなセンサーからの情報を表示するために、そのカードの PCI メモリをユーザー空間にマップするために、AMD グラフィックス カードの PCI リージョン サイズを見つけることです。
PCI バスをスキャンするために、約 1 年前に 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
されましたが、このデバイスのPCI領域サイズを含む必要base_addr
がsize
あるのは常に0です.ループからのサイクルの少なくとも1つは、サイズ > 0。
私のコードは、同じコードを使用する Linux アプリケーションに基づいていますが、Linux に付属の pci.h ヘッダーを使用しています (pciutils には明らかに同じ API があります)。どうやら、Windows(私の場合はWindows 7 x64)はこの情報を表示しないか、少なくともPCIUtilsに公開されていません。
この情報をどのように入手することを提案しますか? Windows 用の pciutils に代わるものがあり、この情報を提供する場合は、それらへのリンクを喜んで取得します。
編集:私はまだ解決策を見つけていません。私の問題に対する解決策があり、32ビットWindowsでも機能する場合は、深く感謝します.