本文向您介绍WinCE中采用分层驱动程序结构实现的触摸屏驱动,包括对触摸屏驱动模型的讲解、触摸屏驱动程序的实现及接口实现等知识。
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发生一次守时中止,进行一次采样。#p#
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渠道下的接触屏驱动开发就已基本完结,实践操作中还需考虑详细的硬件环境。
【修改引荐】
- Windows Mobile和WinCE的差异
- 根据WinCE的液位遥测体系软件设计
- WinCE电源办理应对移动嵌入式能耗瓶颈
- WinCE中串口驱动及接口函数介绍
- WinCE中nandflash驱动开发介绍
知优网 » WinCE中触摸屏驱动开发详解(触摸屏进入wince系统方法)