摘要:本文利用工具Platform. Builder、以ADC驱动程序为例,探讨Windows CE.net下的驱动程序开发,以及向平台添加ADC驱动的方法并通过一个简单的应用程序来查看ADC驱动调用结果。
1 前言
Windows CE 是为各种嵌入式系统和产品设计的一种压缩的、高效的、可升级的操作系统。多线性、多任务、全优先的操作系统环境是专门针对资源有限而设计的,它的模块化设计使嵌入式系统开发者和应用者能够将其应用于各种产品,例如家用电器、专门的工业控制和嵌入式通信设备等。Windows CE 支持各种硬件外围设备及网络系统,应用领域极为广阔,是微软专门为信息设备、移动通讯、电子产品、嵌入式应用等非 PC 领域而专门设计的一种战略性操作系统产品。
2 Samsung ARM 系列S3C2410 处理器
S3C2410 是Samsung 公司推出的基于ARM920T 核的32 位RISC 微处理器芯片。S3C2410具有低功耗、低成本和高性能的特点,已成为PDA、智能手机、网络计算机终端以及智能设备的终端产品等的热门解决方案之一。
S3C2410 内部资源丰富、结构复杂、接口众多,具有相互独立的16kB 指令缓存和16kB数据缓存,带有MMU 虚拟存储单元和AMBA 总线接口。S3C2410 支持的内外围设备包括外部存储控制器、中断控制器、LCD 控制器、8 通道10bit 的ADC 和触摸屏控制器、SD/MMC 卡控制器、4 通道DMA、4 通道具有PW 入1 功能的定时器、具有日历功能的实时时钟、看门狗定时器、3 通道UART(包含IRDA 红外线数据通讯口)、USB 主机/设备接口、I2C 总线接口、IIS 数字音频总线接口、2 通道SPI 总线接口、通用I/O 端口以及具有锁相环功能片上时钟发生器等。同时,也可以根据需要进行功能扩展从而支持以太网接口、PCMCIA接口以及IDE 接口等。
3 Windows CE.net 下的驱动程序
目前基于 Windows CE.net 的两种模型是本机设备驱动程序和流接口驱动程序。本机设备驱动程序用于低级、内置设备,提供一组定制的接口可通过移植、定制微软提供的驱动样例来实现。流接口驱动程序实现一组固定的流接口函数,所有的CE 设备皆可使用此模型实现。开发工具Platform. Builder 中包含的样本设备驱动程序分为两种:单片驱动程序和分层的驱动程序如图1 所示。单片驱动程序基于单个码片,该码片直接把硬件设备的功能传递给操作系统。与弹片驱动程序相比,分层驱动程序由两个设置好的层组成,上层是模型设备驱动程序(Model Device Driver,MDD),下层是依赖平台的驱动程序(Platform. Dependent Driver,PDD)。大多数的样本设备驱动程序都配置成分层的。
分层驱动程序要利用微软提供的与应用程序通信的上层,这是一个与硬件平台无关的上层,称为模块驱动程序层MDD(Model Device Driver),MDD 层通过设备驱动程序接口DDI(Device Driver Interface)与应用程序通信,开发驱动程序通常不修改MDD 层,主要关心与具体硬件相关的下层,依赖平台的设备驱动程序层PDD(Platform. Dependent Driver),PDD层通过设备驱动服务接口DDSI(Device Driver Service Interface)直接管理硬件。单片驱动程序所驱动的设备通常与微软提供的应用程序没有直接的关系,如LCD 背光条开关的驱动。通常要求单片驱动程序提供一个特定DDI 接口如上层应用通信,通过编写相应的动态链接库DDL 实现这个功能。
4 基于 Windows CE 的流驱动程序的实现
4.1 选择代表设备的文件名前缀
设备前缀名在系统中必须,并且文件前缀名必须是 3 个字母,若有多个同类设备,则通过后缀1 个阿拉伯数字区分,例如COM1、LPT3 等等。文件前缀名将会在驱动的标准接口函数中体现,比如XXX_Init、XXX_Close 等,其中的“XXX”即是我们选择的设备的文件名前缀。
4.2 实现驱动的各个标准接口函数
需要实现的函数在前文已经论述,现在只需按照其功能编写具体的代码。下面给出ADC_Init、ADC_Read、ADC_Write 部分程序代码。
4.3 导出接口函数集
流驱动一般以 DLL 形式存在,与在windows 98/2000/XP 系统下用VC++开发DLL 工程一样,如果我们愿意把DLL 中的某些函数暴露给应用程序或者操作系统调用,就需要将这些函数导出,否则外部程序将不能调用 DLL 中的函数。DEF 文件定义了DLL 需要导出的接口函数集,且名称与设备驱动名称相同[DEF 示例文件]
LIBRARY ADC
EXPORTS
ADC_Open
ADC_Close
ADC_Init
ADC_Deinit
ADC_Read
ADC_Write
本示例表明从 ADC.dll 中导出ADC_Init 等函数,其中 ADC 即为我们选择的代表设备的文件名前缀,DLLEntry 是驱动程序的入口函数。
4.4 在注册表中增加驱动项
注册表是一个庞大的数据库,它记录了用户安装在机器上的软件和每个程序的相互关联信息;它包含了计算机的硬件配置,包括自动配置的即插即用的设备和已有的各种设备说明、状态属性以及各种状态信息和数据。在 Windows 系统中,很多驱动都要通过设备管理器来查询注册表,再根据注册表项来加载驱动程序,所以必须在注册表中增加相应的驱动项。假定ADC.dll 为驱动程序,通常,注册项位于注册表的Root Key 下,一般为[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\ADC]。其中 ADC 是为我们驱动程序而添加的。我们需要在 ADC下建立必要的子键和键值,“Prefix”和“DLL”是2 个重要而且必须的键,分别描述了设备前缀名和驱动程序的动态连接库名。如果还有需要的话,可以建立驱动程序需要的其子他键。
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\ADC]
"Index"=dword:1
"Prefix"="ADC"
"DLL"="ADC.dll"
"Order"=dword:0
"Irq"=dword:2
4.5 修改.BIB 文件
要想驱动的动态链接库加入 Windows CE 系统中,还必须修改Windows CE 二进制映像生成的文件platform.bib。在platform.bib 文件中加入:ADC.dll $(_ FLATRELEASEDIR) \ ADC.dll NK SH
5 驱动编译、加载和调用
增加两个文件 makefile (定义了编译规则)和sources(使用的头文件,自定义函数库,系统函数库等),重新编译Windows CE, ADC 驱动程序即可加载进操作系统。把编译好的 WindowsCE 镜像NK.bin 到博创嵌入式开发平台(S3C2410 处理器),使用PB 的模块查看器,可以看到驱动程序adc.dll 已经被成功加载, 如图2 所示。
搭建一个简单的电路,对S3C2410 处理器第六路ADC 输入一个电压信号,运行ADC_EXE。根据应用程序的运行结果,可以发现ADC.dll 被成功调用。以下是截取的是不同输入电压时的转换结果,如图3 所示。
6 结束语
通过本文介绍、分析Windows CE 下ADC 驱动程序的开发, 读者可以对Windows CE 的驱动程序的结构、编写以及实际应用能有一定的了解。本文作者创新点:在Windows CE.net系统下进行底层设备驱动开发,采用流接口的方式,实现了三星公司ARM9 内核的芯片S3C2410 ADC 驱动程序。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。