驱动绑定

驱动绑定是将设备与可以控制它的设备驱动程序相关联的过程。 总线驱动程序通常会处理这个问题,因为有特定于总线的结构来表示设备和驱动程序。 借助通用的设备和设备驱动程序结构,大多数绑定可以使用通用代码进行。

总线

总线类型结构包含系统中该总线类型上的所有设备的列表。 当为设备调用 device_register 时,它会插入到此列表的末尾。 总线对象还包含该总线类型的所有驱动程序的列表。 当为驱动程序调用 driver_register 时,它会插入到此列表的末尾。 这是触发驱动程序绑定的两个事件。

device_register

添加新设备时,会迭代总线的驱动程序列表以找到支持该设备的驱动程序。 为了确定这一点,设备的设备 ID 必须与驱动程序支持的设备 ID 之一匹配。 用于比较 ID 的格式和语义是总线特定的。 不是尝试推导复杂的状态机和匹配算法,而是由总线驱动程序提供回调来将设备与驱动程序的 ID 进行比较。 如果找到匹配项,则总线返回 1; 否则返回 0。

int match(struct device * dev, struct device_driver * drv);

如果找到匹配项,则设备的驱动程序字段设置为驱动程序,并调用驱动程序的 probe 回调。 这使驱动程序有机会验证它是否真的支持该硬件,以及它是否处于工作状态。

设备类

成功完成 probe 后,设备将在其所属的类中注册。 设备驱动程序属于一个且仅属于一个类,该类在驱动程序的 devclass 字段中设置。 调用 devclass_add_device 以枚举类中的设备,并实际向该类注册它,这通过类的 register_dev 回调发生。

驱动程序

当驱动程序附加到设备时,该设备会插入到驱动程序的设备列表中。

sysfs

在总线的“devices”目录中创建一个符号链接,该链接指向物理层次结构中的设备目录。

在驱动程序的“devices”目录中创建一个符号链接,该链接指向物理层次结构中的设备目录。

在类的目录中为设备创建一个目录。 在该目录中创建一个符号链接,该链接指向 sysfs 树中设备的物理位置。

可以在设备的物理目录中创建一个符号链接(虽然尚未完成),以指向其类目录或类的顶级目录。 也可以创建一个指向其驱动程序的目录。

driver_register

添加新驱动程序时,该过程几乎相同。 迭代总线的设备列表以找到匹配项。 跳过已经有驱动程序的设备。 迭代所有设备,以将尽可能多的设备绑定到驱动程序。

移除

当移除设备时,它的引用计数最终会变为 0。 当它变为 0 时,将调用驱动程序的 remove 回调。 它将从驱动程序的设备列表中删除,并且驱动程序的引用计数会递减。 两个之间的所有符号链接都将被删除。

当移除驱动程序时,会迭代其支持的设备列表,并为每个设备调用驱动程序的 remove 回调。 该设备将从该列表中删除,并且符号链接将被删除。