我正在迈出 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,您的探测函数将为每个可用(即不拥有)设备调用。