Wince6.0 s3c6410触摸屏驱动分析

本文深入分析了Windows CE 6.0在S3C6410平台上触摸屏驱动的工作原理,包括驱动概述、接口分析及关键函数的详细解析,如TouchPanelEnable、TouchPanelpISR和DdsiTouchPanelGetPoint。驱动采用中断方式检测触摸状态,中断源包括触摸屏中断和定时器中断,实现了触摸点的实时采集和校准处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Wince6.0 s3c6410触摸屏驱动分析

 


 

一、wince 触摸屏驱动概述... 3

二、触摸屏驱动接口分析... 4

2.1  Windows CE触摸屏驱动工作过程... 4

2.2 触摸屏驱动程序的实现... 4

2.3四线电阻式触摸屏的工作原理... 4

三、wince 6.0 触摸屏驱动分析... 6

3.1  TouchPanelEnable() 函数分析... 6

3.2 TouchPanelpISR()函数分析... 8

3.3 DdsiTouchPanelGetPoint()函数分析... 13

3.5 TSP_GetXY()函数分析... 17

3.6 Touch_Pen_Filtering()函数分析... 19

3.7 触摸屏校准分析... 21

 


 

一、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、TouchPanelReadCalibrationPoint、TouchPanelReadCalibrationAbort、TouchPanelSetCalibration、TouchPanelCalibrateAPoint、TouchPanelPowerHandler。

Windows CE触摸屏驱动要求的DDSI接口包括:DdsiTouchPanelAttach、DdsiTouchPanelDetach、DdsiTouchPanelDisable、DdsiTouchPanelEnable、DdsiTouchPanelGetDeviceCaps、DdsiTouchPanelGetPoint、DdsiTouchPanelPowerHandler。

 

 

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和hCalibrationSampleAvailable。hTouchPanelEvent事件在正常状态下当有触摸笔按下或者按下后需要定时采集数据时被触发。而hCalibrationSampleAvailable事件在校准状态下当有校准数据输入时被触发;

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

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

TouchPanelEnable()实现 C:\WINCE600\PUBLIC\COMMON\OAK\DRIVERS\TOUCH目录下

代码如下:

 

BOOL

TouchPanelEnable(

    PFN_TOUCH_PANEL_CALLBACK    pfnCallback

    )

{

    BOOL    ReturnValue;

//创建hTouchPanelEvent 触摸屏事件和hCalibrationSampleAvaiable校准采样事件,确保设备被禁用,设置采样频率

    TouchPanelpAttach();

 

    EnterCriticalSection( &csMutex );

 

    //

    // Insure the device is disabled and no one is attached to the logical

    // interrupt.

    // Power on the device.

    // Connect the logical interrupt to the device.

    //

 

    InterruptDone( gIntrTouch );

    InterruptDisable( gIntrTouch );

    if( SYSINTR_NOP != gIntrTouchChanged ) {

        InterruptDone( gIntrTouchChanged );

        InterruptDisable( gIntrTouchChanged );

    }

 

    v_pfnCgrPointCallback = pfnCallback;

    if (v_pfnCgrCallback != NULL)

    v_pfnPointCallback = v_pfnCgrCallback;

    else

        v_pfnPointCallback = pfnCallback;

 

    ghevCalibrationActivity = NULL;

//检查并初始化所需的中断gIntrTouch(触摸屏中断)和gIntrTouchChanged(定时器中断),

//并将中断gIntrTouch、gIntrTouchChanged关联到事件hTouchPanelEvent。

    ReturnValue = DdsiTouchPanelEnable();

 // 将hTouchPanelEvent事件与中断号gIntrTouch绑定,并使能中断

    if (ReturnValue && !InterruptInitialize(gIntrTouch, hTouchPanelEvent, NULL, 0)) {

        DEBUGMSG(ZONE_ERROR, (TEXT("TouchPanelEnable: InterruptInitialize(gIntrTouch %d failed\r\n"),

                              gIntrTouch));

        DdsiTouchPanelDisable();

        ReturnValue = FALSE;

}

 // 将hTouchPanelEvent事件与中断号gIntrTouchChanged绑定,并使能中断

    if ( ( SYSINTR_NOP != gIntrTouchChanged ) &&

        ReturnValue && !InterruptInitialize( gIntrTouchChanged, hTouchPanelEvent, NULL, 0)) {

        DEBUGMSG(ZONE_ERROR, (TEXT("TouchPanelEnable: InterruptInitialize(gIntrTouchChanged %d failed\r\n"),

                              gIntrTouchChanged));

        InterruptDisable(gIntrTouch);

        DdsiTouchPanelDisable();

        ReturnValue = FALSE;

    }

    if (ReturnValue) {

        // Create the ISR thread.  If creation fails, perform cleanup and return failure.

//创建一个ISR线程TouchPanelpISR。TouchPanelpISR用于等待和处理 

//触摸屏事件hTouchPanelEvent,它是整个驱动程序中唯一的事件源。

        bTerminate=FALSE;

        if (!(hThread = CreateThread( NULL, 0, TouchPanelpISR, 0, 0, NULL))) {

            TouchPanelpDetach();

            InterruptDisable(gIntrTouch);

            if( SYSINTR_NOP != gIntrTouchChanged )

                InterruptDisable(gIntrTouchChanged);

            DdsiTouchPanelDisable();

            ReturnValue = FALSE;

        } else {

            // Get thread priority from registry

            TouchPanelpGetPriority(&gThreadPriority, &gThreadHighPriority);

           

            // Set our interrupt thread's priority

            CeSetThreadPriority(hThread, gThreadPriority);

        }

    }

    LeaveCriticalSection(&csMutex);

    return(ReturnValue);

}

 

3.2 TouchPanelpISR()函数分析

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

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

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

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

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

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

TouchPanelpISR()代码如下

// 中断服务函数,采样频率10ms

 

static ULONG

TouchPanelpISR(

    PVOID   Reserved  //@parm Reserved, not used.

    )

{

    TOUCH_PANEL_SAMPLE_FLAGS    SampleFlags = 0;

    INT32                       RawX, CalX;

    INT32                       RawY, CalY;

    UINT32                      MaxX =  DisplayWidth * X_SCALE_FACTOR;

    UINT32                      MaxY =  DisplayHeight * Y_SCALE_FACTOR;

    UINT32                      CurrentDown = 0;

    static LONG CX;

    static LONG CY;

    static LONG XBase;

    static LONG YBase;

    static int  CalibrationSampleCount;

    static BOOL     fSetBase;

    static DWORD    BaseTime;

    static BOOL     fGotSample;

 

    PFN_TOUCH_PANEL_CALLBACK pfnCallback;

 

    // Need to be all kmode so that we can write to shared memory.

    //

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值