(微电子学与固体电子学专业论文)嵌入式工控系统中linux平台研究设计与实现.pdf_第1页
(微电子学与固体电子学专业论文)嵌入式工控系统中linux平台研究设计与实现.pdf_第2页
(微电子学与固体电子学专业论文)嵌入式工控系统中linux平台研究设计与实现.pdf_第3页
(微电子学与固体电子学专业论文)嵌入式工控系统中linux平台研究设计与实现.pdf_第4页
(微电子学与固体电子学专业论文)嵌入式工控系统中linux平台研究设计与实现.pdf_第5页
已阅读5页,还剩71页未读 继续免费阅读

(微电子学与固体电子学专业论文)嵌入式工控系统中linux平台研究设计与实现.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

西北大学硕士学位论文 中文摘要 随着计算机技术的发展,嵌入式系统已成为当前最热门最有发展前途的i t 应用 领域之一,高性能微处理器和嵌入式操作系统相结合的高端应用是嵌入式系统发展的 必然趋势。u n u x 操作系统以其免费开放源码、容易移植和内核稳定等特性成为很多 用户选择操作系统的首选。 本文的主要研究内容是嵌入式工控系统中基于s 3 c 2 4 1 0 x 的l i n u x 平台研究设计 与实现。首先研究了基于l i 肌x 的嵌入式软件开发环境的构建,然后详细地分析了嵌 入式l i n u x 的系统引导程序设计;并在剖析l i n u x 内核结构的基础上,详述了l i n u x 操作系统内核的移植、定制裁剪的具体方法和过程;在分析设备驱动程序开发中,重 点分析了串口驱动、l c d 驱动、触摸屏驱动等关键驱动程序的实现和移植,并给出 了详细的实现方案。最后介绍了基于q t 肥m b e d d e d 开发应用程序的方法,并总结了将 q t o p i a 图形界面系统加入到c r a m f s 文件系统中的详细步骤。本设计的系统平台结构 合理、功能完备、用户界面友好、操作简单、可扩展性强,可以作为其他嵌入式系统 开发的良好平台和借鉴。 关键字:嵌入式系统,l i n u x ,s 3 c 2 4 1 0 x ,b o o t l o a d e r ,q t e m b e d d e d 第1 页 西北大学学位论文知识产权声明书 本人完全了解西北大学关于收集、保存、使用学位论文的规定。 学校有权保留并向国家有关部门或机构送交论文的复印件和电子版。 本人允许论文被查阅和借阅。本人授权西北大学可以将本学位论文的 全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫 描等复制手段保存和汇编本学位论文。同时授权中国科学技术信息研 究所等机构将本学位论文收录到中国学位论文全文数据库或其它 相关数据库。 保密论文待解密后适用本声明。 学位论文作者签名:i 虹指导教师签名:上丑 力桶年二月7 日夕嘲年占月夕日 西北大学学位论文独创性声明 本人声明:所呈交的学位论文是本人在导师指导下进行的研究工作及取得的研究 成果。据我所知,除了文中特别加以标注和致谢的地方外,本论文不包含其他人已经 发表或撰写过的研究成果,也不包含为获得西北大学或其它教育机构的学位或证书而 使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确 的说明并表示谢意。 学位论文作者签名:最哟 矽泌年6 月,7 日 两北人学硕j j 学位沦文 初始化设备驱动程序用到的数据结构。自动配置和初始化子程序仅在初始化时被调用 一次。 ( 2 ) 服务于i o 请求的子程序 服务于i o 请求的子程序,又称设备驱动程序的上半部。调用服务于i o 请求的 子程序是由于系统调用的结果,如r e a d 、w r i t e 调用。服务于i o 请求的子程序在执行 时,系统仍认为是与进行调用的进程属于同一进程,只是由用户态变成了核心态,具 有进行此系统调用的用户程序的运行环境,因此可以在其中调用s l e e p ( ) 等与进程环境 有关的函数。 ( 3 ) 中断服务子程序 中断服务子程序,又称为设备驱动程序的下半部。l i n u x 系统中接受硬件中断, 再由系统调用中断服务子程序。由于中断可以在任何一个进程运行时产生,因而在中 断服务子程序被调用时,不能依赖任何进程的状态,也就不能调用任何与进程运行环 境有关的函数。因为设备驱动程序一般支持同一类型的若干设备,所以一般在系统调 j 用中断服务子程序时,都带有一个或多个参数,以唯一标识请求服务的设备【3 7 1 。 在系统内部,i o 设备的存取通过一组固定的入口点来进行,入口点可以理解为 设备的句柄,即对设备进行操作的函数,这组入口点是由每个设备的设备驱动程序提 供的。在l i n u x 系统中,设备驱动程序所提供的这组入口点是由一个文件操作结构向 系统进行说明。l i n u x 下的所有字符设备和块设备的驱动程序都支持文件操作接口 f i l e _ o p e r a t i o n s ,这个结构体与虚拟文件系统密不可分。f i l e _ o p e r a t i o n s 结构定义于 u s r i n c l u d e l i n u x f s h 文件中,对于不同版本的内核f i l eo p e r a t i o n s 结构稍有不同。 s t r u c tf i l e o p e r a t i o n s s t r u c tm o d u l e 宰o w n e r ; l o f f _ t ( 木l l s e e k ) ( s t r u c tf i l e 木,l o f t t ,i n t ) ; s s i z e t ( 宰r e a d ) ( s t r u c tf i l e 宰,c h a r 木,s i z e _ t ,1 0 f f _ t 木) ; s s i z e _ t ( 卑w r i t e ) ( s t r u c tf i l e 木,c o n s tc h a r 宰,s i z e t ,l o f f _ t 水) ; i n t ( 串r e a d d i r ) ( s t r u c tf i l e4 ,v o i d 宰,f i l l d i r _ t ) ; u n s i g n e di n t ( 木p o l l ) ( s t r u c tf i l e 宰,s t r u c tp o l l t a b l e s t r u c t 宰) ; i n t ( 木i o c t l ) ( s t r u c ti n o d e4 ,s t r u c tf i l e 木,u n s i g n e di n t ,u n s i g n e dl o n g ) ; m 。t ( := m m a p ) ( s t r u c tf i l e 木,s t r u c tv m a r e a s t r u c t 串) ; i n t ( 车o p e n ) ( s t r u c ti n o d e 木,s t r u c tf i l e 木) ; i n t ( 木f l u s h ) ( s t r u c tf i l e 宰) ; i n t ( 宰r e l e a s e ) ( s t r u c ti n o d e 宰,s t r u c tf i l e 掌) ; m t ( 宰f s y n c ) ( s t r u c tf i l e 宰,s t r u c td e n t r y 车,i n td a t a s y n c ) ; r o t ( 木f a s y n c ) ( i n t ,s t r u c tf i l e 术,i n t ) ; i n t ( 木l o c k ) ( s t r u c tf i l e 木,i n t ,s t r u c tf i l e l o c k 牛) ; 两北大学硕十学位论文 s s i z e t ( 半r e a d y ) ( s t r u c tf i l e 术,c o n s ts t r u c ti o v e c 木,u n s i g n e dl o n g ,i o f f _ t 宰) ; s s i z e t ( * w r i t e v ) ( s t r u c tf i l e 木,c o n s ts t r e e ti o v e c 宰,u n s i g n e dl o n g ,l o f f _ t 木) ; s s i z e t ( 半s e n d p a g e ) ( s t r u c tf i l e4 ,s t r u c tp a g e 木,i n ts i z e _ t ,1 0 f f _ t 宰,i n t ) ; u n s i g n e dl o n g ( 术g e t _ u n m a p p e d _ a r e a ) ( s t r u c tf i l e 幸,u n s i g n e dl o n g ,u n s i g n e dl o n g ,u n s i g n e d l o n g ,u n s i g n e dl o n g ) ; ) ; f i l e 结构的成员全部是函数指针,实质上就是函数跳转表。每个进程operations 对设备的操作,都会根据主、次设备号,转换成对f i l eo p e r a t i o n s 结构的访问。常用 的操作的如下: 1 ) l s e e k :移动文件指针的位置,只能用于可以随机存取的设备; 2 )r e a d :读操作,参数b u f 为存放读取结果的缓冲区,c o u n t 为所要读取的数据 长度; 3 ) w r i t e :写操作,与r e a d 类似; 4 )r e a d d i r :取得下一个目录入口点,只有与文件系统相关的设备驱动程序使用; 5 、s e l e c t :选择操作; 6 ) ? i o c t h 读、写以外的其他操作,参数c m d 为自定义的命令; 7 )m m a p - 把设备的内容映射到地址空间,一般只有块设备驱动程序使用; 8 ) o p e n :打开设备进行f o 操作; 9 ) r e l e a s e :即c l o s e 操作。 在编写设备驱动程序时,首先要根据驱动程序的功能,完成f i l e 结构operations 中的函数,不需要的函数可以直接在f i l e结构中初始化为。o p e r a t i o n s n u l l f i l e _ o p e r a t i o n s 变量会在设备驱动程序初始化时,注册到系统内部。当操作系统对设 备进行操作时,会调用设备驱动程序注册的f i l eo p e r a t i o n s 结构中的函数指针【3 9 1 。 s t r u c tf i l e 也是设备驱动程序所使用的一个重要数据结构,主要用于与文件系统相 关的设备驱动程序,可以提供关于被打开的文件的信息。s t r u c ti n o d e 称为索引节点数 据结构,它提供了关于特别设备文件的信息。 4 1 3 设备驱动的初始化 设备驱动初始化函数主要完成的功能是: ( 1 ) 对设备驱动程序管理的硬件进行必要的初始化 对硬件寄存器进行设置。比如设置中断掩码,设置串口的工作方式、片口的数据 第4 0 页 两北人学硕i 二学位论文 方向等。 ( 2 ) 初始化设备驱动相关的参数 一般每个设备都定义一个设备变量,用于保存设备相关的参数。设备驱动的初始 化函数中需要对这些设备变量的项进行初始化。 ( 3 ) 在内核中注册设备 l i n u x 为每个设备驱动程序准备了一个注册结构,对于字符设备是d e v i c es t r u c t 结构,所有的字符设备结构都记录在向量表c h r d e v s 】中。将驱动中定义的 f i l e _ o p e r a t i o n s 类型的f o p s 指针填入到数组c h r d e v s 中以m a j o r 为下标的元素中,就 完成了向内核的注册,在需要的时候就可以调用该设备。 l i n u x 系统中,通过调用r e g i s t e r _ c h r d e v 0 ,向系统注册字符设备驱动程序。 r e g i s t e r _ c h r d e v 的定义为: 撑i n c l u d e 挣i n c l u d e i n tr e g i s t e r _ c h r d e v ( u n s i g n e di n tm a j o r ,c o n s tc h a r + n a m e ,s t r u c tf d e _ o p c r a t i o n s + f o p s ) ; 其中,m a j o r 是向系统申请的主设备号,如果为0 ,则系统为此驱动程序动态分 配一个主设备号;n a m e 是设备名;f o p s 是上述对各个调用的入口点说明。此函数返 回0 或者大于0 的值表示注册成功;返回值小于0 表示注册失败;返回e i n v a l 表 示申请的主设备号非法,一般是指主设备号大于系统所允许的最大设备号。返回 e b u s y 表示所申请的主设备号正在被其他设备程序使用。如果动态分配主设备号成 功,此函数将返回所分配的主设备号。在注册成功后主设备号、设备名会出现在 p r o c d e v i c e s 文件中。 当设备驱动模块从l i n u x 内核中卸载时,对应的主设备号必须被释放。在模块卸 载调用c l e a n u p _ m o d u l e 0 数时,需要调用下面的函数卸载设备驱动: i n tu n r e g i s t e r _ c h r d e v ( u n s i g n e di n tm a j o r ,c o n s tc h a r 木n a m e ) ; 卸载设备时,内核根据m a j o r 找到数组中对应的n a m e ,与注册时的名称对比, 如果不相等,卸载失败,并返回e i n v a l ;如果m a j o r 大于最大的设备号,返回 e i n v a l ;否则卸载成功。 ( 4 ) 注册中断 基于中断的设备驱动会在它所控制的硬件设备需要时引发一个硬件中断,l i n u x 两北人学硕上学位论史 核心再将来自硬件设备的中断传递到相应的设备驱动。设备驱动程序通过r e q u s t i r q 函数和f r e e _ i r q 函数来释放中断,它们在l i n u x s c h e d h 中定义如下: 撑i n c l u d e i n tr e q u e s t _ i r q ( u n s i g n e di n i ti r q , v o i d ( h a n d e r ) ( i n ti r q ,v o i dd e v _ i d ,s t r u c tp l r e g s 4 r e g s ) , u n s i g n e dl o n gf l a g s , c o n s tc h a r + d e v i c e , v o i d d e v _ i d ) ; i n tf r e e _ i r q ( u n s i g n e di n ti r q ,v o i d + d e v _ i d ) ; 其中参数i r q 表示所要申请的硬件中断号;h a n d l e r 为向系统登记的中断处理子程 序,中断产生时由系统来调用,调用时所带参数i r q 为中断号;d e v i d 为申请时告诉 系统的设备标识;r e g s 为中断产生时的寄存器内容;d e v i c e 为设备名;f l a g 是申请时 的选项,它决定中断处理程序的一些特性,其中最重要的是中断处理程序是快速处理 程序还是慢速处理程序。在l i n u x 系统中,中断可以被不同的中断处理程序共享1 4 1 】。 设备驱动程序在申请和释放内存时调用k m a l l o c 和k f r e e ,它们被定义为: 撑i n c l u d e v o i d + k m a l l o c ( u n s i g n e di n tl e n ,i n tp r i o r i t y ) ; v o i dk f r e e ( v o i d + o b j ) ; 其中参数l e n 为希望申请的字节数;o b j 为要释放的内存指针;p r i o r i t y 为分配内 存操作的优先级。 ( 5 ) 其他初始化工作 初始化函数一般还负责给设备申请内存、时钟和d m a 通道,分配i o 端口等系 统资源。 4 1 4 设备驱动的加载方式 l i n u x 系统的设备驱动程序有两种加载方式: ( 1 ) 静态编译进内核 静态编译到内核方式,是在设备驱动程序准备好后编译到内核中,驱动文件包含 在,l 三成的内核映像中。系统运行后,相应的设备可以i 莹接使用。这种方式系统效率比 西北人学硕l :学位论文 较高,在嵌入式l i n u x 系统中经常使用。缺点是增加了内核的大小,不能动态卸载, 不利于调试。 ( 2 ) 编译成动态可加载模块 编泽成动态可加载模块方式,是将驱动各自编译成动念可加载模块,在系统运行 过程中根据需要可以被动念地安装到内核中的方式。编译成动态可加载模块方式可以 减小内核的大小,具有较大的灵活性,但对系统功能和内存利用有负面影响。一个完 整的可加载模块包括i i l i t m o d u l e o 和c l e a n u p _ i n o d u l e o 两个函数。可加载模块通过 i n s m o d 命令加载到l i n u x 内核,从而成为内核的一部分,此时内核会调用模块中函数 i n i tm o d u l e ( ) 注册服务和申请资源;当不需要该模块时,可以使用咖m o d 命令进行卸 载,此时内核会调用模块中的函数d e 卸u pm o d u l e ( ) ,用于在模块卸载时清除掉由 i n i tm o d u l e ( ) 所作的工作,从而使内核模块可以安全地卸载。 这两种方式各有利弊,对系统资源的影响方式也不一样,适用于不同阶段。编译 成动态可加载模块方式占有较少的系统资源,有利于设备驱动模块在试验阶段的调试 和修改,适用于设备驱动程序调试过程;在调试过程结束后,应当将设备驱动程序静 态编译到内核,可以使得程序调用速度更快。 4 1 5 设备驱动程序的开发流程 在a r m 平台上开发嵌入式l i n u x 的设备驱动程序与在其他平台上开发是一样 的。实现一个嵌入式u n u x 设备驱动程序的大致流程如下【删: 1 )查看原理图,理解设备的工作原理; 2 1定义主设备号、次设备号; 3 )在设备驱动程序中实现驱动的初始化; 4 )实现所要实现的文件操作,定义f i l e - 0 p e r a t i o n s 结构; 5 1实现所需要的文件操作调用,如r e a d 、w r i t e 等; 6 )实现中断服务函数,并用r e q u e s l i r q 向内核注册,中断并不是每个设备驱动 所必须的; 7 1将发备驱动编译进内核或者编译成模块,用i s m o d 命令加载; 8 1测试设备,编写应用程序,对驱动程序进行测试。 两北大学t 页- t :学位论义 4 2 串口驱动程序的设计实现 串行通讯是在一根传输线上一位一位的传送信息,每位信息都占据一个固定的 时间长度。这种通讯方式可以借助现成的电话网进行信息传送,适合于远距离传输。 对于那些与计算机相距不远的人一机交换设备和串行存储的外部设备如终端、打印机 等,采用串行方式交换数据也很普遍。串行通讯模块是嵌入式系统中常见的组成部分, 以其使用方便、编程简单的特点被广泛用于系统调试和与外界通信中,在嵌入式系统 中实现串口驱动具有相当重要的意义。本文硬件平台中通过$ 3 c 2 4 1 0 x 的u a r t ( 通 用异步收发器) ,用m a x 3 2 3 2 芯片进行电平转换,实现了与p c 机的串口通讯。 4 2 1 串口工作原理 $ 3 c 2 4 1 0 x 的u a r t 单元提供3 个独立的异步串彳t i o n ,每个异步串口均可工作于 中断模式或d m a 模式,即u a r t 能产生内部中断请求或d m a 请求,在c p u 和u a r t 之间传输数据。u a r t 支持高达2 3 0 4 kb p s 的传输速率,如果使用外部时钟,u a r t 能达到更高的速率。每个u a r t 通道包含了两个1 6 字节的分别用于接受和发送数据的 f i f o 通道。 $ 3 c 2 4 1 0 x 的u a r t 单元特性包括:波特率可编程,支持红外发送与接收,1 2 个 停止位,5 、6 、7 或8 个数据位,奇偶校验。每个异步串口都具有独立的波特率发生 器、发送器、接收器和控制单元。波特率发生器可由片内系统时钟驱动,或由外部时 钟驱动。发送器包含1 6 个字节的发送数据f i f o 年 1 发送移位器,接收器包含1 6 个字节 的接收数据f i f o 和接收移位器。待发送的数据首先传送到发送数据f i f o ,然后拷贝 到发送移位器并通过发送数据引脚( t x d n ) 发送出去;接收数据首先从接收数据引 脚( r x d n ) 移入接收移位器,当接收到一个字节时就拷贝到接收数据f i f o 。 串口在电气连接上有3 w i r e 和9 w i r e 两种。3 w i r e 的接线方式定义了发送、接收和 地三根连接;在9 w i r e 串口中增加了d c d ,d t r ,d s r ,r t s ,c t s ,d e l l 六个控 制线,其中r t s 和c t s 用f 自动流控制( a f c ) ,其它的用于与m o d e r m 相连时的流 控制。$ 3 c 2 4 1 0 x 中的u a r t 0 、u a r t l 都是9 w i r e 支持自动流控制的串行接f 。u a r t 2 没有n c t s 和n r t s 信号,不支持a f c 功能。本系统硬件平台扩展了u a r t 0 ,串口 驱动参数配置如下:数据位:8 b i t 、奇偶校验位:九、停止位:1b i t 、传输方式:中 第4 4 叽 两北人学顾 j 学位论文 图4 1l n u x 下通信数据流和功能调用 4 2 2 终端设备和控制台 终端包括了3 种类型:控制台、串口和伪终端。控制台是与操作系统内核本身交 互的用于系统引导、控制和管理的终端,它可以是内核本身的内部显示终端,也可以 是通过串口连接的外部哑终端。内核终端对用户来说具有若干个虚拟终端子设备,它 们共享同一物理终端,但同一时刻只能有一个虚拟终端操作硬件。串口终端是最原始 的终端类型,串口驱动程序通常是通过t t y 设备驱动注册的。伪终端在逻辑上是终端 设备,物理上却不是。伪终端总是成对的使用,每个主设备号为2 的伪终端主设备都 对应着一个主设备号为3 的伪终端从设备。伪终端主要用于应用进程和s h e l l 的通信。 主发备号为4 、次设备号为0 的d e v t t v o 代表着当前控制台,次设备号1 6 3 分别 为d e v t t y l 至d e v t t y 6 3 代表着6 3 个虚拟终端,次设备号6 4 2 5 5 分别为d e v t t y s 0 至 第4 6 页 两北人学硕l :学位论文 d e v t t v s l 9 1 代表着1 9 2 个可能的u a r t 串口,即般的串行设备。 d e v 目录下主设备号为5 的字符设备统称为“替换”( a l t e m a t e ) 终端设备。次设 备号6 4 2 2 5 分别为d e v c u a 0 至d e v c u a l 9 1 ,共1 9 2 个使用串行口的终端设备,称为 “c a l l o u t ”终端设备,与d e v t t y s 0 至d e v t t y s l 9 1 相对应的。c u a 设备和t t y s 设备一 般是成对出现的,它们的主要区别在于与主机的连接方式不同:c u a 设备与主机的连 接是动态的,t t v s 设备与主机是静态连接的。 4 2 3 串口驱动程序的设计实现 现在几乎所有的串口都是8 2 5 0 1 6 5 5 0 兼容的,针对本系统硬件平台只要修改 8 2 5 0 1 6 5 5 0 的串口驱动函数d r i v e r s e r i a l s e r i a l8 2 5 0 c 文件为适合本系统硬件平台的 s e r i a ls 3 c 2 4 1 0 c 文件即可【4 2 1 。s e r i a ls 3 c 2 4 1 0 c 文件主要包括串口初始化程序 s 3 c 2 4 1 0 u a r i - i n i t 、串口操作结构体s 3 c 2 4 1 0 - p o p s 、中断处理程序等一系列函数。 在系统初始化时会执行m o d u l e j n i t ( s 3 c 2 4 1 0 u a r t j n i t ) 函数,调用s 3 c 2 4 1 c h j a n - i n i t o 函数完成对串口驱动结构体的定义、赋值和注册,检查u a r t 的端口是否正在使用, 初始化u 舢玎硬件设备,向内核注册该设备的操作函数接口。 串口操作结构体s 3 c 2 4 1 0 坤o p s 是连接s e r i a l r e 和底层硬件驱动操作的最主要的 一系列函数。需要逐个完成以下函数: 1 )s 3 c 2 4 1 0 u a n j x e m p t y ( ) :测试发送f i f o 或移位寄存器是否为空; 2 1 s 3 c 2 4 1 0 u a r ts e tm c t r l ( ) :设置m o d e m 控制线的输出状态; 3 )s 3 c 2 4 1 0 u a n 拶t m c t r l ( ) :返回m o d e m 控制线的输入状态; 4 ) s 3 c 2 4 1 0 u a r ts t o pt x ( ) :停止发送数据; 5 )s 3 c 2 4 1 0 u a r l s t a r l t x ( ) :开始发送数据; 6 ) s 3 c 2 4 1 0 u a ns t o pr x ( ) :停止接受数据,端口被关闭; 7 )s 3 c 2 4 1 0 u a r l e n a b l e m s ( ) :开启m o d e m 状态中断: 8 )s 3 c 2 4 1 0 u a r t - b r e a k j t l ( ) :设置是否发送b r e a k 信号; 9 )s 3 c 2 4 1 0 u a r l g e l m c t r l ( ) :返回m o d e m 控制线的输入状态; 1 0 ) s 3 c 2 4 1 0 u a n - - s t a n u p ( ) :启动串口; 1 1 ) s 3 c 2 4 1 0 u a r ts h u t d o w n ( ) :关闭串口,释放中断资源; 1 2 ) s 3 c 2 4 1 0 u a r t _ c h a n g e s p e e d ( ) :改变串口数据帧格式和速度; 第4 7 吹 西北人学硕1 :学位论文 1 3 ) s 3 c 2 4 1 0 u a r tt y p e ( ) :返回描述串口的字符串指针; 1 4 ) s 3 c 2 4 1 0 u a r t _ c o n f i g _ p o r t ( ) :执行串口控制器的自动配置; 1 5 ) s 3 c 2 4 1 0 u a r tr e l e a s ep o r t ( ) :释放内存和i o 等空问资源; 1 6 ) s 3 c 2 4 1 0 u a r tr e q u e s tp o r t ( ) :申请内存和f o 等空| 自j 资源。 用户程序和硬件之间利用缓冲技术建立联系,缓冲区f l i pb u f f e r 将驱动程序层和 硬件层隔离开来。中断处理函数注册时将缓冲区地址传递给操作系统的驱动程序,用 户对硬件层的访问实际上是对这个缓冲区的访问。只要提供系统硬件的中断处理程 序,缓冲区即可与硬件层进行数据交换。 接受数据时,数据到达会产生中断。接收中断处理程序s 3 c 2 4 1 0 u a r tr xi n t e r r u p t ( ) 通过循环检测状态寄存器u t r s t a t 判断接收缓冲区中是否有数据,若有数据并 且串口设备的输入缓冲区未满,则从u r x h 寄存器中读数据,并将其放入串口设备 的输入缓冲区f l i pb u f f e r 中。中断服务程序上半段结束,给c p u 时间处理其他更高 级别的中断。然后进人该中断的下半段,把f l i pb u f f e r 缓冲区中的数据传输到 t t yb u f f e r 中。此时可以通过r e a d 函数,调用1 r y 层和t r y 行规程层的r e a d 函数接 收字符。 发送数据时,首先调用t 1 层的t t y函数,然后向下传递到终端线路规程write ( t t y) 的函数,并产生一个中断函数。通过发送中断处理程序1 d i s c w r i t e s 3 c 2 4 1 0 u a r tt xi n t e r r u p t ( ) 调用硬件设备的w r i t e 函数,从缓冲区中取出数据写入硬 件层。 串口的驱动程序编写好后,测试无误后将串口驱动程序加载到内核中。首先需要 修改k e m e l d r i v e r s e r i a l c o n f i g i n 文件,增加如下代码: d e p _ b o o l $ 3 c 2 4 1 0s e r i a lp o r ts u p p o r t c o n f i gs e r l u l $ 3 c 2 4 1 0 $ c o n f i ga r c h _ s 3 c 2 4 1 0 d e p _ b o o l c o n s o l eo n s 3 c 2 4 1 0s e r i a lp o r t c o n f i g s e r l 业s 3 c 2 4 1 0c o n s o l e $ c o n f i gs e r l 战3 c 2 4 1 0 修改k e r n e l d r i v e r s e r i a l m a k e f i l e 文件,增加如下代码: o b i - $ ( c o n f i g s e r l 气l l $ 3 c 2 4 1 0 ) + = s e r i a l s 3 c 2 4 1 0 o 重新编译内核,在字符设备配置c h a r a c t e rd e v i c e sf 串行设备驱动s e r i a ls u p p o r t 子项中,将$ 3 c 2 4 1 0s e r i a lp o r ts u p p o r t 和c o n s o l eo n $ 3 c 2 4 1 0s e r i a lp o r t 选“y ”即可。 如i 司4 2 所示,串口驱动程序加载到内核过程的抓图。 两北人学倾l 学位论文 图4 2 串口驱动程序加载到内核过程抓图 4 3l c d 驱动程序的设计实现 液晶显示屏l c d ( “q u i dc r y s t a ld i s p l a y ) ,主要用于文本、图形及图像信息的显 示,具有轻薄、体积小、功耗小、控制驱动方便、接口简单易用、无辐射、平面直角 显示及影像稳定不闪烁等特点,在嵌入式系统中作为人机界面获得了广泛的应用。液 晶显示屏按显示原理可分为超扭曲向列s t n ( s u p e rt 州s t e dn e m a t i c ) 型和薄膜晶体 管耵可( 1 1 h i nf i l mt r a n s i s t o r ) 型。s t n 液晶显示屏与液晶材料、光线的干涉现象有 关,显示的色调以淡绿色和橘色为主。t f t 液晶显示器被广泛应用于电脑的液晶显示 设备。 4 3 1s 3 c 2 4 1 0 xl c d 控制器概述 s 3 c 2 4 1 0 x 处理器内部集成了l c d 控制器,其主要功能是传输显示数据和产生 控制信号,并支持屏幕水平和垂直滚动显示,采用d m a ( 直接内存访问) 方式传送 数据。本系统中中采用的是u 9 j 5 1 5 x as t n 彩色液晶屏,在3 2 0 术2 4 0 分辨率f o 提 供8 位彩色显示。 s 3 c 2 4 1 0 xl c d 控制器主要提供液晶显示器显示数据的传送、时钟和各种倍l j f 内 产生与控制功能,其结构框图如h4 3 所示。其中v f 蝴e 、v l i n e 、 两北人学硕上学位论文 图4 3 $ 3 c 2 4 1 0 xl c d 控制器框图 v c l k 、v m 是用于传输显示数据和产生控制信号,v d 2 3 :0 是用于传输显示数据。 $ 3 c 2 4 1 0 xl c d 控制器包含r e g b a n k ,l c d c d m a ,v i d p r c s ,t i m e g e n 和 l p c 3 6 0 0 等控制模块。r e g b a n k 中有1 7 个可编程的寄存器用于配置l c d 控制器。 l c d c d m a 是一个专用的d m a ,它负责自动地将帧缓冲区中的显示数据发往l c d 驱动器。通过特定的d m a ,显示数据可以不需要c p u 的干涉,自动的发送到屏幕上。 v i d p r c s 将l c d c d m a 发送过来的数据转换为合适的格式之后通过v d 2 3 :0 发送到 l c d 驱动器。t i m e g e n 用于支持不同l c d 驱动器对时序以及速率的需求, v f r a m e ,v l i n e ,v c l k ,v m 等控制信号由t i m e g e n 产生。 4 3 2 帧缓冲设备介绍 帧缓冲设备f r a m e b u f f e r 是出现在l i n u x2 2 x x 内核当中的一种驱动程序接口, 对应的源文件在k e r n e l d r i v e r s v i d e o 目录下,当用户使用q t 、m i n i g u i 、m i c r o w i n d o w s 等图形用户接口时,l c d 的设备驱动程序必须以l i n u xf r a m e b u f f e r 驱动形式实现【4 3 1 。 f r a m e b u f f e r 是l i n u x 为图形显示设备提供的一个接口,是把显存抽象后的一种 设备,它允许上层应用程序在图形模式下直接对显示缓冲区进行读写和i o 控制等操 作。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由f r a m e b u f f e r 设备驱动来完成的。对于用户来说f r a m e b u f f e r 就是一块内存,用户既可以向罩:写入 两北人学硕1 学位论文 4 ) s t r u c tf b _ c m a p ( ) :是与设备无关的调色板信息; 5 ) s t r u c td i s p l a y :帧缓存设备与控制台驱动的接口。 编写帧缓冲设备驱动程序主要完成以下工作: ( 1 ) 编写初始化程序 初始化函数首先初始化l c d 控制器,设置显示模式和显示颜色数,然后分配l c d 显示缓冲区。在l i n u x 中可以用k m a l l o c 0 函数分配一段连续的空间。本系统采用的 l c d 显示方式为3 2 0 * 2 4 0 ,1 6 级灰度,需要分配的显示缓冲区为:3 2 0 * 2 4 0 * 4 8 = 3 7 5 k 字节。缓冲区通常分配在片外s d r a m 中,起始地址保存在$ 3 c 2 4 1 0 xl c d 控制器 中。最后初始化s t r u c tf bi n f o 来填充其中的变量,通过调用 r e g i s t e r f r a m e b u f f e r ( & f b _ i n f o ) ,向内核中登记f b i n f o l 4 4 l 。 ( 2 ) 编写f b i n f o 中函数指针f b o p s 对应的成员函数 本系统只需要编写s t r u c tf bo p s 中的三个函数即可,该函数位于s t r u c tf bi n f o 中。 s t r u c tf t , o p s ? i n t ( + f b _ g e t f l x ) ( s t r u c ti b f i x s c r e e n i n f o f i x ,i n t c o n ,s t r u c tf b i n f o + i n f o ) ; i n t ( 奉f b _ g e t v a 唢s t r u c tf b v a r s c r e e n i n f o v a r , i n tc o b ,s t r u c tf b i n f o 。i n f o ) ; h a t ( * f bs e tv a r ) ( s t r u c tf b v a t s c r e e n i n f o + v a r , i n tc o n ,s t r u c tf b _ i n f o + i n f o ) ; k s t r u c tf bo p s 在k e m e l i n c l u d e l i n u x f b h 中定义。这些函数都是用来设置获取 f bo p s 结构中的成员变量的,当应用程序对设备进行i o c t l 操作时会调用它们。对于 f b _ g e t _ f i x 0 ,应用程序进入的是f b s c r e e n i n f o 结构,在函数中对其成员变量赋值,主 要是缓冲区起始地址s m e ms t a r t 和缓冲区长度s m e nl e n ,最终返回给应用程序。而 f bs e tv a r ( ) 函数的传入参数是f b v a r s c r e e n i n f o ,函数中需要对x r e s ,y r e s 和 b i t s _ p e r _ _ p i x e l 赋值【4 5 1 。 对显示设备d e v f b 的操作主要有以下几种: 1 )读写( r e a d w i t e ) d e v f b :相当于读写屏幕缓冲区: 2 )映射( m a p ) 操作:通过映射操作,将屏幕缓冲区的物理地址映射到用户空 间的1 段虚拟地址中,用户即可通过读写这段虚拟地珧访问屏幕缓冲区,在 屏幕j 二绘图和图片显示; 3 )f o 控制:对于帧缓冲设备,对设备文件的i o c t l 操作可渎墩设置显示设备及 西北人学硕i :学位论文 4 4 触摸屏驱动程序的设计实现 触摸屏是附着在显示器的表面,根据显示屏表面的接触由电脑来识别其位置的装 置。触摸屏作为一种输入设备,具有反应速度快、节省空间、易于交流的优点,在便 携式手持设备中广泛的应用。 4 4 1 触摸屏工作原理介绍 触摸屏由触摸监测部件和触摸屏控制器两部分组成。触摸监测部件安装在显示器 屏幕的前端,主要作用是检测用户的触摸位置,并传送给触摸屏控制电路。触摸屏控 制器的主要作用是从触摸点监测装置上接收触摸信息,并将它装换为触点坐标传送给 处理器,同时还接收处理器发来的命令并加以执行。 按照触摸屏的工作原理以及传输信息的介质,常用的触摸屏主要有矢量压力传感 式、电阻式、电容式、红外线式和表面声波式等多种类型。其中电阻式触摸屏结构简 单,成本低,透光效果好,工作环境和外界隔离,不怕灰尘和水气,同时还具有高解 析度、高速传输反应、一次校正、稳定性高、不漂移等优点,因而广泛用于工业控制 领域。电阻式触摸屏又分为四线式和五线式两种。本系统的硬件平台使用四线电阻式 触摸屏,点数为3 2 0 宰2 4 0 。 电阻触摸屏是一个多层的透明的复合薄膜屏。由一层玻璃或有机玻璃构成基层, 表面涂有一层透明的导电层,最外面是一层外表面经过硬化处理过的光滑防刮的塑料 层;它的内表面也涂有二层透明的导电层:这两个薄层被非常薄的绝缘层隔开,绝缘 层通常以塑料微粒子的形式存在。电阻触摸屏等效电路见图4 5 所示。未接触触摸屏 时,两层导电层出于开路状态;当触摸屏幕时,会使平常绝缘的两层导电层在触摸点 位置处连接,控制器检测到这个接通后,其中一面导电层接通y 轴方向的5 v 均匀电 压场,另一导电层将接触点的电压引至控制电路进行,d 转换,得到电压值后与5 v 相比即可得触摸点的y 轴坐标,同理得出x 轴的坐标。 触摸屏控制器分时向x 、y 电极对施加电压,并把所得电压值转换为该触摸点的 坐标值。s 3 c 2 4 1 0 x 处理器内置采用近似比较算法的8 通道1 0 位a d c ( 模数转化器) 。 s 3 c 2 4 1 0 x 处理器有8 个如转换输入通道,其中通道7 作为触摸屏接口的x 坐标 输入,通道5 作为触摸屏接口的y 坐标输入。 西北人学硕l j 学位论文 e 图4 5 触摸屏等效电路 q 1 触摸屏主要有以下四种工作模式: 1 1a d c 普通转换模式:与通用的a ,d 转换模式相似; 2 )独立x 轴坐标转换模式:这种模式要进行两次坐标转换中断,在x 转换 模式中将x 坐标转换数值写入a d c 数据寄存器0 ,然后产生中断;同样的 在y 模式下,将y 坐标写入a d c 数据寄存器1 ,然后产生中断; 3 )自动x 轴坐标转换模式:触摸屏控制器自动完成x 轴坐标和y 轴坐标转 换,并读取两个坐标轴方向上的坐标,随后产生相应的中断。 4 )中断等待模式:在触摸笔点到触摸屏上时,控制器产生i 哪c 中断信号。 中断产生后,可以设置适当的转换模式来读取x 坐标和y 坐标。 4 4 2 触摸屏驱动程序的设计实现 触摸屏驱动程序的设计主要是结合本系统硬件工作原理实现初始化函数、触摸屏 接口函数以及中断处理函数。 模块初始化是通过调用s 3 c 2 4 1 0 - t s j

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论