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

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

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

有没有办法直接从硬件本身检索这些信息? 一旦我将我的 PCI-E 卡插入我的 Linux 机器,我在哪里可以找到它的所有信息? 也许读取 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! 
      } 

请您参考如下方法:

虽然接受的答案确实回答了这个问题,但我想详细说明一下未调用的探测函数。

根据 Documentation/PCI/pci.txt(如何编写 Linux PCI 驱动程序),探测函数被调用用于其他驱动程序尚未不拥有的所有现有 PCI 设备。因此,即使您拥有正确的供应商和设备 ID,如果设备由另一个驱动程序拥有,您也不会看到正在调用的函数。 要查看哪些驱动程序拥有哪些设备运行:

lspci -knn

如果您暂时将供应商 ID 和设备 ID 都更改为 PCI_ANY_ID,您的探测函数将为每个可用(即不拥有)设备调用。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!