【Linux】驱动学习,先啃框架

目录

前言:

一、驱动设计

(1)面向对象:

(2)分层:

(3)分离:

二、驱动框架

(1)传统框架 

(2)总线设备驱动框架:

(3)设备树


前言:

经典环节:我一直深信,带着问题思考和实践,能够更容易理解并学习到

(1)驱动设计的核心思想

  • 面向对象
  • 分层
  • 分离

(2)驱动框架有哪些?

  • 传统框架
  • 总线设备驱动框架
  • 设备树

写作不易,如果有所帮助,多多支持,大家一同进步呀!前人的思想真的巧妙!!!

参考学习: 

1.韦老师课程 

2.Linux笔记 https://xuesong.blog.csdn.net/article/details/109522945?spm=1001.2014.3001.5502

一、驱动设计

9.驱动设计的思想_面向对象_分层_分离_哔哩哔哩_bilibili

现如今大部分的驱动开发工作,是基于前人的工作上进行修改和完善,所以他所运用的驱动设计思想,我们需要去学习和理解,之后就可以知道在什么地方完成相应的改进和完善。 

驱动的学习,是要认知到驱动的作用,在Linux系统上的驱动程序相较于裸机单片机上的驱动程序有什么区别,为什么要需要驱动框架之类的东西?可以参照阅读以下的博文:

https://blog.csdn.net/weixin_42373086/article/details/129764065?spm=1001.2014.3001.5501

经过前面的应用开发的学习,我们可以非常清晰的认知到,Linux系统需要处理非常多的设备,那么如何管理控制以及处理数据,就是一个比较大的问题。并且尤其是进一步的开发过程中,设备改动以及程序版本更迭,如何快速的开发以及兼容,就又是一个大的问题。

每一个设备都有相关的特点和属性,它就是一个个对象,之后就是将这个对象进行分层(类比,皮肤肌肉),最后就是对其更深层次的分解分离(同一类的共性和特性)。

驱动设计的思想,就如上述的,面向对象、分层以及分离

(1)面向对象:

字符设备驱动程序里是抽象出一个file_operations结构体,提供具体实现的函数(open/read/write),代表一个对象。(如何抽象出合适的结构体,这个比较考验内功,哈哈)

(2)分层:

当应对多个板子,都要调用同一个驱动程序时,如何使得驱动程序支持多个板子呢?这里就应用到了分层的思想,举个例子,字符设备驱动程序。

  • 上层实现硬件无关的操作,比如注册字符设备驱动
  • 下层实现硬件相关的操作,

(3)分离:

以LED驱动程序为例,如果更换一个引脚来控制LED。这里涉及到引脚初始化和设置,某一款芯片每一个GPIO操作都是类似的,这里就可以写出比较通用的硬件操作代码(chipY_gpio.c)。

对上图进行总结,可以进行一个左右分离,board_A.c和board_B.c定义资源,chipY_gpio.c为硬件通用的代码,实现分离。

这里抽象出一个结构体led_resource来表示具体资源有哪些。

二、驱动框架

10.驱动进化之路_总线设备驱动模型_哔哩哔哩_bilibili

(1)传统框架 

这里使用到哪个引脚,怎么操作引脚,都写在代码中。

这里的框架,就不考虑拓展性,可以快速实现功能,但是涉及到引脚的修改时,就需要重新编译。

(2)总线设备驱动框架:

如果有一个设备(led)就要建立一个结构体(led_resource)来管理的话,会非常的麻烦

应用分离思想,进行进一步的拓展,引入platform_device/platform_driver,将资源(devise)与“驱动”(driver)分离开来。

按照上述分离之后,我们会发现还是会出现以下多个设备类型的定义,是否可以统一管理呢?这里就引入了总线(bus)的概念,对分离思想更好的实现。

对上述模型进行简化之后就如下图:https://live.csdn.net/v/269203?spm=1001.2014.3001.5501

Linux的设备驱动管理将运用对象思想对各式各样的设备、总线以及驱动进行管理。 

总线(bus):负责管理挂载对应总线的设备以及驱动;

设备(device):挂载在某个总线的物理设备。

驱动(driver):与特定设备相关的软件,负责初始化该设备以及提供一些操作该设备的操作方式。

类(class):对于具有相同功能的设备,归结到一种类别,进行分类管理。

Bus如何管理device和driver呢?

subsys_private,它是总线的驱动核心的私有数据。我们可以看到subsys_private数据结构下有两个链表,一个用于挂载device,一个用于挂载driver,从而实现对device和driver的管理。

(3)设备树

实际开发中,会有不同单板的.c资源文件,如果都放入Linux内核中,会导致内核臃肿不堪。

这里引入了dts配置文件来管理。dts文件会编译出dtb文件,之后传给内核,内核会解析dtb,产生一系列的platform_device/platform_driver文件。

 这里我们可以看到dtb文件和dts文件都是在内核外的,这样可以使得内核精简优雅。

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

希希雾里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值