1.触摸屏驱动程序的模型
1.1 分层触摸屏驱动层序结构
本触摸屏驱动采用分层驱动程序结构,其驱动模型如下图所示,这种结构将驱动程序代码区分为上层模型设备驱动层(MDD),下层是依赖平台的驱动层(PDD)。其中MDD层通常无需修改就可以直接使用,改部分提供面向GWES的DDI的接口,而MDD通过指定的DDSI函数接口调用PDD,这就是我们通常驱动要实现的部分。PDD部分和MDD部分除了DDSI函数集接口外,还要实现一些指定的变量的定义或变量初始化动作(比如,gIntrTouch和gIntrTouchChanged在PDD层定义,但主要在MDD层使用。),也就是说MDD层和PDD层之间并不一定是以严格的分层模型来实现的,有时候也要通过共享变量的方式来完成交互。
1.2 DDI函数集(MDD层)
TouchPanelPowerHandler(BOOL boff)
Touch Screen的电源管理函数,boff:TRUE表示关闭电源,FALSE表示打开电源,其只是调用DdsiTouchPanelPowerHandler()函数,该函数在进入或退出poweroff状态时产生。
TouchPanelCalibrationAPoint()
该函数用于校准输入的触摸屏坐标,把触摸屏坐标转换为显示坐标,利用了公式Sx=A1*Tx+B1*Ty+C和Sy=A2*Tx+B2*Ty+C2。
TouchPanelReadCalibrationPoint()
在执行触摸屏校准程序时,用这个函数获得在当前校准点的十字形上点击的触摸屏坐标。
TouchPanelReadCalibrationAbord()
该函数在校准取消时被调用(在触摸屏校准程序运行过程中取消校准),仅仅设置状态位和事件后返回。
TouchPanelDisable()
禁用触摸屏(touch panel)设备,该函数关闭ISR,停止中断和注销事件及其他同步手段,此函数调用了DdsiTouchPanelDisable()函数。
TouchPanelEnable(PFN_TOUCH_PANEL_CALLBACK pfnCallback)
PfnCallback是指向处理touch panel事件的回调函数,该函数的执行动作:
⑴创建事件hTouchPanelEvent和hCalibrationSampleAvailable,其中当触笔按下或抬起,或者定时器中断时会触发hTouchPanelEvent事件,而在校准状态下当有校准数据输入时会触发hCalibrationSampleAvailable事件。
⑵初始化临界区,初始化所需的触摸屏中断gIntrTouch和gIntrTouchChanged,并且把它们关联到事件hTouchPanelEvent中。
⑶创建IST TouchPanelpISR,并设定其优先级。
TouchPanelSetCalibration()
该函数通过运行触摸屏校准程序时的校准动作获得显示坐标(Sx,Sy)和触笔在十字形上按下的触摸坐标(Tx,Ty)用于计算校准参数A1,B1,C1和A2,B2,C2。
TouchPanelGetDeviceCaps()
用于查询触摸屏设备支持的具体功能,通过DDSI函数查询相应的信息,当查询屏幕坐标信息时保存屏幕信息,供后面程序计算校准参数所用。
TouchPanelSetMode()
用于设置触摸屏的工作模式(采用低采样率还是高采样率),当设置IST优先级时直接通过内核API来完成,而直接将其他设置交给DdsiTouchPanelSetMode()函数来处理。
1.3WinCE DDSI函数集(PDD层)
DdsiTouchPanelGetDeviceCaps(INT iIndex, LPVOID lpOutput)
查询touch panel设备的相关信息。
IIndex:查询的索引值,其取值如下:
TPDC_SAMPLE_RATE_ID:查询采样率信息。
TPDC_CALIBRATION_POINT_COUNT_ID:查询用于校验的点的个数。
TPDC_CALIBRATION_POINT_ID:查询需要校验的点的坐标。
LpOutput:根据iIndex值分别指向相关的信息。
DdsiTouchPanelSetMode()
设置Touch Panel工作模式。
iIndex:模式索引
TPSM_SAMPLERATE_HIGH_ID:高采样率
TPSM_SAMPLERATE_LOW_ID:低采样率
lpInput:指向包含相关信息的内存
DdsiTouchPanelEnable()
该函数所执行的动作:
⑴为需要用到的I/O,ADC,PWM和INT寄存器分配内存空间。
⑵配置触摸屏控制器、中断控制器和PWM的寄存器。
⑶申请触摸屏中断gIntrTouch和定时器中断gIntrTouchChanged,并且对它们进行初始化,为物理中断号分配相应的系统逻辑中断号。。
DdsiTouchPanelDisable()
屏蔽触摸屏中断和释放为I/O,ADC,PWM和INT寄存器分配的WinCE内存空间。
DdsiTouchPanelAttach()
只是简单地返回1。
DdsiTouchPanelDetach()
只是简单地返回0。
DdsiTouchPanelGetPoint (TOUCH_PANEL_SAMPLE_FLAGS * pTipStateFlags,
INT * pUncalX,
INT * pUncalY )
获得Touch Panel上被按下的点的状态和坐标。
◆pTipState:当前触摸点的状态,比如无效点,有效点,被按下的点等。
◆pUnCalX:触摸点的X坐标
◆pUnCalY:触摸点的Y坐标
◆DdsiTouchPanelPowerHandler()
设置touch panel的电源状态,boff:TRUE表示关闭电源,FALSE表示打开电源,
2.触摸屏驱动程序的实现
Windows CE5.0触摸屏驱动程序采用中断方式对触摸笔的按下状态进行检测,如果检测到触摸笔按下将产生中断并触发一个事件通知一个工作线程开始采集数据。同时,驱动将打开一个硬件定时器,只要检测到触摸笔仍然在按下状态将定时触发同一个事件通知工作线程采集数据,直到触摸笔抬起后关闭该定时器,并重新检测按下状态。驱动中采用了触摸屏中断以及定时器中断2个中断源,不仅可以监控触摸笔按下和抬起状态,而且可以检测触摸笔按下时的拖动轨迹。触摸屏驱动流程下图所示
3.四线电阻式触摸屏的工作原理
四线电阻式触摸屏的结构如图1,在玻璃或丙烯酸基板上覆盖有两层透平,均匀导电的ITO层,分别做为X电极和Y电极,它们之间由均匀排列的透明格 点分开绝缘。其中下层的ITO与玻璃基板附着,上层的ITO附着在PET薄膜上。X电极和Y电极的正负端由“导电条”(图中黑色条形部分)分别从两端引 出,且X电极和Y电极导电条的位置相互垂直。引出端X-,X+,Y-,Y+一共四条线,这就是四线电阻式触摸屏名称的由来。当有物体接触触摸屏表面并施以 一定的压力时,上层的ITO导电层发生形变与下层ITO发生接触,该结构可以等效为相应的电路,
计算触点的X,Y坐标分为如下两步:
1. 计算Y坐标,在Y+电极施加驱动电压Vdrive, Y-电极接地,X+做为引出端测量得到接触点的电压,由于ITO层均匀导电,触点电压与Vdrive电压之比等于触点Y坐标与屏高度之比。
2. 计算X坐标,在X+电极施加驱动电压Vdrive, X-电极接地,Y+做为引出端测量得到接触点的电压,由于ITO层均匀导电,触点电压与Vdrive电压之比等于触点X坐标与屏宽度之比。
测得的电压由ADC转化为触摸点的原始坐标(数值范围由所选用的A/D转换器位数决定)后,还要根据具体使用的液晶屏实际像素进行转换,转换后通过校准直接转化为屏幕上的坐标,供GWES使用。
4.触摸屏的接口部分
◆X+:连接触摸屏控制器的TSXP,。
◆X-:连接触摸屏控制器的TSXM。
◆Y+:连接触摸屏控制器的TSYP。
◆Y-:连接触摸屏控制器的TSYM。
在触摸屏接口使用时,TSXM或TSYM应该接触摸屏接口的。
5.配置控制器硬件
5.1 ADCCON-----ADC控制寄存器
ECFLG:ADCCON[15],AD转换结束标志,只读,0表示AD转换在过程中;1表示AD转换结束。
PRSCEN:ADCCON[14],AD转换器预分频器使能,在此使能,故为1。
PRSCVL:ADCCON[13:6],AD转换器预分频器值,在此为49。
SEL_MUX:ADCCON[5:3],模拟信号输入通道选择,在此选择XP,故为7。
STDBM:ADCCON[2],备用操作模式选择,在此选择普通操作模式,故为0。
READ_START:ADCCON[1],通过读取来启动A/D转换,在此选择通过读取操作无效来启动A/D转换,故为0。
ENABLE_START,ADCCON[0],通过使能该位来启动A/D转换,在此选择无操作。此位在A/D转换开始后被使能。
5.2 ADCTSC-----ADC触摸屏控制寄存器
UD_SEN:ADCTSC[8],在此选择检测到触笔按下就产生中断信号,故为0。
YM_SEN:ADCTSC[7],YM开关使能,在此选择YM输出驱动有效(GND),故为1。
YP_SEN:ADCTSC[6],YP开关使能,在此选择YP输出驱动无效(AIN5),故为1。
XM_SEN:ADCTSC[5],XM开关使能,在此选择XM输出驱动无效(Hi-Z),故为0。
XP_SEN:ADCTSC[4],XP开关使能,在此选择XP输出驱动无效(AIN7),故为1。
PULL_UP:ADCTSC[3],上拉开关使能,在此选择XP上拉有效,故为0。
AUTO_PST:ADCTSC[2],初始化时,在此选择自动连续测量X坐标和Y坐标,故为0,但如果开始转换时,应该置1。
XY_PST:ADCTSC[1:0],手动测量X坐标和Y坐标,在此选择等待中断模式,故为3。
注:当等待触摸屏中断时,XP_SEN位(XP输出无效)应该置为1,且PULL_UP(XP上拉使能)位应该置为0。
5.3 ADCDLY-----ADC开始延时寄存器
DELAY:ADCDLY[154:0],因为选择等待中断模式,此值表示,当触笔按下出现在睡眠模式时,产生一个用于推出睡眠模式的信号,有几个毫秒的时间间隔。在此此值为40000?????????(40s,太长了吧?)
SUBINTMSK-----WinCE中子中断屏蔽寄存器
该寄存器有11位,每位和一位中断源相关。触摸屏中断请求有效,故第十位应设为0。
v_pINTregs->INTSUBMSK &= ~(1<<IRQ_SUB_TC);
5.4 TCFG1-----5路多路器及DMA模式选择寄存器
MUX3:TCFG1[15:12],为PWM计时器3选择多路输入,并初始化其值,每个定时器都有一个时钟分频器,其可以生成5钟不同的分频信号(1/2,1/4,1/8,1/16和TCLK),在此选择1/16分频。
v_pPWMregs->TCFG1 &= ~(0xf << 12); /* Timer3's Divider Value */
v_pPWMregs->TCFG1 |= (3 << 12); /* 1/16
TCNTB3-----PWM定时器3计数缓存寄存器,选择定时器3为时钟,比如定义10ms中断一次,提供触摸屏采样时间基准,即10ms触摸屏采样一次。在此为17×1000/100=170,在此PCLK=400MHz/6,可以得出timer3的时钟频率=PCLK/(244+1).16,可以算数触摸屏就是10ms产生一次定时中断,进行一次采样