




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
前言 随着我国工业化的高速发展,对工业自动控制的要求也在不断地增长和提高。触摸屏,作为一种可视化的人机接口,以其小体积和高可靠性的特点逐步取代传统的按钮控制和仪表控制,成为工控界人机接口的主流。本文分析了触摸屏设备的特点,国内外现状及发展趋势,设计了一种基于嵌入式实时操作系统WinCE5.0,并以ARM9系列的AT91SAM9261为核心处理器的大型触摸屏控制器。综合考虑触摸屏设备的功能需求,提出了该课题的设计指标,制定了触摸屏控制器总体设计方案,并以控制器硬件设计和操作系统移植两个方面给出了具体的体现。以模块化和结构化的思想设计和实现了硬件平台。分析了触摸屏控制器中的主要硬件模块,包括处理器核心模块、存储模块、触摸板模块、键盘模块、以太网模块和USB主从模块,给出了硬件设计方法及电路实现。建立了硬件测试环境,对哥哥硬件模块进行调试。基于搭建好的硬件平台,重点研究了嵌入式操作系统WinCE 5.0的移植和BSP的开发。分析了WinCE 5.0操作系统的体系结构和移植原理,在摄入了解三星公司S3C2410 BSP 的基础上,给出了基于AT91SAM9261的WinCE 5.0 BSP的开发流程。详细分析了WinCE 5.0 Bootloader的工作原理和架构,根据触摸屏系统的功能需要和硬件资源分配,设计了触摸屏设备的Bootloader并给出了具体的开发步骤。深入研究了OAL的功能和原理,对OAL开发中的重要函数和主要模块,给出了具体的实现。针对触摸屏控制器的主要硬件模块,在分析WinCE 5.0的中断模型和中断机制的基础上,开发了触摸屏驱动程序、矩阵键盘驱动程序和USB主机驱动程序。在开发的BSP基础上,利用WinCE 5.0操作系统定制工具Plarform Builder进行了操作系统内核的定制和编译,同时对操作系统的性能进行测试。测试结果表明:WinCE 5.0操作系统可成功移植到触摸屏控制器上,并能满足工业现场的实时性要求。本课题对于基于ARM9和WinCE的触摸屏设备的开发具有很高的参考价值,对于其它基于ARM和WinCE的开发也具有一定的参考价值。关键词:触摸屏;Clinux;驱动程序;C/OS-II;S_CPU_A.ASM;绪论1 . 1 课题的研究背景现阶段随着计算机技术的发展,人们对电子产品需求越来越高,不仅要求其性能良好、可靠,功能多样而且要求其设计美观,操作人性。触摸屏和手写汉字输入就是在该需求下的产物,而且这些技术已经广泛的渗透到我们的生活中了。比如银行的查询系统,ATM取款机,高档手机上的手写输入法以及各种手写板都是这方面的产品。由于触摸屏技术的不断改进与革新,越来越多的电子产品采用触摸屏作为输入设备,对用户来说非常方便,直观。而且省去了键盘和按钮,能够增大可携带的电子展品的屏幕尺寸,能带给用户非常舒适的视觉效果。对于产品的设计者来说,设计产品更加灵活,更容易推出富有个性的产品。触摸屏输入使得人机互交仅仅依靠手指触摸完成操作,操作简便直观,而且就爱你姑耐用,节省空间。2077年六月苹果公司推出的iPhone手普及,就掀起触摸屏应用到电子设备的高潮,它的操作界面设计比较人性化,用手点击空触摸屏取代按钮和滚轮来完成手机的所有操作,还附加了很多按键操作无法实现的功能,显然是一个多媒体娱乐平台。课件良好的触摸屏产品非常受用户青睐,是未来中高档电子产品的必不可少的输入设备。现阶段我们把汉字输入到计算机,手机等电子产品的主要方式是通过饮马、形码。但如果我们使用的电子产品输入设备是触摸屏,我们就会更倾向于采用手写输入。其实,把汉字字符输入计算机等电子设备一直是中国使用、设计各种电子产品的一个难题。对于计算机来说,饮马输入法有智能双拼、微软双频、清华紫光拼音输入法、搜狗输入法等等,但如果用户不知道该汉字的读音,就非常麻烦,而且这种重码率非常高,影响输入速率。对于形码输入法,比较流行的有王码,郑码。这两种输入法都是通过吧汉字分解为字根,这些字跟对应不同的字母按键,通过这种编码方式来获得对汉字的输入。这种方式重码率低,输入速率比较快,缺点是需要用户区学习记忆字根位码。然而如果采用触摸屏进行汉字的输入(即进行联机输入),符合通常汉字的书写习惯,用户更容易上手。这种输入方法关键技术在于手写字符的识别,需要解决的事一种大类别数的模式识别问题。由于模式识别,计算机等技术的发展,现在联机汉字输入系统已经比较成熟,不少产品已成功的应用到现实生活当当中,并得到良好的反响。1 . 2 触摸屏技术简介触摸屏在20世纪70年代就开始问世了,它是由美国人Sam Hurt在1971年发明了这项技术。由于各种技术员因,70年代后触摸屏技术发展比较缓慢。当时其反应速度、可靠性、使用寿命、对恶劣环境的适应性等方面都不尽人意。现在这种情况已经得到了很大的改善,也正是由于这种改进掀起了触摸屏应用的浪潮。目前,触摸屏触摸的实现技术多种多样,主要有矢量压力传感器技术触摸屏、电阻感应式触摸屏、红外线是触摸屏、电容感应式重默平和表面声波式触摸屏。其中矢量压力传感器触摸屏已经从历史舞台中消失了,现在应用广泛的主要是其他四种方式。下面简单介绍一下这些技术。1 . 2 . 1 电阻式触摸屏电阻式触摸屏又分为四线电阻触摸和五线电阻触摸,四线电阻触摸屏的两层透明导电层的都加上5V的恒定电压,这两层导电层分别引出分管数值和水平触摸点两根导线。只需要4跟先就可以完成触摸点检测的功能。其原理我们后面会详细介绍。这种触摸屏解析度较高,具有高速的传感反应,需要在系统运行时进行一次校正,稳定度较高,没有触摸飘逸现象。五线电阻触摸屏的基层是把竖直和水平方向的两个电压长通过精密的电阻网络加在玻璃的导电层上。外层的镍金导电层仅仅用来做纯导电层。内电层的导电吃呢更需要引出四条导线,外层的导电层会引出一条导线。在图1.1我们给出了其示意图,内层导电层引出4根线,外层导电层引出一根线。有触摸后分时检测内层IT0(铟锡氧化物)接触点X轴和Y轴电压值的方法测得触摸点的位置。其特点是:解析度较高,具有高速的传输反应,需要一次校正,稳定度较高,没有触摸飘逸现象,价位较高,对外导电层划伤具有良好的包容度,这是四线电阻触摸屏所不具有的。1 . 2 . 2 电容式触摸屏电容式触摸屏是四层符合玻璃屏。最外层是只有0.0015毫米厚的矽土玻璃保护层,再向内室IT0(IT0是一种透明的导电体铟锡氧化物Indium Tin Oxider)夹层和IT0内层,最里面的是玻璃基层。玻璃瓶的内表面和夹层各涂有这两层IT0导电层的功能不同,内层IT0作为屏蔽层,以保证良好的工作环境,夹层IT0涂层作为检测定位的工作层,在四个角或四条边上引出四个电极。这四个电极在导电体内形成一个低电压交流电场。当我们触摸矽土玻璃保护层时,通过人得手指与工作面形成耦合电容吸走一个很小的电流,这个电流分别从四个角或者四个边上的电极流出,这个电流信息与手指到四角的距离成正比,通过这种方法可以准确计算出触摸点的位置。这种触摸屏能够很好的保护导体,防止外界环境对触摸屏的影响,比如触摸屏了污秽、油渍、尘埃等,仍然能够良好的进行工作。但是采用耦合电容这种方式不稳定,会产生触点的“飘逸”。现在解决的主要方法是采用剁掉校准法解决飘逸问题。1 . 2 . 3 红外线式触摸屏该触摸屏在显示器外安装一个外框,里面装由红外发生装置和接受感应装置,这样就在屏幕的四边形成了横竖交叉的红外线矩阵,当手指或者其他物品阻挡经过该位置的横竖红外线,相应位置接收到的信号就急剧下降,这样就完成对触摸点坐标的探测。下图1.2是红外线式触摸屏的示意图。这种触摸屏价钱较高,不受电流、静电干扰,安装方便。1 . 2 . 4 表面声波触摸屏表面声波是一种沿介质表面传播的机械波。这种触摸屏包括声波发生、接受装置。触摸屏的左上角和右下角各固定了竖直和水平方向的超声波发射器,右上角则固定了两个相应的超声波接收器。玻璃屏的四个周边刻有45度角由疏到密间隔非常精密的反射条纹。当发射器发射一个窄脉冲后,声波能量历经不同途径到达接收器,走最右边的最早到达,走最左边的最晚到达。接受信号集合了所有在X轴方向历经长短不同路径回归的声波信号。这个波形信号的时间轴反映各原始波形叠加前的位置,也就是X轴坐标。发射信号与接受信号波形没有触摸的时候,接受信号的波形与参照波形完全一样。当手指或其他能够吸收或阻挡声波能量的物体触摸屏幕时,X轴途径手指部位向上走的声波能量被部分吸收,反应在接收波形上即某一时可谓之上必行有一个衰减缺口。这样就可以确定触摸位置的X轴坐标,同理可以得到相应的Y轴坐标。图1.3是表面声波触摸屏的示意图。这种触摸屏具有分辨率高、防刮擦、使用寿命长、透光率高、只需要安装时进行一次校对的优点,适用安装在公共场合。1 . 3 本文的主要内容和结构安排本文主要讨论的问题是如何实现一个基于触摸屏控制器的联机手写汉字识别系统。首先介绍触摸屏控制器的硬件结构,固件编程,获取触摸点的数据之后,进行对数据信息采用模式识别的方法进行处理,判断在触摸屏上所写的字符。字符识别处理包括预处理、归一化、特征形成和特征的提取,生成字符库,最后检索字符库得出字符。第二章 触摸屏控制器的硬件设计2 . 1 硬件设计 本设计中硬件平台微处理器选用MOTOROLA公司的MC68VZ328,它是一款M68k体系的32位低功耗微处理器,采用SoC技术设计,具有典型的嵌入式微处理器的特征;触摸屏选用TI(原为Burr-Brown公司的产品,由于该公司已被TI公司收购,所以下文均用TI公司)公司的ADS7843。在本设计中,CPU与触摸屏以主从方式工作,触摸屏工作于从设备(slave)状态。本设计中硬件电路不同于传统设计,而是充分利用了ADS7843中的BUSY信号线,如图1所示。ADS7843是一款四线电阻式触摸屏控制芯片,它主要完成两件事情:其一,是完成电极电压的切换;其二,是采集接触点处的电压值。它由两层透明的阻性导体层组成,在导体层中间充满了用粘性绝缘液体材料做成的隔离层和由导电性能极好的材料构成的电极。 触摸屏工作时,上下导体层相当于电阻网络,如图2所示。当某一层电极加上电压时,会在该网络上形成电压梯度。若有外力使得上下两层在某一点接触,则在电极未加电压的另一层可以测得接触点处的电压,从而知道接触点处的坐标。比如,若在顶层的电极(X+、X-)上加上电压,则在顶层导体层上形成电压梯度;当有外力使得上下两层在某一点接触,在底层就可以测得接触点处的电压,再根据该电压与电极(X+)之间的距离关系,知道该处的X坐标。然后,将电压切换到底层电极(Y+、Y-)上,并在顶层测量接触点处的电压,从而知道Y坐标。对电压在横向和纵向导体层之间的切换以及A/D转换,需要先通过串行外设接口(SPI)往ADS7843发送控制字,转换完成后再通过SPI读出电压转换值。 2 . 2 触摸屏硬件原理简介 我们在开始编写触摸屏驱动程序之前,必须对硬件的工作原理有个基本的了解。许多不同的触摸技术会把屏幕某个位置的压力或接触转换成有意义的数字坐标。典型的触摸技术包括电阻触摸屏、声表面波触摸屏、红外线触摸屏和电容触摸屏。如果想详细了解这些技术,你可以登录或网站。 这里侧重介绍电阻触摸屏。电阻触摸屏非常普及,你会发现许多评估板和开发套件中都集成了电阻触摸屏。电阻触摸屏普及的主要原因是价格便宜,而且在电气上可以直接接入用户的系统中。 之所以叫电阻触摸屏,是因为它们本质上就是电阻分压器。它们由两个电阻薄层组成,这两个薄层被非常薄的绝缘层隔开,绝缘层通常以塑料微粒子的形式存在。当你触摸屏幕时,会使两个电阻薄层变形到足以使它们之间发生电气连接。然后由软件通过检测分压器上产生的电压计算出两层的短接位置,并最终确定触摸位置。 电阻触摸屏分为几种类型,比如四线,五线和八线。线越多,精度就越高,温度漂移也越少,但基本的操作是一样的。在最简单的四线设计中,有一层称为X轴的电阻层,上面加有一定的电压,另一个称为Y轴的电阻层作为接受层测量对应X轴位置的电压值。这一过程再反过来执行一遍,即Y轴层加电,X轴层用于电压检测。 图2是电阻触摸屏的简单等效电路。注意必须获取二个完全独立的读数,即X轴位置和Y轴位置数据。这些数据在四线或五线电阻触摸屏中是无法同时读取的。软件必须先读一个轴,然后再读另外一个轴。读取的顺序则无关紧要。将电阻触摸屏产生的电压转换成数字需要用到模数转换器(ADC)。直到不久前这个ADC几乎一直是主CPU的外围器件。Burr Brown NS7843或NS7846就是这种ADC控图2:触摸屏电路简单等效电路。制器。该器件为12位的模数转换器,其内嵌的逻辑电路通过交替给一个薄层加电,再从另外一层转换来控制触摸屏。虽然可以使用诸如GPIO之类的信号线来完成薄层加电的切换,但该器件能够分担许多任务,还能提供产生触摸或笔压中断的方式。 2 . 3 基于两种CPU的参考板 第一块板是飞思卡尔的MX9823ADS评估板,采用了飞思卡尔的MC9328MX1处理器。该评估板可以直接从飞思卡尔的分销商处定购。评估套件包括QVGA(240x320)彩色LCD和触摸屏。 第二块板采用了夏普LH79524 ARM处理器。这块夏普的参考板以及集成的显示和触摸套件都可以从LogicPD公司处定购。有几种可更换的显示套件供选择,分辨率范围从QVGA到800x600像素不等。 本文中不提供每个驱动程序的详细代码,而是介绍驱动程序的设计和流程,并重点介绍其中的重要部分。读者可以从/pub/2005/07maxwell下载每个驱动程序的全部源代码。总的来看,软件提供的功能完成以下这些步骤: 1. 配置控制器硬件 2. 判断屏幕是否被触摸 3. 获得稳定的、去抖动的位置测量数据 4. 校准触摸屏 5. 将触摸状态和位置变化信息发送给更高层的图形软件 2 . 4 硬件配置 触摸驱动程序要做的第一件事是配置硬件。对这些集成控制器来说,这意味着通过向映射到存储器的寄存器中写入数据将控制器配置成某个确定状态。这一过程是由每个驱动程序中的TouchConfigureHardware()函数完成的。 关于触摸驱动程序是否应该使用中断驱动,事实上在范例的驱动程序中用的就是中断驱动方式。坦率地讲,我之所以这样做是因为使用中断很有趣。千万不要由这个例子推断出采用中断永远是最好或最正确的设计方式,也不要听信别人说不采用中断驱动方式的触摸驱动程序就是错误的。 之所以这样说只是因为轮询对嵌入式系统程序员来说似乎变成了贬义词。我曾经问过一位客户,他的输入设备采用的是轮询还是中断服务方式。回答是这是嵌入式系统,我们不做任何轮询。我当时感觉问这个问题时我就像一个傻瓜,但进一步探讨后发现查询其实也是一种合理且值得考虑的方式。如果使用的是RTOS,并且所有任务经常为了等待某类外部事件而被中断,处理器经常处于空闲的循环状态,没有什么有意义的事做。这种情况下使用空闲任务查询触摸屏上的输入也许是更好的设计方式。根据你的总体系统需求,查询也可能是一个值得考虑的合理的设计方式。 配置中断的方法因具体操作系统而异。读者会发现对于每一个支持的RTOS都有被(#ifdef)限定的代码段。在所有情况下驱动程序实际会使用二种不同的中断: 1 、当屏幕被初次触摸时唤醒主机的中断,称为PEN_DOWN中断 2 、当完成一组模数数据转换时的第二种中断信号 接下来的问题是我们希望以多快的速度从ADC接收采样输入读数。采样速度会影响我们需要如何配置时钟来驱动触摸屏和ADC。我们希望时钟有足够快的速度来提供可响应的输入和实现精确的跟踪,但也不要太快,以至于影响转换精度,或让系统消耗超过所需的功率。 根据我的经验,触摸屏至少需要以20Hz或50ms间隔的速度向更高层软件提供位置更新数据,只要高层软件跟得上,速度越快越好,我们不太担心功耗问题。如果触摸输入响应比这慢得多,那么在用户的触摸输入和显示屏上可观察到的响应之间会出现明显和烦人的迟滞现象。20Hz的更新速度听起来并不是太有挑战性,但提供20Hz的更新速度实际上要求采样速度接近200Hz,具体数值取决于我们在确定输入稳定之前准备采用多少读数。为了去抖动和对触摸输入位置值进行平均,我们需要进行过采样。电阻触摸屏,特别是便宜的那种,一般会有很大的噪声和抖动。 图3:X轴移动时Y轴上的偏移。在向更高层软件发送位置更新数据之前,驱动程序需要多次采样每个轴上的输入。我们提供的驱动程序默认情况下将以最少200Hz(5ms)的采样速率配置各自处理器上的ADC时钟。这样就能让驱动程序对输入原始数据进行充分的去抖动和过滤,并仍能向高层用户接口软件提供20Hz的实际位置更以使这项工作简单很多。本文提供的驱动程序完全符合该应用指南对如何配置夏普ADC序列控制器提出的建议。 LH79524 ADC本身是一个令人称奇的电路系统,能够实现完全可编程的状态机和序列器。该ADC无需核心CPU的任何干预就可以通过编程完成:驱动一个触摸层;延时;进行测量;驱动另一层;延时;进行测量等操作。理解如何对LH79524 ADC序列器控制单元编程可能是一个挑战,不过利用夏普()公司提供的应用指南可 一旦完成了基本的硬件设置,接下来就需要一种可靠的方法判断屏幕是否被触摸了。如果用户没有触摸屏幕,那么运行ADC获得转换后的读数毫无意义。上述两个控制器都提供了屏幕是否被触摸的检测机制,并且当触摸事件发生时还可选择是否中断主处理器。判断屏幕是否被触摸的驱动程序的函数名叫WaitForTouchState()。 当控制器处于触摸检测模式时,Y轴触摸层通过一个上拉电阻上拉到高电平,X轴触摸层则连接到地。当用户触摸屏幕的任何地方时,这两层就发生短接,Y轴层被拉到低电平。该事件可以在驱动程序内部连接到名为PEN_OWN IRQ的中断发生机制。 在正常工作期间,当触摸事件发生时驱动程序利用PEN_DOWN IRQ唤醒触摸驱动任务。这样做可以让驱动程序在屏幕没有被触摸时中断自己的执行,而不消耗任何CPU资源,而一旦用户触摸屏幕,驱动程序就被唤醒并进入转换模式。我们也可以在转换模式没被激活时停止(disable)ADC时钟来节省功耗。 2 . 4 . 1 读取触摸数据 在校准和正常操作期间,我们需要读取X和Y轴的原始数据并去抖动,然后确定屏幕被触摸时是否有稳定的读数。该过程在两个驱动程序中都叫TouchScan()。该过程的要点是: 1 、检查屏幕是否被触摸; 2 、采集每个轴上的多个原始读数用于以后的过滤; 3 、检查屏幕是否仍在被触摸。 在执行模数转换时,两个控制器都提供了由编程产生延迟的方法,以在给触摸层加电和开始实际的模数转换之间插入一段时延。飞思卡尔把这段时延称作数据建立计数(DSCNT),在两层切换后会有很多个ASP输入时钟长度的延时。夏普把这段时延称为预充时延。 两种CPU都需要这种时延,因为电阻触摸面板是二块由薄绝缘层隔离的大面积导体,正好形成一个电容。当从将要执行模数转换的层切换到正在加电的层时,需要一定的延时才能保证电容达到稳定状态。 我们可以通过编程让处理器在FIFO存有任何有效数据时就产生中断,或在输入FIFO装满时产生中断。由于我们通常会做多次读取,因此驱动程序一般会在FIFO装满时产生中断。当该中断产生时,会有12个原始的模数转换数据等待处理,分别对应于X轴的6次读数和Y轴的6次读数。 一旦序列器控制字在LH79524上被编好程,驱动程序获取原始读数所需要做的就是命令序列器执行。当EOS(序列结束)中断产生时,我们获得的结果就可以用于采集和检查了。序列器可以被配置为当屏幕被触摸时自动触发、根据软件命令触发或连续触发三种模式。 这里不可避免要进行折衷考虑。如果我们要求较窄的稳定窗口,那么驱动程序将无法跟踪快速的拖曳操作。对于在签名输入期间发生的滑动或笔划跟踪事件来说快速拖曳是非常重要的。如果我们加宽稳定窗口,我们就可能面临着风险,这些风险包括接收到不精确的触摸数据和上文描述过的处于临界状态的层连接结果。因此需要通过实验来确定适合自己系统的最佳值。智能化的触摸控制器同样允许你通过软件命令调整这些参数。 每个样值所需的读取次数、连续读取间允许的偏差以及采样速率是每个驱动程序的全部可编程参数。可以通过#defines调整这些参数以便在你的系统上产生最佳结果。智能化的外部触摸控制器一般会以很快的速度读取数十或数百个数据用以改善精度。由于我们是用核心CPU完成这种过滤,因此我们需要确定有多少时间可以合理地分配给触摸采样任务。嵌入式系统包含折衷,你的任务就是想出最佳的折衷办法,以产生能使用户满意的系统。 2 . 4 . 2触摸屏的校准 电阻触摸屏需要校准,我们需要一些参考值,以便我们能够将接收到的原始模数转换值转换成高层软件所需的屏幕像素坐标。理想情况下校准程序只要在产品初次加电测试过程中运行一次就可以了,参考值被存储在非易失性存储器中。我已经安排好让触摸驱动程序在一启动时就运行校准程序,但要记住,你要把参考值保存起来,以免让用户在以后的加电启动期间再做校准。不过无论如何你仍然需要向用户提供一种进入校准例程的途径,从而在由于温度漂移或其它因素造成校准不准确时进行重新校准。 校准例程的名称是CalibrateTouchScreen(),它是一个简单的逐步操作过程,会在屏幕上向用户提供图形目标,并要求用户触摸目标,然后记录下原始的ADC读数,该读数将用于后面的原始数据转换到像素位置的调整例程。图形目标和用户提示通过使用便携式图形用户界面(PEG)图形软件API显示在屏幕上,不过这也可以通过类似的图形软件实现。 在理想情况下你只需两组(X和Y)原始数据,即在屏幕对角读取的最小和最大值。而在实际应用中,因为许多电阻触摸屏存在显著的非线性,因此如果在最小和最大值之间简单的插入位置数值会导致驱动程序非常的不精确。 非线性意味着在屏幕上的等距物理移动会导致原始数据的增量不等。更糟的情况下,即使我们只改变X轴的触摸位置,但从Y轴读取的数据也会发生很大的变化。 得出的结论是采用的校准点越多越好,尽量减小内插窗口的间距,才能产生可能的最佳精度。如果你能在工厂做一次校准,那么得到大量采样点并不是件难事。如果无法在工厂完成校准,那你必须确定用户需要输入多少个点才能产生足够精确的校准。本文提供的校准例程用了四个数据点,即屏幕的每个角一个。对于参考板上的VGA分辨率(640x480)显示屏幕来说,这样做的精度可达到一个或二个像素之内。对于更高的屏幕分辨率或其它触摸屏,要产生一个精确的驱动程序这些点也许过多,也许不够。做出准确判定的唯一途径只能是对具体的硬件进行大量反复测试。 2 . 4 . 3 正常操作 一旦校准过程完成,我们就可以开始正常的操作,并开始向更高层软件发送触摸事件。我把提供的每个触摸驱动程序在每种支持的RTOS环境中都作为低优先级任务加以执行。任务的入口名叫PegTouchTask,因为驱动程序需要与PEG图形软件进行交互操作。这些驱动程序修改后,可与其它图形软件甚至你自己编写的用户接口环境协同工作。在任何时候PegTouchTask总是先调用硬件配置例程,然后调用校准例程,最后进入等待触摸输入的无限循环中。 LH79524驱动程序以相似的方式工作。当产生PEN_DOWN中断时,我们命令ADC序列器开始进行转换。驱动程序以20Hz的速度工作,检查位置的变化,直到屏幕不再处于被触摸的状态。 当屏幕被触摸时,我们需要对每个轴连续读取多个转换值以确定触摸位置是否稳定。如果任何两个连续读数中的增量或变化超出#defined定义的噪声窗口范围,我们就要重新开始。我们一直这样做,直到读取的多个连续值处于#defined定义的稳定范围内,此时我们可以调整该结果并向更高层软件报告更新。当屏幕不再被触摸时,我们又可以中断此任务,等待触摸输入事件的发生。 在每个转换过程的前后,驱动程序必须检查并确认屏幕仍处于被触摸状态。我们不希望向更高层的软件报告实际上是处于开路状态的稳定读数。我也看到过有的驱动程序在屏幕被初始触摸后会忽略掉N个读数。不过对于这两块参考电路板,我没有发现忽略掉一定数量的初始读数是有必要或有益的。 第三章 触摸屏控制器的软件设计3 . 1 嵌入式Linux系统下的驱动程序设备驱动程序是Linux内核的重要组成部分,控制了操作系统和硬件设备之间的交互。Linux的设备治理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,成为设备文件。应用程序可以打开、关闭、读写这些设备文件,对设备的操作就像操作普通的数据文件一样简便。为开发便利、提高效率,本设计采用可安装模块方式开发调试触摸屏驱动程序。Linux操作系统通过系统调用和硬件中断完成从用户空间到内核空间的控制转移。设备驱动模块的功能就是扩展内核的功能,主要完成两部分任务:一个是系统调用,另一个是处理中断。图2是一个设备驱动模块动态挂接、卸载和系统调用的全过程。系统调用部分则是对设备的操作过程,比如 open,read,write,ioctl等操作,设备驱动程序所提供的这组入口点由几个结构向系统进行说明,分别是file_operations数据结构、inode数据结构和file 数据结构。内核内部通过file结构识别设备,通过file_operations数据结构提供文件系统的入口点函数,也就是访问设备驱动的函数,结构中的每一个成员都对应着一个系统调用。在嵌入式系统的开发中,我们一般仅仅实现其中几个接口函数:read、write、open、ioctl及 release就可以完成应用系统需要的功能。写驱动程序的任务之一就是完成file_operations中的函数指针Clinux继承了Linux的设备管理方法,将所有的设备看做具体的文件,通过文件系统层对设备进行访问。所以在Clinux的框架结构中,和设备相关的处理可以分为两个层次文件系统层和设备驱动层。设备驱动层屏蔽具体设备的细节,文件系统层则向用户提供一组统一的规范的用户接口。这种设备管理方法可以很好地做到“与设备无关性”,使Clinux可以根据硬件外设的发展进行方便的扩展,比如要实现一个设备驱动程序,只要根据具体的硬件特性向文件系统提供一组访问接口即可。 3 . 1 . 1 驱动程序在内核的装载方法 驱动程序在内核中装载的方式有两种:一种是直接编译进内核,在系统初始化的时候就对设备进行注册;一种是模块化加载的方法,将驱动程序编译成目标文件(*.o),需要添加设备时,使用insmod命令向系统注册,停止使用时,用rmmod命令卸载。对于触摸屏这种基本的输入工具,建议采取直接编译进内核的方式,这样系统一启动就可以使用了。 向内核注册一个字符设备的函数为:externintregister_chrdev(unsignedintmajor,constchar*name, structfile_operations*fops);内核用主设备号和次设备号惟一地标识一个设备。参数major对应所请求的主设备号,name对应设备的名字,fops是一个指向file_operations结构的指针,它是Clinux下编写驱动程序用到的一个关键的数据结构,它提供了应用空间与驱动程序的调用接口。这个数据结构的每一项都指向驱动程序完成的一个功能。 在2.4版本内核中对该结构采取标记结构初始化语法(TaggedStructureInitializationSyntax),与2.0内核比较,这种语法可移植性更好,程序的可读性和代码的紧凑性都比较好。以触摸屏为例: static struct file_operations ts_fops= owner:THIS_MODULE, read:ts_read, /读数据操作 poll:ts_poll, /非阻塞操作 ioctl:ts_ioctl, /I/O控制操作 open:ts_open, /打开设备 release:ts_release, /释放设备 fasync:ts_fasync, /异步触发 完整的结构还包括llseek、readdir等函数指针,只是由于在本程序中没有用到,所以省略不写,内核把它们默认为空(NULL)。 3 . 2 .触摸屏驱动程序的流程及关键函数在本设计中,我们使用Clinux2.4内核。驱动程序主要设计思想是:驱动程序在初始化结束后,进入空闲状态,等待中断的到来。一旦笔中断(pen_irq)发生,则进入中断处理程序,进行数据采样、转换和传输,同时,程序对各种不同的情况进行鉴别和异常处理。 触摸屏软件流程如图3所示。在驱动程序中设定了触摸屏所处的7个不同状态,分别用从-1到5的数字表征,这7个状态构成了一个触摸屏状态机,系统根据当前状态做出下一步的处理,如表1所示。整个软件设计根据功能可以划分为5个部分,分别是初始化、设备打开、读操作、中断处理以及I/O控制,下面具体介绍每一部分。 3 . 2 . 1 驱动程序初始化在mc68328digi_init()中向内核注册设备驱动函数:err=misc_register(&mc68328_digi),在init_ts_settings()中设定触摸屏的当前参数:内核版本号、笔移动判别阈值、采样时间、消除抖动开关、消除抖动时间等参数,这些均由用户根据自己的液晶屏以及精度要求来定制,也可以在应用程序中用I/O控制函数ioctl()来设定,本文将在参数分析中具体分析这些参数的意义。 在ts_open()函数中,驱动程序向内核注册中断。中断也可以在系统初始化的时候向内核注册,但是一般不建议这样做,因为在加载的设备比较多时,这样做有可能造成中断的冲突。打开一个设备,才让该设备占用中断,是一个较好的策略。向内核注册中断处理程序主要实现两个功能,一是注册中断号,二是注册中断处理函数。 本程序中,向内核注册了两个中断处理程序,分别是: request_irq(PEN_IRQ_NUM, handle_pen_irq,IRQ_FLG_STD, “touch_screen”,NULL)和request_ irq(SPI_IRQ_NUM,handle_spi_irq, IRQ_FLG_STD,“spi_irq”,NULL); 在前者中,PEN_IRQ_NUM是中断号,可以指定,也可以动态分配。在该驱动程序中,指定笔中断分配中断号为19;handle_pen_irq是中断处理函数,IRQ_FLG_STD是申请时的选项,它决定中断处理程序的一些特性,这里表示由系统内部占用;touch_ screen是设备名。在后者中,程序向内核注册SPI中断,用来在CPU和外设间传递数据,分配的中断号是0,handle_spi_irq是SPI中断处理函数。 此外,在触摸屏驱动初始化子函数init_ts_drv()中,进行了如下工作: (1)触摸屏状态的初始化; (2)笔信息(pen_values)的初始化; (3)初始化定时器并设置超时函数handle_timeout(); (4)初始化寄存器。初始化等待队列,等待队列是由等待触摸事件发生的进程组成的一个队列,它包括头尾指针和一个正在睡眠进程的链表; (5)设置触摸屏状态为空闲。 由于这里的初始化会占用一部分系统资源,所以把它们放在了打开设备时处理,而不是最初的设备初始化部分,这样也是出于节省资源的考虑。 读函数ts_read() 一旦用户程序调用read()对触摸屏进行读操作,则驱动程序调用入口点函数ts_read()进行处理。如果此时没有数据到来,且驱动程序选择阻塞型操作,则调用interruptible_sleep_on(&queue-proc_list)将进程阻塞,并进入等待队列,同时设置触摸屏状态为等待;如果选择了非阻塞型操作,则程序在没有数据到达的时候立即返回,然后用异步触发fasync()来通知数据的到来。 当笔中断发生,程序进入中断处理函数。在中断处理函数中,将完成对两个中断进行处理,分别是外部的触摸中断(笔中断)和SPI数据转换中断。与这两个中断对应的中断处理函数,是触摸屏软件设计的关键所在。 驱动程序在中断处理函数中使用定时器处理时间相关操作。定义函数set_timer_irq(),如下: staticvoidset_timer_irq(structtimer_list*timer,intdelay) del_timer(timer); timer-expires=jiffies+delay; add_timer(timer); jiffies是一个表征系统自从启动以来到当前为止所运行时钟数的变量,delay是设定的延长时间(用时钟数作为计数单位)。一旦时钟数超过设定值,则触发超时函数,在本程序中是handle_timeout( )。引入定时器的目的有两个:一是可以较为精确地控制系统由于消除电平升降造成信号抖动所需要时间,二是能够有效控制采样坐标的数量,而不必引入占用大量系统资源的简单延时函数。使用SPI中断而产生大量坐标数据这一问题在文献中没有很好的解决办法,只是简单地降低SPI时钟频率以取较少的数据量。本设计中引入定时器,可以很好地解决上述问题。 3 . 3 结论 在获得触摸点的原始坐标(数值范围由所选用的A/D转换器位数决定)后,还要根据具体使用的液晶屏实际像素进行转换,以方便图形界面的后续开发。考虑到相邻两次的移动阈值,按照如下公式对触摸屏坐标进行计算: 其中XV为触摸点X坐标显示值,XW为触摸点X坐标测量值(原始坐标值),(1)、(2)、(3)式在触摸屏初始化时得到,方法是任取触摸屏X方向左侧和右侧各一点,以XV=XW=1,Xoffrer=0为初始值进行测量得到新的3个参数:XV、XW和Xoffrer(在实际使用中此项工作属于校准零点偏移),然后这3个参数就不再变动,对于每次测量到的任意触摸点原始坐标XW,直接代入(4)式求出触摸点的像素显示坐标XV。 其中,XV1为触摸屏左侧点坐标显示值;XV2为触摸屏右侧点坐标显示值;XW1为触摸屏左侧点坐标测量值;XW2为触摸屏右侧点坐标测量值。 本设计使用MicroWindows作为用户界面,定制出每个桌面图标的坐标区域,结合触摸屏的采样坐标,判断是否在图标区域坐标内,然后做出相应的事件处理。对于本设计中使用的开发平台,液晶屏是320240点阵的,物理尺寸为: 80mm60mm,ADS7843选择12位转换精度,触摸屏理论分辨率为80/212=0.020mm,但是由于电平干扰和触摸动作发生时的物理干扰,实际的精度无法达到这个值。经过测试,在我们平台上对同一点的点击精度可以达到1.0mm。本驱动程序可以有效地区分点击和移动信号,如果配合手写识别软件,够作为手写板的底层驱动使用,实现手写输入。第四章 嵌入式操作系统的移植4 . 1 C/OS-II 介绍 C /OS-II是个完整的、可移植、可固化、可裁剪的占先式实时多任务内核。C/OS-II绝大部分的代码是用ANSI的C语言编写的,包含一小部 分汇编代码, 使之可供不同架构的微处理器使用。至今,从8位到6 4位,C/OS-II已在超过40种不同架构上的微处理器上运行。C/OS-II已在世界范围内得到广泛应用,包括非常 多领域, 如 手机、路由器、集线器、不间断电源、飞行器、医疗设备及工业控制 上。实际上,C/OS-II已通过了非常严格的 测试,并且得到了美国航空管 理局(Federal Aviation Administration)的认证,能用在飞行器上。这说明C/OS-II是稳定可靠的,可用于和人性命攸关的安全紧要(safety critical)系统。除此以外,C/OS-II 的鲜明特点就是源码公开,便于移植和维护。 4 . 1 . 1 C/OS-II 内核结构 多任务系统中,内核负责管理各个任务 ,或说为每个任务分配CPU 时间 ,并且负责任务之间的通讯。内核提供的基本服务是任务转换。 C/OS-II能管理多达64个任务。由于他的作者占用和保留了8个任务,所以留给用户应用程式最多 可有56个任务。赋予各个任务的优先级必须是不相同的。这意味着C/OS-II不支持时间片轮转调度法 (round-robin scheduli ng)。C/OS-II为每个任务设置独立的 堆栈空间,能快速实现任务转换 。C/OS-II近似地每时每刻总是让优先级最高的就绪任务处于运行状态,为了确保这一点,他在调用系统API 函数、中断结束、定时中断结束时总是执行调度算法,C/OS-II通过事先计算好数据简化了运算量,通过精心设计就绪表结构使得延时可预知。 P89V51RD2是Philips公司生产的一款80C51微控制器,包含64KB Flash和1024字节的数据RAM。P89V51RD2的典型特性是他的X2方式选项。利用该特性,设计者可使应用程式以传统的80C51时钟频率(每个机器周期包含12个时钟)或X2 方式(每个机器周期包含6个时钟)的时钟频率运行,选择X2方式可在相同时钟频率下获得2倍的吞吐量。从该特性获益的另一种方法是将时钟频率减半来保持特性不变,这 样能极大地降低EMI。Flash程式存储器支持并行和串行在系统编程(ISP),ISP允许在软件控制下对成品中的器件进行重复编程。应用固件的 产生/更新能力实现了ISP的大范围应用。 5V的工作电压,操作频率为040MHz。P89V51RD2的资源和ISP的功能使得他非常适合用来做C/OS-II的移植调试。并不必购买仿真器和编程器等额外投资。 4 . 1 . 2C/OS-II 的移植 移植就是使C/OS-II能在P89V51RD2上运行。为了方便移植,大部分的C/OS-II的代码是用C语言编写的;不过仍需要用C语言和汇编语言编写一些处理器硬件相关的代码,这是因为C/OS-II在读/写处理器寄存器时,只能通过汇编语言来实现。由于C/OS-II在设计时就已充分考虑了可移植性,所以C/OS-II的移植相对来说是比较容易的。 由于P89V51RD2是一款80C51微控制器,片内包含了64KB的FLASH程式存储器,并且支持串行在线编程(ISP)。使他在ROM空间上非常适合做C/OS-II的移植。不过他片内RAM空间非常有限,只有1KB,不能满足C/OS-II对RAM的需求。不过由于P89V51RD2能扩展RAM空间,使这一问题得以解决。我们为他扩展了一片32KB的RAM来构成移植C/OS-II的硬件平台。这样P89V51RD2就满足了移植C/OS-II的所有需求。由于C/OS-II绝大部分代码是用标准的C语言编写的,所以C语言研发工具对于C/OS-II是必不可少的。由于C/OS-II是个可剥夺行的占先式内核,所以需求C编译器能产生可重入型代码。笔者选择Keil C51集成研发环境作为研发工具。该研发工具有C编译器,汇编器和链接定位器等工具构成。链接器用来将不同模块(编译过或汇编过的文件)链接成目标文件,定位器则允许将代码和数据放置在目标处理器的指定内存中。Keil C51 还能生成HEX格式的编程文件用于编程EPROM或是FLASH,同时能实现完整软件仿真支持。Keil C51支持所有8051变种的微控制器。通过设置编译控制选项,他完万能满足编译C/OS-II原始码的需求。 4 . 2C/OS-II源文件移植 在了解了P89V51RD2微处理器和Keil C51 编译器的技术细节的基础上,就能开始C/OS-II源文件移植的工作了。真正编写移植代码的工作就相对比较简单了。图1表示了基于C/OS-II的应用的系统结构结构。由图1能看出由于C/OS-II自生的绝大部分代码是使用ANSI C编写的,而且代码的层次结构十分干净,和平台相关的移植代码仅仅存在于OS_CPU_A.ASM、OS_CPU_C.C及OS_CPU.H这三个文件当中。下面分别解释各个文件在P89V51RD2上的移植。 OS_CPU.H包括了用#define语句定义的、和处理器相关的常数、宏及类型。因为不同的处理器有不同的字长,所以C/OS-II的移植包括的一系列数据类型定义,以确保其可移植性。C/OS-II代码不使用语言中的short,int,及long等数据类型,因为他们是和编译器相关的,是不可移植的。采用定义的整形数据结构等既是可移植的,又非常直观。参考Cx51编译手册,能完成OS_CPU.H里所有数据类型的定义。 和所有的实时内核相同,C/OS-II需要先关中断,再处置临界段代码,并且在处置完毕后重新开中断。这样能保护临界段代码免受多任务或中断服务子程式的破坏。为了隐藏不同编译器提供的不同的关中断和开中断的实现方法,增强可移植性,C/OS-II在OS_CPU.H中定义了2个宏,来开中断和关中断:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。根据P89V51RD2的结构和Keil C51提供的方法,我们通过置位或清零中断允许位来实现。 代码如下: OS_ENTER_CRITICAL() EA=0 OS_EXIT_CRITICAL() EA=1 MCS-51 堆栈从下往上增长(1=向下0=向上) ,OS_STK_GROWTH 定义为0。 C/OS-II的移植需求用户在OS_CPU_C.C中编写10个简单的C函数。但唯一必要的C/OS-II的移植需求用户在OS_CPU_C.C中编写10个简单的C函数。但唯一 必要的是OSTaskStkInit(),其他九个必须声明,但不一定要所有程式代码。OSTaskStkInit()是在系统创建任务时用来初始化任务堆栈的,使堆栈看起来就象中断刚发生相同,所有寄存器都保存在堆栈中。由于P89V51RD2硬件堆栈非常小,最多只能有在内部RAM空间的256字节。因此非常难将所有任务的堆栈都用硬件堆栈来实现。为了解决这个问题,我们为每个任务在外部RAM空间都分配一段连续的存储区,用来模拟每个任务的堆栈。在C/OS-II进行任务转换时,首先将P89V
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 吉林大附中力旺实验中学2024-2025学年初三年级第二次模拟考试生物试题试卷含解析
- 湛江市高二上学期期中考试生物试题
- 上海市青浦区2025届高三二模语文试题(含答案)
- 2025比熊犬买卖合同
- 音乐六年级上册第五课贝多芬与歌德教学设计
- 2025水稻田租赁经营权流转合同
- 2025年安徽省钢材购销合同模板
- 2025年本大厦物业管理合同示范文本
- 2025年自建房屋租赁合同范本
- 2025陶瓷砖粘贴承包合同
- 湖北省第十届湖北省高三(4月)调研模拟考试数学试题及答案
- 2025年03月广东深圳市光明区科技创新局公开招聘专干5人笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 内蒙古通辽市科左中旗实验小学2025届数学三下期末质量检测试题含解析
- 海参收购协议书范本
- 高温急救知识培训
- 2025年江苏苏州市相城区六大区属国有公司招聘笔试参考题库附带答案详解
- 2025年03月绍兴市诸暨市综合行政执法局执法辅助人员27人笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 学前教育学 课件 第1、2章 绪论;学前教育的目标、内容的方法
- 部编人教版五年级语文下册教学策略计划
- 2025北京丰台高三一模物理试题及答案
- 江南美术遗产融入美育的数智化路径探索
评论
0/150
提交评论