首页 > 范文大全 > 正文

Windows CE下设备驱动的研究与实践

开篇:润墨网以专业的文秘视角,为您筛选了一篇Windows CE下设备驱动的研究与实践范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要:介绍windows ce及其特点,深入研究Windows CE本机设备驱动程序和流接口驱动程序模型及工作方法。在多主I2C总线模式下,根据S3C2440处理器的集成功能和接口模式,以S3C2440处理器的寄存器物理地址和虚拟地址来捆绑和配置I2C总线控制器设计为例,着重阐述了嵌入式Windows CE流接口驱动程序的开发过程,为此类设备驱动的快速开发提供了很好的思路。

关键词:Windows CE;设备驱动;I2C;S3C2440

中图分类号:TP334

0 引 言

伴随着后PC时代的到来,人们越来越多地接触到一个新的概念即嵌入式技术。嵌入式技术已被广泛地应用于科学研究、工程设计、军事技术,以及文艺商业等方方面面,成为后PC时代IT领域发展的主力军。这也极大地刺激了嵌入式系统的发展和产业化的进程。嵌入式操作系统作为嵌入式系统的核心,是连接嵌入式设备和应用的重要部件。它一方面要支持各种功能及规格的硬件设备,另一方面要为各种应用程序提供┮恢陋的功能调用接口,同时还需要在有限的系统资源上尽可能快地完成应用的计算需求。目前,主流的嵌入式操作系统有嵌入式Linux,Palm OS,VxWorks,Windows CE等。

1 Windows CE简介

Windows CE是一个开放的、可裁剪的、32位实时嵌入式窗口的操作系统。与其他桌面版窗口操作系统相比,它具有可靠性好,实时性高,内核体积小及可伸缩性,通信能力强等特点。所以被广泛用于各种嵌入式智能设备的开发中,是当今应用最多,增长最快的嵌入式操作系统。

Windows CE是从整体上为有限资源平台设计的多线程、完整优先权、多任务的操作系统[1,2] 。它采用高度的模块化设计,这些模块之间可能是独立的,也可能有一些依赖关系。在Windows CE中最主要的系统模块有五个,它们是:

(1) 内核:Windows CE的内核可以非常小,最小的内核只有500 KB。这是因为系统的大部分功能都可以在各自的功能模块中完成。它是整个Windows CE操作系统的核心,主要完成六类功能,即处理器调度、内存管理、异常处理、系统内的通信机制,为其他部分提供核心调用例程,为系统范围内的调试提供支持。

(2) 设备管理模块:提供系统范围内基本的设备列表管理、即插即用管理、电源管理、I/O资源管理等,并实现设备驱动程序得以工作的基本机制。设备配置信息存储在Windows CE的注册表中。

(3) 数据存储模块:提供基本的数据存储能力,包括对象存储和文件系统。目前,对象存储的大小限制为256 MB的RAM ,对象存储里的单个文件限制为最大32 MB;对象存储在Windows CE中的作用类似于PC机中的硬盘,它为应用程序及相关数据提供了持久稳固的存储。在Windows CE中,提供了三种文件系统,分别为基于ROM文件系统,基于RAM文件系统,以及用于支持存储设备的FAT文件系统。另外,嵌入式开发者也可以创建和注册属性文件系统

(4) 图形用户界面模块(GWES):它提供以下几个主要功能:基本的绘图引擎、窗口管理、界面的事件机制等。在Windows CE中GWES是操作系统、应用程序以及用户之间的接口。它支持组成Windows CE图形用户界面的窗口、对话框、控件、菜单和资源,使用户能够控制应用程序。同时,GWES还负责部分驱动程序的加载工作,主要包括显示、键盘、鼠标及触摸屏等的驱动。

(5) 通信模块:在整个Windows CE中,网络通信模块是最为独立的一部分,它运行时体现为一系列的动态链接库。其设计目标主要体现在四点:

① 高效能。提供最好的网络应用平台。

② 包容力。支持广泛的网络类型和选项。

③ 易用性。通过系统提供的API,用户可以容易地开发出各种网络应用。

④ 可拆卸。这是整个网络系统构架的特征,系统可以拆成很多独立的部分,应用系统可以根据需要选择其中一部分,这样可以降低系统开销,使系统更加精简。

除了这五个主要的系统模块外,Windows CE还有一些其他的模块,如OAL模块、驱动程序模块等。在实际的开发应用中,嵌入式开发者可以根据设备的性质,只选择那些必要的模块或模块中的组件,包含进操作系统镜像中。

2 Windows CE驱动程序模型

在操作系统中设备驱动程序通常扮演着无名英雄的角色。正是由于驱动程序的存在,大多数操作系统之上的应用程序都与硬件无关。应用程序的开发者和最终用户通常都不必关心底层的硬件如何工作。Windows CE之所以能够支持各种各样的硬件设备,也是因为存在对应的设备驱动程序。这些设备驱动程序提供了操作系统与硬件交互的方式,是连接硬件和操作系统之间的桥梁。

当前Windows CE有四种设备模型,其中本机设备驱动程序和流接口驱动程序模型是专用于Windows CE驱动程序的开发方法。另外,两种外部模型也可应用于其他操作系统,它们分别是通用串行总线(USB)和网络驱动器接口标准(NDIS)的驱动程序。

2.1 本机设备驱动程序

在开始开发本机设备驱动程序前,必须先了解哪些设备的驱动程序是采用本机设备驱动模型实现的。正如它的名字,本机设备驱动程序适用于集成到基于Windows CE平台的设备,如键盘、显示器、PC卡插槽等设备。本机设备驱动程序通常使用Windows CE提供的特定接口,而且都有明确和专一的目的。微软本身提供了很多本机设备驱动程序的样本程序,这样绝大多数的开发人员不需要编写本机设备驱动程序。除非是OEM开发商想为新平台定制Windows CE,那么他们就需要编写自己的本机设备驱动程序,当然可以将微软的本机设备驱动程序的例子直接移植到新平台上。

本机设备驱动程序分为两种类型:单片驱动程序和分层的驱动程序[5]。单片驱动程序的代码直接与硬件交互,因此它包含与特定的某款硬件相关联的代码。通常,单片驱动程序会暴露DDI接口给操作系统,DDI函数是操作系统与驱动程序交互的接口协议。而分层驱动程序由两个设置好的层组成:上层是模型设备驱动程序(MDD),下层是依赖平台的驱动程序(PDD)。MDD层与硬件平台无关,它通过驱动程序接口DDI与应用程序通信。

开发驱动程序时,一般不必修改MDD层。只需关心与具体硬件平台有关的下层,依赖平台的驱动程序层PDD。PDD层通过设备驱动服务接口DDSI直接管理硬件。通常,MDD层的代码与PDD层的代码会被编译成独立的静态LIB库,然后进行链接,形成可执行的驱动程序。因此,MDD和PDD的划分只是在源代码逻辑层面,在驱动程序的二进制可执行代码中不会存在MDD与PDD的分层。

2.2 流接口驱动程序

流接口驱动程序是为了连接到Windows CE平台的设备而设计的,如打印机、寻呼机、调制解调器等。它是动态链接库,由设备管理器动态加载、管理和卸载[8]。与具有单独目的接口的本机设备驱动程序相比,流接口驱动通过使用相同的接口,导出一组相同的函数即流接口函数。流接口函数也称作流接口驱动的入口点,用来完成标准的文件I/O函数和电源管理函数,这些函数是提供给Windows CE的操作系统内核使用的。流接口驱动的入口点主要包括 XXX[CD#*2]Init,XXX[CD#*2]Deinit,XXX[CD#*2]Open,XXX[CD#*2]Close,XXX[CD#*2]Read,XXX[CD#*2]Write,XXX[CD#*2]Seek,XXX[CD#*2]PowerUp,XXX[CD#*2]PowerDown和XXX[CD#*2]IOControl。其中,XXX是在驱动程序注册表里定义的设备文件名的前缀。在Windows CE中设备文件名通常由3个大写字母,1个数字和1个冒号组成。

流接口驱动对硬件设备的访问涉及五个部分[6]:应用程序、FileSys.exe、设备管理器、流式接口驱动程序本身以及硬件。其中,应用程序和流式接口驱动程序是由用户编写的;FileSys.exe与设备管理器是由Windows CE操作系统提供的组件,用户无法修改。

在应用程序使用文件API对设备进行访问时,文件API作系统转发到FileSys.exe进程中;然后FileSys.exe发现是对设备操作,就会把执行交给设备管理器处理;接着设备管理器根据具体的请求,调用不同流式接口驱动程序中提供的接口;最后驱动程序负责与硬件交互。

3 Windows CE驱动开发实例

这里以基于S3C2440A的I2C驱动程序为例,共同探讨Windows CE下驱动程序的开发。

I2C(Inter Integrated Circuit)总线是1980年Phi[CD*2]lips公司推出的。通过I2C两根引线:一根串行地址线(SDA)和一根串行时钟线(SCL),可使微控制器与外部设备之间进行串行通信或使主设备和从设备之间实现双向数据传送。I2C总线遵从同步串行传输协议,即各位串行发送,由时钟(clock)线指示读数据(data)线的时刻。每个数据包前有一个地址,以指示由哪个器件来接收该数据。

S3C2440A是三星公司推出的16/32位精简指令集微处理器,它是为应用于小型掌上设备和高性价比、低功耗、高性能的嵌入式系统而提供的微控制解决方案。S3C2440使用了ARM920T内核,芯片上提供的集成功能包括:分开的16 KB指令/数据缓存、SDRAM控制器、LCD控制器、4通道DMA、3通道UART、I2C总线、IIS总线、SD主机接口、PWM定时器、看门狗、片上PLL时钟发生器、8通道10位A/D控制器和触摸屏接口、摄像头接口以及带日历函数的实时时钟。S3C2440A最高频率可达533 MHz,且功耗只有毫瓦级[9]。

在多主I2C总线模式下,S3C2440A微处理器从设备接收串行数据或发送串行数据到从设备。主S3C2440A可以初始化或终止I2C总线上的数据传输。在S3C2440A中,I2C总线使用标准的总线仲裁过程。S3C2440A的I2C总线接口有4种模式[9]:主接收模式、主发送模式、从接收模式和从发送模式。为了控制多主I2C总线,必须对下面这几个寄存器进行读/写:I2C控制寄存器I2CCON,I2C控制/状态寄存器I2CSTATI2C、数据寄存器I2CDS,I2C地址寄存器I2CADD。

[BT3]3.1 编写流驱动程序

首先,需要在oalintr.h中添加I2C的中断号;然后在cfw.c中初始化I2C中断;接下来,编写I2C的驱动程序。这里采用Windows CE下的流接口驱动模型。在I2C[CD#*2]Init中需要把IOPORT registers,I2C Bus registers,CLK/PWR registers等寄存器的物理地址和虚拟地址绑定起来。同时配置I2C 总线控制器,使能I2C的Clock/Power controller。其中一些语句为:

然后,可实现I2C[CD#*2]Open,I2C[CD#*2]Read,I2C[CD#*2]Write,I2C[CD#*2]Close函数等,通过对各个寄存器进行操作,从而得到I2C总线读取和发送的数据。

完成编译之后,得到的DLL还不能作为流接口,还需要编写一个def文件,将它的接口函数导出。

[BT3]3.2 编写驱动程序注册表

一个具体的流接口驱动程序与注册表部分是不能分开的。在此,使用记事本编写注册表的内容如下:

[BT3]3.3 编写CEC文件

有了驱动程序和注册表文件,驱动程序还不能正常运行。因为它还没有被加入到CEC内核中。将一个文件添加到定制内核中的方法通常有两种:一种是修改BIB文件;另一种是编写一个CEC文件,并添加到PB中。将编写好的CEC文件导入到PB中后,重新进行Build,就可以生成包含该流接口的驱动程序。

4 结 语

在嵌入式技术飞速发展的今天,Windows CE必将有广泛的应用前景,这里编写高效的设备驱动程序也将带动设备的开发。