基于 Linux 的 Intel Xscale PXA27X 的 LED 驱动程序.doc
《基于 Linux 的 Intel Xscale PXA27X 的 LED 驱动程序.doc》由会员分享,可在线阅读,更多相关《基于 Linux 的 Intel Xscale PXA27X 的 LED 驱动程序.doc(9页珍藏版)》请在三一办公上搜索。
1、精品论文基于 Linux 的 Intel Xscale PXA27X 的 LED 驱动程序实例开发王鑫 中国矿业大学信息与电气工程学院,徐州(221008) E-mail:wangxinshandong摘要:本文首先介绍了嵌入式Linux系统在PXA27X上的开发流程,进而介绍了设备驱动 的概念和功能。然后结合具体的YLE-PXA270开发板介绍了基于Linux下Intel Xscale PXA27X 的LED驱动及测试程序的设计,并介绍了以模块形式加载的过程,和编写、编译和调试的方法与步骤,并给出了部分驱动程序和测试程序的核心代码。为方便使用make工具编译的读者,还给出了Makefile文
2、件的完整详细的代码。给出了在YLE-PXA270开发板上的具体开发 与实验得出的有效而正确快速的调试与测试方法步骤。本设备驱动程序编写的思路严格按照 Linux下设备驱动程序的要求, 对其它基于Linux的设备驱动有很强的参考意义。关键词:Linux;LED;驱动;测试程序1. 前言目前, 嵌入式系统的开发已经离不开操作系统的支持, 而开发基于嵌入式操作系统的底 层硬件驱动程序是研发中必不可少的工作之一。Strong ARM 处理器将 Intel 处理器技术和 AMR 体系结构融为一体,致力于为手提式通信和消费电子类设备提供理想的解决方案。Intel XScale 微体系结构则提供全性能、高性
3、价比、低功耗的解决方案,支持 16 位 Thumb 指令和 集成数字信号处理(DSP)指令。XScale 架构微处理器是 Intel 公司针对目前新信息家电发展的 大量需求之下,发展的 Strong ARM 嵌入式处理器的第二代微处理器架构,Intel 公司在 2004 年 IDF 展览会上发布代号为 Bulverde 的 PXA27X 处理器,PXA27X 嵌入式处理器提供了业 界领先的多媒体性能,丰富的外设集成,它的设计面向于无线客户端,应用了第二代内存堆 栈技术,这使得它能够满足大多数在移动领域的应用需求。2. 嵌入式 Linux 系统在 PXA27X 上的开发嵌入式 Linux 系统在
4、 PXA27X 上的开发流程如下:1开发环境的建立2.Bootloader3.Linux 系统在 PXA27X平台上的移植4.嵌入式文件系统5.Linux 设备驱动程序开发6.嵌入式 GUI嵌入式操作系统位于低层硬件与用户之间,是两者沟通的桥梁,用户可以通过操作系统的用户界面来输入命令,操作系统则对命令进行解释,驱动硬件设备,实现用户的需求。设 备驱动可以理解为操作系统的一部分,设备驱动程序控制了操作系统和硬件设备之间的交 互。Linux 设备驱动程序在 Linux 的内核源代码中占有很大的比例,源代码长度的日益增加 主要是驱动程序的增加。对于一个特定的硬件设备来说,其对应的设备驱动程序是不同
5、的,- 5 -比如网卡,声卡,键盘,鼠标,摄像头,LED 跑马灯等。对于操作系统来说,挂接的设备越多,所需的设备驱动程序也越多。在嵌入式系统设计过程中,没有通用的驱动程序可使用, 驱动程序开发是整个嵌入式设计过程中必不可少的一部分。设备驱动主要完成以下功能:z对设备进行初始化;z使设备投入运行和退出服务;z从设备接收数据并将它们送回内核;z将数据从内核送到设备;z检测和处理设备出现的错误。图 1设备管理系统层次结构系统调用是操作系统内核与应用程序之间的接口,驱动程序则是操作系统内核与机器硬 件的接口。设备驱动程序能够直接访问硬件的代码,必须为应用程序提供系统调用,以便应 用程序能够访问设备,在
6、 Linux 中,主要有 3 种设备,即字符设备,块设备和网络设备,与 此相关的主要有 3 类设备驱动程序,即字符设备驱动程序,块设备驱动程序和网络设备驱动 程序。它们的系统调用是一致的,采用统一接口(在数据结构 file_operations 中)。应用程 序使用设备就像使用读/写普通的文字一样方便,使用相同的 open(),close(),read(),write()等, 真正做到了与设备无关1。通常,Linux 驱动程序接口分为如下 4 层:z应用程序进程与内核的接口;z内核与文件系统的接口;z文件系统与设备驱动程序的接口;z设备驱动程序与硬件设备的接口;在系统内部 I/O 设备的存取通
7、过一组固定的入口点来进行,这组入口点是由每个设备的 驱动程序提供的。具体的 Linux 系统里,设备驱动程序所提供的这组入口点有一个 file_operations 数据结构来向系统进行说明。3. LED 驱动程序设计Linux 的设备驱动程序可以分为 3 个主要组成部分:z自动配置和初始化子程序,负责检测所要驱动的硬件设备是否存在和是否能正常工 作。如果设备正常,则对这个设备及其相关设备的相关驱动程序需要的软件状态进 行初始化。这部分驱动程序仅在初始化时被调用一次。z服务于 I/O 请求的子程序,又称为驱动车虚的上半部分。调用这部分程序是由于系 统调用的结果,这部分程序在执行时系统仍认为是和
8、进行调用的进程属于同一个进 程,只是由用户态变成了核心态,具有进行此系统调用的用户程序的运行环境,因 此可以在其中调用 sleep()等与进程运行相关的函数。z中断服务子程序,又称为驱动程序的下半部分。在 Linux 系统中,并不是直接从中 断向量表中调用设备驱动程序的中断服务子程序,而是由 Linux 系统来接收硬件中断,再由系统调用中断服务子程序。中断可以产生在任何一个程序运行时,因此在 中断服务程序被调用时,不能依赖于任何进程的状态,也就不能调用任何与进程运 行环境运行有关的函数。因此设备驱动程序一般支持同一类型的若干设备,所以一 般在系统调用中断服务子程序时都带有一个或多个参数,以唯一
9、表示请求服务的设 备。在 Linux 系统里,对中断的处理是属于系统核心部分,因而如果设备与系统之 间以中断方式进行数据交换,就必须把该设备的驱动程序作为系统核心的一部分,设备驱动程序通过调用 request_irq 函数来申请中断,通过 free_irq 来释放中断。 从程序结构角度而言,驱动程序是子程序和数据的集合,是输入输出设备的软件接接口,它的任务就是向系统提供接口函数,从而实现对系统中各种设备进行访问的功能,所以简单 的说编写驱动程序就是实现这接口函数。针对不同的设备,驱动程序分三类:字符设备驱动、 块设备驱动、网络设备驱动,下面首先介绍 Linux 系统的三种设备。1字符设备 可以
10、像文件一样访问字符设备,字符设备驱动程序负责实现这些行为。这样的驱动程序通常会实现 open,close,read 和 write 系统调用。系统控制台和并口就是字符设备的例子, 它们可以很好地用流概念描述。通过文件系统节点可以访问字符设备,例如/dev/tty1 和/dev/lp1。2块设备块设备是文件系统的宿主,如磁盘。在大多数 Unix 系统中,只能将块设备看作对多个 块进行访问,一个块设备通常是 1K 字节数据。Linux 允许用户象字符设备那样读取块设 备允许一次传输任意数目的字节。结果是,块设备和字符设备只在内核内部的管理上有 所区别,因此也就是在内核/驱动程序间的软件接口上有所区
11、别。3网络设备 任何网络事务处理都是通过接口实现的,即,可以和其他宿主交换数据的设备。通常,接口是一个硬件设备,但也可以象 loopback(回路)接口一样是软件工具。网络接口是由内 核网络子系统驱动的,它负责发送和接收数据包,而且无需了解每次事务是如何映射到实际 被发送的数据包。尽管“telnet”和“ftp”连接都是面向流的,它们使用同样的设备进行传输; 但设备并没有看到任何流,仅看到数据报。由于不是面向流的设备,所以网络接口不能象/dev/tty1 那样简单地映射到文件系统的节点上。Unix 调用这些接口的方式是给它们分配一个 独立的名字(如 eth0)。这样的名字在文件系统中并没有对应
12、项。内核和网络设备驱动程序之间的通信与字符设备驱动程序和块设备驱动程序与内核间的通信是完全不一样的。内核不再调用 read,write,它调用与数据包传送相关的函数。图 2 设备驱动程序的工作过程如前所述,设备驱动程序是一组由内核中的相关子例程和数据组成的 I/0 设备软件接口。 每当内核意识到要对某个设备进行特殊的操作时,它就调用相应的驱动例程。这就使得控制 从用户进程转移到了驱动例程,当驱动例程完成后控制又被返回至用户进程。图 2 就显示了 以上的过程。系统调用是操作系统内核、应用程序之间的接口,设备驱动程序是操作系统内 核、机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样
13、在应用程序看 来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。 设备驱动程序是内核的一部分,它完成以下的功能;z对设备初始化和释放。z把数据从内核传送到硬件和从硬件读取数据。z读取应用程序传送给设备文件的数据和回送应用程序请求的数据。 z检测和处理设备出现的错误。 每个设备驱动程序都具有以下几个特性:z具有一整套的和硬件设备通讯的例程,并且提供给操作系统一套标准的软件接口。z具有一个可以被操作系统动态地调用和移除的自包含组件。 z可以控制和管理用户程序和物理设备之间的数据流。 由于存在这些特点,本课题中将它们的共同点提炼出来,形成一个驱动程序框架。这样就可 以简
14、化驱动程序的编程开发。3.1 主要数据结构1struct device struct 系统启动过程中要登记的块设备和字符设备管理表的定义在文件 fs/devices.c 中: struct device structconst char*name;struct file_operations*fops;static struct device_struct chrdevsMAX_CHRDEV;static struct device_struct blkdevsMAX BLKDEV;其实块设备表和字符设备表使用了相同的数据结构。在某些系统中,这些设备表也称作 设备开关表,不同的是它们直接定义了
15、一组函数指针进行对设备的管理。而这里系统用文件 操作(file_operations)代替了那组开关。文件操作是文件系统与设备驱动程序之间的接口,系 统特殊文件在建立的时候并没有把两者对应起来,只是把设备的缺省文件结构和 i 节点结构 赋给设备文件,而真正的对应定义在系统启动之后,当设备被打开时才进行的。操作 blkdev_open 和 chrdev_open 定义在文件 devices.c 中,它们的基本功能是当设备 文件初次打开时,根抓该文件的 i 节点信息找到设备真正的文件操作接口,然后更新原 来的设备表项;最后再调用该设备的 open 操作。/include/linux/major.h
16、 中定义了设备表的长 度。设备表中不同的表项表示不同种类的设备,也就是说,LINUX 系统分别支持各 128 种 不同的块设备和字符设备。2struct file_operations操作系统将每个外部设备当作文件来处理,内核通过 file_operations 结构来访问 driver 的功能。file_operations 的定义在文件中。每个字符设备都有一个 file_operatioins 结构。这个结构指向一组操作函数(open,read.)。每个函数的定义由 driver 提供。当然,有 些标准操作某些设备并不支持,这时,file_operatons 结构中对应表项为 NULL。(
17、随着 linux 内核的不断升级,file_op eratioins 结构也不断变大。最新的版本中,甚至函数原型也发生了 一些变化。当然,新版本总会向下兼容的。)结构的每一个成员的名字都对应着一个系统调用。用户进程利用系统调用在对设备文件 进行诸如 read/write 操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序, 然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。这是 linux 的设备驱动 程序工作的基本原理。既然是这样,则编写设备驱动程序的主要工作就是编写子函数,并填 充 file_operations 的各个域。3.2 模块化模块化的概念 Linux 中的可
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Linux Intel Xscale PXA27X LED 驱动程序
链接地址:https://www.31ppt.com/p-5197695.html