文档详情

linux设备驱动开发实例..doc

发布:2017-01-08约字共38页下载文档
文本预览下载声明
·1 基础知识 设备驱动的作用:任何一个计算机系统的运行都是系统中软硬件协作的结果,没有硬件的软件是空中楼阁,没有软件的硬件则是一堆废铁。硬件是底层基础,是所有软件得以运行的平台,代码最终会落实为硬件上的组合逻辑与时序逻辑;软件则实现了具体应用,它按照各种不同的业务需求而设计,满足了用户的需求。软件和硬件不应该相互渗透到对方的领域。为了尽快的完成设计,应用软件工程师不想也不必关心硬件,而硬件工程师也难掌握软件编程语言。例如,应用软件工程师在使用printf函数输出信息的时候,他不用知道具体底层是怎么实现将信息输出到显示屏或者串口上的。也就是说,应用软件工程师需要看到的是一个没有硬件的纯粹的软件世界,他不用知道底层的硬件原理,而是通过一些通用的接口函数就可以操作。那么这些接口函数是怎么提供给上层的软件工程师的呢,那这个艰巨的任务就落在了驱动工程师的头上。 驱动程序在 Linux 内核里扮演着特殊的角色. 它们是截然不同的黑盒子, 使硬件的特殊的一部分响应定义好的内部编程接口. 它们完全隐藏了设备工作的细节. 用户的活动通过一套标准化的调用来进行, 这些调用与特别的驱动是独立的; 设备驱动的角色就是将这些调用映射到作用于实际硬件的和设备相关的操作上. 这个编程接口是这样, 驱动可以与内核的其他部分分开建立, 并在需要的时候在运行时插入. 这种模块化使得 Linux 驱动易写, 以致于目前有几百个驱动可用.总而言之:驱动就是linux给用户操作硬件提供的一个接口,它是一个存在于应用程序和实际设备间的软件层。 由此可见,设备驱动充当了硬件和应用软件之间的纽带,它使得应用软件只需要调用系统的一些应用编程接口(API)就可以让硬件去完成相应的操作。在没有操作系统的情况下,我们可以根据硬件设备的特点利用汇编和C语言的混合编程来操作硬件。在有操作系统的情况下,设备驱动的结构则由相应的操作系统定义,然后驱动工程师必须按照相应的架构设计设备驱动,这样,设备驱动才能良好的整合到操作系统的内核中。 并不是所有的计算机系统都一定要运行操作系统,在许多情况下操作系统是不必要的。对于一些功能比较单一、控制并不复杂的系统,如公交车刷卡机、电冰箱、微波炉、简单的手机和小灵通等,并不需要多任务调度、文件系统、内存管理等复杂功能,用单任务架构完全可以很好的支持它们的工作。一个无限循环中夹杂对设备中断的检测或者对设备的轮询是这种系统中软件的典型架构。在这样的系统中,虽然不存在操作系统,但是设备驱动往往是必须存在的。一般情况下,对每一种设备驱动都会定义 那么如果计算机系统中包含了操作系统,那么设备驱动会变得怎样呢?首先我们要知道操作系统的功能。操作系统的主要功能:进程管理、内存管理、文件管理、设备控制和网络管理等。操作系统的存在它要求设备驱动附加更多的代码和功能,把单一的“驱动硬件设备行动”变成了操作系统内与硬件交互的模块,它对外呈现为操作系统的API。此时我们需要将设备驱动融入到内核中。为了实现这个融合,必须在所有的设备驱动中设计面向操作系统内核的接口,这样的接口由操作系统规定。我们的linux操作系统是一个开源的操作系统,Linux 的众多优良特性之一就是可以在运行时扩展由内核提供的特性的能力. 这意味着你可以在系统正在运行着的时候增加内核的功能(也可以去除).每块可以在运行时添加到内核的代码, 被称为一个模块. Linux 内核提供了对许多模块类型的支持, 包括但不限于设备驱动. 每个模块由目标代码组成( 没有连接成一个完整可执行文件 ), 可以动态连接到运行中的内核中, 通过 insmod安装模块程序, 以及通过 rmmod 移除模块. Linux内核的划分如图所示: 计算机系统的硬件主要由CPU、存储器和外设组成。随着IC制造工艺的发展,目前,芯片的集成度越来越高,往往在CPU内部就集成了存储器和外设适配器。ARM、PowerPC、MIPS等处理器都集成了UART、IIC控制器、USB控制器、SDRAM控制器等,有的处理器还集成了片内RAM和Flash。 驱动针对的对象是存储器和外设(包括CPU内部集成的存储器和外设),而不是针对CPU核。Linux将存储器和外设分为3 种基本设备类型(字符设备、块设备、网络设备). 每个模块常常实现 3 种设备类型中的 1 种, 因此可分类成字符模块, 块模块,网络模块. 3类设备如下: 字符设备:一个字符( char ) 设备是一种可以当作一个字节流来存取的设备( 如同一个文件 ); 它是必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等。这样的驱动常常至少实现 open, close, read, 和 write 系统调用. 它不经过系统的快速缓冲。 块设备:如同字符设备, 它可以用任意顺序进行访问,
显示全部
相似文档