什么是platform总线

platform总线是区别于实体总线USB、 I2C、SPI 、PIC总线的虚拟总线,一些usb设备选址的话需要通过USB总线来进行寻址,而有些类似于SoC内部外设如led 看门狗 定时器是直接通过内存的寻址空间来进行寻址的,cpu与这些设备通信是不需要总线的,2.6内核以后要对所有设备进行统一管理,通过kset、kobject来建立层次关系,对这些直接通过内存寻址的设备虚拟了一种总线即platform总线,在硬件上实际是没有这个总线;platform内核纯软件的总线,所有的直接通过内存寻址的设备都映射到这条总线上;

platform总线的优点

  1. 可以通过platform总线,可以遍历所有的platform总线设备;platform本质其实也是kset、kobject,具有kobject的特性
  2. 实现设备与驱动的分离,通过platform总线,设备与驱动是分开注册的,通过platform总线的probe来随时检测与设备匹配的驱动,如匹配上即进行这个设备的驱动注册;
  3. 由于上面这个优势,一个驱动可以供同类的几个设备使用;

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)

Logo

更多推荐