2

私は最初のステップをLinuxカーネルデバイスドライバーの開発に移しています。

私は、pci-eカードpci_register_driverの場合、タイプのオブジェクトを介して情報を提供するように呼び出す必要があることを学びましたpci_driver(例の下)。モジュールをロードするとき(経由insmod)経由で渡された情報.id_tableが見つかった場合、.probe関数が呼び出されます。

私は今、自分の.probe関数がまったく呼び出されていないので(を介してログを追加しましたprintk)、含まれている情報が間違っていると想定するpci_device_id必要がありますよね?

この情報をハードウェア自体から直接取得する方法はありますか?LinuxボックスにPCI-Eカードを差し込むと、それに関するすべての情報を見つけることができますか?たぶんBIOSまたはsysのファイルを読んでいますか?

どんな助けでも大歓迎です。

AFG

      static struct pci_driver my_driver = {
      // other here
          .id_table = pci_datatable,
          .probe    = driver_add
      //
      };

      static struct pci_device_id pci_datatable[] __devinitdata =
      {
          { VendorID,  PciExp_0041,  PCI_ANY_ID, PCI_ANY_ID },
          { 0 },
      };

      int __devinit DmaDriverAdd(
          struct pci_dev *             pPciDev,
          const struct pci_device_id * pPciEntry
          )
      {
          // my stuff!
      }
4

2 に答える 2

4

受け入れられた答えは確かに質問に答えますが、プローブ関数が呼び出されないことについて少し詳しく説明したいと思います。

Documentation / PCI / pci.txt(Linux PCIドライバーの書き方)によると、他のドライバーがまだ所有していない既存のすべてのPCIデバイスに対してプロービング機能が呼び出されます。したがって、正しいベンダーIDとデバイスIDを持っていても、デバイスが別のドライバーによって所有されている場合は、関数が呼び出されていることはわかりません。どのドライバがどのデバイスを所有しているかを確認するには、次の手順に従います。

lspci -knn

ベンダーIDとデバイスIDの両方を一時的にPCI_ANY_IDに変更すると、使用可能なすべての(つまり所有されていない)デバイスに対してプローブ関数が呼び出されます。

于 2013-03-06T21:18:41.087 に答える
3

必要なコマンドはですlspci

引数がない場合は、すべてのPCIデバイスのリストが表示されます。例:

$ lspci
00:00.0 Host bridge: Intel Corporation 2nd Generation Core Processor Family DRAM Controller (rev 09)
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family 
03:00.0 Network controller: Intel Corporation Centrino Advanced-N 6205 (rev 34)
...

次に、IDを取得するには、次を使用します。

$ lspci -v -n -s 03:00.0
03:00.0 0280: 8086:0085 (rev 34)
    Subsystem: 8086:1311
    Flags: bus master, fast devsel, latency 0, IRQ 52

/sys同じ情報は次の場所にもあります。

$ cd /sys/bus/pci/devices/0000:03:00.0 
$ cat vendor device 
0x8086
0x0085
$ cat subsystem_vendor subsystem_device 
0x8086
0x1311
于 2012-08-10T13:38:51.510 に答える