struct pci_device_id {
__u32 vendor, device; /* Vendor and device ID or PCI_ANY_ID*/
__u32 subvendor, subdevice; /* Subsystem ID's or PCI_ANY_ID */
__u32 class, class_mask; /* (class,subclass,prog-if) triplet */
kernel_ulong_t driver_data; /* Data private to the driver */
};
1、 vendor (厂商号)这个寄存器标识一个硬件制造商,例如,每个Intel的设备都标有相贩供应商号, 0x8086, 这样的号有一个全球注册,由PCI特别利益体所维护, 并且供应商必须申请有一个唯一的分配给它们的编号
2、device (设备号) 这个寄存器,由供应商选择。
3、subvendor (子厂商号) 如果驱动可处理任何类型的子系统ID, 值PCI_ANY_ID应该用于设置此域
4、subdevice (子设备号) 如果驱动可处理任何类型的子系统ID, 值PCI_ANY_ID应该用于设置此域
5、class (类别) 如果驱动可处理任何类型的子系统ID, 值PCI_ANY_ID应该用于设置此域
6、class_mask (类别掩码) 如果驱动可处理任何类型的子系统ID, 值PCI_ANY_ID应该用于设置此域
7、driver_data (私有数据)
再介绍两个宏定义用来初始化struct pci_device_id
PCI_DEVICE(vendor, device) : 这个创建一个 struct pci_device_id, 它匹配特定的供应商和设备ID,这个宏设置这个结构的子供应商和子设备号为PCI_ANY_ID
PCI_DEVICE_CLASS(device_class, device_class_mask) : 这个创建一个struct pci_device_id它匹配一个特定的PCI类。
另外,一个重要的宏
MODULE_DEVICE_TABLE : 用于将pci_device_id结构输出到用户空间,来允许执插拔各模块加载系统知道什么模块使用什么硬件设备。示例:
MODULE_DEVICE_TABLE(pci, i810_ids);
这个语解码器创建一个局部变量称为__mod_pci_device_table,它指向struct pci_device_id的列表,稍后在内核建立过程中 depmod程序在所有的模块中录找__mod_pci_device_table.如果找个这个符号,它将数据拉出模块并添加到文件/lib/modules/KERNEL_VERSION/modules.pcimap. 在depmod完成后,所有的被内核对中的模块支持的PCI设备被列出,带有它们模块名子,在那个文件中,当内核告知热插拔系统有新的PCI设备已找到,热插拔系统使用modules.pcimap文件来找到正确的驱动来加载。
阅读(831) | 评论(0) | 转发(0) |