Wince6.0 s3c6410触摸屏驱动分析
3.1
3.3 DdsiTouchPanelGetPoint()函数分析... 13
3.6 Touch_Pen_Filtering()函数分析... 19
一、wince 触摸屏驱动概述
在Windows CE操作系统中触摸屏驱动是一种分层驱动。其驱动模型如下图所示。上层是模型设备驱动程序(Model Device Driver, MDD),下层是依赖平台的驱动程序(Platform Dependent Driver, PDD)。MDD通常无需修改直接使用,MDD链接PDD层并定义它希望调用的函数接口:设备驱动程序提供器接口(Device Driver Service Provider Interface, DDSI)。同时MDD把不同的函数集提供给操作系统,这些函数叫做设备驱动程序接口(Device Driver Interface, DDI),这部分为也就是我们通常驱动需要实现的部分。
二、触摸屏驱动接口分析
2.1 Windows CE 触摸屏驱动工作过程
Windows CE的触摸屏驱动链接了tch_cal.lib和tchmdd.lib两个静态链接库。触摸屏驱动由GWES加载,GWES通过DDI调用驱动程序获取设备状态,设置驱动功能等,而驱动本身通过DDSI直接获得硬件信息来确定当前触摸屏的状态。
Windows CE触摸屏驱动要求的DDI接口包括:TouchPanelGetDeviceCaps、TouchPanelEnable、TouchPanelDisable、TouchPanelSetMode、TouchPanelReadCalibratio
Windows CE触摸屏驱动要求的DDSI接口包括:DdsiTouchPanelAttach、DdsiTouchPanelDetach、DdsiTouchPanelDisable、DdsiTouchPanelEnable、DdsiTouchPanelGetDeviceC
2.2 触摸屏驱动程序的实现
Windows CE6.0触摸屏驱动程序采用中断方式对触摸笔的按下状态进行检测,如果检测到触摸笔按下将产生中断并触发一个事件通知一个工作线程开始采集数据。同时,驱动将打开一个硬件定时器,只要检测到触摸笔仍然在按下状态将定时触发同一个事件通知工作线程采集数据,直到触摸笔抬起后关闭该定时器,并重新检测按下状态。驱动中采用了触摸屏中断以及定时器中断2个中断源,不仅可以监控触摸笔按下和抬起状态,而且可以检测触摸笔按下时的拖动轨迹。
2.3四线电阻式触摸屏的工作原理
四线电阻式触摸屏的结构如下图,在玻璃或丙烯酸基板上覆盖有两层透平,均匀导电的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使用
三、wince 6.0 触摸屏驱动分析
Windows CE触摸屏驱动程序采用中断方式对触摸笔的按下状态进行检测,如果检测到触摸笔按下将产生中断并触发一个事件通知一个工作线程开始采集数据。同时,驱动将打开一个硬件定时器,只要检测到触摸笔仍然在按下状态将定时触发同一个事件通知工作线程采集数据,直到触摸笔抬起后关闭该定时器,并重新检测按下状态。驱动中采用了触摸屏中断以及定时器中断两个中断源,不仅可以监控触摸笔按下和抬起状态,而且可以检测触摸笔按下时的拖动轨迹。
3.1 TouchPanelEnable () 函数分析
触摸屏驱动在初始化过程调用TouchPanelEnable函数使能触摸屏。该函数调用的DDSI函数为:DdsiTouchPanelEnable和DdsiTouchPanelDisable。该函数实现如下内容:
1) 创建事件hTouchPanelEvent和hCalibrationSampleAvaila
2) 检查并初始化所需的中断gIntrTouch(触摸屏中断)和gIntrTouchChanged(定时器中断),并将中断gIntrTouch、gIntrTouchChanged关联到事件hTouchPanelEvent。当gIntrTouch,gIntrTouchChanged中断产生时将触发hTouchPanelEvent事件;
3) 创建一个ISR线程TouchPanelpISR。TouchPanelpISR用于等待和处理触摸屏事件hTouchPanelEvent,它是整个驱动程序中唯一的事件源。
TouchPanelEnable()实现 C:\WINCE600\PUBLIC\COMMON\OAK\DRIVERS\TOUCH目录下
代码如下:
BOOL
TouchPanelEnable(
{
//创建hTouchPanelEvent 触摸屏事件和hCalibrationSampleAvaiab
//
检查并初始化所需的中断gIntrTouch(触摸屏中断)和gIntrTouchChanged(定时器中断),
//
并将中断gIntrTouch、gIntrTouchChanged关联到事件hTouchPanelEvent。
将hTouchPanelEvent事件与中断号gIntrTouch绑定,并使能中断
}
将hTouchPanelEvent事件与中断号gIntrTouchChanged绑定,并使能中断
//
创建一个ISR线程TouchPanelpISR。TouchPanelpISR用于等待和处理
//
触摸屏事件hTouchPanelEvent,它是整个驱动程序中唯一的事件源。
}
3.2 TouchPanelpISR()函数分析
TouchPanelpISR函数是实现触摸屏数据采集关键函数,它实现的内容为:
1) 等待循环,用于接收hTouchPanelEvent事件,并构成函数的主体;
2) 通过调用DdsiTouchPanelGetPoint函数获取当前触摸屏位置和状态信息;
3) 在获取有效数据且在校准状态下,收集并提交按下的位置信息;
4) 在正常状态下,校准数据,并检查校准后数据的有效性;
5) 最后调用由GWES传入的回调函数,提交位置信息和状态信息。
TouchPanelpISR()代码如下
// 中断服务函数,采样频率10ms
static ULONG
TouchPanelpISR(
{