Linux platform设备驱动原理及架构
什么是platform总线platform总线是区别于实体总线USB、 I2C、SPI 、PIC总线的虚拟总线,一些usb设备选址的话需要通过USB总线来进行寻址,而有些类似于SoC内部外设如led 看门狗 定时器是直接通过内存的寻址空间来进行寻址的,cpu与这些设备通信是不需要总线的,2.6内核以后要对所有设备进行统一管理,通过kset、kobject来建立层次关系,对这些直接通过内存寻址的设.
·
什么是platform总线
platform总线是区别于实体总线USB、 I2C、SPI 、PIC总线的虚拟总线,一些usb设备选址的话需要通过USB总线来进行寻址,而有些类似于SoC内部外设如led 看门狗 定时器是直接通过内存的寻址空间来进行寻址的,cpu与这些设备通信是不需要总线的,2.6内核以后要对所有设备进行统一管理,通过kset、kobject来建立层次关系,对这些直接通过内存寻址的设备虚拟了一种总线即platform总线,在硬件上实际是没有这个总线;platform内核纯软件的总线,所有的直接通过内存寻址的设备都映射到这条总线上;
platform总线的优点
- 可以通过platform总线,可以遍历所有的platform总线设备;platform本质其实也是kset、kobject,具有kobject的特性
- 实现设备与驱动的分离,通过platform总线,设备与驱动是分开注册的,通过platform总线的probe来随时检测与设备匹配的驱动,如匹配上即进行这个设备的驱动注册;
- 由于上面这个优势,一个驱动可以供同类的几个设备使用;
platform总线的工作流程
从内核态分析platform配对流程
初始化platform总线
platform_bus_init()
--> device_register(&platform_bus)
--> bus_register(&platform_bus_type)
--> platform_bus_type ==> platform_match(dev和drv的配对原则)
注册device
platform_device_register(struct platform_device *dev)
--> platform_device_add(pdev)
--> device_add(&pdev->dev)
--> bus_probe_device(dev)
--> device_initial_probe(dev)
--> __device_attach(dev, true)
--> bus_for_each_drv(dev->bus, NULL, &data, __device_attach_driver)
--> __device_attach_driver
--> driver_match_device(drv, dev) ==> 匹配driver,匹配成功才能往下走
--> driver_probe_device(drv, dev)
--> really_probe(dev, drv)
--> dev->bus->probe(dev) / drv->probe(dev)
注册driver
platform_driver_register(struct platform_driver *drv)
--> __platform_driver_register(drv, THIS_MODULE)
--> driver_register(&drv->driver)
--> bus_add_driver(drv)
--> driver_attach(drv)
--> bus_for_each_dev(drv->bus, NULL, drv, __driver_attach)
--> __driver_attach
--> driver_match_device(drv, dev) ==> 匹配driver,匹配成功才能往下走
--> driver_probe_device(drv, dev)
--> really_probe(dev, drv)
--> dev->bus->probe(dev) / drv->probe(dev)
更多推荐
已为社区贡献2条内容
所有评论(0)