文章目录

序言

参考资料:Linux设备驱动开发解读宋宝华版

从现今开始,就对Linux驱动进行学习。在进行学习前,肯定是要给自己定下目标,做好打算。怎样学?怎样学好?

相信学习一样东西的目的,是为了解决问题,而不是为了学所学!所以,在学习前我们是抱着为了解决问题的思想去学习,这样我们的心理将会得到升华。

这么学习驱动的目的是哪些呢?

由于驱动开发工程师薪水高呀,没错确实很大缘由和这个有关。(哈哈哈)

其实,还有一个诱因!

就是构想一下,在我们身边学应用层开发的朋友有去关心过printf函数的实现吗?我们学单片机开发的朋友有用过printf函数吗?(有些朋友用的是被构建的printf,并不是真的printf)。

而我们的驱动就是解决这样一个问题的存在,即应用软件工程师不关心硬件linux 论坛,而硬件工程师也不用顾及软件的实现

设备驱动的作用

任何计算机系统的运转都是系统中软硬件共同努力的结果,没有硬件的软件就是空中楼阁,没有软件的硬件就是一堆废品。硬件是基础,代码最终会落实为硬件上的组合逻辑和时序逻辑;软件则实现了具体的应用,照料不同的业务需求,完成了用户的最终诉求。

而为了提升开发的效率linux设备驱动开发详解 光盘,软件和硬件不应当互相渗透入对方的领域,即软件工程师不害怕硬件,硬件工程师不害怕软件。也就是说,驱动的作用就是为了给软件工程师构建一个没有硬件的纯粹的软件世界,让硬件透明化。

浅显的讲,驱动也叫“驱使硬件设备行动”。驱动与底层硬件直接打交道,根据硬件设备具体的工作方法,读写设备的寄存器,完成设备的寻址,中断处理,DMA通讯,进行化学显存向虚拟显存地址映射等,最终让通讯设备能收发数据,让显示设备能显示文字和画面,让储存设备能记录文件和数据。

由此可见,设备驱动充当了硬件和软件之间的纽带,应用软件时只须要调用系统的应用编程插口(API)就可以让硬件去完成要求的工作。在系统没有操作系统的情况下,工程师可以按照硬件设备自己定义插口。而在有操作系统的情况下,驱动的框架由相应的操作系统定义,驱动工程师必须根据相应的构架设计驱动这样驱动能够更好的融合在操作系统中。

无操作系统时的设备驱动

并不是任何一个计算机系统都须要操作系统,例如针对工作任务比较单一的公汽车刷卡器,冷柜等。实现的功能单一,不须要操作系统的任务调度。所以常常我们对此的设计思路就是一个死循环!

相信你们在对单片机进行开发的时侯,就有很深刻的印象。我们的程序逻辑都是包含在一个while(1)循环当中的

int main(int argc,char *argv[]){
	while(1){
	//your's code begin
	gpio_init();
	key_init();
	....
}
//your's code end
}

linux光驱驱动_linux光驱启动_linux设备驱动开发详解 光盘

在这样的系统中,即使不存在操作系统,而且设备驱动则无论怎样都必须存在。通常情况下,每种设备驱动就会定义为一个软件模块linux设备驱动开发详解 光盘,包含.h头文件和.c源文件,后者定义设备驱动的数据结构并申明外部函数,前者进行驱动的具体实现。

其他模块想要使用这个设备的时侯,只须要包含设备的头文件之后调用即可。

正确的设计框架:实现软件和硬件的分离。

有操作系统时的设备驱动

从前面的无操作系统时设备驱动我们可以看出,设备驱动的硬件操作是必不可少的。没有这一部份驱动不可能和硬件打交道。

linux光驱驱动_linux光驱启动_linux设备驱动开发详解 光盘

其次,我们还须要将驱动融入到内核。为了实现这些融合,必须在所有设备的驱动中设计面向操作系统内核的插口,这样的插口由操作系统规定redhat linux下载,对一类设备而言结构一致,独立于具体的设备。

由此可见,当系统中存在操作系统的时侯,驱动就弄成了联接硬件和内核的桥梁。如下:

操作系统的存在势必要求设备驱动附加更多的代码和功能,把单一的“驱使硬件设备行动”变成了操作系统内核与硬件交互的模块,它对外呈现操作系统API,不再给应用软件工程师直接提供插口。

操作系统通过给驱动制造麻烦来达到给下层应用提供遍历的目的。当驱动都依照操作系统给出的独立于设备的插口而设计时,这么应用程序可使用统一的系统调用插口来访问各类设备。对于类UNIX的Vxworks、Linux等操作系统而言,当应用程序通过read(),write()等函数读写文件就可以访问各类字符设备和块设备,而不论设备的具体类型和工作方法,那将是多么遍历。

Linux设备驱动设备的分类及其特征

计算机系统的硬件主要由CPU、存储器和外设组成。随着IC制做工艺的发展,目前芯片的集成度越来越高,常常在CPU内部就集成了储存器和外设适配器。像ARM、PowerPC、MIPS等处理器都集成了UART、IIC控制器,SPI控制器、USB控制器,SDRAM控制器等。有的还集成了GPU(图形处理器)、视频编解码器等。

驱动针对的对象是储存器和外设(包括CPU内部集成的储存器和外设),而不是针对CPU内核。Linux将储存器和外设分为3个基础大类。

Linux系统中,网路设备面向数据包的接收和发送而设计,它并不倾向于对应于文件系统的节点。内核与网路设备的通讯与内核和字符设备、网络设备的通讯方法完全不同,网路设备主要还是使用套接字插口。

Linux设备驱动与整个软硬件系统的关系

除网路设备外,字符设备与块设备都被映射到Linux文件系统的文件和目录,通过文件系统的系统调用插口open()、write()、read()、close()等即可访问字符设备和块设备。所有的字符设备和块设备都统一呈现给用户。Linux的块设备有两种访问方式:一种是类似于dd命令对应的原始块设备,如“dev/sdb1”等;另一种方式是在块设备上构建FAT,EXT4,BTRFS等文件系统,之后通过文件路径的方法进行访问。

在Linux中,针对NOR、NAND等提供了独立的显存技术设备子系统,其上运行YAFFS2,JFFS2,UBIFS等具备擦除和负载均衡能力的文件系统。针对c盘或则Flash设备的FAT,EXT4,YAFFS2,UBIFS等文件系统定义了文件和目录在储存介质上的组织。而Linux虚拟文件系统则统一对她们进行了具象。

应用程序可以使用Linux的系统调用插口编程,但也可以使用C库函数,出于代码可移植性的目的,前者更值得推荐。C库函数本身也通过系统调用插口而实现,如C库函数fopen()、fwrite()、fread()、fclose()分别会调用操作系统的APIopen(),write(),read(),close()。

本文原创地址:https://www.linuxprobe.com/lsbqdkfxjsbh.html编辑:刘遄,审核员:暂无