触摸屏驱动

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.3 WinCE   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产生一次定时中断,进行一次采样。

6.判断触摸屏是否被触摸和中断处理 

咱们采用中断等待模式,当触笔按下时,触摸屏控制器产生中断信号(INT_TC)给中断控制器,中断处理程序捕捉到这个物理中断后,调用已注册的 ISR来决定如何处理这个硬件中断。ISR向内核返回对应于这个物理中断的逻辑中断号,好比咱们用触笔按下触摸屏时,产生INT_TC物理中断,ISR把物理中断号映射成逻辑中断信号,而后 操做系统 根据物理中断号触发所关联的WinCE事件内核对象gIntrTouch,从而等待这个事件内核对象的IST (TouchPanelpISR,这个名字不是很合理应该改成TouchPanelpIST)来开始执行中断处理。

咱们在驱动中采用了两个中断源,一个是触摸屏中断(包括触笔按下或抬起中断,根据ADC触摸屏控制寄存器ADCTSC的UD_SEN位来决定,在代码中的名字是gIntrTouch),也就是说当触笔按下或抬起时会产生物理中断INT_TC,其对应的逻辑中断号为SYSINTR_TOUCH;另外一个是定时器中断(在此采用timer3),只要检测到触笔仍然在按下状态,将定时(在此是10ms,在代码中的名字是gIntrTouchChanged) 产生定时中断INT_TIMER3,其对应的逻辑中断号为SYSINTR_TOUCH_CHANGED。这两个中断产生时都会触发同一个事件 hTouchPanelEvent,而后等待这个时间的IST(TouchPanelpISR)线程将开始执行。

如下是产生中断的条件

⑴ 触笔按下时,产生触摸屏中断。

⑵ 触笔抬起时,也产生触摸屏中断。

⑶ 触笔按下产生触摸屏中断的同时,驱动打开硬件定时器timer3,只要检测到触笔仍然在按下状态,将定时(每隔10ms产生定时器中断)中断。

判断触笔对于触摸屏的活动状况的流程以下:  

7. 得到稳定、去抖动的位置测量数据 

在得到触摸点的原始坐标(数值范围由所选用的A/D转换器位数决定)后,还要根据具体使用的液晶屏实际像素进行转换,转换后经过校准直接转化为屏幕上的坐标,以方便图形 界面 的后续 开发 ,而后经过回调函数把屏幕坐标和采样状态这些参数传递给GWES

人机界面中对触摸屏的操做有如下3钟:

⑴ 触摸笔在触摸屏上的位置不变。

⑵ 触摸笔在触摸屏上连续滑过。

⑶ 触摸笔在触摸屏上有大幅度的跳跃。

7.1 触摸屏采样程序

当触笔按下时,就开始进行触摸屏触摸坐标的采样,同时打开定时中断,为10ms后的定时器中断作好准备。下面是采样过程:

⑴ 经过对ADC控制寄存器ADCCON和ADC触摸屏控制寄存ADCTSC的设置,启动自动测量X坐标和Y坐标。

⑵ 等待AD转换完成,经过对ADCCON的ECFLG的访问能够判断AD转换完成与否。

⑶ AD转换完成后,就经过对ADC转换数据寄存器ADCDAT0和ADCDAT1的读取触摸屏坐标的Y坐标和X坐标值。

⑷ 回到第一步,连续取得5组数据,求和并计算其平均值,若是平均值和这5组数据中最近一次数据的差值大于咱们规定的阈值(这个阈值应该须要根据咱们采用的 LCD屏的分辨率来决定)时,认为这次采样值无效,同时对修改寄存器ADCTSC的设置,让其处于等待中断模式,为下次中断(触笔抬起中断作好准备)。

7.2 触摸屏滤波程序

经过函数TSP_GetXY()获得触笔按下位置的触摸屏坐标后,到把校准后的坐标经过回调函数传递给GWES,其中此回调函数是经过GWES调用TouchPanelEnable(pfnCallback)函数传递进来的,这过程有如下步骤:

⑴ 经过函数TSP_GetXY()获得触笔按下位置的触摸屏坐标。

⑵ 根据具体使用的液晶屏实际像素对触摸屏坐标进行转换,也即经过函数

TSP_TransXY()转换TSP_GetXY()函数获得的触摸屏坐标,用到公式

X=W*(x-x1)/(x2-x1),Y=H*(y-y1)/(y2-y1),其中(x1,y1)和(x2,y2)分别表示显示区域左上角和右上角对应的触摸屏的采样坐标,在此显示屏的分辨率为240×320,代码中(x1,y1)和(x2,y2)值为(85,105)和(965,980),这些值是分辨率240×4和320×4后肯定的,相应地咱们也须要对W和H作处理:W=4*W,H=4*H,(x,y)是触摸屏上任意一点的采样坐标(在这里有一个地方有疑问,右下角坐标的x值为何是965,它不是大于240×4了吗?)。

⑶ 对由⑵获得的坐标值进行判断,若是x坐标值大于等于240×4,或者y坐标值大于等于320×4(也就是⑵转换前的x坐标值大于等于965,y坐标值大于等于980)时,咱们认为此次采样值无效,或者若是最近两次采样值的相应的x坐标值差额或y坐标值差额分别小于等于15和40,则表示触笔在这两次采样的时间内一直在同一个位置,故忽略最近的采样值;若是若是最近两次采样值的相应的x坐标值差额或y坐标值差额分别大于15和40,则表示触笔在这两次采样的时间内触笔在滑动,这次采样有效。

⑷经过TouchPanelCalibrateAPoint()函数把有效的触摸屏按下点的坐标转换成相应的显示设备点坐标,用到Sx=A1*Tx +B1*Ty+C和Sy=A2*Tx+B2*Ty+C2这两个公式,其中A1,B1,C1和A2,B2,C2在执行触摸屏校准程序的时候经过 TouchPanelSetCalibration()函数计算出来。

⑸经过⑷转换获得显示坐标,对这些值进行边界检查,若是此x坐标值大于等于。

⑹经过TouchPanelEnable(pfnCallback)函数传递进来的函数指针进行回调,同时传递采样状态,校准后获得的显示坐标给GWES。


触笔按下的触摸屏坐标通过校准后,经过callbak函数采样状态和位置变化信息经过GWES发送给更高层的图形 软件

8.校准触摸屏 

触摸屏的校准过程以下:

⑴ 调用TouchPanelEnable函数来启动触摸屏采样。

⑵ 调用TouchPanelGetDeviceCaps函数来得到校准触点的个数。

⑶ 去校准点,对于每个校准点都有一下过程:

I:调用TouchPanelGetDeviceCaps函数来获得校准点的坐标。

II:在上述校准点处画十字,等待用户点击.

III:用户点击十字图形后,调用TouchPanelReadCalibrationPoint函数来得到上述校准点处触摸屏对应的坐标。

⑷ 当取完所需用的校准点,调用TouchPanelSetCalibration函数来计算校准系数A1,B1,C1和A2,B2,C2。

完成上述步骤后,WinCE平台下的触摸屏驱动开发就已基本完成,实际操做中还需考虑具体的硬件 环境