1、 目录摘要本设计主要分析和研究了以下内容:(1)分析和研究PXA270的体系结构和低功耗等特点,以及嵌入式操作系统Windows CE的模块化结构特点及中断系统、驱动构架和内存管理。(2)针对多媒体播放器的硬件以及Windows CE的特点开发了板级支持包BSP,主要包括设计和开发具有压缩和解压缩映象功能的BootLoader,OAL层的平台初始化、中断处理。(3)实现了分别代表Windows CE的本机设备驱动和流接口驱动的触摸屏驱动和音频驱动。关键词:便携式媒体播放器PXA270微处理器Windows CE操作系统摘要11.便携式媒体播放器平台概述11.1 PXA270处理器体系结构11.
2、2 PXA270处理器的低功耗特性11.3 Windows CE结构特点分析22.便携式媒体播放器BSP的实现62.1 BSP的结构72.2 BootLoader的设计和实现72.3 OAL层的实现123.触摸屏和音频驱动程序的实现153.1触摸屏驱动设计与实现153.2音频驱动程序设计与实现18设计总结22参考文献2323 1.便携式媒体播放器平台概述硬件方面,平台使用的是PXA270处理器,它在原来有的XScale微构架的基础上,提高了处理媒体的效率,优化了处理器的功耗,同时添加了众多针对移动终端设备而设计的新功能,适合手持设备使用,所以适合我们的媒体播放需求。软件方面,我们选择微软的Wi
3、ndows CE.Net作为操作系统,主要原因是WindowsCE.Net是一个模块化的操作系统,用户可以根据自己的需要来方便地定制操作系统模块,便于快速开发出产品。本设计只简单介绍播放器的硬件部分。1.1 PXA270处理器体系结构Intel PXA270在原来有的XScale微架构基础上,提高了处理媒体的效率,优化了处理器的功耗,同时添加了众多针对移动终端设备设计的新功能。PXA270处理器的主要特性如下:(1)Intel Wireless MMX指令集和扩展单指令多数据流指令SSE可以提供高性能、低功耗的多媒体、3D游戏和视频等应用加速。(2)Intel Quick Capture技术可
4、以支持高达400万象素的摄像头。支持快速预览模式、高质量图片捕捉模式和快速动画捕捉模式。(3)SpeedStep电源管理技术可以根据CPU的性能要求动态的调节功耗,可以动态调节CPU的电压和频率来节省电源。(4)电源管理。支持多种运行模式?运行模式、开始运行模式、空闲模式、深度空闲模式、挂起模式、睡眠模式和深度睡眠模式。(5)256KB的片内RAM。(6)内置LCD控制器。支持24位色双屏显示,支持两个overla ys窗口和一个硬件光标,内部集成了7通道DMA。(7)内部集成众多外设,如USB Host控制器、PCMCIA/SD/MMC卡控制器、I2C接口、串口、AC97控制器、实时时钟、P
5、WM控制器、SSP串行接口等1.2 PXA270处理器的低功耗特性为了节约处理器的能耗,PXA270将处理器工作状态分为Turbo Mode(加速模式)、Run Mode(正常模式)、Idle Mode(空闲模式)、Deep-Idle mode(深度空闲模式)、StandbyMode(挂起模式)、Sleep Mode(睡眠模式)、Deep-Sleep Mode(深度睡眠模式)。其中Turbo和Run模式都是系统正常工作模式,他们的区别在于Turbo模式的处理器内核工作频率与总线频率不一样,而处于Run模式时两者是完全一致的。Idle模式时CPUclock停止,当发生中断唤醒时继续。Deep I
6、dle的区别是允许CPU时钟返回到13MHz的频率。Standby模式保持系统的状态但没有任何活动,内部和外部的PLL关闭。Sleep模式下不保存状态但是I/O仍然有电。Deep Sleep模式下比sleep用更少的电,和Sleep不同的是把I/O也断电了。处理器的状态变迁如图2.1所示。在空闲模式下,PXA270的时钟停止,处理器的功耗减小。当操作系统发现处理器空闲时,可以将处理器置于空闲模式。硬件中断发生时,处理器被自动唤醒。由于大多数系统会周期性地产生计时器中断,处理器在一秒钟之内可能几千次地进出空闲模式。值得注意的是,处理器空闲模式仅影响处理器本身,对系统的其它硬件不产生任何影响。当没
7、有任务请求及不要求输出时,可以使其进入省电的睡眠模式。1.3 Windows CE结构特点分析1.3.1 模块化结构Windows CE.Net具备可伸缩性和可裁减性。它通过许多完成特定功能的模块组成整个系统,模块的分工细致,通过对模块的选取,达到对整个系统功能的裁减。Windows CE.Net包含众多的功能模块,多至上百个。每一个模块都是完成相对独立的功能,表2.1选取了几个主要的模块加以简单的描述。表2.1中包含的6个模块构成了Windows CE.Net系统的核心与基础。内核功能模块NK及COREDLL,设备管理器DEVICE,图形管理器GWES,文件系统FILESYS。这些模块通常以
8、库文件的形式存在。选取这些模块,实质就是包含这些库文件。众多的模块必然导致选取上的复杂过程,Microsoft Windows CE.Net采用了预置对象的方案,针对最终系统的类型,提供多种默认的选择。这些预置的终端类型包含了最接近于实际需求的组件,然后根据实际的需求加以调整,这样就大大减小了选择组件的复杂度。模块名描述库COREDLL向其它模块提供CE核心的基本功能Coredll.libDEVICE设备管理器,它是流设备驱动的管理模块Device.libFILESYS文件系统模块GWES图形窗口事件系统,提高窗口API和管理图形输入输出设备NKCE内核模块NK.lib表2.1 Windows
9、 CE.Net主要模块1.3.2中断系统)中断基本结构Microsoft Windows CE.Net在提供了丰富的应用功能的同时,还具备了良好的实时性,这在很大程度上要得益于其设计优良的中断处理架构。Windows CE.Net的中断架构如图2.2所示。Microsoft Windows CE.Net处理中断的过程如下:(1)硬件发起一个中断。(2)系统内核搜寻中断请求,调用相应的ISR,同时屏蔽掉所有低级中断。(3)ISR进一步搜寻中断号,并打开除该号码以外的所有其它中断,并返回此中断号给系统内核。(4)如果此返回的标志符为SYSINT_NOP,表示这是一个时间片引起的中断,并且没有做进程
10、调度的必要,从而重新开启所有的中断,并继续执行该中断发生前的程序。如果返回的标志符是其他的代码,则内核会设置一个事件,这个事件就是已经和该标志符相关连的事件。(5)内核调度该中断标识符相关联的IST运行。IST用于处理该中断发生后,所需要进行的所有的数据处理工作。(6)在完成中断的所有服务工作以后,IST通过调用Interrupt Done来表示完成中断服务,该函数还会重新开启本中断,以便下次再响应此硬件中断。2)中断系统特点纵观整个中断的处理过程,Microsoft Windows CE.Net中断系统的特点如下:(1)中断处理程序被分为两级,ISR和IST。ISR的任务简单,主要是返回中断
11、标志符,并迅速返回。IST为实际中断处理程序,响应中断的服务工作由它全部完成。(2)双级的结构,降低了延时。原因是ISR在运行时,系统处于屏蔽掉所有低级中断线的状态,但是ISR并不实际处理数据,只是返回中断号,所以可以快速返回,这样就降低了其它中断被延迟服务的时间;IST要服务于中断,因此可能要处理大量的数据,所需时间可能较长,但是IST运行时,除了它所服务的中断被屏蔽了以外,其他的所有中断都是可以被响应的。(3)双级的结构,简化了中断程序的设计,并增强了稳定性。通常,ISR由系统制造商实现,属于用户适应层(OEM Adaptive Layer),一旦编写完成,就可以服务于所有中断,一般不用修
12、改。IST作为中断的具体服务程序,由用户编写,它只是一个用户级的线程。因此,如果IST的编写过于繁琐,导致服务时间过长,它也只是影响本身这个中断的服务,而不会导致整个系统的中断服务瘫痪。1.3.3驱动构架特点如果一个OEM厂商,决定采用Microsoft Windows CE.Net作为操作系统来构建自己的终端平台,那么通常它需要做的工作一是创建自己硬件平台的BootLoader,即平台的启动代码;二是创建自己平台的BSP(Board Support Package),也就是板级支持包。而在BSP中,一个重要的组成部分就是Driver,即平台驱动程序。因为一个硬件平台究竟采用那些设备,只有OE
13、M商才清楚,而相关的驱动也就必须由OEM商来完成,并整合到系统映像中去。可以说,驱动程序占据了完成整个软件系统50%以上的工作量。(1) Windows CE.Net组织结构图2.3说明了驱动程序在Windows CE.Net系统中的位置。 微软己经提供的是中间的三层,最底两层是由OEM厂商来完成,而应用程序通常会由ISV,也就是独立软件开发商来完成。驱动程序主要由四部分来组成:图形驱动,网络驱动,文件驱动以及其它由设备管理器管理的驱动。一般而言,一个硬件平台上的所有设备驱动,均可以被归为上面四类。(2)驱动分类目前Windows CE.Net提供了四种设备模型,其中两种是专用于Windows
14、 CE.Net的模型,另外两种外部模型来自其它操作系统。基于Windows CE.Net的两种模型是本机的设备驱动(native driver)和流接口(stream interface)驱动程序。两种外部模型用于通用串行总线(USB)和网络驱动器接口标准(NDIS)的驱动程序。本机设备驱动程序适合于集成到Windows CE.Net平台的驱动。它是专门为底层内置硬件设计的。比较典型的本机设备驱动有触摸屏、键盘和PC卡插槽。因为本机设备驱动程序通常跟Windows CE平台有紧密联系,而且每种本机设备驱动程序有特殊的目的。微软为支持内部设备驱动程序提供了固定的接口,原始设备制造商可以创建自己的
15、本机设备驱动,也可以将微软的本机设备驱动移植到自己的平台之上。本机设备驱动是由图形窗口消息模块(GWES)根据注册表来加载,并且加载后属于gwes.exe的进程空间。跟本机设备驱动相对应的是流接口驱动。它具有定制的接口,一般是在用户一级的动态链接库DLL,用来实现一组固定的函数。这些函数就是流接口函数,它们使得应用程序可以通过文件系统来把设备当作文件打开。它们加载的方式也一致,均是通过设备管理器(Device.exe)根据注册表的信息来加载的。流接口驱动程序支持几乎任何类型的可以连接到Windows CE平台的外部设备。如接在串口上的各种外设等等。通用串行总线驱动(USBD)将通用串行总线兼容
16、设备与Windows CE连接起来。与流接口驱动程序不同,通用串行总线不要求输出特定的函数集。根据所使用的设备不同,通用串行总线驱动程序可以输出流接口函数,可以输出定制函数集或者使用Windows CE应用程序接口来展现设备的功能。网络设备接口标准(NDIS)驱动程序采用了Windows NT操作系统的驱动程序。NDIS驱动是使网络协议生效的驱动程序模型。如TCP/IP和红外线数据通信协议,与网卡(NICS)驱动程序的实现细节无关。1.3.4内存管理Microsoft Windows CE.Net的内存管理方式,不仅极大地影响到应用程序的编写,还对驱动程序的编写具有重要的指导作用,因为在Mic
17、rosoft Windows CE.Net系统中,驱动程序与应用程序均属于用户态的例程,本质上是一样的。CE系统的内存区域是这样划分的:(1)首先是33个32M大小的slot,每一个slot就是一个进程的运行空间,不同的进程运行在不同的slot空间中。Slot0表示当前被激活的进程的运行空间。所以可以看出,CE系统最多允许同时运行的进程数目为32个。(2)然后是被映射到一些各种文件的地址空间,也就是系统中存放的各种文件的虚拟地址。(3)2G-3G空间是一个特殊的空间,它通常是由CPU以一定的固定的映射规则映射到实际的物理内存空间的。当CE系统工作于kernel状态时,就是用的这个空间的地址。3
18、G以上的空间是保留给应用程序申请新的物理地址映射时用的。2.便携式媒体播放器BSP的实现板级支持包(BSP)是便携式多媒体播放器实现的重要内容,它介于操作系统和硬件之间,是操作系统能够运行的基础。本章主要描述便携式多媒体播放器的BSP实现过程,如BootLoader和OAL层部分的实现过程,具体包括了Bootloader中压缩和解压缩映象并传输到平台的过程以及OAL层的初始化、中断系统等。2.1 BSP的结构板级支持包是介于主板硬件和操作系统之间的一层,应该说是属于操作系统的一部分,主要目的是为了支持操作系统,使之能够更好地运行于主板硬件。构建便携式多媒体播放器的CE操作系统的关键就是实现BS
19、P软件包。BSP主要由OAL层、驱动层及配置文件构成。配置文件是影响生成或CE启动时的重要文件。BSP开发的主要步骤有:(1)建立BootLoader,用来下载系统映象,启动系统;(2)编写OAL程序,用来引导核心镜像和初始化、管理硬件;(3)为新的硬件编写驱动程序;(4)设置平台配置文件,便于Platform Builder编译系统。2.2 BootLoader的设计和实现BootLoader是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。2.2.1B
20、ootloader工作流程本项目所要实现的Windows CE.Net的映象生成于开发主机,但是最终要在开发板上运行。因此我们必须把映象文件下载到开发平台中去。所以,我们首先要实现终端平台的BootLoader。BootLoader单独存放在目标平台的非易失存储介质如FLASH或者ROM中,用于启动硬件和下载nk.bin映象到目标板上,并且输出打印信息,有一定的监控作用。BootLoader所采用的是2阶段的启动过程,分为stage1和stage2两部分。BootLoader与主机之间通过串口、USB进行文件传输,也可以通过以太网连接并借助TFTP协议来下载文件。流程如图3.2所示2.2.2启
21、动代码的实现启动代码是Bootloader的入口点,是由PXA270处理器可以直接允许的汇编语言编写的代码。当系统一上电,PXA270内部的程序计数器的值会自动设置为0,也就是说处理器将在地址为0的空间上开始执行BootLoader的第一条ARM指令。启动代码除了为启动Windows CE.Net的内核做准备之外还负责为Windows CE.Net的引导程序的执行做准备。如图3.3所示。2.2.3以太网下载模块实现我们的BootLoader可以通过菜单选择从以太网或者是USB下载映象。通过解析用户的命令是从Ethernet下载,那么便开始初始化网卡的硬件以及建立TFTP连接,并获得指定的IP地
22、址。然后开始接收UDP数据包,通过解封装的过程把有效数据抽取出来,这个数据就是系统映象。通常,在 Platform Builder自带的代码中,会包含有微软提供的 TFTP 连接的最基本的函数: (1)初始化TFTP连接:用函数EbootInitTFtp和EbootInitTFtpd完成。 (2)登记解析bin格式数据的回调函数:用EbootTFtpdServerRegister完成。 (3)发出连接请求:用EbootSendBootme完成。 (4)接收主机端发出的数据包:用EbootTFtpReceiver完成。 EbootTFtpReceiver 这个接收数据包的函数只能处理已经存入内存
23、的以太网数据包,必须添加以太网控制器接收数据的功能来把数据放入内存。本项目中以太网控制器采用的是SMSC 的LAN91c111,需要直接读写其端口来实现这一功能。 函数EbootTFtpdServerRegister登记一个回调函数EthDown, 它的功能是用于完成解析bin格式的数据和保存有效数据至目的地 RAM。如果目的地是FLASH的话,可以先存入内存中待下载完毕以后再写入FLASH。如果FLASH空间不够则报错。下载系统映象的流程如图3.4所示。2.2.4压缩和解压缩image的实现因为Flash跟SDRAM的价格往往比较贵,而有时候生成的映象nk.bin或者nk.nb0过大。为了节
24、约成本,可以在台式机上压缩映象文件,然后用微软提供的PlatformBuilder下载到目标板并且在启动的时候进行解压缩。压缩算法采用GZIP算法,一个12.9M的nk.bin可以被压缩成7.35M,大大节约了SDRAM和FLASH。(1)压缩映象的设计和实现我们使用Platform Builder生成的映象nk.bin或者nk.nb0有时候比较大,为了节约RAM跟FLASH我们在台式机上设计了一款压缩的软件把CE生成的映象文件压缩成相对较小的伪映象文件nk.bin,并且再通过Platform Builder下载到目标板上。解压缩的过程稍后讨论。压缩的程序是在台式机上使用VC完成的,压缩是利用
25、gzip算法实现的。压缩的过程先是利用Gzip算法压缩原有的映象,然后获取映象所要放置的位置参数以及Platform Builder所需要的参数,最后把所有的数据按照表3.1的结构所示按顺序重新组合成新的映象。表3.1就是压缩后的image的结构。项目内容注释新的 bin 映象的头char signature=B000FFnULONG StartAddressULONG LengthStartAddress = the originalStartAddress + originalLengthRecord0的头ULONG StartAddressULONG LengthULONG Checks
26、umRecord0的数据ULONG RomSignatureULONG RomOffsetRomOffset 指向Record2,Record2包含了新的 ROMHDRRecord1的头ULONG StartAddressULONG LengthULONG ChecksumRecord1的数据ULONG ulSig=CMPSULONG ulCompRecordSizeULONG ulCompressedSizeULONG ulOriginalLengthULONG ulOriginalImageStartULONG ulOriginalLaunchAddr在压缩的映象文件前加一个头,这样 Eb
27、oot 可以知道要被解压的 bin 文件的参数以及原始的 bin 文件的参数压缩的内容原始的被压缩的映象,如 nk.nb0Record2的头ULONG StartAddressULONG LengthULONG ChecksumRecord2的数据ROMHDR新的 bin 文件的假ROMHDR 数据结构Record3的头ULONG StartAddressULONG LengthULONG ChecksumRecord3的数据TOCentry一个 nk.exe 模块的假TOCentry,blcommon 要验证这个 entry 是否存在Record4的头ULONG StartAddress=0
28、ULONG Length=Launch AddrULONG Checksum=0最后一个记录 表3.1()解压缩映象的实现解压缩文件是在加载image的时候进行。在从Flash加载image到RAM中时,先判断image是否为压缩的,这主要是通过CompHeader结构中的ulSig字段来判断的,如果为“CMPS”就是被压缩了的映象。那么就初始化一块内存并根据CompHeader结构的内容设置buff_dest,dest_len等参数然后开始解压缩映象文件。解压缩的算法仍然是gzip算法。过程如图3.7所示。2.3 OAL层的实现OAL就是OEM适应层(OEM Adaptive Layer),
29、它是内核与硬件平台之间的软件层,负责硬件平台与操作系统内核之间的通信。所谓创建OAL层就是指完成一些函数用于内核和硬件设备之间的通信以及硬件启动的初始化和中断控制以及电源管理。不同硬件平台的OAL层的代码也是不一样的,不过要实现的函数名称及需要完成的功能有可能相同。我们以相近的平台Intel Mainstone的BSP中的OAL作为基础,对每个功能模块进行修改移植到我们的平台上。2.3.1 调试模块Windows CE.Net内核启动的过程中,会有一些必要的调试信息借助于串口或者以太网口传输到编译的台式机上。所以在平台上,我们使用串口输出调试信息,必须在OAL层实现这个模块。首先通过函数OEM
30、InitDebugSerial初始化本地模块,主要是初始化硬件传输串口,然后通过OEMReadDebugByte、OEMWriteDebugByte、OEMWriteDebugString、OEMClearDebugCommError四个函数实现读写字符、字符串的功能。2.3.2平台初始化CE使用OAL来完成用户平台的硬件初始化。首先CE内核在进行完最小程度的初始化之后系统就会调用OEMInit,利用这个函数我们就可以来初始化便携式媒体播放器的硬件平台。整个初始化的流程如图3.8所示。在OEMInit函数里面,完成的工作有:(1)初始化CPU的通用寄存器。(2)初始化时钟、时间片等计时模块。(
31、3)初始化中断系统,将中断线与ISR联系起来。(4)获取CPU的型号和版本号。2.3.3中断服务程序ISRISR就是中断服务程序,它属于OAL层的代码。我们的硬件使用的是Intel PXA270处理器,具有120个GPIO,它们每一个都可以作为一个中断源输入。(便携式多媒体播放器的中断号分配请查看相关资料,这里不作介绍)下面的程序是OEMInterruptHandler函数,它的作用是初始化和匹配中断服务程序,返回值是中断服务程序的入口地址:int OEMInterruptHandler(unsigned int ra)unsigned long ichp;int i;volatile int
32、 APB_temp,ret=SYSINTR_NOP;/读取最高优先级中断控制寄存器的值ichp=ReadICHP();if(ichp&XLLP_BIT_31)i=ICHPTOIRQID(ichp);ret=(*pIRQISRi)(ra);/执行它的ISRreturn(ret);其中pIRQISR数组的内容是所有的中断处理函数入口地址,上面函数的功能就是从IHCP寄存器里读取最高优先级的中断号,并且返回对应的中断服务程序的入口地址。IHCP是一个32位寄存器,它包含了未被屏蔽的引起IRQ和FIQ的具有最高优先级的外部设备的ID号,bit31是判断引起IRQ中断的外围设备ID号码是否有效的位,bi
33、t1620表示最高优先级IRQ的外围设备ID号。系统通过这个函数建立起中断映射表,一旦有中断发生,OEMInterruptHandler便会找出具有最高中断优先级的设备的服务函数并且进行中断服务。不过由于嵌入式中断服务程序在执行的时候会占用整个CPU,如果时间过长会引起整个系统看起来效率很低,所以中断服务程序要尽可能简短。我们在这个中断程序处理服务程序ISR里编写的代码非常少,只返回一个中断ID号,程序如下所示,它是keypad的中断服务程序,所做的工作是先把这个中断屏蔽掉然后便返回了中断号,主要的工作交给了中断服务线程IST来完成。int KEYPADISR(unsigned int ra)
34、/键盘的中断服务程序volatile XLLP_INTC_T*v_pICReg;v_pICReg=(volatileXLLP_INTC_T*)INTC_BASE_U_VIRTUAL;INTC_KEYPAD_INT_DIS(v_pICReg-icmr);/屏蔽keypad中断return SYSINTR_KEYPAD;/返回中断号在keypad的驱动里会定义一个HANDLE m_hevInterrupt,并利用InterruptInitialize(SYSINTR_KEYPAD,m_hevInterrupt,NULL,0)来注册接收SYSINTR_KEYPAD中断的事件通知。驱动程序调用Wait
35、forSingleObject函数来等待这个事件也就是中断的发生。如果等到了这个中断便执行真正要执行的服务程序,它们都是通过线程的形式实现的。中断使能和屏蔽是通过函数OEMInterruptEnable、OEMInterruptDisable来实现的,中断执行完毕后调用OEMInterruptDone来打开相应的中断。3.触摸屏和音频驱动程序的实现多媒体播放器的硬件平台有多个设备需要编写相应的驱动程序,本小节实现了平台所用的WM9712芯片所带的触摸屏以及音频部分的驱动。这两个驱动代表了WindowsCE.Net的两种类型的设备驱动:本机设备驱动和流接口设备驱动,对整个媒体播放器的其它硬件驱动
36、的开发有很好的参考价值。3.1触摸屏驱动设计与实现Windows CE.Net系统的本机设备驱动包括显示器、电池、键盘、触摸屏、PC卡插槽驱动。微软提供的样本设备驱动程序分为两种:单片驱动程序和分层的驱动程序。单片驱动程序基于一个程序片断,直接把硬件设备的接口传递给操作系统。而分层的驱动程序则由两个设置好的层组成:上层是模型设备驱动程序(MDD),下层是依赖平台的驱动程序(PDD)。大多数样本设备驱动程序都是分层的。图 4.1 说明了单片驱动程序和分层的驱动程序是如何在Windows CE操作系统中集成。在MDD层实现的函数集称为设备驱动程序接口(DDI),由GWES模块调用;设备驱动程序服务
37、提供器接口(DDSI)是在PDD中实现的函数集并且由MDD层调用。如果要是流接口驱动程序,则驱动程序把流接口作为它们的DDI使用。在这种情况下,驱动程序以普通的DLL方式存在并且根据需要由设备管理器调用。3.1.1触摸屏硬件电路设计处理器集成AC97 controller,本系统采用公司的作为电路接口芯片,同时带有驱动和电池检测功能的立体声功能,可以直接连接、和信号,该芯片与触摸屏及的接口如图所示:3.1.2触摸屏的工作原理触摸屏是一种简单、方便的输入设备,可以代替鼠标或者键盘,根据触点的位置来定位选择信息输入。触摸屏在用户输入的时候产生一个反映用户点击位置的信号,这个信号通常是模拟信号。通过
38、触摸屏控制器把模拟信号转换为数字信号(即坐标),再送给处理器处理。触摸屏的两个金属导电层是触摸屏的两个工作面(通常称作工作面和工作面),在每个工作面的两端各有一层银胶,称为该工作面的一对电极。如果对一个工作面的电极对施加电压则会产生均匀、连续的平行电压分布。当在方向的电极对施加一个确定的电压,而方向电极对不加电压时,在平行电压场中,触点处的电压值可以在(或)电极上反映出来,通过测量电极对地的电压大小便可以得知触点的坐标值。同理,对电极施加电压,电极不加电压时,通过测量电极的电压便可得知触点的坐标。触摸屏产生的是模拟信号,通过中触摸屏控制器转换成数字信号,从而准确地判断出触点的坐标位置。3.1.
39、3实现过程分析作为对输入设备的控制,除了完成必要的设备初始化,包括外部电路的中断设置和采样率设置以外,触摸屏驱动程序在系统中的任务主要是:反映用户按键的状态;采集精确的物理坐标并将其转换为显示坐标以便GUI处理。系统采用中断方式接受输入,为了实现上述目的,结合触摸屏的工作原理,采用以下方案:用中断方式很容易知道用户何时点下了屏幕,此时便可以开启触摸屏扫描获取物理坐标。而对于监测抬起可以采用查询的方式,因此可以在WindowsCE.Net下创建一个任务监测中断信号什么时候结束,并且将笔抬起的状态告知GUI。由于触摸屏控制器启动后能自动完成扫描,并且将物理坐标的AD值存入特定的寄存器然后产生触摸屏
40、扫描AD中断,因此可以在扫描AD中断服务程序中采集物理坐标并将其转换为显示坐标。为了提供精度,可以多采几次点,最后取平均值。整个响应触摸屏输入的过程按时间顺序分为:用户触摸,触发外部落笔中断,在落笔中断服务程序中,为了不影响笔触数据的交换,首先关闭落笔中断,然后将WM9712的工作模式分别转换到读坐标模式和读压力值模式,分别读取笔触点处的坐标值和压力值。然后为了能检测到起笔状态,在退出前需要开启中断检测电路的使能信号,然后可以通知监测起笔任务开始运行并且退出中断服务程序。此后监测起笔的任务开始运行,根据需要任务每隔50ms执行一次,为了消除抖动可以设置一个计数器,连续监测到几次的话可以告知GU
41、I,到时候就可以开放落笔中断,等待落笔事件,并且将自己挂起。从此时起新一轮的用户输入便可开始。如果用户长期按下,也可以在此监测任务中检测按下的时间,通过设定延时时间,定期开放落笔中断可以方便地处理持续落笔的情况。3.1.4触摸屏驱动的实现对于Windows CE.Net的驱动而言,驱动链接了tch_cal.lib和tchmdd.lib两个静态链接库,tch_cal.lib负责触摸屏的校准算法。tchmdd.lib是提供MDD层的DDI函数接口。Touch驱动由GWES加载,通过DDI调用驱动程序获取设备状态,设置驱动功能等,而驱动本身直接获得硬件信息来确定当前Touch的状态。驱动本身由两个部
42、分组成:MDD和PDD。其中MDD通常无需修改直接使用,该部分提供了面向GWES的DDI的接口,而MDD通过指定的DDSI函数接口调用PDD,这部分为需要由HIV或OEM厂商完成硬件相关的特定部分,也就是我们通常驱动需要实现的部分。PDD部分与MDD部分之间除了DDSI外还需要实现一些指定的变量定义或变量初始化动作,也就是说MDD与PDD之间并不一定是以严格的分层模型来实现,有时候也需要通过共享变量的方式来完成交互。PDD层是驱动程序的最底层,主要功能是判断设备状态及控制设备的工作和数据的读写。所有的硬件细节都由这层程序处理。在模块化程序设计中,根据实现功能的独立性一般将对硬件的基本操作编写为
43、若干函数。将所有的硬件的底层特性用模块化的方法封装起来就成了DDSI。触摸屏的硬件操控层主要处理的问题有:设备初始化、触笔状态判断和触点原始坐标数据的读写。)设备初始化Touch panel的初始化是通过函数TouchPanelEnable来完成的。调用的DDSI函数为DdsiTouchPanelEnable。该函数的执行动作为:(1)初始化Touch的电源管理用到的KeepAliveEvent事件;(2)分配寄存器,并初始化ACLink层;(3)初始化WM9712的跟touch panel有关的寄存器,使得芯片在有笔触的状态下产生中断;(4)设置触摸屏的电源状态为打开,并开始电源管理。2)取
44、点函数DdsiTouchPanelGetPoint是获取笔触的点的坐标值函数。根据发过来的中断判断是笔按下的中断还是笔抬起的中断。如果笔按下的话那么就调用SampleTouchScreen函数去获取屏幕的坐标,并且调用IPM_RegisterTouchActivity电源管理函数来设置跟电源相关的事件,也就是告诉电源管理器有用户活动发生。SampleTouchScreen是读WM9712的ADC转换后的寄存器获得坐标x和y的坐标模拟值,并且读多次放在一个数组里,最后调用evaluateSample函数判断这个点读出来的三个坐标值,如果彼此之间相差过大则说明这个点是无效的测量值,否则有效。在获得点的坐标之后便打开中断,以便响应下次点击事件。3)中断处理函数也不是的接口。它用于等待和处理触摸屏时间中断,为整个驱动程序提供唯一的事件源。其中要调用函数来获得触点的坐标。该函数实现的内容为:()循环等待接收中断消息,并构成函数的主体;()通过获取当前触摸屏位置信息;()在获取有效数据且在校准状态下,收集递交按下的位置信息;()在正常状态下,校准数据,并检查校准后数据的有效性;()最后调用由传入的回调函数,提交位置信息和状