首页 理论教育ARM嵌入式系统设备驱动程序概述

ARM嵌入式系统设备驱动程序概述

【摘要】:因此,驱动程序的设计,要求开发人员熟悉Linux的内核机制、驱动程序和用户级应用程序的接口关系、系统中对设备的并发操作,同时要求开发人员非常熟悉所开发硬件的工作原理。嵌入式Linux中的设备驱动程序有以下三个方面的特点。

1.Linux设备

设备驱动针对的对象是存储器外设,因此Linux将存储器和外设分为三个基础大类。

字符设备

字符设备通常指不需要缓冲就能够直接读写的设备,它们以字节为单位进行读写,如串行口、并行口、虚拟控制台等。

●块设备

块设备通常指仅能以块为单位读写的设备,典型的块大小为512B或1024B,它的读取是通过缓冲区来进行的,诸如磁盘、内存、Flash等存储设备。

网络设备

网络设备通常指网络设备访问的接口,如网卡等,它们由内核中网络子系统驱动,负责接收和发送数据包。

嵌入式Linux将这三大类设备都当做文件进行处理,即字符设备文件、块设备文件和网络接口设备文件。三类设备中使用较多为字符设备和块设备,二者的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O操作就发生了;块设备则不然,它需要利用一块系统内存作为缓冲区,当用户进程对设备请求能满足用户的要求时,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作。而块设备主要针对磁盘等慢速设备设计的,主要是为了避免耗费过多的CPU时间来等待。

2.设备驱动程序

任何一个计算机系统的运转都是系统中软硬件共同努力的结果,没有硬件的软件是空中楼阁,而没有软件的硬件则只是一堆废铁;硬件是底层基础,是所有软件得以运行的平台,代码最终落实为硬件上的组合逻辑与时序逻辑;软件则实现了具体的应用,它按照各种不同的业务需求设计,最终完成用户的需求。

对设备驱动最通俗的解释就是“驱使硬件设备行动”。驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备轮询、中断处理、通信,进行物理内存到虚拟内存的映射等,最终让通信设备能收发数据,让显示设备能够显示文字和画面,让存储设备能够记录文件和数据。由此可见,设备驱动充当了硬件和软件之间的纽带,负责硬件和应用软件之间的沟通。(www.chuimin.cn)

嵌入式Linux内核采用可加载的模块化设计方式,即将最基本的核心代码编译在内核中,其他的代码若有必要则编译成内核的模块文件。常见的设备驱动程序则作为内核模块动态的加载,比如声卡驱动程序和网卡驱动程序等。因此,驱动程序的设计,要求开发人员熟悉Linux的内核机制、驱动程序和用户级应用程序的接口关系、系统中对设备的并发操作,同时要求开发人员非常熟悉所开发硬件的工作原理。

往往对一个设备进行访问和操作的程序由两部分组成,一个是设备驱动程序,一个是应用程序;但两者又是不同的,设备驱动程序是用户应用程序与硬件之间的一个中间软件层,其层次结构如图9.1所示。

图9.1 设备驱动的层次结构

应用程序一般都有一个main函数,从头到尾执行一个任务,而设备驱动程序没有main函数,它通过用户空间的insmod命令将设备驱动程序的初始化函数加入到内核中,在内核空间执行驱动程序的初始化函数,完成驱动程序的初始化和注册,之后驱动便停止下来,一直等待被应用程序调用。因此,设备驱动程序有时简称为驱动。

嵌入式Linux中的设备驱动程序有以下三个方面的特点。

(1)内核代码:设备驱动程序是内核的一部分,如果设备驱动程序出错,则有可能导致系统崩溃。

(2)内核接口:设备驱动程序必须为内核或者其子系统提供一个标准接口。

(3)可动态装载:大多数嵌入式Linux设备驱动程序都可以在需要时动态地装载进内核,在不需要时从内核中卸载。

设备驱动程序运行在内核空间,而用户应用程序则运行在用户空间;嵌入式操作系统通过系统调用和硬件中断来完成从用户空间到内核空间的控制转移。