电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
Linux字符设备驱动模型之框架解说
分 享
扫描二维码分享
Linux字符设备驱动模型之框架解说
linux
驱动
嵌入式
东方青
关注
发布时间: 2019-12-06
丨
阅读: 1852
Linux字符设备驱动模型之框架解说 -----东方青 一、软件操作硬件设备模型 在进行嵌入式开发的过程中,在常做的事情就是驱动配置硬件设备,然后根据功能需求使用硬件设备,实现功能的逻辑。如下图为其相互之间的关系。 ![](https://cf05.ickimg.com/bbsimages/201911/9f11ee34a2038766190b50dcbcc7bb88.png) 如上图所示: 驱动程序:主要作为操作和配置硬件设备,使得硬件设备能够正常进行工作。例如,在写点灯程序时,前提条件是从原理图了解到LED等与CPU/MCU之间的硬件连接(使用了哪一个GPIO口),驱动程序的作用就是初始化配置GPIO口,使得GPIO口能够进行工作,比如现在配置为推完输出模式。GPIO能够正常工作之后,那么就需要进行最基本的操作了,即灯亮和等灭。这就是驱动程序。 应用程序:当驱动程序能够时间最基本的灯亮和灯灭,那么是需要实现跑马灯,还是各种花样的灯的显示,这就由应用程序来决定了。 硬件设备能够接受CPU/MCU通过驱动程序进行的操作,或者是能够为CPU/MCU提供有效的数据。 二、Linux系统软件操作硬件模型 对于Linux操作系统而言,因其系统的强大和所支持功能的完善,可支持各种设备在Linux操作系统下运行。所以设备的类型可谓繁多,如:字符设备,块设备,网络接口设备,USB设备,PCI设备,平台设备,混杂设备……等等,而设备类型不同,也意味着其对应的驱动程序模型不同。即每一种类型的设备,都有其相应的驱动模型。 但总体而言,既然都是运行在Linux操作系统下的设备,所以其应当存在相应的驱动架构来进行驱动设备。如下图: ![](https://cf05.ickimg.com/bbsimages/201911/75fa015e72169695f3c888a00d6050fc.png) 如上图,对于Linux操作系统而言,用户空间的应用程序和内核空间的驱动程序,有着千丝万缕的关系,但却又相互独立。他们通过文件的方式进行相互之间的通信。而驱动程序则是依赖于Linux内核的驱动架构进行编写的程序,为用户空间的应用程序提供相应的接口通道。而设备操作程序则是在Linux内核驱动架构下进行与设备直接交互的程序代码,比如配置初始化CPU私有外设,初始化硬件设备,对硬件设备进行基本操作等等,总之目的是让硬件设备能够正常的工作。 那么在Linux系统中编写内核驱动,其驱动模型是怎样的呢?? ![](https://cf05.ickimg.com/bbsimages/201911/a815346070be5e2913c9bec3ff36a4a1.png) 如上图: 初始化内核驱动:依赖于Linux内核的驱动模型,建立所需要操作的设备驱动并进行相应的操作。如下图: ![](https://cf05.ickimg.com/bbsimages/201911/ae425d212ef9f30bcf657556061b6f2c.png) 实现设备操作:根据硬件设备的型号、功能特性等,实现驱动硬件设备正常工作,能够进行基本的操作,比如读取设备数据或者向设备写数据等。 注销设备驱动:在Linux系统中,会存在设备热拔插或者用户不想使用相应设备的应用场景,那么可以将相应的设备驱动在内核空间注销,将不能使用相应的设备驱动。 三、Linux字符设备驱动模型 对于Linux内核驱动而言,任何一种设备驱动模型都会用Linux内核中的一种结构来进行描述。 对于字符设备确定而言,在Linux内核中使用struct cdev结构来描述。其结构原型如下: ![](https://cf05.ickimg.com/bbsimages/201911/f785fe8b53e47dcc10332dd80858393e.png) 对于Linux内核给出的描述设备的结构,其结构成员并不是都是由程序员使用的,有些结构成员由内核内部使用,有些结构成员有程序员使用。比如以上struct cdev结构中,由程序员使用的成员为unsigned int count; 、dev_t dev;和const struct file_operations *ops;。 【unsigned int count;】:其表示设备的数目/数量,在同一个系统中,可能存在多个相同的设备,那么不需要每一个设备就为其提供一个驱动,而是统一提供同一个驱动,只需要在驱动中识别出是操作哪一个设备即可。Count结构成员的作用就是记录这一个驱动中存在多少个设备。 ![](https://cf05.ickimg.com/bbsimages/201911/011920fe8d9a3decf41e92bacc28991d.png) 【dev_t dev;】:表示这个设备的设备号,在Linux操作系统中,通过设备号的方式来进行区分不同是设备。 【const struct file_operations *ops;】:设备驱动操作的函数集/方法集。这个方法集为上层应用程序提供相应的接口通道。实现用户空间的操作函数与内核空间的操作实现一一映射关系。 四、Linux操作系统中硬件的操作方式 有句话叫做“对于Linux而言,一切皆文件”,所以对于在用户空间的应用程序而言,在面向硬件设备的操作时,也是通过文件的方式进行操作。操作相应的设备文件节点,就等同于操作了其设备文件节点对应的硬件设备。 硬件设备相关的设备文件节点存放于/dev目录下。如下图: ![](https://cf05.ickimg.com/bbsimages/201911/624724f763e1a5d88f10ffa55a469d8a.png) 如上图所示,/dev目录下的文件节点均为对应的硬件设备的设备文件。例如:ttyS0设备文件为PC台式机默认的9针串口设备节点。所以对相应设备文件节点的读写操作即是对其所对应的硬件进行读写操作。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
3
)
东方青
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交