WinCE流驱动程序设计概述

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微 处 理 机

M I CROPROCESS ORS

W inCE 流驱动程序设计概述

顾峥浩,王自强,聂文华

(南京大学电子科学与工程系,南京210093)

摘 要:介绍了W inCE 操作系统下流驱动的设计方法,并在I ntel 公司的DBPXA255开发板下提供了关于8位数码管LED 的设计实例。

关键词:W inCE;流驱动;DBPXA255中图分类号:TP316.7 文献标识码:B 文章编号:1002-2279(2007)03-0081-03

The D e s i gn o f S tream I n te rface D ri ve r fo r W i nC E

G U Zheng -hao,WANG Zi -qiang,N I E W en -hua

(D epart m ent of Electronics and Engineering,N anjing U niversity,N anjing 210093,China )

Abstract:This paper intr oduces the strea m interface driver of W inCE,and p resents a sa mp le driver f or the Hex LED s of I ntel ’s DBPXA255.

Key words:W inCE;Strea m interface driver;DBPXA255

1 引 言

W inCE 是一款由微软公司推出的面向嵌入式

领域的操作系统,被广泛应用于手机、P DA 、平板电

脑以及各种工控领域中。由于嵌入式设备硬件平台的多样性,针对不同的硬件编写驱动程序,从而使W inCE 上层屏蔽底层硬件的多样性就显得尤为重

要。

W inCE 的驱动按类型分有四种,分别为本地驱动(Native device driver )、流驱动、US B 驱动和网络驱动。其中流驱动由于接口简单、支持硬件设备最多,因而最为常用。下面将结合DBPXA255开发板中流驱动的一个简单实例,详细说明其设计方法。

2 流驱动开发的基本知识

2.1 开发W inCE 驱动的基本工具

驱动程序属于板级支持包(BSP )开发的一部分,可以使用微软的Platfor m Builder 工具进行设计。该工具将驱动编译成动态库,并整合到CE 系统中去。如果成功,则会得到一个NK .bin 的文件,此文件即为按照你的硬件平台定制的内核镜像,将其下载到嵌入式设备中就可以运行W inCE 了。笔者使用的是其.Net 版本。2.2 DBPXA255开发板

PXA255是I ntel 公司推出的取代Str ong AR M

S A1110的新一代嵌入式应用处理器,属于ar m 系

列,它拥有Thumb 压缩指令、64位长乘法指令、增强型DSP 指令等先进特性,并集成了众多的外部接口,支持L inux 、W inCE 、Pal m OS 、Sy mbian OS 等主流嵌入式操作系统。DBPXA255开发板基于该型处理器,添加了一些外设如触摸屏、声卡接口等,在嵌入式开发中有着广泛的应用。2.3 W inCE 设备驱动程序的加载

大部分W inCE 驱动程序在系统引导的时候被设备管理器加载,加载信息被放在注册表的特定子键中,一般被设定为“HKEY _LOCAL _MACH I N E \DR I V ERS\BuiltI n ”。例如音频设备(W ave Dev )的加载信息:

[HKEY _LOCAL _MACH I N E \D rivers \BuiltI n \W ave Dev\]

"Prefix"="WAV ""D ll"="wavedev .dll"

"I ndex"=dword:1"O rder"=dword:0

Prefix 的值代表设备的前缀名,用于标识与特

定名称设备相关联的文件流访问接口,必须由三个大写字母组成。在这里它的值为WAV ,那么设备的打开、关闭例程就为WAV_Open 和WAV_Cl ose 。

“D ll ”的值代表该设备驱动程序所在的动态库的名称,这里系统将在“wavedev.dll"中查找对

作者简介:顾峥浩(1981-),男,江苏无锡人,硕士研究生,主研方向:W inCE 、L inux 下嵌入式开发及应用。收稿日期:2005-03-02

第3期

2007年6月

No .3

Jun .,2007

微 处 理 机W ave Dev 设备的操作例程。

“I ndex ”的值为索引值,用于区分流接口管理的

设备。同一个流接口可能会有超过一个的设备,这时就需要索引值来加以区分。索引值跟在前缀后面,其值可以从1到9,第十个设备则用0代表。这里,当调用CreateFile 函数打开此设备时,需要的文件名为”WAV1:”。

“O rder ”的值为该设备在引导期间的加载次序,为可选项。2.4 流驱动设备概述流接口设备是以文件流的形式实现功能的设备。对W inCE 系统而言,它是作为一个特殊文件存在的,用户可以通过文件操作函数如CreateFile 、ReadFile 、W riteFile 等来实现对设备的访问。流驱动使用一个固定的流接口函数集,共10个函数,分别为XXX_I nit 、XXX _Deinit 、XXX _Open 、XXX _Cl ose 、XXX_Read 、XXX _W rite 、XXX _Seek 、XXX _I O Contr ol 以及可选的电源管理函数XXX _Power Up 、XXX _Po wer Down 。其中XXX 为该设备在注册表中的Pre 2fix 值。通过这些函数,驱动程序将操作系统对设备的文件操作重定向成该设备的I/O 操作,以实现对设备的控制和访问。由此可见,此实现机制与L inux 操作系统的字符设备驱动有一定的相似之处。2.5 ar m 系列下W inCE 的硬件I O 方式

在ar m 系列平台中,W inCE 通过MMU 根据系统自带的OE MAddressTable 建立物理地址和虚拟地址之间的映射关系。此后,系统就能通过虚拟地址的存取来间接访问硬件地址。但是,OE MAddre 2ssTable 仅仅是将物理地址映射到系统的内核空间,即系统2G 以上的虚拟地址中,而处于用户空间的驱动程序无法对此进行直接访问。这时,就需要使用V irtual A ll oc 函数在用户空间申请虚存,然后调用V irtual Copy 将内核空间的虚拟地址二次映射到本地用户空间中去。然后,就能通过RE AD _REGI STER _ULONG 和WR I TE_REGI STER _ULONG 之类的宏进行硬件I O 存取了。

3 流驱动开发实例

以下为在DBPXA255开发板下的一个简单流驱动实例。DBPXA255中存在8个8位LED 数码管,可通过物理地址为0x0800_0040的控制寄存器和地址为0x0800_0010的数据寄存器来控制它们显示数字。本实例的功能就是操作这两个寄存器,以实现对这8个LED 的操作。通过该实例,可进一步了解W inCE 流驱动程序的设计方法。此处限于篇

幅,省略了介绍程序如何编译的Makefile 部分,读者可自行参阅W inCE 的帮助文档。3.1 编辑注册表文件p latfor m.reg

本实例使用的前缀名为LE D ,因此在该文件中添加信息如下:

[HKEY _LOCAL _MACH I N E \D rivers \BuiltI n \LedDev\]

"Prefix"="LE D ""D ll"="leddev .dll""I ndex"=dword:13.2 编辑p latfor m.bib 文件

p latfor m.bib 文件的作用是将已知文件整合到内核镜像中去,只有这样,嵌入式设备运行时才能在本地系统中找到该文件。因此,这里需要将驱动程序的动态库复制到内核中:

leddev .dll $(_F LATRELE ASED I R )\leddev .dll NK SH

其中NK 代表此文件将被复制到内核地址空间;SH 代表此文件为系统文件,且其属性为隐藏。3.3 编写驱动程序3.3.1 初始化

DWORD LED _I nit (LPCTST R pContext,LPCVO I D l pv Bus Context )

{

DWORD DevHandle =1;DE BUG MSG (1,(TEXT ("Now you are in the LE D _I nit ()\n")));

LED_H W _I nit ();return DevHandle;}

此函数在系统引导、设备初始化的时候被调用,其返回值为设备的上下文句柄,这里由于功能简单,因此并未使用该句柄,仅保证其返回值不为0。DE 2BUG MSG 为一个宏,用于输出调试信息。LED_H W _I N I T 为自定义函数,实现了具体硬件的初始化。在这里,它主要是调用V irtual A ll oc 和V irtual Copy 两个函数将内核空间中关于LE D 寄存器的虚拟地址二次映射进本驱动的用户空间,以方便以后对这两个寄存器的访问。同时,它还向LE D 控制寄存器写0,以打开LED 的电源。3.3.2 逆初始化

BOOL LED_Deinit (DWORD hDeviceContext ){

DE BUG MSG (1,(TEXT ("Now you are in the LE D _Deinit ()\n")));

LED_H W _DE I N I T ();return TRUE;

・28・2007年 

相关文档
最新文档