原创 基于Windows CE 的USB Key 驱动程序设计

2011-5-2 14:57 2801 2 2 分类: MCU/ 嵌入式
摘要:对Widows CE 系统下驱动结构进行了讨论,在深入研究针对USB 设备流接口驱动设计基础上,给出并分析了USB Key 设备驱动的部分关键代码。
关键词:流设备驱动程序,USB Key 设备,Windows CE
1 引言
嵌入式系统已经渗透到国民经济的各个领域,嵌入式操作系统则是嵌入式系统的灵魂,目前常用的嵌入式操作系统有:Windows CE 、Linux。其中,微软开发的Windows CE 以其快速的开发流程、灵活的软硬件选择和强壮的最终产品特性成为越来越多嵌入式产品开发的首选。Windows CE 是一种紧凑、高效、可伸缩的32 位的操作系统,它所具有的多线程、多任务、完全抢占式的特点是专为各种有很严格资源限制的硬件系统所设计的。而现在各硬件厂商很少提供基于Windows CE 的硬件驱动,因此开发人员经常需要根据自己特定的硬件平台进行基于Windows CE 的驱动开发,本文选择USB Key 密码设备来探讨基于Windows CE 的驱动开发设计。
2 Windows CE 系统驱动模型
Windows CE 系统驱动结构不同于基于Windows 2000 驱动结构,它主要有两种设备驱动类型:本机设备驱动程序(Native Device Driver)和流设备驱动程序(Streams Device Driver) ,如图1 所示。在本质上,Windows CE 的设备驱动程序都是一些DLL 文件 (动态链接库),可以用标准的Windows CE API(基于WIN32) 实现。这些DLL 文件向内核提供了一些入口函数,使设备管理模块可以通过这些函数与具体的硬件设备进行通信。
本机设备驱动程序有时也被称为内建驱动程序(Built-in Driver)是硬件所必需的,它们是由 GEWES统一的管理和加载。通常是由 OEM 设计硬件时所完成的,本机设备驱动程序的开发是和操作系统开发一起进行的,驱动程序被集成到最终的 CE 映像文件中。在 Platform Builder 中,提供了许多本机设备的驱动程序原代码。在自行定制操作系统时,可以直接将目标平台上的本机设备驱动程序加载到自己的操作系统中。
流设备驱动程序也被称为可安装的驱动程序(Installable Driver),它是由设备管理器(device.exe)动态加载的用户模式的 DLL。流设备驱动程序使用流接口驱动程序的架构并借助于文件系统调用从设备管理器或应用程序获得命令。

3 针对 USB Key 设备的流接口程序的设计
Windows CE 没有提供 USB 设备使用的标准机制,但是编写 USB 设备驱动程序可供采用的方法有:
(1)使用流接口函数;
(2)使用现有的 Windows CE 应用程序编程接口(API);
(3)创建用户指定的 API。
我们在编写 USB Key 设备驱动时采用了流接口驱动的模式,该驱动程序的位置位于 USBD 协议栈层上,属于控制具体设备功能的客户端驱动程序。下图表示了流接口驱动程序和 USBD 模块以及Windows CE 其它系统部件相互关系。
流接口驱动程序的流接口函数被设计为匹配系统文件系统 API 函数的形式,通过这种机制,设备就可在流接口的管理下通过文件系统暴露给应用层,应用层将设备作为一种特殊的文件进行操作从而达到对设备的控制。
在应用程序发出请求命令后,由系统中的文件系统进行匹配,分别处理应用程序的请求。Windows CE 系统的流接口是属于固定开放的规范,每个流接口驱动程序必须实现一组标准的函数,用来完成标
准的文件 I/O 函数和电源管理函数,这些函数通常叫做流接口驱动程序的 DLL 接口,见表 1。
表 1 流接口驱动程序的 DLL 接口
函数名称
描述
XXX_Init
当设备管理器初始化一个 USB 设
备的时候调用这个函数
XXX_Deinit
当设备管理器卸载一个 USB 驱动
程序的时候调用这个函数
XXX_Open
在打开一个 USB 设备驱动的时候
应用程序通过 CreatFile()函数
调用这个函数
XXX_Close
在 USB 驱动程序关闭的时候应用
程序通过 CloseHandle()函数调
用这个函数
XXX_IOControl
上 层 的 软 件 面 过
DeviceIoControl 函数数可以调
用这个函数
XXX_Read
设备驱动程序处于打开状态的时
候由应用程序通过 ReadFile()函
数调用
XXX_Seek
对 USB 设备的数据指针进行操作,
由 应 用 程 序 通 过
SetFilePointer()函数调用
XXX_Write
在一个 USB 设备驱动程序处于打
开 状 态 时 由 应 用 程 序 通 过
WriteFile()调用
XXX_PowerUp
在系统重新启动前调用这个函数

XXX_PowerDown 在系统挂起前调用这个函数
流接口函数的参数,一部分是由应用程序通过系统传递给驱动程序的流函数,一部分是由系统自身将内核对象变量传递给驱动中各个流函数。
在实际开发中接口名称中的 XXX 三个字母由设备驱动的设备文件名前缀代替。在驱动中,我们用设备名前缀 KEY 替换函数集中的 XXX,那么它相应要实现的 DLL 接口就为 KEY_Init,KEY_Close,KEY_Deinit ,KEY_Seek ,XXX_Open,XXX_IOControl 等。
4 USB Key 设备驱动程序设计与实现
4.1 USB Key 设备概述
USB Key 实际上是 IC 卡和 IC 卡读写器的结合体,具有成本低、携带方便等优点。USB KEY 主要有 CPU,COS(卡操作系统),EEPROM(或 Flash)三大部分组成,可以在 KEY 内执行密码运算,并且可以存储一定容量的敏感数据。由于其体积一般较小,能够像普通钥匙一样随身携带,因而又称为密码钥匙。USB Key 在硬件存储上采用内部特定安全逻辑,能够防止秘密信息被读出,同时又能够进行加解密运算,具有比较高的安全性。
我们开发用的 USB Key 采用的是华虹 SHC1402 芯片,该芯片集成有一个 USB 通信接口,支持USB1.1 标准,通信速率为 1.5Mb/s。支持的传输方式有控制传输和中断传输两种,具有 EndPoint0、EndPoint1、EndPoint2 三类端点。其中,EndPoint0 是双向端点,支持控制;EndPoint1 端点支持中断传输,方向 IN;EndPoint2 支持中断传输,方向 OUT。
4.2 驱动程序,实现
下面就以 USB Key 的驱动程序为例,具体介绍基于 Windows CE 平台的驱动程序开发的过程。笔者使用优龙公式的 FS2410 开发板,该核心板上集成 203MHz 的 ARM920T 内核的 Samsung S3C2410 处
理器。
Windows CE 系统下 USB 设备驱动程序编写不同于在 Windows 2000 系统下编写,在 Windows CE系统下编写 USB 设备驱动程序主要分为两大部分工作。一部分是需要实现控制设备的各种流接口函数。
以系统流接口驱动机制为框架在这些函数的内部实现了如何操作具体功能设备,这是与具体的设备相关的。另一部分是必须实现的三个入口函数 USBDeviceAttach() ,USBInstallDriver ( ) ,USBUninstallDriver
( ) 。实现这三个入口函数主要目的是为了使客户端驱动与系统的 USBD 协议栈进行联系。因为在设备接到主机上后,系统底层的 USB 总线功能实现层会将检测到的设备的基本信息及设备某功能接口的有
关信息提供给上层,USBDeviceAttach () 等函数会接受该信息从而为客户端驱动的下一步工作打下基础;二是为了进行必要的注册表项设置。在 Windows CE 系统中,设备的配置信息都是存储在系统注册
表中,所以有关具体设备的必要信息和一些附加信息可以在 USBInstallDriver ( ) 中实现注册,对应的USBUninstallDriver ( ) 函数负责卸载这些注册的设备信息。这里重点介绍首先被 USBD 协议栈所调用
的 USBDeviceAttach()函数的处理流程,它主要实现选择 USB 总线设备的某个接口从而能够利用设备的信息填写构造的设备对象成员值及激活该驱动等的功能。
USBDeviceAttach( USB_HANDLE hDevice, LPCUSB_FUNCS UsbFuncs,
LPCUSB_INTERFACE UsbInterface,
LPCWSTR UniqueDriverId,
LPBOOL AcceptControl,
LPCUSB_DRIVER_SETTINGS UsbDriverSettings, DWORD Unused
)
{
/ / 初始化各种变量
PUSBKey_CONTEXT pUsbKey = NULL;
……
/ / 分析 USB 设备接口描述信息
pUsbInterface = ParseUsbDescriptors(hDevice , UsbFuncs , UsbInterface ,
(LPUSHORT)&ulConfigIndex );
……
/ / 分配设备对象结构
pUsbKey = ( PUSBKEY _ CONTEXT) LocallAlloc (L PTR , sizeof (USBKEY_CONTEXT) );
……
pUsbKey ->hUsbDevice = hDevice;
pUsbKey ->bInterfaceNumber = pUsbInterface->Descriptor.bInterfaceNumber;

……
pUsbKey ->hEP0Event = CreateEvent( NULL,MANUAL_RESET_EVENT,FALSE,NULL);
……
//设置 USB 设备接口
bRc = SetUsbInterface(pUsbKey,pUsbInterface );
/ / 激活流驱动接口
pUsbKey - > hSt reamDevice = ActivateDevice ( ws2RegKeyPath , (DWORD) pUsbKey) ;
……
/ / 注册回调函数
bRc = UsbFuncs->lpRegisterNotificationRoutine( hDevice,DeviceNotify,pUsbKey );
……
/ / 判断是否能够控制该设备
if ( ! bRc){ DEBU GMSG( ZONE _ ERR , ( TEXT ( " We can not control this device ! \ n" ) ) ) ;
RemoveDeviceContext (pUsbKey) ;}
……
return bRc ;
}
4.3 USB 设备驱动程序的注册表配置
USBD 模块使用一组跟踪驱动程序和设备的注册键来定位正确的驱动程序。这些注册键被作为HKEY_LOCAL_MACHINE \Drivers \USB \LoadClients\.键的子键保存起来,每个驱动程序的子键都有Groupl ID \Group2 ID \Group3 ID \DriverName 的格式。如果注册表信息与 USB 设备信息符合,USBD就会加载此驱动程序,否则 USBD 就不加载此程序。下面是 USB Key 的部分注册代码:
DriverSettings.dwCount = sizeof(DriverSettings);
DriverSettings.dwVendorId = 0x4242;//设备供应商 ID
DriverSettings.dwProductId = 0x4201;//设备的产品 ID
DriverSettings.dwReleaseNumber = USB_NO_INFO;
DriverSettings.dwDeviceClass = 0x00; //设备类
DriverSettings.dwDeviceSubClass = 0x00;// 设备子类
DriverSettings.dwDeviceProtocol = 0x00; 设备类协议
DriverSettings.dwInterfaceClass = USB_NO_INFO;
DriverSettings.dwInterfaceSubClass = USB_NO_INFO;
DriverSettings.dwInterfaceProtocol = USB_NO_INFO;
USB Key 设备在系统中注册表配置如下:
(HKEY_LOCAL_MACHINE\Drives\USB\LoadClients)
(16962_16897) (0_0_0) (Default)
(USB KEY)
DLL = USB KEY.dll
创建驱动程序加载所需的注册表信息是由 USBlnstallDriver()函数完成的,它在设备第一次插入 USB接口时 调用 。 USB 设 备驱动 程序 不使用 Windows CE 的 注册表 API 函数来 创 建,而 是使 用
RegisterClientDrivedD ( )和 RegisterClientSetings()来注册相应的设备信息。卸载驱动程序时会调用另外一个函数 USBUninstallDriver(),它可以删除 USBInstallDriver)时创建的注册表信息,同样的它使用自己
的函数接口 UnRegisterClientDriverlD)和 UnRegisterClientSetings)来做相应的处理。

5 结束语
随着嵌入式操作系统越来越被广泛应用,在嵌入式系统中编写驱动受到重视。Windows CE 虽然发布时间较其他嵌入式系统较晚,但是它对硬件的驱动提供了良好的接口,随着 Windows CE 普及,越来
越多的 USB 外设将会支持 Windows CE 平台。
本文创新点:在 ARM 处理器上,在 Windows CE 操作系统中,实现特殊密码设备 USB Key 流接口驱动设计与开发。本文能够给广大的 Windows CE 驱动开发人员一些帮助。
参考文献:

[1]微软公司.Microsoft Windows CE设备驱动程序开发指南.北京:北京希望电子出版社,1999
[2]陈向群等.Windows CE系统分析及实验教程[M].北京:机械工业出版社,2003
[3]宁立革,孙鹤旭,林涛,张妍.基于嵌入式操作系统的USB驱动程序开发[J].微计算机信息,2005,5
[4]GogginTA 尤滔 张平 周晓权 译.Windows CE高级开发指南[M].北京:电子工业出版社,2001
[5]Boling D 博彦科技译.Microsoft Windows CE程序设计[M].北京:北京大学出版社,2000
[6]Microsoft 希望译.Microsoft Windows CE Device Driver Kit[M].北京:北京希望电子出版社,2000
[7]Wilson J Y, Havewals A. Building Powerful Platforms with Windows CE[M]. 2001
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
2
关闭 站长推荐上一条 /3 下一条