基于S3C6410的Touch驱动详解(之一)

来源:互联网 发布:php用户登陆页面 编辑:程序博客网 时间:2024/05/21 04:18

Windows CE操作系统中触摸屏驱动是一种分层驱动。其驱动模型如图1所示。上层是模型设备驱动程序(Model Device Driver, MDD),下层是依赖平台的驱动程序(Platform Dependent Driver, PDD)。MDD通常无需修改直接使用,MDD链接PDD层并定义它希望调用的函数接口:设备驱动程序提供器接口(Device Driver Service Provider Interface, DDSI)。同时MDD把不同的函数集提供给操作系统,这些函数叫做设备驱动程序接口(Device Driver Interface, DDI),这部分为也就是我们通常驱动需要实现的部分。

 

Windows CE的触摸屏驱动链接了tch_cal.libtchmdd.lib两个静态链接库。触摸屏驱动由GWES加载,GWES通过DDI调用驱动程序获取设备状态,设置驱动功能等,而驱动本身通过DDSI直接获得硬件信息来确定当前触摸屏的状态。

Windows CE触摸屏驱动要求的DDI接口包括:TouchPanelGetDeviceCapsTouchPanelEnableTouchPanelDisableTouchPanelSetModeTouchPanelReadCalibrationPointTouchPanelReadCalibrationAbortTouchPanelSetCalibrationTouchPanelCalibrateAPointTouchPanelPowerHandler

Windows CE触摸屏驱动要求的DDSI接口包括:DdsiTouchPanelAttachDdsiTouchPanelDetachDdsiTouchPanelDisableDdsiTouchPanelEnableDdsiTouchPanelGetDeviceCapsDdsiTouchPanelGetPointDdsiTouchPanelPowerHandler

 

Windows CE触摸屏驱动程序采用中断方式对触摸笔的按下状态进行检测,如果检测到触摸笔按下将产生中断并触发一个事件通知一个工作线程开始采集数据。同时,驱动将打开一个硬件定时器,只要检测到触摸笔仍然在按下状态将定时触发同一个事件通知工作线程采集数据,直到触摸笔抬起后关闭该定时器,并重新检测按下状态。驱动中采用了触摸屏中断以及定时器中断两个中断源,不仅可以监控触摸笔按下和抬起状态,而且可以检测触摸笔按下时的拖动轨迹。

触摸屏驱动在初始化过程调用TouchPanelEnable函数使能触摸屏。该函数调用的DDSI函数为:DdsiTouchPanelEnableDdsiTouchPanelDisable。该函数实现如下内容:

1) 创建事件hTouchPanelEventhCalibrationSampleAvailablehTouchPanelEvent事件在正常状态下当有触摸笔按下或者按下后需要定时采集数据时被触发。而hCalibrationSampleAvailable事件在校准状态下当有校准数据输入时被触发;

2) 检查并初始化所需的中断gIntrTouch(触摸屏中断)和gIntrTouchChanged(定时器中断),并将中断gIntrTouchgIntrTouchChanged关联到事件hTouchPanelEvent。当gIntrTouchgIntrTouchChanged中断产生时将触发hTouchPanelEvent事件;

3) 创建一个ISR线程TouchPanelpISRTouchPanelpISR用于等待和处理触摸屏事件hTouchPanelEvent,它是整个驱动程序中唯一的事件源。

 

TouchPanelEnable()代码如下:

TouchPanelpISR函数是实现触摸屏数据采集关键函数,它实现的内容为:

1) 等待循环,用于接收hTouchPanelEvent事件,并构成函数的主体;

2) 通过调用DdsiTouchPanelGetPoint函数获取当前触摸屏位置和状态信息;

3) 在获取有效数据且在校准状态下,收集并提交按下的位置信息;

4) 在正常状态下,校准数据,并检查校准后数据的有效性;

5) 最后调用由GWES传入的回调函数,提交位置信息和状态信息。

TouchPanelpISR()代码如下:

原创粉丝点击