翻译自Linux Kernel的文档,
Documentation/driver-model/binding.txt
该翻译源于译者个人兴趣,其中某些地方可能含糊不清、歧义、甚至错误,请参考原始文档阅读文。
若你发现有需要改正的地方欢迎指出
本文与原文档采用相同许可协议发布
驱动绑定
驱动绑定是建立设备与设备驱动之间的关系的过程。总线驱动已经完成了这个过程因为总线特定的结构体已经表现为了设备和驱动。对于普通的设备和设备驱动结构
体而言,大多数绑定过程可以使用公共的代码。
总线
总线类型结构体包含了这个系统中该总线类型上所有的设备形成的链表,当有设备通
过device_register函数注册,这个设备会被插入到设备链表的最末尾。总线对象也
包含了这个总线类型上所有的驱动程序所形成的链表,当有驱动通过driver_register
函数注册时,这个驱动会被插入到驱动链表的最末尾。这两种情况都会触发驱动绑定。
注册设备
当一个新设备被添加到某个总线上时,内核将遍历该总线的驱动链表以寻找能支持
这个设备的驱动。要确定设备和驱动是否匹配,那么该设备的设备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’目录下为相应设备创建一个符号链接指向物理层
中该设备的目录
内核会在相应的class的目录下为相应的设备创建一个目录,在这个目录下创建
一个符号链接指向这个设备在sysfs树下的物理位置。
内核可以在设备的物理目录下创建一个符号链接(尽管这还没完成),指向其
class目录或者class的顶层目录,也可以创建一个指向符号链接指向其驱动的
目录。
注册驱动
这个过程几乎和添加驱动时相同。内核将枚举相应总线上设备链表,将未被驱动
的设备与该驱动相匹配,把所有受支持的设备与其绑定。
卸载
当一个设备被移除,它的引用计数最终将变为0。当这件事情发生的时候,相应驱
动的移除回调函数将被调用。它会从该驱动的设备链表中移除,并且该驱动的引用
计数减一。所有未它产生的符号链接也将会被移除。
当驱动被卸载时,内核将遍历该驱动的设备链表上的所有设备、即受该驱动支持的
设备,驱动移除回调将为每个设备调用一次。设备会从设备链表中依次移除,所有
的符号链接也会被依次移除。