在Linux中,PCIe设备驱动程序和设备可以通过设备的厂商ID、设备ID和子系统ID来匹配。这些ID信息通常包含在设备的PCI配置空间中。
- 确认设备ID和厂商ID
使用以下命令可以列出系统上所有PCI设备的详细信息:
lspci -vvv
在输出中找到你要匹配的设备,并记录下它的设备ID和厂商ID,例如:
04:00.0 Network controller: Intel Corporation Dual Band Wireless-AC 8265 (rev 78)
Subsystem: Intel Corporation Dual Band Wireless-AC 8265
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0, Cache Line Size: 64 bytes
Interrupt: pin A routed to IRQ 16
Region 0: Memory at dc200000 (64-bit, non-prefetchable) [size=8K]
Capabilities: <access denied>
Kernel driver in use: iwlwifi
Kernel modules: iwlwifi
从中可以看到设备的厂商ID为Intel Corporation
,设备ID为8086:24fd
。
- 编写设备驱动程序
编写一个设备驱动程序,并在驱动程序中使用pci_device_id
结构体来描述要匹配的设备。该结构体包含设备的厂商ID、设备ID和子系统ID等信息。
static const struct pci_device_id my_device_ids[] = {
{ PCI_DEVICE(0x8086, 0x24fd) }, // Intel Dual Band Wireless-AC 8265
{ 0 }
};
MODULE_DEVICE_TABLE(pci, my_device_ids);
- 注册设备驱动程序
在驱动程序中,使用pci_register_driver()
函数注册设备驱动程序。在注册时,将上一步中定义的my_device_ids
作为参数传递给函数。
static struct pci_driver my_pci_driver = {
.name = "my_pci_driver",
.id_table = my_device_ids,
.probe = my_probe,
.remove = my_remove,
};
module_pci_driver(my_pci_driver);
这样,当系统启动时,内核会自动加载并匹配驱动程序与可用设备。如果有符合条件的设备,就会调用驱动程序的probe()
函数来初始化设备。