Linux platform设备驱动原理及架构

什么是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)

  • 5
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值