关于platform设备驱动框架的总结

          这两天学习了platform设备驱动程序的框架,现在来总结一下。在linux内核中常见的的总线有I2C总线,PCI总线,串口总线,SPI总线,PCI总线,CAN总线等,所以有些设备和驱动就可以挂在这些总线上,然后通过总线上的match进行设备和驱动的匹配。但是有的设备并不属于这些常见总线,所以引入了一种虚拟总线,也就是platform总线的概念,对应的设备叫做platform设备,对应的驱动叫做platform驱动。platform设备驱动具备“总线—设备—驱动”的模型,完美的体现了Linux驱动开发中设备与驱动分离以及设备驱动分层的思想。Platform驱动模型结构主要如下:

    (1)platform核心层:为设备层和驱动层提供注册接口、为设备层和驱动层的匹配提供标准

           ① 搭建总线框架。定义了总线类结构体struct bus_type,包含关键的回调函数指针match来确定platform_device和platform_driver之间的匹配。以及提供了platform总线初始化函数platform_bus_init(),内部调用了bus_register()函数注册platform总线,初始化了klist_devices和klist_drivers两个链表
         ② 为设备层提供注册API,提供自动匹配接口函数。定义了platform设备结构体struct platform_device,继承于设备结构体struct device(此处需要说明一下,Linux内核虽然是用C语言和汇编来写的,但处处体现着面向对象的思想,这里的继承主要通过结构体的嵌套来实现,即把struct device嵌套在struct platform_device中)。然后提供了用来注册platform设备的platform_device_register()函数
        ③ 为驱动层提供注册API,提供自动匹配接口函数。定义了platform驱动结构体struct platform_driver,继承于驱动结构体struct device_driver。然后提供了用来注册platform驱动的platform_driver_register()函数

   (2)设备层:主要工作就是把核心层提供的API用起来

          ① 设置好platform_device结构体成员:主要是name、resource、num_resources、id、dev->release、
       ② 通过platform_device_register()把这个结构体链入核心层的klist_devices链表(platform_device_register()里会调用到bus type 的match()成员函数,match成功才会把设备加入设备链表)

    (3)驱动层:同样是把核心层提供的API用起来

          ① 设置好platform_driver结构体成员:probe、remove、driver->name
        ② 通过platform_driver_register()函数把这个结构体链入核心层的klist_drivers链表(platform_driver_register()里会调用到bus type 的match()成员函数,match成功才会把驱动加入驱动链表)
        ③ 实现probe成员函数
        ④ 通常最后才去完成probe函数用到的材料,一般是file_operation结构体成员,这样应用层就可以通过这个接口来操作设备

.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值