没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
ARM嵌入式 WINDOWS CE 实践教程
第 6 章 Windows CE 驱动程序实验
6.1 WINCE 驱动程序模型
基于 WINCE 的驱动程序有两种模型,它们是本机设备驱动程序和流接口
驱动程序。
不同的驱动模型只能通过它们支持的软件接口来区别,而不是它们所适用
的设备,驱动程序模型决定了指定驱动程序输出的软件接口。
WINCE 是可移植的,将它移植到目标平台上,必须为在平台上已建立的设
备提供驱动程序。一些类型的设备,如键盘、显示器等,对操作系统都有一定
的接口。因为这些接口是专门用于 WINCE 的,所以这类设备的驱动程序称作
本机设备驱动程序。本机驱动设备驱动程序适于集成到基于 WINCE 平台的设
备,通用 LED 驱动和电源驱动就是这样的例子。通用 LED 驱动由 nleddrv.lib
连接,电源驱动由 battery.lib 连接。还有一些样本本机驱动程序,例如显示驱动
程序和键盘驱动程序,他们表现在一个 DLL 的文件上由 GWES 统一加载和管
理。因为本机设备驱动程序通常与基于 WINCE 的平台有着紧密的连接,而每
种本机设备驱动程序都有精确的和特殊的目的,微软提供了定制接口的方式来
支持内部设备驱动程序,也就是说绝大多数的开发人员不需要编写本机设备驱
动程序。但是把 WINCE 定制到新平台的原始设备制造商(OEM)除外,他们
可以创建自己的本机设备驱动程序,也可以将微软的本机设备驱动程序的例子
移植到他们基于 WINCE 的平台上。本机设备驱动程序总是在基于 WINCE 的
平台启动时加载。
流接口驱动程序是一般类型的设备驱动程序。流接口驱动程序表现为在用
户一级的动态链接库 DLL,用来实现一组固定的函数称为流接口函数,这些流
接口函数使得应用程序可以通过文件系统访问这些驱动程序。流接口驱动程序
几乎支持任何类型的可以连接到基于 WINCE 的平台外部设备。同时用户还可
以定制出不支持任何外围设备的流接口驱动程序,这些驱动只是提供某些服务。
第 46 页 共 99 页
This is trial version
www.adultpdf.com
ARM嵌入式 WINDOWS CE 实践教程
6.2 本机设备驱动程序的系统结构
对于本机设备驱动程序,PB 提供了一些驱动程序的样本。PB 中包含的样
本设备驱动程序分为两种类型:单片驱动程序和分层的驱动程序。正如其设备
表明的,单片驱动程序基于单个码片,该码片直接把硬件设备的功能性传递给
操作系统。与单片驱动程序相比,分层驱动程序由两个设置好的层组成;上层
是模型设备驱动程序(Model Device Driver, MDD),下层是依赖平台的驱动程
序(Platform Dependent Driver, PDD)。大多数的样本设备驱动程序都配置成分
层的,而不是单片的。
下图说明了单片驱动和分层驱动如何在 WINCE 中集成的。
DDSI 函数
DDSI 函数
PDD 层
MDD 层
设备驱动程序
PDD 层
MDD 层
设备驱动程序
单片设备
驱动程序
流接口函数
DDI 函数
DDI 函数
硬件
设备管理器 GWES
6.3 流接口驱动程序的系统结构
6.3.1 设备管理器
流接口驱动程序是以动态链接库形式存在的,由设备管理器统一加载、管
第 47 页 共 99 页
This is trial version
www.adultpdf.com
ARM嵌入式 WINDOWS CE 实践教程
理和卸载。
流接口驱动程序是为连接到基于 WINCE 的平台的外围设备而设计的。这
些外围设备包括 MODEM、打印机、数字相机和 PC 卡等。外围设备的驱动程
序就像桌面计算机的打印机驱动程序一样,都当作用户模式的程序来运行,所
以载某种情况下可以说 WINCE 的驱动是在用户模式下运行的。这些程序使用
内置硬件的服务来控制他们的设备。串行设备的驱动程序使用串行口。为了与
外围设备进行交互,流接口驱动程序通常使用本机设备驱动程序所提供的 DDSI
函数来使用本机设备驱动程序。
流接口驱动程序的主要任务就是把外设的使用传递给应用程序,这是通过
把设备表示为文件系统的一个特殊文件实现的。对于串口 1 在用户级别的程序
里面通常被描述为 COM1。WINCE 的设备文件通常保存在固定的路径\Windows
目录下,通过注册表机制来完成特殊的命名惯例。
设备管理器使用存储在 HKEY_LOCAL_MACHINE\Drivers\键中的注册键
来管理驱动程序。该键下面主要由如下几个子键:
(1) Active\: 此键包含由设备管理程序加载的跟踪当前活动的驱动程序。当
加载一个设备驱动程序的时候,设备管理器会在这个键记录加载的驱动程序信
息。通常这个键下面的子键都为数字 1,2,3…这代表加载驱动程序的顺序,
每一个数字键都有可能包含下面这些子键。
Hnd:ActiveDeviceEx 函数返回的设备句柄值。
Name:设备文件名,例如“COM1”和“COM2”。
Key:HKEY_LOCAL_MACHINE 中的设备驱动程序键的注册表路径。
一旦一个设备驱动程序被加载,设备管理器会在 Active\键下面增加一个子
键,这个子键的名称就是在原有的 Active\键下面的数字键最大数加一。在设备
驱动程序卸载时,设备管理器就删除 Active\键下面关于这个驱动程序的所有键
值。
(2) Builtin\:此键包含由基于 WINCE 的平台制造商提供的流接口驱动程序,
这里面的驱动程序都是在系统启动时就加载的。
(3) PCMCIA\:此键含有与 PC 卡及其流接口驱动程序有关的子键。
(4) Resource\:此键记录了系统的中断和 IO 的使用情况。
第 48 页 共 99 页
This is trial version
www.adultpdf.com
ARM嵌入式 WINDOWS CE 实践教程
6.3.2 设备文件名
在 WINCE 中应用程序通过文件系统里的特殊入口访问外围设备。WINCE
中的文件系统代码包括那些识别特殊文件名并重定向 IO 操作到适当的流接口
驱动程序的代码。
WINCE 的设备文件名是由三个大写字母、一个数字和冒号组成的,例如
“COM1:”。WINCE 使用前面三个字母来识别与特殊流接口驱动程序相对应的
特殊设备。文件名前缀存储在称作“Prefix”的注册表键值中,一般来说如果用
户想生成自己的流接口驱动程序,就要指定这三个字母的前缀。它可以是任意
三个字母。
WINCE 设备文件名中的数字是用来区分由同一个流接口驱动程序管理的
所有设备。设备管理器对索引的编号默认是从 1 到 9,1 用于第一个设备文件名,
如果需要 10 个文件名可以把 0 也用上。
6.3.3 流接口驱动程序入口函数
每个流接口驱动程序必须实现一组标准的函数,用来完成标准的文件 IO 函
数和电源管理函数,这些函数提供给 WINCE 内核使用。这些函数通常叫做流
接口驱动程序的 DLL 接口。下面将分别描述,其中函数名称前面的 XXX 表示
设备文件名前缀。
(1) DWORD XXX_Open (DWORD hDeviceContext, DWORD AccessCode,
DWORD ShareMode)
参数:DWORD hDeviceContext,设备驱动的句柄,由 XXX_Init 函数创建
的时候返回。
DWORD AccessCode,传给设备驱动程序使用的地址,这个地址和读
写有关。
DWORD ShareMode,共享模式,这个参数用于一些特殊的设备。例
如一些 PC 卡的设备读写的时候是否可以共享。
返回值:返回驱动程序引用事例句柄。
第 49 页 共 99 页
描述:这个函数用于打开一个设备驱动程序,当应用程序准备对某一个设
备进行读写操作时,系统必须先执行 CreateFile()这个函数用于打开这个设备。
这个函数执行了以后系统才能够执行读写操作。
This is trial version
www.adultpdf.com
ARM嵌入式 WINDOWS CE 实践教程
(2) BOOL XXX_Close (DWORD hOpenContext)
参数:DWORD hOpenContext,设备驱动的引用事例句柄,由 XXX_Open
创建。
返回值:调用成功返回 TRUE,失败返回 FALSE。
描述:这个函数用于关闭一个驱动程序的引用事例。应用程序通过
CloseHandle 来调用这个函数,当执行完成这个函数的时候驱动程序引用的事
例,hOpenContext 将不再有效。
(3) DWORD XXX_Init (DWORD dwContext)
参数:DWORD dwContext,指向字符串的指针。通常这个参数都为一个流
接口驱动在注册表那的设置。
返回值:如果调用成功返回一个驱动程序的句柄。
描述:当用户开始使用一个设备的时候,设备管理器调用这个函数来初始
化该设备。这个函数并不是由应用程序直接调用的,而是通过设备管理器提供
的 ActivateDeviceEx 函数来调用的。函数执行后如果成功则返回一个设备的句
柄。
(4) BOOL XXX_Deinit (DWORD hDeviceContext)
参数:DWORD hDeviceContext,由 XXX_Init 创建时生成的设备句柄。
返回值:调用成功返回 TRUE,失败返回 FALSE。
描述:当一个用户需要卸载一个驱动程序的时候,设备管理器调用这个函
数来卸载这个驱动程序,应用程序不能够直接调用这个函数,设备管理器通过
DeactivateDevice 函数调用这个函数。
(5) DWORD XXX_Read (DWORD hOpenContext, LPVOID pBuffer,
DWORD Count)
参数:DWORD hOpenContext, 由 CreateFile 函数返回的句柄。
LPVOID pBuffer, 一个缓冲区地址用于从驱动读数据。
DWORD Count,需要读缓冲区的长度。
返回值:实际读取字节的长度。
描述:这个函数与 ReadFile 很相似,当一个流接口驱动程序已经被打开后,
可以使用 ReadFile 函数对这个设备进行读操作,ReadFile 里面的 hFile 参数就
是这个设备的引用实例句柄 hOpenContext,而 参 数 lpBuffer 将传给 pBuffer,用
于表示要读写缓冲区的地址,参数 nNumberOfBytesToRead 将传送给 Count,用
于表示要读写的缓冲区的长度。同样,返回的参数:如果操作成功则返回实际
第 50 页 共 99 页
This is trial version
www.adultpdf.com
剩余53页未读,继续阅读
资源评论
qq_16768799
- 粉丝: 0
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功