linux设备驱动开发详解_Linux设备驱动概述
本篇⽂章将介绍Linux设备驱动开发的基本知识,带你快速拨开Linux驱动这团迷雾。⽂章分为如下3个⼩节进⾏讲解:
1、设备驱动的概念和作⽤;
2、在⽆操作系统和有操作系统的情况下设备驱动的设计开发;
3、Linux设备驱动的重点、难点和学习⽅法。
⽂章最后会给出⼀个简单的LED驱动在⽆操作系统和Linux操作系统下的实现⽰例。
好,Let's go
1、设备驱动的概念和作⽤
⼤家都知道在Linux开发中是⼀个分层的思想,也就是说应⽤层、操作系统层、驱动层和硬件层分别独⽴,然后为上⼀层提供API接⼝。对设备驱动通俗⼀点的解释就是:驱使硬件设备⾏动。驱动与底层硬件直接打交道,按照硬件设备的具体⼯作⽅式,读写其寄存器,完成设备轮询、中断处理和DMA通信等。
设备驱动实际上充当了硬件和应⽤软件之间的纽带,在系统没有操作系统的情况下⼯程师可以根据硬件设备的特点⾃⾏定义接⼝,如对串⼝定义SerialSend()、SerialReceive(),对继电器定义RelayOn()、RelayOff()等。⽽在有操作系统的情况下,驱动的架构则由操作系统定义,因为驱动架构也属于操作系统内核的⼀部分,驱动⼯程师必须按照相应的架构设计驱动,这样的话驱动才能融⼊操作系统内核中,并正常运⾏。
2、在⽆操作系统和有操作系统的情况下设备驱动的设计开发
2.1、⽆操作系统的情况下
事实上,在许多情况下我们的程序也运⾏在⽆操作系统的环境中(裸机程序),因为对于那些功能⽐较单⼀、控制并不复杂的系统不需要多任务调度和⽂件系统等复杂的功能,⽤单任务架构完全可以很好的实现我们的需求,也就是在⼀个⽆限循环(单⽚机编程中的while(1)死循环)中夹杂着对设备中断的检测或者对设备的轮询。这⼀部分的知识相信有过单⽚机编程经验的朋友⼀定⾮常熟悉了,下⾯是这种单任务软件的架构:
主函数
在这样的系统中,虽然不存在操作系统,但是设备驱动必须存在。⼀般情况下每⼀种设备驱动都会定义成⼀个软件模块,包含.c⽂件和.h⽂件。
2.2、有操作系统的情况下
当包含操作系统时,我们还需要将驱动融⼊内核,为了实现这种融合,必须在所有设备的驱动中设计提供给操作系统内核的接⼝,这类接⼝由操作系统规定(这是⼀个复杂的过程,在后续更新的⽂章中会由浅及深的说明)。所以,存在操作系统的时候,驱动便成为了连接硬件和Linux内核的桥梁。当设备成功注册到系统中,也就是让系统知道了我们需要使⽤的设备的存在之后,Linux会将设备映射到⽂件系统的⽂件和⽬录中,然后通过系统调⽤的接⼝open()、write()、read()、close()等即可访问我们的设备。
linux内核设计与实现 pdf3、Linux设备驱动的重点、难点和学习⽅法
Linux设备驱动的学习是⼀项浩繁和长久的过程,其中包含了如下重点和难点:
1、编写Linux设备驱动要求⼯程师有⼀定的硬件基础;
2、编写Linux设备驱动要求⼯程师有⾮常好的C语⾔基础,能灵活的运⽤C语⾔的结构体、指针以及内存动态申请和释放等;
3、编写Linux设备驱动要求⼯程师有⼀定的Linux内核基础,并不要求对内核的各个部分有深⼊的研究,但⾄少我们要明⽩驱动程序与内核的接⼝;
4、编写Linux设备驱动要求⼯程师有多任务并发控制和同步的基础,因为在驱动中会⼤量的使⽤⾃旋锁、互斥、信号量和等待队列等并发与同步机制。
看到这⾥,相信你已经对Linux设备驱动有了基本的认识,⾸先我们要明⽩,Linux驱动程序是门槛最⾼难度最⼤的⼀部分,当然薪资也是相对最⾼的,所以只要我们掌握了⽅法坚持学习下去,⼀定可以拨开这团迷雾看见阳光。笔者会定期更新关于嵌⼊式Linux和C语⾔在开发和学习中的经验和技巧。欢迎关注!
⽂章的最后,给出LED驱动在⽆操作系统和Linux操作系统下的实现⽰例,以供⼤家作以⽐较。LED⼀般直接由CPU的GPIO⼝控制,GPIO ⼀般由两组寄存器控制,即⼀组控制寄存器和⼀组数据寄存器。控制寄存器可设置GPIO⼝的⼯作⽅式为输⼊或输出。当引脚被设置为输出时,向数据寄存器的对应位写⼊1和0分别在引脚上产⽣⾼电平和低电平;当引脚设置为输⼊时,读取数据寄存器的对应位可获得引脚上的电平⾼低。
在⽆操作系统时的LED驱动如下:
上述程序中的LedInit()、LedOn()、LedOff()都直接作为驱动提供给应⽤程序使⽤。
在Linux下,我们使⽤字符设备驱动的框架来编写对应于上图中的LED驱动程序,为了遵循Linux编程的命名习惯,重新将其命名为
led_init()、led_on()、led_off(),注意:你现在并不需要能够读懂下图中的这些代码,我在后续的⽂章
更新中会继续讲解说明。
Linux操作系统下的LED驱动程序:
在这⾥,我们只需要有⼀个感性的认识即可,那就是上图中陌⽣的结构和元素都是Linux内核为设备定义的,在后⾯的学习中,我们只需要会使⽤即可(都是套路)。
笔者会定期更新嵌⼊式Linux、C语⾔在开发和学习中的经验和技巧。欢迎关注,我们共同学习共同进步

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。