驱动绑定¶
驱动绑定是将设备与可以控制它的设备驱动程序相关联的过程。总线驱动程序通常会处理此问题,因为存在特定于总线的结构来表示设备和驱动程序。通过通用设备和设备驱动程序结构,大多数绑定可以使用通用代码进行。
总线¶
总线类型结构包含系统中该总线类型上的所有设备的列表。当为设备调用 device_register 时,它会被插入到此列表的末尾。总线对象还包含该总线类型的所有驱动程序的列表。当为驱动程序调用 driver_register 时,它会被插入到此列表的末尾。这两个事件会触发驱动绑定。
device_register¶
当添加新设备时,会遍历总线的驱动程序列表以查找支持该设备的驱动程序。为了确定这一点,设备的设备 ID 必须与驱动程序支持的设备 ID 之一匹配。比较 ID 的格式和语义是特定于总线的。与其尝试推导复杂的状态机和匹配算法,不如由总线驱动程序提供回调来比较设备和驱动程序的 ID。如果找到匹配项,总线返回 1;否则返回 0。
int match(struct device
* dev, struct device_driver
* drv);
如果找到匹配项,则将设备的 driver 字段设置为驱动程序,并调用驱动程序的 probe 回调。这使驱动程序有机会验证它是否真的支持硬件,并且硬件是否处于工作状态。
设备类¶
在成功完成 probe 后,该设备将注册到它所属的类。设备驱动程序属于一个且仅属于一个类,并且该类在驱动程序的 devclass 字段中设置。调用 devclass_add_device 以枚举类中的设备,并实际将其注册到该类,这通过该类的 register_dev 回调完成。
驱动程序¶
当驱动程序附加到设备时,该设备将被插入到驱动程序的设备列表中。
sysfs¶
在总线的“devices”目录中创建一个符号链接,该链接指向物理层次结构中的设备目录。
在驱动程序的“devices”目录中创建一个符号链接,该链接指向物理层次结构中的设备目录。
在类的目录中创建一个设备的目录。在该目录中创建一个符号链接,该链接指向 sysfs 树中设备的物理位置。
可以在设备的物理目录中创建符号链接(尽管尚未完成),以指向其类目录或类的顶级目录。也可以创建一个链接指向其驱动程序的目录。
driver_register¶
当添加新驱动程序时,该过程几乎相同。遍历总线的设备列表以查找匹配项。跳过已具有驱动程序的设备。遍历所有设备,以将尽可能多的设备绑定到驱动程序。
移除¶
当移除设备时,其引用计数最终将变为 0。当它变为 0 时,将调用驱动程序的 remove 回调。它会从驱动程序的设备列表中删除,并且驱动程序的引用计数会递减。删除两者之间的所有符号链接。
当移除驱动程序时,会遍历其支持的设备列表,并为每个设备调用驱动程序的 remove 回调。该设备将从该列表中删除,并删除符号链接。