之前的文章http://blog.csdn.net/shevsten/archive/2010/01/14/5188898.aspx介绍了如何获得触摸屏坐标,设置注册表,将CSP下的Touch搬运到BSP目录下等移植应用工作.现在我们来具体分析下WinCE下触摸屏驱动是如何实现的.
1.首先简单介绍下触摸屏的原理.从网上搜集了一些资料:
很多LCD模块都采用了电阻式触摸屏,这些触摸屏等效于将物理位置转换为代表X、Y坐标的电压值的传感器。通常有4线、5线、7线和8线触摸屏来实现.我们这里的就是4线式触摸屏.
电阻式触摸屏是一种传感器,它将矩形区域中触摸点(X,Y)的物理位置转换为代表X坐标和Y坐标的电压。很多LCD模块都采用了电阻式触摸屏,这种屏幕可以用四线、五线、七线或八线来产生屏幕偏置电压,同时读回触摸点的电压。
触摸屏包含上下叠合的两个透明层,四线和八线触摸屏由两层具有相同表面电阻的透明阻性材料组成,五线和七线触摸屏由一个阻性层和一个导电层组成,通常还要用一种弹性材料来将两层隔开。当触摸屏表面受到的压力(如通过笔尖或手指进行按压)足够大时,顶层与底层之间会产生接触。所有的电阻式触摸屏都采用分压器原理来产生代表X坐标和Y坐标的电压。如图3所示,分压器是通过将两个电阻进行串联来实现的。上面的电阻(R1)连接正参考电压(VREF),下面的电阻(R2)接地。两个电阻连接点处的电压测量值与下面那个电阻的阻值成正比。
为了在电阻式触摸屏上的特定方向测量一个坐标,需要对一个阻性层进行偏置:将它的一边接VREF,另一边接地。同时,将未偏置的那一层连接到一个ADC的高阻抗输入端。当触摸屏上的压力足够大,使两层之间发生接触时,电阻性表面被分隔为两个电阻。它们的阻值与触摸点到偏置边缘的距离成正比。触摸点与接地边之间的电阻相当于分压器中下面的那个电阻。因此,在未偏置层上测得的电压与触摸点到接地边之间的距离成正比。
四线触摸屏
四线触摸屏包含两个阻性层。其中一层在屏幕的左右边缘各有一条垂直总线,另一层在屏幕的底部和顶部各有一条水平总线,见图4。为了在X轴方向进行测量,将左侧总线偏置为0V,右侧总线偏置为VREF。将顶部或底部总线连接到ADC,当顶层和底层相接触时即可作一次测量。
为了在Y轴方向进行测量,将顶部总线偏置为VREF,底部总线偏置为0V。将ADC输入端接左侧总线或右侧总线,当顶层与底层相接触时即可对电压进行测量。图5显示了四线触摸屏在两层相接触时的简化模型。对于四线触摸屏,最理想的连接方法是将偏置为VREF的总线接ADC的正参考输入端,并将设置为0V的总线接ADC的负参考输入端。
2.GEC2410触摸屏原理图
触摸屏的四线TSXP,TSXM,TSYP,TSYM分别连接CPU的AIN7&nXPON,XMON,AIN5&nXPON,YMON
AIN7和AIN5连接的是CPU的ADC控制器引脚,其余的对应CPU的Touch Screen控制器引脚.
3.Windows CE触摸屏驱动架构
触摸屏驱动从硬件读取用户输入,然后转换成一个触摸事件发送给GWES.同时将为计算的坐标转换为校准坐标.校准坐标对硬件异常,如触摸倾斜,非线性顺序做了补偿运算.
触摸屏驱动正常工作时,当用户用触摸行为时需要提供该触摸点.当触摸结束时驱动必须提交至少一个事件以通知系统触摸笔已移除.
开发人员可以使用以下步骤来进行对触摸屏进行采样和校准:
(1) 调用TouchPanelEnable开始屏幕采样
(2) 调用TouchPanelGetDeviceCaps来获取采样点数目
(3) 对于每个校准点,进行以下步骤
a. 调用TouchPanelGetDeviceCaps来获得一个校准坐标
b. 在返回坐标画一个交叉线
c. 调用TouchPanelReadCalibrationPoint来获得校准点数据
(4) 调用TouchPanelSetCalibration来计算校准系数.
当驱动执行完以上顺序后,任何采样数据被传递给TouchPanelEnable定义的回调函数.驱动可以传递校准好的坐标也可以传递未校准的坐标给回调函数.如果驱动有有效的校准算法,可以返回校准好的坐标.如果算法复杂,可以返回未校准坐标以避免在高优先级的驱动线程中进行计算,而是交由较低优先级的驱动回调函数来进行计算.
我们实际上是在应用程序中调用TouchCalibrate来完成触摸屏校准的.
source文件里引用了两个库tch_cal.lib和tchmdd.lib.
SOURCELIBS= /
$(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/tch_cal.lib /
$(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/tchmdd.lib /
tch_cal.lib(/WINCE500/PUBLIC/COMMON/OAK/DRIVERS/TOUCH/TCH_CAL)实现了触摸屏的校准算法.下表中的ErrorAnalysis,TouchPanelSetCalibration,TouchPanelCalibrateAPoint在此库中实现
tchmdd.lib(/WINCE500/PUBLIC/COMMON/OAK/DRIVERS/TOUCH/TCHMAIN/tchmain.c),实现了其他的touch screen driver functions.
这两个库实际上就是触摸屏的MDD层驱动.
Programming element |
Description |
ErrorAnalysis |
This function provides information on the accuracy of the touch screen calibration. |
TouchCalibrate |
This function starts the touch screen calibration sequence. |
TouchPanelCalibrateAPoint |
This function converts noncalibrated points to calibrated points. |
TouchPanelDisable |
This function disables the touch screen. |
TouchPanelEnable |
This function enables and re-enables the touch screen. |
TouchPanelGetDeviceCaps |
This function returns information about the capabilities of the touch screen. |
TouchPanelInitializeCursor |
This function provides an opportunity for touch drivers to move the cursor at initialization time. |
TouchPanelPowerHandler |
This function handles power-state change notifications. |
TouchPanelReadCalibrationAbort |
This function aborts the currently active call to the TouchPanelCalibrateAPoint function. |
TouchPanelReadCalibrationPoint |
This function initiates the process of getting a calibration point. |
TouchPanelSetCalibration |
This function initializes calibration information in a global parameter vCalcParam, which you can use to convert noncalibrated points to calibrated points by the TouchPanelCalibrateAPoint function. |
TouchPanelSetMode |
This function sets mode information for a touch screen device. |
而我们需要实现的PDD层驱动则是对应的以下DDSI函数,被对应的MDD层函数调用.
Programming element |
Description |
DdsiTouchPanelAttach |
This function executes when the MDD's DLL entry point receives a DLL_PROCESS_ATTACH message. |
DdsiTouchPanelDetach |
This function executes when the MDD's DLL entry point receives a DLL_PROCESS_DETACH message. |
DdsiTouchPanelDisable |
This function disables the touch screen device. |
DdsiTouchPanelEnable |
This function applies power to the touch screen device and initializes it for operation. |
DdsiTouchPanelGetDeviceCaps |
This function queries capabilities of the touch screen device. |
DdsiTouchPanelGetPoint |
This function returns the most recently acquired point and its associated tip state information. |
DdsiTouchPanelPowerHandler |
This function indicates to the driver that the system is entering or leaving the suspend state. |
DdsiTouchPanelSetMode |
This function sets information about the touch screen device. |
下一篇我们就来具体看看我们需要实现的这些DDSI函数.