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