`
mmdev
  • 浏览: 12928437 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

《Windows CE嵌入式开发入门——基于Xscale架构》 第10章 案 例 分 析

阅读更多

10.1 TouchScreen驱动分析

10.1.1 介绍

触摸屏驱动是从触摸屏硬件上获取用户的输入信息,然后将触摸事件传递给GWES子系统。驱动会矫正坐标值,比如将歪斜的线条修正为直线。

在用户的笔或者手指触摸屏幕的时候,驱动必须随时返回坐标值,当笔或者手指离开屏幕后,必须产生事件来标记“抬笔”事件。

10.1.2 注册表设置

下面是触摸屏驱动的注册表设置。

[HKEY_LOCAL_MACHINE\ControlPanel]

InputConfig"=dword:3; 3 => 键盘和触摸屏

[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH]

"DriverName"="touch.dll"

"MaxCalError"=dword:10

10.1.3 数据结构

1TOUCH_PANEL_SAMPLE_FLAGS

本数据结构绘出返回到系统的坐标值的属性。

2TPDC_CALIBRATION_POINT

本数据结构由TouchDriverCalibrationPointGet.例程代码组成,并运行在系统启动时,用户可以看见屏幕上会有一个X,从中间再到四周指引用户矫正坐标值。TouchDriverCalibrationPointGet例程通常利用屏幕的高和宽来确定中心和四周的坐标值。

struct TPDC_CALIBRATION_POINT {

INT PointNumber;

INT cDisplayWidth;

INT cDisplayHeight;

INT CalibrationX;

INT CalibrationY;

};

3TPDC_SAMPLE_RATE

本数据结构由DdsiTouchPanelGetDeviceCaps例程代码组成。

struct TPDC_SAMPLE_RATE {

INT SamplesPerSecondLow;

INT SamplesPerSecondHigh;

INT CurrentSampleRateSetting;

};

数据结构中成员说明

SamplesPerSecondLow

低采样率值。

SamplesPerSecondHigh

高采样率值。

CurrentSampleRateSetting

当前采用的采样率值,1代表高采样率,0代表低采样率。

10.1.4 驱动例程

1TouchPanelEnable

本例程使触摸屏具有采样功能。可以被程序直接调用。

2DdsiTouchPanelAttach

本例程在MDDDLL中被加载,DLL入口获得DLL_PROCESS_ATTACH事件时被执行。在多数系统中,一般只有一个进程加载触摸屏驱动,然而在某些系统中也不排除多个进程都加载触摸屏驱动DLL的可能性。在本例程中可以为它们复制全局变量等信息,这样可使每个加载驱动的进程都从本例程获得一个全局信息的副本。但是在本例程中不需要操作硬件或者中断。硬件和中断的操作应当在DdsiTouchPanelEnableDdsiTouchPanelDisable中进行。

本例程原型:

LONG DdsiTouchPanelAttach(void);

返回值一般为0

3DdsiTouchPanelDetach

本例程在MDDDLL被卸载,DLL入口获得DLL_PROCESS_DETACH事件时被执行。在多数系统中,一般只有一个进程加载触摸屏驱动,然而在某些系统中也不排除多个进程都加载触摸屏驱动DLL的可能性。在本例程中可以为它们复制全局变量等信息,这样可使每个加载驱动的进程都获得一个全局信息的副本。但是在本例程中不需要操作硬件或者中断。硬件和中断的操作应当在DdsiTouchPanelEnableDdsiTouchPanelDisable中进行。

本例程原型:

LONG DdsiTouchPanelDetach(void);

4DdsiTouchPanelDisable

本例程关闭触摸屏设备,删除任何没有被提交给GWES的坐标,关闭电源。

本例程原型:

VOID DdsiTouchPanelDisable(void);

无参数,无须返回值。

5DdsiTouchPanelEnable

本例程原型:

BOOL DdsiTouchPanelEnable(void);

返回值:

TRUE代表成功,FALSE代表失败。

本例程为触摸屏加载电源,并且进行初始化。调用AllocTouchPanelRegs为寄存器分配内存。这些虚拟内存分配时,参数中使用MEM_RESERVED标志,这样被分配的内存不与物理内存绑定,不能被malloc等函数访问,最后使用virtual_copy将虚拟地址和寄存器的物理地址绑定(不是物理内存)。

在为寄存器分配完空间后,建立中断,即“落笔”中断,但是建立后就关闭中断,直到InterruptEnable()被执行后再建立中断。

6DdsiTouchPanelGetDeviceCaps

本例程查询触摸屏设备的精度。

本例程原型:

BOOL DdsiTouchPanelGetDeviceCaps(

ULONG iIndex,

LPVOID lpOutput

);

其参数为:

iIndex,代表查询的项目。可以有以下类型:

TPDC_SAMPLE_RATE_ID 查询采样频率。

TPDC_CALIBRATION_POINT_ID 返回指定精度的坐标值,精度由lpOutput参数的PointNumber域指定。

TPDC_CALIBRATION_POINT_COUNT_ID 查询校准坐标所需要的坐标样本数。

lpOutput:指向存放返回信息的内存区域,类型和iIndex对应。

iIndexTPDC_SAMPLE_RATE_ID时,指向TPDC_SAMPLE_RATE结构。

iIndexTPDC_CALIBRATION_POINT_ID时,指向TPDC_CALIBRATION_POINT结构。

lpOutput不能为空指针。

返回值:

TRUE代表成功,FALSE代表失败。

7DdsiTouchPanelGetPoint

本例程返回最近的一次数据采样坐标值。在“落笔”之后,就会触发定时器的一系列中断。定时器每秒钟约产生150次中断,每次中断都要返回坐标值。

pxa255中,本例程分为三部分:

n 处理“落笔”中断

关闭“落笔”中断

n 处理定时器中断

递增定时器中断计数。

以上两个中断处理,都会调用SampleTouchScreen,从采集到的3个点中,选出最优化的点,返回给系统。

n 处理“抬笔”中断

最后,打开“落笔”中断,将UCB1400设置为可中断模式。

8DdsiTouchPanelPowerHandler

本例程通知驱动程序,系统正从暂停模式恢复到正常模式,或者进行相反的操作。本例程会被内核态程序调用,因此不要在其中使用系统调用。

10.2 显示驱动分析

基于微软公司的DirectDraw显示驱动,必须在DDI内实现DDHAL用于支持DirectDraw

10.2.1 Windows CE DirectDraw架构

DirectDraw提供了独立于设备的显示驱动功能。它将图形显示数据直接加载到硬件设备上,而不需要图形设备接口来对数据进行转换,从而使图形显示效果更加顺畅,避免了屏幕的闪烁。实现这样的接口,需要扩展能够直接访问硬件的驱动接口,这些能够直接访问硬件的驱动接口组成了DirectDraw硬件抽象层(DirectDraw Hardware Abstraction LayerDDHAL

Windows CE中的DirectDraw架构

10-1 DirectDrawGDI
显示驱动结合

10-1显示了DirectDrawGDI显示驱动是如何结合的:

Windows CE中的DirectDrawWindows桌面环境Direct-
Draw
的子集。DirectDraw的核心可执行代码常驻在系统进程gwes.exe中,而应用程序则和较小的客户端代理Ddraw.dll建立连接,这个代理负责维护系统和用户进程之间的远程DirectDraw COM接口连接。Windows CE在默认的情况下不提供进程外部的COM服务器。

Windows CE还提供了一个名为DirectDraw图形原始引擎(DirectDraw Graphics Primitive EngineDDGPE)的抽象层,GDIDirectDraw组件在系统进程中使用这个抽象层将GDI/DDIDDRAW/DDHAL的功能捆绑到一个由C++类和函数组成的框架上。DDGPE提供的C++类实现了GPE类的扩展。

10.2.2 如何创建DirectDraw显示驱动程序

可以复制Platform Builder提供的样例显示驱动程序作为新创建的驱动程序的基础。

1.修改二进制文件导出的接口,二进制文件应当导出HALInit接口。在Platform Builder提供的样例显示驱动程序有一个.def后缀名的文件,在这个文件中添加HALInitHALInitDdgpe.lib库的一部分,应当总是被链接到程序中。

2.在程序中包含路径drive:\wince400\public\directX\oak\inc,这应当是DDHFuncs.h所在路径。这是一个所有显示驱动程序公共的头文件,不应当被修改。

将下列文件从样例显示驱动程序中复制到自己的文件夹下:

n HalCaps.cpp

n HalDD.cpp

n HalSurf.cpp

n HalPalette.cpp

在选择样例显示驱动程序时,应当选择和自己设备最接近的驱动程序。最后,编译自己创建的驱动程序。

10.2.3 DDGPE基类

1DDGPE

DDGPE类是DirectDraw对象继承的基类。

10-1列出了DDGPE类中的成员函数:

10-1 DDGPE类中的成员函数

DDGPE::AllocSurface

为一个surface分配内存

DDGPE::AllocVideoSurface

在内存中创建DDGPESurf对象

DDGPE::BltExpanded

建立并且执行一个GPE blit

DDGPE::BltPrepare

GPE BltPrepare 函数的DDGPE版本

DDGPE::DetectMode

根据提供的参数确定显示模式

DDGPE::DetectPixelFormat

DDPIXELFORMAT转换成EGPEFormat或者EDDGPEPixelFormat.

DDGPE::GetDriverData

返回指向驱动数据的指针

DDGPE::GetDriverGUID

获取驱动的GUID

DDGPE::GetModeInfoEx

返回扩展模式信息

DDGPE::GetPhysicalModeId

获取当前实际的显示模式

DDGPE::InDisplay

判断给定的扫描线是否正在显示

DDGPE::PerformBlt

执行一次blit

DDGPE::SetDriverData

将驱动特定的数据存储到DDGPE对象中

DDGPE::SetDriverGUID

将驱动的GUID赋予特定的对象

DDGPE::SetMode

更改当前的显示模式

DDGPE::SetVisibleSurface

使指定的surface被推到前台,成为可视

DDGPE::WrapSurface

在既存的内存块之上创建一个DDGPESurf对象

2DDGPESurf

DDGPESurf类扩展了GPESurf类,并且代表了由GDI分配的一个surface,如表10-2描述。

10-2 DDGPSurf类中的成员函数

DDGPESurf::AlignedWidth

获取一个surface内存的宽度

DDGPESurf::Bpp

决定在当前surface中,每个象素占用的位数

DDGPESurf::ColorKey

获取当前surfacecolor key

DDGPESurf::ColorKeyMask

获取当前surfacecolor key掩码

DDGPESurf::DeleteSurface

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics