- 收藏
- 点赞
- 分享
- 举报
Windows CE下流驱动(AD驱动)设计与实现
驱动程序是连接操作系统和硬件的桥梁。文中作者主要讨论在Windows CE.Net 操作系统下,如何设计实现S3C2410芯片具有AD接口的驱动程序;详细介绍Windows CE.Net 下,流接口驱动程序的工作原理和编写方法,提供了具体驱动开发的AD实例以及如何将驱动编译进操作系统。该驱动设计简单,可供上层应用程序灵活调用。 关键字:Windows CE.Net; 流接口驱动; 设备驱动
0 引言
Windows CE.Net 是一个32位、多任务、多线程的完全抢占式的实时操作系统。它提供了众多强大工具适应于快速构建新一代内存少、体积小的智能设备,如工业控制器、手持式设备等。该系统的特点是专为各种具有严格资源限制的硬件系统所设计的。为了将操作系统和硬件设备连接起来,连接硬件和应用软件的驱动就非常重要。该论文主要针对SAMSUNG公司以ARM9为内核的S3C2410进行分析,介绍在Windows CE.Net 系统下进行底层设备流接口驱动的原理和开发方法并提供AD驱动程序的实例。
1 S3C2410芯片片上AD介绍
S3C2410 是一款基于ARM920T的16/32位RISC微处理器,拥有高性价比,低功耗等特点,也是目前市面上出现较多的嵌入式开发板的处理器之一,具有8路10位的A/D转换,S3C2410上的A/D转换器在2.5MHZ的时钟下,最大转化速率可达500KSPS,A/D转换器支持片上采样和保持功能。S3C2410微处理对AD转换进行的操作,主要是对下面的两个寄存器进行读/写:ADC 控制寄存器,ADCCON ;ADC 数据寄器,ADCDAT0。
2 流接口驱动
Windows CE.Net 支持四种驱动模型:本地驱动、流驱动、USB、NDIS[1]。本文只针对流驱动进行介绍。
2.1 流接口驱动体系结构
流驱动将设备抽象为文件进行操作,它体系结构如图1所示。应用程序使用文件API对设备进行访问,文件API被操作系统转发到FileSys.exe进程中;然后FileSys.exe发现是对设备进行操作,就会把执行交给设备管理器;接着设备管理器根据具体的请求,调用不同的流接口驱动程序中暴露的接口;最终驱动程序负责与硬件交互[2-3]。
图1流接口驱动的体系结构
2.2 流接口函数
流接口驱动程序是动态连接库,由设备管理程序的特殊程序加载、管理和卸载,与具有单独目的接口的内部驱动程序相比,流接口驱动程序使用同一个接口并调用同一个函数集-流接口函数[4]。Windows CE.Net 系统规定流接口的入口点如表1,对应着直接或者间接调用流接口函数的系统组件或文件API函数。生成一个DLL后,就用设备文件名前缀替换入口点名字中的XXX。
表1 流接口入口函数
流接口函数 功能描述 调用流接口对象
XXX_Init() 初始化设备 系统设备管理器
XXX_Denit() 卸载设备 系统设备管理器
XXX_Open() 打开设备进行读写操作 文件API函数CreateFile()
XXX_Close() 关闭设备 文件API函数CloseHandle()
XXX_Read() 读取设备数据 文件API函数ReadFile()
XXX_Write() 向设备写数据 文件API函数WriteFile()
XXX_IOControl() 对设备进行各种操作 文件API函数DeviceIOControl()
XXX_Seek() 移动设备数据的指针位置 文件API函数SetFilePointer()
XXX_PowerDown() 使设备休眠 系统电源管理器
XXX_PowerUp() 恢复设备电源 系统电源管理器
2.3 流接口驱动工作原理
在流驱动工作原理中需要包括几个重要的工作实体:硬件、流接口驱动驱动程序、系统注册表、设备管理器、应用程序。整个驱动程序工作原理如图2所示。
流驱动的工作顺序如下:1)加载驱动。在当系统启动时,设备管理器搜寻注册表的HKEY_LOCAL_MACHINE\Driver\BuiltIn键下面的子键,并逐一加载子键下的每个驱动,此过程叫BusEnum。2)设备管理器从注册表的dll键值中获取驱动程序所在的DLL文件名。3)设备管理器调用LoadDriver()函数把DLL加载到自己的虚拟地址空间内。4)设备管理器在注册表的HKEY_LOCAL_MACHINE\Driver\Active下面,记录所有已经加载的驱动程序[2]。5)设备管理器调用驱动中的XXX_Init()函数。6)在XXX_Init()中,通常对硬件进行一些基本的初始化操作。通过以上6步,流接口驱动被成功加载。7)应用程序使用该设备。首先它调用CreateFile()打开设备。CreateFile()是在FileSys.exe中实现的。但是FileSys.exe只作简单判断,如果发现打开的设备驱动程序而不是一个文件,那么就重新把主动权交还给设备管理器。8)设备管理器调用驱动程序中的XXX_Open()函数打开设备。在XXX_Open()中,驱动程序可能会对硬件进行一些额外的初始化工作,使硬件进入工作状态。9)XXX_Open()函数把打开设备的结果返回给设备管理器。10)设备管理器把XXX_Open()返回的结果,再返回给应用程序的CreateFile()函数调用。通过7-10步,设备已被成功打开,至此就可以对设备进行读写和控制操作。11)应用程序使用第7步CreateFile()函数返回的句柄作为 ReadFile() / WriteFile()的第一个参数,向设备发送读请求。同样ReadFile() / WriteFile()要经过FileSys.exe转发给设备管理器。12)设备管理器调用驱动程序中的XXX_Read() / XXX_Write() 函数,读取设备的数据信息或向设备写信息。13)在流驱动程序中,XXX_Read() / XXX_Write() 函数可与硬件交互,从硬件中读取必要的信息或向硬件写必要的信息。然后返回给设备管理器,再返回给应用程序。
当应用程序不再使用该设备时,它可调用CloseHandle()将设备关闭。当系统不再使用设备时,应用程序可调用DeactivateDevice()函数把该驱动程序卸载。
图2 流驱动工作原理顺序图
3 AD驱动的实现
AD驱动程序以动态链接库方式编写,采用流接口驱动的标准形式。在ADC_ Init函数中,主要进行初始化。函数ADC_Open 只需要返回一个不为0的值来判断打开设备成功。在函数 ADC_Write 中通过写入要选择的通道号和预分频值,它控制通道的动作。函数 ADC_Read 中的代码最为关键,它完成读取模拟量向数字量的转换结果,其部分主要代码如下:
pADCIOreg->rADCCON = (1<<14)|(ADCPRS<<6)|(ch<<3); //建立通道号
pADCIOreg->rADCCON |= 0x1; // 开始转换
while(pADCIOreg->rADCCON & 0x1); //检测开始位是否为低电平
while(!(pADCIOreg->rADCCON & 0x8000)); //检测转换是否完毕标志位
return ( (double)(pADCIOreg->rADCDAT0 & 0x3ff) ); //返回转换完的数值
其中 ch 表示采样通道号, ADCPRS为预分频值。其它函数均为空。
4 ADC驱动封装及其在Windows CE.Net中的添加www.51kaifa.com
通过以上的工作,编译出一个 DLL 函数,接着建立一个自己的 def 文件,导出所需要的流接口函数。新建一个记事本文件,命名为 AdcDriver.Def :
LIBRARY AdcDriver
EXPORTS
ADC_Init
ADC_Open
ADC_Readwww.51kaifa.com
ADC_Write
ADC_Close
ADC_Deinit
然后编写一个注册表文件, 命名为AdcDriver.reg :
[HKEY_LOCAL_MACHINE\ Drivers\ BuiltIn\ ADC]
"Index" = dword :1
"Prefix" = "ADC"
"Dll" = "AdcDriver.dll"
"Order" = dword :0
最后在 Platform Builder中新建一个 CEC 文件,首先添加一个BuildMethod ,它的任务是复制注册表到 Windows CE.Net 的系统目录下面。然后再添加一个 Bib File,其主要任务是把编译的 AdcDriver.dll 文件添加到 Windows CE.Net 内核中去。保存写好的CEC文件。在Platform Builder 中 , 打开“File”菜单,添加已经编写好的 CEC 特征到系统选项中去。生成系统的时候, 添加 CEC 特性,这样驱动就加入到操作系统里了。
5 结速语
文中作者分析了 Windows CE.Net 的流接口驱动的工作原理顺序,设计实现了Windows CE.Net下的AD驱动,并通过Platform builder将其编译到操作系统。而本系统再配上 EVC 开发的图形界面软件,可以开发出各种使用的设备,如移动数据采集器等,在现代化检测领域有很强的实用性。本文作者创新点:分析了Windows CE.Net下流驱动的执行顺序以及上层文件API如何调用流驱动,并给出将编写的驱动加入到操作系统的详细步骤,该驱动设计简单,应用程序可以灵活调用
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
-
2008-11-02 17:14:58
-
2012-12-04 13:33:30
-
2012-12-05 10:58:49
-
2012-12-04 13:36:34
-
2008-08-23 16:12:03
-
2012-12-04 13:22:32
-
2012-12-05 14:32:53
-
2012-12-05 11:12:01
-
2012-12-05 11:13:14
-
2017-05-17 12:46:27
-
2010-06-01 23:29:28
-
2012-12-05 14:27:39
-
2008-08-18 22:21:13
-
2010-06-01 23:25:04
-
2012-12-05 13:33:42
-
2012-12-05 11:07:55
-
2008-05-27 11:09:53
-
2009-11-05 22:09:02
-
2010-05-22 07:47:49
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明