本篇文章将介绍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()等即可访问我们的设备。
3、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设备驱动开发详解
发表于 10-28 11:03
•9次下载
大部分学习者的最终目的就是学习 Linux驱动开发,Linux中的外设驱动可以分为:字符设备驱动、块设备驱动和网络设备驱动。
发表于 10-26 09:53
•231次阅读
电子发烧友网站提供《TLC5940的16通道PWM LED驱动器的基本知识.zip》资料免费下载
发表于 10-19 11:21
•3次下载
前言 Linux的IIC驱动想必大家都耳熟能详,网上也有很多相关的教程。 网上的教程总结,比如: 方法 问题描述 Linux 3.X.X版本之后,设备树+驱动 此方法是比较符合linux驱动的写法
发表于 08-09 11:18
•407次阅读
本文档概述了利用Linux开发板为 Linux 内核开发驱动程序的基础知识,并简单介绍了如何配置和操作 Linux 驱动程序开发板。
发表于 02-15 13:36
•1764次阅读
Linux驱动开发,看起来是一份很高大上的职业,毕竟从事上层应用开发人员太多,而且门槛又不是特别高,而内核级开发从业人员要少得多,而且资料又较少。有许多刚刚接触到Linux驱动开发的同学会感觉非常
发表于 12-31 00:03
•57次阅读
:嵌入式linux应用开发基础知识 BV1kk4y117Tu第5篇:嵌入式linux驱动开发基础知识 BV14f4y1Q7ti第6篇:项目实战 BV1it4y1Q75z第7篇:驱动大全 BV1hz4y1f7eN学习驱动开发
发表于 12-24 08:18
Linux设备驱动开发入门 嵌入式工程师、嵌入式讲师、10多年嵌入式开发实战...
发表于 12-23 08:14
,编译原理,计算机控制,计算机网络等知识。在真正学习嵌入式开发之前,首先要打好基础。其中最重要的是C语言基础、数字电路、计算机组成原理三门课程。下面我们就来讲下嵌入式Linux C的基本知识点。...
发表于 12-17 08:08
Linux驱动分为SOC内部,SOC外部。SOC内部为平台驱动,SOC外部为设备驱动。单片机项目可以参考之,MCU内部为平台驱动,MCU外部为设备驱动。MCU平台驱动一般都已经被MCU供应商实现了(Linux的SOC也是
发表于 11-13 19:21
•1次下载
1.《linux驱动设备驱动开发详解》 基于linux4.0 是目前主流的 嵌入式开发用的系统 整个开发流程很详细,是嵌入式开发的入门之选,在2021年之前是没有任何图书有这么详细的教程的,是国内
发表于 11-08 08:03
移植,rootfs移植)linux驱动开发嵌入式开发用到哪些知识?编程语言:第一层次(C语言) 第二层次(ARM汇编、shell脚本、C++、Java)操作系统...
发表于 10-27 10:14
抽水蓄能电站基本知识(肇庆理士电源技术有限公司地址)-抽水蓄能电站基本知识。。。。。。。。。。。
发表于 09-24 12:37
•24次下载
文章目录1. 舵机的基本知识2. 舵机的组成3. 舵机的工作原理1. 舵机的基本知识舵机就是一种有输出轴的小传动装置。这个输出轴能够通过向舵机输入一个编码信号而定位到我们指定的角度位置。只要这个编码
发表于 09-13 08:36
LED照明及驱动器基本知识培训PPT
发表于 08-26 11:46
•43次下载
Linux系统的设备分为哪几类?Linux驱动开发有哪些流程?
发表于 07-23 11:57
文章目录基本知识数码管应用范围单片机常用显示器LED显示器显示结构LED数码管接法共阳数码管码表共阴数码管码表注意静态显示原理优点缺点基本知识数码管也称作辉光管,是一种可以显示数字和其他信息
发表于 07-19 09:33
Linux用户态开发驱动教程及基础知识
发表于 07-14 10:06
•7次下载
STM32有哪些基本知识?如何去建立一种STM32开发环境?怎样去安装并下载一种keil软件?
发表于 07-05 07:30
详解射频和微波开关的基本知识
发表于 05-20 06:06
`Linux设备驱动基础、硬件知识、时序分析方法与手册阅读方法,字符设备驱动、驱动设计中控制并发、同步等问题。书籍内容很精彩。`
发表于 04-01 14:47
CPLD/FPGA的基本知识讲解。
发表于 03-30 09:55
•24次下载
嵌入式Linux设备驱动开发思想进阶之驱动分层与驱动分离
发表于 02-19 06:40
电源基本知识问答20条,你答对了几条?
发表于 01-29 07:18
电源基本知识问答20条
发表于 01-26 06:25
,编译原理,计算机控制,计算机网络等知识。在真正学习嵌入式开发之前,首先要打好基础。其中最重要的是C语言基础、数字电路、计算机组成原理三门课程。下面我们就来讲下嵌入式Linux C的基本知识点。
发表于 01-12 06:31
操作系统与驱动的关系 1.3 Linux驱动程序开发 1.3.1 用户态和内核态 1.3.2 模块机制 1.3.3 编写设备驱动程序需要了解的知识 1.4 编写设备驱动程序的注意事项
发表于 07-07 21:09
linux开发需要学什么?其实Linux开发包含的知识点挺多的。学会了这些东西之后,就可以做很多事情。下面本篇文章给大家归纳一下,希望对大家有所帮助。
发表于 05-29 09:23
•6802次阅读
由于Linux驱动编程的本质属于Linux内核编程,因此我们非常有必要熟悉Linux内核以及Linux内核的特点。 这篇文章将会帮助读者打下Linux驱动编程的基础知识。
发表于 03-01 08:27
•3106次阅读
【RT-Thread】线程的基本知识
发表于 02-04 15:42
•2691次阅读
《Linux设备驱动开发详解(第2版)》是一本介绍linux设备驱动开发理论、框架与实例的书,《Linux设备驱动开发详解(第2版)》基于ldd6410开发板,以linux
发表于 11-25 09:32
•1256次阅读
Linux设备驱动开发详解:基于最新的Linux 4.0内核
发表于 08-31 12:29
这是一本介绍Linux设备驱动开发理论、框架与实例的书,《Linux设备驱动开发详解(第2版)》基于LDD6410开发板,以Linux2.6 版本内核为蓝本,详细介绍自旋锁、信号量、完成量、中断顶
发表于 07-24 08:00
•25次下载
linux驱动程序开发-第六节:驱动自动创建设备节点
发表于 07-15 14:46
这是一本介绍Linux设备驱动开发理论、框架与实例的书,Linux设备驱动开发详解基于LDD6410开发板,以Linux2.6 版本内核为蓝本,详细介绍自旋锁、信号量、完成量、中断顶/底半部、定时器
发表于 04-28 08:00
•12次下载
了解Linux设备驱动程序的基础知识,重点关注设备节点,内核框架,虚拟文件系统和内核模块。
提出了一个简单的内核模块实现。
发表于 11-26 06:51
•2498次阅读
本文档的主要内容详细介绍的是嵌入式Linux设备驱动程序开发基础知识总结免费下载
嵌入式Linux设备驱动程序分类静态加载的驱动程序动态加载的驱动程序
Linux将设备按照功能特性划分为三
发表于 10-23 16:10
•13次下载
,知道如何利用linux提供的功能来进行应用程序开发,知道如何来使用设备驱动来进行应用程序设计,有了这些知识后,你就可以更深入的去学习Linux系统原理和基于Linux驱动的开发,Linux内核的裁剪
发表于 10-11 11:11
•328次阅读
本文档的主要内容详细介绍的的电机基本知识及直流电机驱动与测速实例分析包括了:电机基本知识,H桥电路与MC3386驱动芯片,直流电机驱动的实例,增量式编码器,编码器测速实例
发表于 09-26 15:14
•76次下载
的驱动程序和应用程序的需求在成倍增长。本文通过实现对 PXA255开发板外围字符设备(电机、数码管、串口和 mini键盘)的操作和控制,详细讨论了嵌入式 linux字符设备驱动的设计与应用。
发表于 08-21 10:19
•850次阅读
嵌入式Linux设备驱动开发之驱动分层/分离思想 我们在学习I2C、USB、SD驱动时,有没有发现一个共性,
发表于 04-21 08:35
•5490次阅读
想要驾驭Linux驱动开发,必须深刻理解Linux总线设备驱动框架。之所以会形成这样的框架,主要是为了代码的可重用性,因为驱动和设备的关系是一对多的。正如主设备号和次设备号之分,主设备号表示驱动
发表于 03-22 11:08
•9843次阅读
学习Linux设备驱动开发的过程中自然会遇到字符设备驱动、平台设备驱动、设备驱动模型和sysfs等相关概念和技术。对于初学者来说会非常困惑,甚至对Linux有一定基础的工程师而言,能够较好理解这些
发表于 12-17 16:16
《Linux设备驱动开发详解》第4章、Linux内核模块
发表于 10-27 14:15
•19次下载
《Linux设备驱动开发详解》第5章、Linux文件系统与设备文件系统
发表于 10-27 14:13
•9次下载
《Linux设备驱动开发详解》第6章、字符设备驱动
发表于 10-27 11:46
•22次下载
《Linux设备驱动开发详解》第7章、Linux设备驱动中的并发控制
发表于 10-27 11:37
•9次下载
《Linux设备驱动开发详解》第8章、Linux设备驱动中的阻塞与非阻塞IO
发表于 10-27 11:35
•8次下载
《Linux设备驱动开发详解》第9章、Linux设备驱动中的异步通知与异步IO
发表于 10-27 11:33
•13次下载
《Linux设备驱动开发详解》第10章、中断与时钟
发表于 10-27 11:29
•12次下载
《Linux设备驱动开发详解》第11章、内存与IO访问
发表于 10-27 11:27
•6次下载
《Linux设备驱动开发详解》第13章、Linux块设备驱动
发表于 10-27 11:24
•17次下载
《Linux设备驱动开发详解》第14章、Linux终端设备驱动
发表于 10-27 11:22
•8次下载
《Linux设备驱动开发详解》第15章、Linux的I2C核心、总线与设备驱动
发表于 10-27 11:19
•8次下载
《Linux设备驱动开发详解》第16章、Linux网络设备驱动
发表于 10-27 11:17
•5次下载
《Linux设备驱动开发详解》第17章、Linux音频设备驱动
发表于 10-27 11:14
•17次下载
《Linux设备驱动开发详解》第18章、LCD设备驱动
发表于 10-27 11:11
•12次下载
《Linux设备驱动开发详解》第19章、Flash设备驱动
发表于 10-27 11:09
•8次下载
《Linux设备驱动开发详解》第20章、USB主机与设备驱动
发表于 10-27 11:04
•8次下载
《Linux设备驱动开发详解》第21章、PCI设备驱动
发表于 10-27 11:00
•5次下载
《Linux设备驱动开发详解》第23章、Linux设备驱动的移植
发表于 10-27 10:58
•9次下载
分享到:标签:嵌入式Linux 设备驱动 操作系统 11.1 设备驱动概述 11.1.1 设备驱动简介及驱动模块 操作系统是通过各种驱动程序来驾驭硬件设备的,它为用户屏蔽了各种各样的设备,驱动
发表于 10-18 16:44
•0次下载
华清——linux设备驱动开发
发表于 09-02 17:04
安防监控基本知识
发表于 01-04 13:52
•1次下载
光纤基本知识
发表于 12-15 22:26
•1次下载
电子专业单片机相关知识学习教材资料——UPS电源的基本知识
发表于 09-13 17:46
•15次下载
O***oy观点:本帖子您应该学到的知识点就是,什么是字符型设备,块型设备,网络设备,和mtd设备驱动的特点。大家可以根据该帖子提出的观点,baidu,google进行扩展阅读。 Linux设备
发表于 04-16 14:31
本书从linux基本知识开始讲解,内容包括开发语言、开发平台、操作系统、网络编程等等。
发表于 03-23 14:21
•1次下载
安全用电基本知识安全用电基本知识安全用电基本知识
发表于 01-14 15:54
•5次下载
`一、看威武霸气的封面作者:宋宝华 二、读读简介,看看适合你吗?这是一本介绍Linux设备驱动开发理论、框架与实例的书,《Linux设备驱动开发详解(第2版)》基于LDD6410开发板,以
发表于 09-11 23:36
#《Linux设备驱动开发详解》电子书连载#第8章 Linux设备驱动中的阻塞与非阻塞IO,阻塞和非阻塞I/O是设备访问的两种不同模式,驱动程序可以灵活地支持用户空间对设备的这两种访问方式。8.1节
发表于 06-25 15:14
#《Linux设备驱动开发详解》电子书连载#第7章 Linux设备驱动中的并发控制,Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发访问会导致竞态。Linux提供了多种解决竞态问题
发表于 06-09 14:48
#《Linux设备驱动开发详解》电子书连载#第5章 Linux文件系统与设备文件系统,由于字符设备和块设备都很好地体现了“一切都是文件”的设计思想,掌握Linux文件系统、设备文件系统的知识非常重要。首先,
发表于 06-06 11:28
本帖最后由 华清远见 于 2013-6-3 09:47 编辑
#华清远见《Linux设备驱动开发详解》电子书连载#第1章 设备驱动概述,本章将带您走进Linux设备驱动的精彩世界。1.1节讲解
发表于 06-03 09:45
三四本LINUX设备开发实用书籍《Linux内核源代码情景分析—毛德操 著》、《精通LINUX设备驱动程序开发》,《嵌入式Linux应用开发完全手册》,非常经典!文件太大,要的留邮箱!
发表于 06-03 09:21
第2章,主要介绍嵌入式Linux的基本知识和如何配置嵌入式Linux开发环境;第二篇为系统篇,包括第3-7章,主要介绍了uClinux操作系统相关的知识,如任务管理、任务间通信、内存与I/O管理以及
发表于 06-02 10:26
《Linux设备驱动开发详解》
发表于 10-30 13:16
介绍LED的基本知识以及LED的分类。
发表于 05-30 14:58
•51次下载
关于电源的基本知识
发表于 05-29 16:18
HFC网络的基本知识讲解
发表于 11-08 17:30
•59次下载
Android内核是基于Linux 2.6内核的,它是一个增强内核版本,除了修改部分Bug外,它提供了用于支持Android平台的设备驱动,这里介绍了Android内核和驱动程序开发的基础知识。 第一部分 Lin
发表于 09-05 14:24
•334次下载
本文以快捷而简单的方式讲解如何像一个内核开发者那样开发linux设备驱动. 要开发Linux设备驱动,需要掌握以下知识: C编程 需要掌握深入一些的C语言知识,比如,指针的使用,位处理
发表于 03-19 14:57
•598次下载
摘 要: 介绍虚拟设备驱动程序开发的基本知识以及VxDs与WIN32应用程序通讯的几种常用方法,并给出了用VtoolsD开发VxDs的具体实例。 关键词: 虚拟设备,虚拟设
发表于 11-18 17:25
•38次下载
MIMO 的基本知识介绍
很好的初学者入门书籍
发表于 06-25 14:47
•25次下载
CAN 基本知识.pdf
CAN基本知识什么是CAN ?CAN,全称为“Controller Area Network”,即控制器局域网,是国际上应用最广泛的现场总线之一。最初,CAN被设计作为汽
发表于 03-19 15:40
•25次下载
linux驱动开发教程
本书应该提供唾手可得的途径去理解内核内幕以及Linus本人在开发时所做的设计抉择。尽管本书的主要目的是教如何写设备驱动程序,但它所
发表于 02-10 14:53
•117次下载
LDO基本知识
发表于 02-09 10:26
•100次下载
网络基本知识教程
发表于 01-13 12:55
•1386次阅读
电工基本知识
发表于 09-21 16:34
•807次下载
本文介绍了Linux 系统的特点,阐述了在Linux 操作系统下,对系统硬件的访问和开发驱动程序的方法,说明了设备驱动程序的结构和编写过程。
发表于 09-02 17:11
•20次下载
本文详细介绍了Linux平台下内核空间设备驱动程序的开发。在比较proc和dev两种文件系统的基础上,分别以PCI设备和USB设备的驱动程序开发为实例来介绍利用两种文件系统开发字符设
发表于 08-19 08:44
•18次下载
为了促进“Linux+PCI”技术在工控领域中的应用,通过对Linux系统中PCI局部总线规范实现机制和Linux设备驱动模块的分析,给出了PCI设备驱动程序的基本结构、内容及开发方法;最后用
发表于 07-16 09:55
•15次下载
本文主要讲述的是Linux的设备驱动程序开发。
发表于 04-22 16:37
•40次下载
高压钠灯的基本知识
1 高压钠灯的基本知识 高压钠灯使用时发出金白色光,它具有发光效率高、耗电少、寿命长、透雾能
发表于 04-17 14:20
•4786次阅读
嵌入式Linux设备驱动开发
Linux 设备驱动的基本概念Linux 设备驱动程序的基本功能Linux 设备驱动的运作过程常见设备驱动接口函数掌握
发表于 09-10 13:10
•79次下载
嵌入式Linux系统开发的基础知识了解嵌入式Linux系统? 从Linux内核到文件系统ü嵌入式Linux开发流程v嵌入式Linux开发内容? 驱动开发;§ 内核移植;? 内核特性开发;? 系
发表于 09-10 11:21
手机的基本知识
2002年5月
发表于 11-29 11:32
•413次下载
继电器基本知识
发表于 06-30 19:28
•1454次阅读
功率MOSFET的基本知识
发表于 04-16 23:34
•1697次阅读
评论