2

我正在向 Linux 内核设备驱动程序开发迈出第一步。

我了解到,对于 pci-e 卡,我必须pci_register_driver通过类型对象调用提供信息pci_driver(下面的示例)。当我加载我的模块时( via insmod)如果.id_table找到通过的信息而不是调用该.probe函数。

就像我现在一样,我根本看不到我的.probe函数被调用(我添加了一些日志记录printk),所以我必须假设其中包含的信息pci_device_id一定是错误的,对吧?

有没有办法直接从硬件本身检索这些信息?一旦我将 PCI-E 卡插入我的 Linux 机器,我在哪里可以找到有关它的所有信息?也许读取 BIOS 或系统中的某些文件?

任何帮助表示赞赏。

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,如果设备归另一个驱动程序所有,您也不会看到正在调用的函数。要查看哪些驱动程序拥有哪些设备运行:

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 回答