touch触摸 - 图文

更新时间:2024-05-24 15:20:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

触摸屏驱动分析: (本机驱动) (2009-12-13 19:22) 分类: 驱动

触摸屏驱动为本机驱动,由微软提供有通用层 MDD,我们只需要编写PDD层就可以了。触摸屏驱动由GWES 加载,GWES 通过MDD层的DDI设备驱动程序接口函数(Device Driver Interface,DDI),实现和驱动程序的交互,而PDD层则通过实现DDSI接口函数(Device Driver Service Provider Interface, DDSI),来完成对系统的支持和对硬件的控制。他们的关系是:MDD 链接PDD 层并定义它希望调用的函数接口:设备驱动程序提供器接口。同时MDD 把不同的函数集提供给操作系统。

Windows CE 的触摸屏驱动链接了tch_cal.lib 和tchmdd.lib 两个静态链接库。

所以在编写source檔时,要记得加上: SOURCELIBS= \\

$(_COMMONOAKROOT)\\lib\\$(_CPUINDPATH)\\tch_cal.lib \\ $(_COMMONOAKROOT)\\lib\\$(_CPUINDPATH)\\tchmdd.lib

标准接口声明(touch.def檔中声明) TouchPanelGetDeviceCaps; TouchPanelEnable; TouchPanelDisable; TouchPanelSetMode;

TouchPanelReadCalibrationPoint; TouchPanelReadCalibrationAbort; TouchPanelSetCalibration; TouchPanelCalibrateAPoint; TouchPanelPowerHandler; 详解:

DDI界面是在

WINCE500\\PUBLIC\\COMMON\\OAK\\DRIVERS\\TOUCH\\TCHMAIN中的

tchmain.c檔中实现,在此檔中,MDD通过调用PDD的DDSI接口来实现DDI函数.

DDI 接口包括 TouchPanelGetDeviceCaps、

TouchPanelEnable、 TouchPanelDisable、 TouchPanelSetMode、

TouchPanelReadCalibrationPoint、TouchPanelReadCalibrationAbort、 TouchPanelSetCalibration、 TouchPanelCalibrateAPoint、 TouchPanelPowerHandler。

PDD层是我们真正要写的,直接与所要驱动的硬件相关。

DDSI 接口包括:

DdsiTouchPanelAttach、 DdsiTouchPanelDetach、 DdsiTouchPanelDisable、 DdsiTouchPanelEnable、

DdsiTouchPanelGetDeviceCaps、 DdsiTouchPanelGetPoint、

DdsiTouchPanelPowerHandler。

我们现在重点讲PDD层要实现的DDSI函数。

由TouchPanelEnable调用 DdsiTouchPanelEnable 1:创建事件hTouchPanelEvent 和hCalibrationSampleAvailable。 DdsiTouchPanelDisable、 2: 检查并初始化所需的中断gIntrTouch(触摸屏中断)和 gIntrTouchChanged(定时器中断) 3: 创建一个ISR 线程TouchPanelpISR 4: 函数获取当前触摸屏位置和状态信息; DdsiTouchPanelGetPoint: DdsiTouchPanelGetDeviceCaps

询问校正点数 由TouchPanelGetDeviceCaps调用 MDD分析:

在PDD层的档与MDD与的檔之间,通过共同包含头檔tchddsi.h。来实现中逻辑中断号的通用,中断的传递等。在WINCE5.0中,tchddsi.h文件放在D:\\WINCE500\\PUBLIC\\COMMON\\OAK\\INC 中,如有必要,可进行修改 接口函数声明也在该目录的touch.def文件中

摘自tchddsi.h

//定义触摸中断和 定时器中断 的逻辑中断号 extern DWORD gIntrTouch;

extern DWORD gIntrTouchChanged;

在文件tchmail.c 中,

1:TouchPanelEnable函数主要做以下工作

//把中断与事件关联

InterruptInitialize(gIntrTouch, hTouchPanelEvent, NULL, 0)

InterruptInitialize( gIntrTouchChanged, hTouchPanelEvent, NULL, 0) //创建ISR线程

hThread = CreateThread( NULL, 0, TouchPanelpISR, 0, 0, NULL) // 获得线程优先权

TouchPanelpGetPriority(&gThreadPriority, &gThreadHighPriority); // 设置线程优先权

CeSetThreadPriority(hThread, gThreadPriority);

2:TouchPanelGetDeviceCaps函数:

MDD层给系统发消息

MDD层是通过PFN_TOUCH_PANEL_CALLBACK v_pfnPointCallback; 结构给系统发的消息

3:TouchPanelpAttach函数:

主要是生成一个事件hTouchPanelEvent。

hCalibrationSampleAvailable

hTouchPanelEvent = CreateEvent( NULL,

FALSE, // Not manual reset FALSE, // Not signalled NULL);

4: TouchPanelReadCalibrationPoint 函数 用于屏幕校准, 读取相应的触摸屏坐标值/。

TouchPanelReadCalibrationAbort(void); 终止当前活动的校准活动()

5:TouchPanelSetCalibration

处理上面TouchPanelReadCalibrationPoint 函数读来的校准数据,该函数将产生校准基准参数,

TouchPanelSetCalibration 函数执行的动作是一套数学算法,具体内容为: 在触摸屏数据与其位置偏移关系且屏幕像素与其位置偏移关系同为线性关 系假设情况下,触摸屏返回的位置信息与像素位置信息之间成2D 坐标变换关系。

则对于触摸屏按下点的触摸屏坐标(Tx,Ty)与其在显示设备位置关系上匹配的点 的屏幕坐标(Sx,Sy)之间的转换关系,可以通过下述坐标变换表示: Sx = A1*Tx + B1*Ty + C1 Sy = A2*Tx + B2*Ty + C2

TouchPanelSetCalibration 的具体工作就是通过校准的动作获取的屏幕坐标 和触摸屏坐标TouchCoordinate 来确定A1,B1,C1 和A2, B2, C2。

消息定义:在文件 pegc_def.h 中有各种消息的定义,如有必要,可以修改,以合已用

// TOUCH handler wnd messages

#define WM_STUB_REGISTWND WM_USER+1 #define WM_STUB_UNREGISTWND WM_USER+2 #define WM_STUB_SETVALUE WM_USER+3 #define WM_STUB_GETVALUE WM_USER+4 #define WM_STUB_RESET WM_USER+5 #define WM_STUB_EVENT WM_USER+6

#define WM_STUB_GETFOCUSWND WM_USER+7 #define WM_STUB_FOCUSBACK WM_USER+8

#define WM_STUB_GETLASTTOUCHFOCUSWND WM_USER+9 #define WM_STUB_GETVERSION WM_USER+10 #define WM_STUB_TABLET WM_USER+11

#define WM_STUBHOOK_GETFOCUS WM_USER+3000 #define WM_STUBHOOK_READY WM_USER+3001

启动流程:

? QQ空间新浪微博百度搜藏人人网腾讯微博开心网腾讯朋友百度空间豆瓣网搜狐微博MSNQQ收藏淘宝百度贴吧搜狐白社会更多...首页技术频道51CTO旗下网站地图 社区:论坛博客下载读书更多

登录注册

?

?

网络安全开发数据库服务器系统虚拟化云计算嵌入式移动开发

51CTO.COMCIOage.comWatchStor.comHC3i.cn灵客风LinkPhone家园微博博客论坛下载自测门诊

?

周刊读书技术圈知道RSA 身份验证和保护白皮书下载

? 云计算360度有奖评估

? 决胜新网络2012深信服全国巡展

? 针式打印机保养方法汇总

首页 | Java | .NET | Web | XML | 语言工具 | 测试 | 游戏 | 移动 | 架构 | 项目管理 | 全部文章

请输入关键字

您所在的位置:开发 > 嵌入式开发 > Windows Embedded > WinCE中触摸屏驱动开发详解(1)

WinCE中触摸屏驱动开发详解(1)

2009-07-01 09:27 warchief_dx ITPUB 我要评论(0) 字号:T | T

本文向您介绍WinCE中采用分层驱动程序结构实现的触摸屏驱动,包括对触摸屏驱动模型的讲解、触摸屏驱动程序的实现及接口实现等知识。 AD:

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.配置控制器硬件

只是简单地返回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<

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产生一次定时中断,进行一次采样。

1 2 下一页>>

硬件上的原理不是本文的重点,只讲一下大概的原理(主要是我也只知道大概的原理, 毕竟咱不是搞硬件的. 嘻嘻!)

我移植用的这个屏是320*240 的TFT屏, 四线电阻式触屏. 这种触屏的原理是由两个电阻层组成, 一个实现X位置的测量,一个用于Y位置上的测量. 简单来说,就是当用触笔按

下屏幕时,两个电阻层接触, 电阻发生变化,然后在X Y方向上产生信号, 这个信号是电压信号, 再经过CPU内部分AD转换为坐标值. 这个原理有点像高中物理课用的滑动电阻,有一个最大上限,滑动到不同的地方,阻值不同. 2410本身集成了touch的控制器,通过简单的配置和读取相关的寄存器,就可以实现触摸屏的操作.

二 驱动部分

Wince下的touch驱动跟很多其它的驱动一样, 是分层的, 有MDD 和PDD两层. MDD层被系统隐藏起来, 一般不用我们来修改. 而我们真正关心的是PDD 层. 也就是要由开发者来修改的这一层.

分析touch驱动时,以我最近刚刚移植到一个基于2410的板子上的6.0的BSP包的触屏驱动为例.到

C:\\WINCE600\\PLATFORM\\DEVICEEMULATOR\\SRC\\DRIVERS\\TOUCH下. 找到s3c2410x_touch.cpp文件. 这里面正是PDD层的实现代码. 容易发现这里面的函数分为两类,一类是以TSP开头的函数,一类是以DDSI开头的函数. TSP开头的函数为内部私有的函数,是被DDSI调用的, 而DDSI开头的函数则是对外的接口, 也就是被MDD层的函数调用的接口.

DdsiTouchPanelEnable是首先被调用的一个外部接口, 它的实现可参见源程序, 它主

要做了下面几个事情:

1 通过调用TSP_VirtualAlloc函数为驱动所用的IO,中断等硬件中断分配内存空间.

2 通过调用KernelIoControl向系统申请两个中断,如果申请成功,赋予相应的逻辑中断号. KernelIoControl向底层是调用OEMIoControl函数, OEMIoControl根据KernelIoControl传进来的IOCTL代码,做相应的操作,比如这里, IOCTL是

IOCTL_HAL_REQUEST_SYSINTR, 它是向内核申请一个物理中断和逻辑中断的映射.

3 通过调用TSP_PowerOn来初始化中断控制器,ADC寄存器,定时器等, 在TSP_PowerOn的实现中,有几点要说明一下:

ADCDLY 这个值在不同的模式下意义不同, 因为前面通过ADCTSC已经配置为wait for interrupt mode, 所以这个值的意义和你的触笔按下时, 从产生中断信号到开始自动转换X,Y时的时间间隔是相关的,它的单位是ms

v_pPWMregs->TCNTB3 = g_timer3_sampleticks

TCNTB3是timer3的count buffer, 当定时器启动时, 0,这个值以一个设置好的频率递减,直到减到0, 这时会产生一个定时器中断. 这个有什么用呢. 要理解它,得知道触摸屏在中断模式下是如何工作的.

当我们按下的触摸屏时,会产生一个ADC的中断, 同时我们的驱动还会启动一个定时器, 这个定时器触发一个事件做数据采集, 在我们的手或触笔抬起来前,这个定时器不断的触发采集事件,直到它被关闭, 而它什么时候会被关闭呢,就是在触笔的抬起来时. 下面截取的代码很好的说明的这个原理:

if ( (v_pADCregs->ADCDAT0 & (1 << 15)) |(v_pADCregs->ADCDAT1 & (1 << 15)) )

{

bTSP_DownFlag = FALSE;

DEBUGMSG(ZONE_TIPSTATE, (TEXT(\v_pADCregs->ADCTSC &= 0xff; *pUncalX = x; *pUncalY = y; TSP_SampleStop(); …… }

上面的代码,if判断的正是是否抬起.

而g_timer3_sampleticks的值是这样计算出来的.

g_timer3_freq = (g_s3c2410_pclk / TIMER3_DIVIDER);

g_timer3_sampleticks = (g_timer3_freq / TSP_SAMPLE_RATE_LOW); TIMER3_DIVIDER 的值是2, TSP_SAMPLE_RATE_LOW的值是100, 由

v_pPWMregs->TCFG1 &= ~(0xf << 12); v_pPWMregs->TCFG1 |= (0 << 12);

可知定时器1/2分频, 所以,很容易计算出,所设置的定时器是每10ms产生一次定时器中断

而触摸屏中断是在你按下和抬起时产生的.

DdsiTouchPanelGetPoint是采样的主要实现函数,当MDD检测到中断事件发生时,该函数会被调用. 触摸屏的中断是SYSINTR_TOUCH, 而定时器的中断是SYSINTR_TOUCH_CHANGED

该函数用if else分别处理两种中断, 如下:

if (v_pINTregs->SUBSRCPND & (1<

{ …… }

else /*定时器中断 */

{ }

DdsiTouchPanelGetPoint函数的实现代码中,调用了两个很重要的函数TSP_TransXY和TSP_GetXY

需要说明的是,这两个函数的实现跟LCD本身的分辨率是没有关系的.

TSP_GetXY用来获到AD采样值,TSP_TransXY把它转化为屏上的坐标. 我移植touch驱动时,遇到过点屏幕上面,下面有反应,或者点左上角,右上角有反应等类似的问题, 都是因为这两个函数没实现好.

先来看TSP_GetXY函数.它的实现如下:

TSP_GetXY(INT *px, INT *py) { INT i;

INT xsum, ysum; INT x, y; INT dx, dy; xsum = ysum = 0;

for (i = 0; i < TSP_SAMPLE_NUM; i++) {

v_pADCregs->ADCTSC = (0 << 8) | /* UD_Sen*/ (1 << 7) | /* YMON 1 (YM = GND)*/

(1 << 6) | /* nYPON 1 (YP Connected AIN[n])*/ (0 << 5) | /* XMON 0 (XM = Z)*/ (1 << 4) | /* nXPON 1 (XP = AIN[7])*/ (1 << 3) | /* Pull Up Enable*/

(1 << 2) | /* Auto ADC Conversion Mode*/

(0 << 0); /* No Operation Mode*/

v_pADCregs->ADCCON |= (1 << 0); /* Start Auto conversion*/

while (v_pADCregs->ADCCON & 0x1); /* check if Enable_start is low*/

while (!(v_pADCregs->ADCCON & (1 << 15))); /* Check ECFLG*/

y = (0x3ff & v_pADCregs->ADCDAT1); x = (0x3ff & v_pADCregs->ADCDAT0); xsum += x; ysum += y; }

*px = xsum / TSP_SAMPLE_NUM; *py = ysum / TSP_SAMPLE_NUM;

v_pADCregs->ADCTSC = (1 << 8) | /* UD_Sen*/ (1 << 7) | /* YMON 1 (YM = GND)*/

(1 << 6) | /* nYPON 1 (YP Connected AIN[n])*/ (0 << 5) | /* XMON 0 (XM = Z)*/ (1 << 4) | /* nXPON 1 (XP = AIN[7])*/ (0 << 3) | /* Pull Up Disable*/

(0 << 2) | /* Normal ADC Conversion Mode*/ (3 << 0); /* Waiting Interrupt*/

dx = (*px > x) ? (*px - x) : (x - *px); dy = (*py > y) ? (*py - y) : (y - *py);

return((dx > TSP_INVALIDLIMIT || dy > TSP_INVALIDLIMIT) ? FALSE : TRUE); }

关于这个函数有几点要说明.

根据2410的手册, ADCDAT0 保存是X方向上采样的结果, ADCDAT1 保存是Y方向上采样的结果, 所以, 我们看到下面的两行代码

y = (0x3ff & v_pADCregs->ADCDAT1); x = (0x3ff & v_pADCregs->ADCDAT0);

与上0x3ff, 是因为, ADCDAT寄存器只用了前面 10位来保存AD采样的结果, 而这和2410内部的AD模块只有10位精度是相一致的.所以,AD转换后的最大值不会超过1024-1.

当然上在那种计算方法并不是绝对的 , 根据硬件构造的不同, 比如有可能你x方向的坐标值和采样值成反比,就要按下面的方式计算:

x = 0x3ff - (0x3ff & v_pADCregs->ADCDAT0);

再看TSP_TransXY函数. 我移植的版本的实现如下:

PRIVATE void

TSP_TransXY(INT *px, INT *py) {

*px = (*px >= TSP_MAXX) ? (TSP_MAXX) : *px; *py = (*py >= TSP_MAXY) ? (TSP_MAXY) : *py;

*px = (*px - TSP_MINX); *py = (*py - TSP_MINY);

*px = (*px >= 0) ? *px : 0; *py = (*py >= 0) ? *py : 0;

*px = *px * TSP_LCDY / (TSP_MAXX - TSP_MINX); *py = *py * TSP_LCDX / (TSP_MAXY - TSP_MINY);

*px = (*px >= TSP_LCDY)? (TSP_LCDY - 1) : *px; *py = (*py >= TSP_LCDX)? (TSP_LCDX - 1) : *py;

*px = TSP_LCDY - *px - 1; *py = TSP_LCDX - *py - 1; }

这个实现是我在模拟器的实现代码基础上修改的. 这个函数计算X,Y的坐标用的是一个公式,至于这个公式是怎么来的,我就不太清楚了. 只说明一点.

#define TSP_MINX 88 #define TSP_MINY 84

#define TSP_MAXX 952 #define TSP_MAXY 996

上面四个值是定义X+, X-, Y+, Y-四个有效的采样值, 理论上应该是0和1023(10 bit ADC), 但实际肯定有偏差,准确来讲, 换了不同的硬件平台,这四个值应该是要重新测过的. 我就直接沿用原BSP中的值了.

1. 前言

触摸屏是嵌入式设备中常用的计算机输入设备,它可使操作简单直观,人人都会使用,这一点无论是键盘还是鼠标都无法与其相比。在手机、PDA等手持产品及公共服务设备中大量采用触摸屏。触摸屏分为电阻式、电容式、表面声波式等多种,电阻式触摸屏是目前应用比较广泛的一种,有四线、五线、七线等几种。本文将分析Windows CE操作系统下的触摸屏驱动程序模型及实现方法。

2. Windows CE触摸屏驱动程序模型

在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),这部分为也就是我们通常驱动需要实现的部分。

3 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。

4 Windows CE的触摸屏数据采集

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

1) 创建事件hTouchPanelEvent和hCalibrationSampleAvailable。

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

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

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

TouchPanelpISR函数是实现触摸屏数据采集关键函数,它实现的内容为: 1) 等待循环,用于接收hTouchPanelEvent事件,并构成函数的主体;

2) 通过调用DdsiTouchPanelGetPoint函数获取当前触摸屏位置和状态信息; 3) 在获取有效数据且在校准状态下,收集并提交按下的位置信息; 4) 在正常状态下,校准数据,并检查校准后数据的有效性;

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

因此,在触摸屏驱动程序中DdsiTouchPanelEnable、DdsiTouchPanelDisable和DdsiTouchPanelGetPoint三个DDSI接口函数是驱动实现的关键所在。 在DdsiTouchPanelEnable和DdsiTouchPanelDisable函数中分别打开和关闭触摸屏硬件,这两个函数其实可以不真正操作硬件,而只是实现软件上的控制,但

是为了降低功耗最好在DdsiTouchPanelDisable中将触摸屏控制器电源关闭并在DdsiTouchPanelEnable函数中打开。

在DdsiTouchPanelGetPoint函数中实现对触摸屏数据的采样。从上面的分析得知MDD通过检测hTouchPanelEvent和hCalibrationSampleAvailable事件控制采样,这两个事件被触发都将调用该函数。而这两个事件触发条件有两个: 1) 触摸笔按下时产生触摸屏中断gIntrTouch时触发;

2) 触摸笔按下后,定时器被打开,定时器将定时产生中断gIntrTouchChanged,并触发事件,直到触摸笔抬起为止。

因此该函数不仅需要对触摸屏数据采样,而且需要对触发条件进行状态控制,其流程如图2所示。图中定义了三个变量,它们分别为: 1) TouchIrq为静态变量或全局变量,且初始值为TRUE,该变量必须在触摸屏按下并产生触摸屏中断时设置为FALSE; 2) InterruptType为静态变量或全局变量,且初始值为SYSINTR_NOP,当在处理触摸屏中断时设置为SYSINTR_TOUCH,在处理定时器中断时设置为

SYSINTR_TOUCH_CHANGED,其余设置为SYSINTR_NOP,且在处理完毕后必须将其作为参数传入InterruptDone函数以清除中断;

3) g_NextExpectedInterrupt为静态变量或全局变量,该变量表示下一个希望产生的中断,初始状态为PEN_DOWN,也就是触摸笔在抬起状态,因此希望下一个产生的中断为PEN_DOWN。当触摸屏中断产生以及定时器中断产生时该变量为PEN_UP_OR_TIMER,也就是下一个可能产生的状态为触摸笔抬起状态或者触摸笔按下但定时器中断产生。

DdsiTouchPanelGetPoint函数一开始从触摸笔抬起状态开始执行,此时

TouchIrq等于TRUE。如果此时触摸笔按下,将设置TouchIrq为FALSE,表示本次采样是由于触摸屏中断产生并设置下一次调用由定时器产生。然后设置InterruptType状态为SYSINTR_TOUCH,接着开始采集数据并设置

g_NextExpectedInterrupt变量为PEN_UP_OR_TIMER,表示下一次产生的中断为定时器中断。接着判断在触摸笔按下状态(g_NextExpectedInterrupt等于PEN_UP_OR_TIMER)下触摸笔是否抬起,如果抬起则设置

g_NextExpectedInterrupt为PEN_DOWN恢复到抬起状态。最后通过将

InterruptType作为参数传入InterruptDone函数以清除中断。当触摸笔按下,并产生定时器中断时,TouchIrq等于FALSE,此时InterruptType被设置为SYSINTR_TOUCH_CHANGED,其余的动作基本和上面的流程一致。 5 Windows CE下的触摸屏校准

电阻触摸屏需要校准。应用程序需要一些参考值,以便将接收到的触摸屏坐标数据转换成高层软件所需的屏幕坐标。理想情况下校准程序只要在产品初次加电测试过程 中运行一次就可以了,参考值被存储在非易失性存储器中。在理想情况下只需两组原始数据,即在屏幕对角读取的最小和最大值。而在实际应用中,因为许多电阻触 摸屏存在显著的非线性,因此如果在最小和最大值之间简单的插入位置数值会导致驱动程序非常的不精确。

在Windows CE中通过在函数DdsiTouchPanelGetDeviceCaps 中设置校准点的个数,在TouchDriverCalibrationPointGet中获取每个校准点的屏幕坐标。常用的校准点数量为5。校准UI将在校准点坐标处相应显示一个十字叉,用户需要精确地在该十字叉位置按下触摸屏,驱动通过

TouchPanelReadCalibrationPoint函数读取相应的触摸屏坐标值,然后开始下

一个校准点。循环设定的次数后,将采集到的触摸屏坐标值和校准点屏幕坐标送到TouchPanelSetCalibration函数中进行处理。该函数将产生校准基准参数。 TouchPanelSetCalibration函数执行的动作是一套数学算法,具体内容为: 在触摸屏数据与其位置偏移关系且屏幕像素与其位置偏移关系同为线性关系假设情况下,触摸屏返回的位置信息与像素位置信息之间成2D坐标变换关系。则对于触摸屏按下点的触摸屏坐标(Tx,Ty)与其在显示设备位置关系上匹配的点的屏幕坐标(Sx,Sy)之间的转换关系,可以通过下述坐标变换表示: Sx = A1*Tx + B1*Ty + C1 Sy = A2*Tx + B2*Ty + C2

TouchPanelSetCalibration的具体工作就是通过校准的动作获取的屏幕坐标和触摸屏坐标TouchCoordinate来确定A1,B1,C1和A2, B2, C2。 触模屏校验和WINCE的实现

2008年12月30日 星期二 18:04 触模屏校验和WINCE的实现

现在非常流行的触模屏校验数学模型是以2D坐标变换为基础的。

数学模型是首先假设触模屏和LCD之间的误差是由于1.水平和垂直错位C1,C2 2.以一个角度转动

则实际的坐标应该为:

RealX = uncalX*K*cos(a) + uncalY*sin(a) + C1 RealY = uncalX*K*sin(a)+uncalY*cos(a)+C2 可以简化为:

RealX =a1*uncalX+b1*uncalY+C1 RealY=a2*uncalX+b2*uncalY+C2

这种基本的模型,在uncalX,和uncalY比较多的时候,来计算a1,b1,c1,a2,b2,c2的值 抽象为矩阵模型:

RealX1 uncalX1 uncalY1 1 a1 {RealX2} ={uncalX2 uncalY2 1} *{b1} RealX3 uncalX3 uncalY3 1 c1 RealX4 uncalX4 uncalY4 1 RealX5 uncalX5 uncalY5 1

通过数据求角这个矩阵得到a1,b1,c1,a2,b2,c2的值 最终解出来的结果如下:

触模屏的流程是这样子的:

1.首先WINCE在启动的时候会去读取[HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\TOUCH]下的 \这个键值。

如果这键值已被设置,接着会调用calibrat.c中的TouchPanelSetCalibration()来初始化 v_CalcParam.a1 = a1.u.s32.u[0]; v_CalcParam.b1 = b1.u.s32.u[0]; v_CalcParam.c1 = c1.u.s32.u[0];

v_CalcParam.a2 = a2.u.s32.u[0]; v_CalcParam.b2 = b2.u.s32.u[0]; v_CalcParam.c2 = c2.u.s32.u[0]; v_CalcParam.delta = delta.u.s32.u[0];

并设置标志v_Calibrated为TRUE来标志已完成校验初始化,这个初始化也可以在控制面板中调用中和BOOL WINAPI TouchCalibrate(void)来重设。

2.WINCE的驱动程序在收到触摸中断后,会在TouchPanelpISR()中处理,这个函数一般在tclmai在TouchPanelpISR()函数处理主要处理两情况

1.是当TouchCalibrate()被调用来重设校验因子,a1,b1,c1,a2,b2,c2,delta的时候。 返回未校验的坐标,

2.是当一般情况下处理触摸屏事件,调用TouchPanelCalibrateAPoint()也就是做上面讲的2D坐的坐标

做为回调函数返回。

3.由于微软的这个验法会把坐标值都乘以4,所以很多的触模屏驱动都会把从AD读出的值,放缩到然后再乘以4。 从例如:

posX = (MAX_X-*x)*iScreenWidth/(MAX_X-MIN_X); posY = (*y-MIN_Y)*iScreenHeight/(MAX_Y-MIN_Y); *x = posX<<2; //乘以4 *y = posY<<2;

PB自带的触摸屏校准代码D:\\WINCE420\\PUBLIC\\COMMON\\OAK\\DRIVERS\\TOUCH

可以参考PLATFORM BUILDER的帮助文档:

Windows CE Features > Shell and User Interface > User Interface > Touch ------CE5.0

Platform Development > Developing Platform Elements > Customizing the User IScreen Calibration Reference -------CE4.2

Touch Panel校准过程如下:

1)调用TouchPanelEnable启动触摸屏

2)调用TouchPanelGetDeviceCaps,通过设置参数TPDC_CALIBRATION_POINT_COUN

用触点的个数

3)取校准点,对每个校准点都有以下过程

A:调用TouchPanelGetDeviceCaps,设置参数TPDC_CALIBRATION_POINT_ID来 B:在上述校准点坐标处画十字,并等待用户点击

C:调用TochPanelReadCalibrationPoint来获得上述校准点坐标处触摸屏对应

4)当取完校准用的所有的点,调用TouchPanelSetCalibration来计算校准系数,到

程序流程:

TouchPanelGetDeviceCaps-->

DdsiTouchPanelGetDeviceCaps(参数为TPDC_CALIBRATION_POINT_ID)-->

TouchDriverCalibrationPointGet(得到校准点之一的坐标,该坐标为screen坐标英文资料如下:

The following steps detail the basic algorithm that you, the driver developer, and calibrate the screen with the touch screen driver:

1. Call the TouchPanelEnable function to start the screen sampling.

2. Call the TouchPanelGetDeviceCaps function to request the number of sam

3. For every calibration point, perform the following steps:

a. Call TouchPanelGetDeviceCaps to get a calibration coordinate. b. Draw a crosshair at the returned coordinate.

c. Call the TouchPanelReadCalibrationPoint function to get calibrati

4. Call the TouchPanelSetCalibration function to calculate the calibratio

Wince的cordll提供了屏幕校准的函数,使用方法强制加载dll,获取地址,然后这里给出源代码。

首先在头文件里加入函数指针定义:

typedef BOOL (WINAPI *_TouchCalibrate)(); 然后使用如下代码,就会出现屏幕校准画面了。 HINSTANCE hinstance = LoadLibrary(_T(\ if (hinstance == NULL) {

AfxMessageBox (L\ return; }

_TouchCalibrate TouchCalibrate = NULL;

TouchCalibrate = (_TouchCalibrate)GetProcAddress(hinstance , L\ if (TouchCalibrate == NULL) {

AfxMessageBox (L\ return; }

TouchCalibrate ();

FreeLibrary(hinstance );

关于屏幕校准,有一点值得说的是,据我所知,注册表的

HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\TOUCH的CalibrationData项保存有屏幕校

果注册表是基于RAM的话,那么屏幕校准的结果将得不到保存,系统断电重启后需要再

觉得有必要的话)。如果谁有不用hive注册表就能 保存上次的屏幕校准结果,请不吝

要自已写一个触摸屏的校准应用程序该怎么写? 有没有那位大哥做过?给点提示了!急啊!

我用微软private下面的一个TOUCHTEST的里面的测试代码试,校准完了触摸屏 我的程序顺序是这

样:LoadDrvier-->TouchPanelEnable-->TouchPanelGetDeviceCaps-->TouchPanelRead--->TouchPanelSetCalibration-->FreeDriver. 校准完了后系统的触摸屏就没反应了!

3.7 触摸屏校准分析

触摸屏的校准过程如下:

⑴ 调用TouchPanelEnable函数来启动触摸屏采样。

⑵ 调用TouchPanelGetDeviceCaps函数来获得校准触点的个数。 ⑶ 去校准点,对于每一个校准点都有一下过程:

I:调用TouchPanelGetDeviceCaps函数来得到校准点的坐标。 II:在上述校准点处画十字,等待用户点击.

III:用户点击十字图形后,调用TouchPanelReadCalibrationPoint函数来获得上述校准点处触摸屏对应的坐标。

⑷ 当取完所需用的校准点,调用TouchPanelSetCalibration函数来计算校准系数A1,B1,C1和A2,B2,C2。

wince取消开机校准触摸屏

分类: wince 2011-08-02 11:11 222人阅读 评论(1) 收藏 举报

wince6与wince5很多方面的设置都不一样,wince5是在注册表的init下面驱动触摸屏校正进程的,取消掉该项就可以消除每次开机触摸屏校正。

而wince6是通过调用ctlcpl.exe来实现校正的,但我没在注册表发现哪里调用了此文件,通过实验发现wince6开机会自动检测注册表

HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\TOUCH下面的CalibrationData项,如果不存在该项,则会调用触摸屏校正程序。而默认得到的NK.bin内的注册表都是没有该项的(开机校正之后才有该项)。

因此,先开机再次校正触摸屏平,然后在VS2005里调用Target\\Remote Tools\\Registry Editor,查看校正得到的准确CalibrationData校正值,

然后把该串数据写入解决方案内的BSP\\Parameter Files\\platform.reg注册表中的HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\TOUCH\\CalibrationData项。 但现在为止还不够,需要用记事本把platform.reg,找到下面这三行: IF IMGNOCALIBRATION

\ENDIF IMGNOCALIBRATION 修改成

;IF IMGNOCALIBRATION

\;ENDIF IMGNOCALIBRATION

要把IMGNOCALIBRATION判断取消掉,否则,即使重新编译系统镜像后注册表仍然是没有CalibrationData数值的,就还会调用触摸屏校正。

修改完毕后,重新编译得到NK.bin烧入FLASH,开机,就再也没有触摸屏校正界面了! 结论,虽然在vs2005里打开解决方案的注册表,是可以看到CalibrationData项的,但编译后得到的NK.bin还是没有该项,原因是宏IMGNOCALIBRATION一直是FALSE的.

I.MX51的方法:

增加\注释:; \

HINSTANCE hInstance = LoadLibrary(_T(\

if(NULL == hInstance)

{

MessageBox(_T(\

return; }

_TouchCalibrate TouchCalibrate = NULL;

TouchCalibrate = (_TouchCalibrate)GetProcAddress(hInstance,L\

if (NULL == TouchCalibrate)

{

MessageBox (L\

return;

}

TouchCalibrate (); FreeLibrary(hInstance );

How to Use Hive-based Registry IN WINCE.NET

摘要:

WINCE本身是一个完全在内存中运行的系统。每次启动都需要把NK.BIN拷贝到内存中相对应的地址。这样的系统就不需要了系统维护,但是如何“永久”的保存设置就成了问题。本文将介绍如何在Wince中实现设置的永久保存。

关键字:

WINCE、嵌入式操作系统、Hive-based Registry

作者

Tony

Email:gzci@163.com

Windows CE .NET是Windows CE 3.0的后继产品。Windows CE .NET为嵌入式市场从新设计,为快速建立下一代智能移动和小内存占用的设备提供了一个健壮的实时操作系统。Windows CE .NET具备完整的操作系统特性集包和端对端开发环境,它包括了创建一个基于Windows CE的定制设备所需的一切,例如:强大的联网能力、强劲的实时性和小内存体积占用以及丰富的多媒体和Web浏览功能。

WINCE本身是一个完全在内存中运行的系统。每次启动都需要把NK.BIN拷贝到内存中相对应的地址。关机之后内存中的数据将都“消失”。这样的 系统就不需要了系统维护,但是如何“永久”的保存设置就成了问题。通过查找资料找到了一个微软提供的解决办法。具体实现方法如下:

第一步:在PB的Catalog里面将Hive-based Registry加入到我们的Platform之中。

SYSTEMHIVE是system.hv文件保存的路径。Start DevMgr是选择是否启动设备管理器(Device Manager),启动设备管理器的目的是为了启动一些Hive-based Registry所必须的设备。(Start DevMgr is a Boolean value indicating whether or not to start the Device Manager so it can start the drivers necessary to reach the registry hives. A value of 1 causes the Device Manager to start; 0 keeps the Device Manager from starting. The only case in which the Device Manager should not start is if you want to store the hives in the object store, which causes the hives to be lost on a cold boot. Typically, the hives are stored outside RAM, so it is necessary to start the Device Manager.)

第三步:在Platform.reg中修改[HKEY_LOCAL_MACHINE\\init\\BootVars]下面的\设置,以确定调用哪个默认用户的Hive-based Registry。如果不是多用户可以不做设置。

第四步:确定一下Platform.reg和Common.reg当中所有的启动驱动程序的注册项是否设置。你可以在Platform.reg和Common.reg中搜索

; HIVE BOOT SECTION ; END HIVE BOOT SECTION

这样的字段。有许多项需要设置,包括IRQ、IO、PCI等,不过一般的如果你没有修改过,系统默认的就可以了。这些设置是告诉ROM registry builder需要把什么加入到boot hive中。

第五步:启动必须在第一启动阶段启动的驱动程序。我们先看一下下面的关于第一启动阶段的描述:

本文来源:https://www.bwwdw.com/article/s1w7.html

Top