基于S3C2440的Windows CE设备驱动的研究与实践

时间:2022-09-03 02:50:12

基于S3C2440的Windows CE设备驱动的研究与实践

摘 要:随着信息化、智能化、网络化的发展,嵌入式技术已经成为通信和消费类产品的共同发展方向。简要介绍嵌入式操作系统Windows CE,同时对Windows CE下两种基本的驱动开发模型本机设备驱动程序和流接口驱动程序进行重点说明。在了解两种模型的基础上,以基于S3C2440处理器的UART0驱动程序开发为例,详细介绍嵌入式操作系统Windows CE下流接口设备驱动开发的具体过程。

关键词:嵌入式操作系统;Windows CE;设备驱动开发;UART0

中图分类号:TP311 文献标识码:B

文章编号:1004-373X(2008)06-153-03

Research and Practice of Device Driver of Windows CE Based on S3C2440

SUN Ting,TIAN Ze,YAN Xiaoying

(School of Computer Science,Xi′an Shiyou University,Xi′an,710065,China)

Abstract:With the development of information,intelligence and network,embedded technology has became common direction of communication and consumption products.This paper simply introduces embedded operating system Windows CE,at the same time especially explains two basal driver model of native and stream interface device drivers under the Windows CE.With this understanding,it takes the driver development of UART0 which is based on processor of S3C2440 as an example,introduces the development process of stream interface device driver for embedded Windows CE in details.

Keywords:embedded OS;Windows CE;device driver development;UART0

1 引 言

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

2 Windows CE简介

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

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

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

(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中,网络通信模块是最为独立的一部分,他运行时体现为一系列的动态链接库。其设计目标主要体现在4点:

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

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

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

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

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

3 Windows CE驱动开发模型

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

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

3.1 本机设备驱动程序

在开始本机设备驱动程序开发前,必须先了解哪些设备的驱动程序用本机设备驱动模型实现。正如他的名字,本机设备驱动程序适用于集成到基于Windows CE平台的设备。如键盘、显示器、PC卡插槽等设备的驱动。本机设备驱动程序通常使用Windows CE提供的特定接口,因此本机设备驱动程序都有明确和专一的目的。微软本身提供了很多本机设备驱动程序的样本程序,这样绝大多数的开发人员不需要编写本机设备驱动程序。除非是OEM开发商想为新平台定制Windows CE ,那么他们就可以编写自己的本机设备驱动程序,当然他们也可以将微软的本机设备驱动程序的例子直接移植到新平台上。本机设备驱动程序分为2种类型:单片驱动程序和分层的驱动程序\[3\],如图1所示。单片驱动程序的代码直接与硬件交互,因此他包含与特定的某款硬件相关联的代码。通常,单片驱动程序会暴露DDI接口给操作系统,DDI函数是操作系统与驱动程序交互的接口协议。而分层驱动程序由2个设置好的层组成:上层是模型设备驱动程序(MDD),下层是依赖平台的驱动程序(PDD)。MDD层与硬件平台无关,他通过驱动程序接口DDI与应用程序通信。在开发驱动程序时,一般不必修改MDD层。只需关心与具体硬件平台有关的下层,依赖平台的驱动程序层PDD。PDD层通过设备驱动服务接口DDSI直接管理硬件。通常,MDD层的代码与PDD层的代码会被编译成独立的静态LIB库,然后进行链接,形成可执行的驱动程序。因此,MDD和PDD的划分只是在源代码逻辑层面,在驱动程序的二进制可执行代码中不会存在MDD与PDD的分层。

3.2 流接口驱动程序

流接口驱动程序是为了连接到Windows CE的平台的设备设计的,如打印机、寻呼机、调制解调器等。他是动态链接库,由设备管理器动态加载、管理和卸载。与具有单独目的接口的本机设备驱动程序相比,流接口驱动都使用相同的接口导出一组相同的函数[CD2]流接口函数。流接口函数也称作流接口驱动的入口点,用来完成标准的文件I/O函数和电源管理函数,这些函数是提供给Windows CE的操作系统内核使用的。流接口驱动的入口点主要包括 XXX_Init,XXX_Deinit,XXX_Open,XXX_Close,XXX_Read,XXX_Write,XXX_Seek,XXX_PowerUp,XXX_PowerDown和XXX_IOControl,其中XXX是在驱动程序注册表里定义的设备文件名的前缀。在Windows CE中设备文件名是由3个大写字母、1个数字和1个冒号组成的。

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

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

4 Windows CE驱动开发实例

下面以UART0驱动程序为例,具体介绍驱动程序的开发。

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

S3C2440 UART提供3个独立的异步串行I/O口,每1个口均可以工作在中断或DMA模式下。也就是说UART通过产生1个中断或DMA请求来在CPU和UART之前传输数据。

每个UART通道包括2个用于接收和传输的16 B的FIFOs。

首先需要在oalintr.h中添加UART的中断号,然后在cfw.c中初始化UART中断。接下来修改BSP中带有的UART的驱动程序,实现相应的功能即可。

(1) 注册中断

首先需要在oalintr.h中添加UART的中断号,然后在cfw.c中初始化UART中断。最后在armint.c的实现物理中断与逻辑中断的关联。

① 在platform\\smdk2440\\inc\\Oalintr.h文件中添加:

#define SYSINTR_UART0(SYSINTR_FIRMWARE+3)

在platform\\smdk2440\\inc\\Oalintr.inc添加:

SYSINTR_UART0:.equ SYSINTR_FIRMWARE+3

② 修改cfw.c文件

case SYSINTR_UART0: // Serial port.

s2440INT->rSUBSRCPND = (INTSUB_RXD0 | INTSUB_TXD0 | INTSUB_ERR0);

s2440INT->rINTSUBMSK &= ~INTSUB_RXD0;

s2440INT->rINTSUBMSK &= ~INTSUB_TXD0;

s2440INT->rINTSUBMSK &= ~INTSUB_ERR0;

s2440INT->rSRCPND = BIT_UART0;

if (s2440INT->rINTPND & BIT_UART0) s2440INT->rINTPND = BIT_UART0;

s2440INT->rINTMSK &= ~BIT_UART0;

break;

(2) 在smdk2440\\drivers下创建UART0文件夹,将drivers\\serial中的文件复制一份到这个文件夹中。并把ser2440.def、ser2440_hw.c、ser2440_ser依次改为UART0.def、UART0_hw.c、UART0_ser,同时修改drivers\\dirs文件,添加UART0即可。

(3) 完成.def文件、source文件和platform.reg的修改

① .def文件修改如下:

将LIBRARY ser2440分别改为LIBRARY UART0。

② source文件修改如下:

将TARGETNAME=ser2440改为TARGETNAME=UART0。

将SOURCES=

ser2440_ser.c

ser2440_hw.c

修改为:

SOURCES=

UART0_ser.c

UART0_hw.c

③ smdk2440\\files\\platform.reg修改

将注册表中原有的关于ser2440的部分替换为UART0即可。

(4) 修改bib文件

有了驱动程序和注册表文件,驱动程序还不能够正确地运行。因为他还没有被加入到内核中。添加一个文件到定制的内核中的方法有2种:一种是修改BIB文件,另一种是编写一个CEC文件添加到PB中。这里选择bib 文件。在smdk2440\\files\\platform.bib中IF BSP_NOSERIAL !和ENDIF BSP_NOSERIAL !之间添加:

UART0.Dll(_FLATRELEASEDIR)\\UART0.Dll NK SH

并注释掉:

;irsir.dll (_FLATRELEASEDIR)\\irsir.dll NK SH

;irda2440.dll (_FLATRELEASEDIR)\\ser2440.dll NK SH

;ser2440.dll (_FLATRELEASEDIR)\\ser2440.dll NK SH

完成以上修改后rebuild就可以实现UART0的驱动,然后下载内核到目标板利用串口调试程序测试。

5 结 语

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

参考文献

[1]陈向群,王雷.Windows 系统分析及实验教程[M].北京:机械工业出版社,2003.

[2]Microsoft.Microsoft Windows CE Device Driver Kit[ M].希望电脑公司,译.北京:希望电子出版社,2000.

[3]周毓林,宁杨,陆贵强,等.Windows 内核定制及应用开发[M].北京:电子工业出版社,2005.

[4]何宗键.Windows CE嵌入式系统[M].北京:北京航空航天大学出版社,2006.

[5]SUMSUNG S3C2440A用户手册\[Z\].

上一篇:实现任意系数求和运算电路的设计 下一篇:基于TH7122.1芯片的无线数据传输模块设计