1.分层:核心层和设备相关层分开。
分离:把硬件相关的代码和驱动分离开来,要写dev.c drv.c两个文件。
2.总线bus有dev和drv两个链表。driver中probe成员,插入设备时,总线设备驱动调用device_add时:
(1).会将device结构体放入bus的device链表
(2).从bus的drv链表中取出每一个drv,用bus的match函数测试是否是否支持这个dev。
(3)如果支持则调用这个drv的probe函数。
3.设备驱动程序中:
注册设备驱动,调用driver_register函数时:
(1).会将这个driver放入bus的driver链表中
(2)从bus的device链表中取出每一个device,用bus的match函数测试是否支持这个driver。
(3)若支持则调用这个驱动的probe函数。
4.分析代码可知:bus上的match函数是根据device上的bus_id和driver上的name是否一致来进行匹配的。device中的device_add函数和driver中的driver_register函数分别将各自的bus_id或name进行匹配,如果一致则调用driver的probe函数。
5.Linux中BUS衍生出来的总线有:i2c_bus_type和platform_bus_type等。它们的设备和驱动中都内嵌了device和driver结构。物理总线上除了platform_bus_type是虚拟的,其他都是真实存在的。
6.总线的几大匹配规则:
(1).Platform_bus_type总线中,将platform_device的name和driver的name相匹配,如果一致则调用platform_driver的probe函数。
(2)I2c总线中,将i2c_device的name和driver的name相匹配,如果一致则调用i2c_driver的probe函数。
7.platform总线驱动模型来编写LED点亮程序:需要编写led_dev.c和led_drv.c两个文件。在led_dev.c文件中要分配设置并且注册一个platform_device结构体,而在led_drv.c文件中要分配设置并且注册一个platform_driver结构体。具体的实现代码略。
8.参考阅读《Linux那些事》
1.不同的设备对应的总线设备驱动中的match函数的具体实现也不同。
2.在热插拔这个名词出现之前,设备要求先于驱动之前存在,即上电之前设备都有先插好。在热插拔出现之后,设备可以随时插入,插入后再加载相应的驱动