2. 驱动程序所支持的设备
在驱动程序的编写过程中,如果此程序被用来作为硬件设备的驱动,那么应该首先确定设备标识。
2.1 PCI设备
可以使用两个辅助宏来进行struct pci_device_id结构体的初始化:
PCI_DEVICE(vendor, device)
创ㄒ桓鼋龊吞囟ǔ 碳吧璞?/span>ID相匹配的struct pci_device_id。
PCI_DEVICE_CLASS(device_class, device_class_mask)
创建一个和特定PCI类相匹配的struct pci_device_id。
struct pci_device_id结构体需要被导出到用户空间,使热插拔和模块装载系统知道什么模块针对什
么硬件设备。宏MODULE_DEVICE_TABLE完成这个工作。
MODULE_DEVICE_TABLE(pci, var_name)
该宏创建一个名为__mod_pci_device_table的局部变量,指向struct pci_device_id数组。在稍后的内核
构建过程中,depmod程序在所有的模块中搜索符号__mod_pci_device_table。如果找到了该符号,它
把数据从该模块中抽出,添加到文件/lib/modules/KERNEL_VERSION/modules.pcimap中。当depmod
结束之后,内核模块支持的所有PCI设备连同它们的模块名都在该文件中被列出。当内核告知热插拔系
统一个新的PCI设备已经被发现时,热插拔系统使用modules.pcimap文件来寻找要装载的恰当的驱动程
序。
2.2 USB设备
对于USB设备,可以使用下面宏进行struct usb_device_id结构体的初始化:
USB_DEVICE(vendor, product)
创建一个struct usb_device_id结构体,仅和指定的制造商和产品ID值相匹配。
USB_DEVICE_INFO(class, subclass, protocol)
创建一个struct usb_device_id结构体,仅和USB设备的指定类型相匹配
例如:
static struct usb_device_id usb_example[] = {
{USB_DEVICE(USB_VENDOR_ID, USB_PRODUCT_ID)},
{0,}
};
MODULE_DEVICE_TABLE(usb, usb_example);
通过MODULE_DEVICE_TABLE宏,用户空间的热插拔和模块装载系统知道什么驱动模块针对什
么硬件设备。