当前位置:首页 > 嵌入式 > 嵌入式软件
[导读] 1、基础知识:1)系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件细节,在应用程序看来

 1、基础知识:

1)系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件细节,在应用程序看来硬件只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。设备驱动是内核的一部分。

2)驱动程序完成以下功能:

——对设备初始化和释放;

——把数据从内核传送到硬件和从硬件读取数据;

——读取应用程序传送给设备文件的数据和回送应用程序请求的数据;

——检测和处理设备出现的错误。

3)上层应用程序运行在用户模式(非特权模式,Ring 3),代码被严格约束执行。如不能执行硬件IO指令。所有的这些被阻止的操作如果想运行必须通过陷阱门来请求操作系统内核。

4)操作系统内核运行在内核模式(特权模式,Ring 0),可以执行所有有效的CPU指令。包括IO操作,可访问任何内存区。

5)整个硬件系统资源在驱动程序面前是赤裸裸的,驱动可以使用所有系统资源,编写驱动程序时我们必须格外小心驱动代码的边界条件,确保它们不会损坏整个操作系统。

2、Windows支持的驱动:

1)虚拟设备驱动程序(Virtual Device Driver):Windows3.1(Windows95/98/Me)

2)内核模式驱动程序(Kernel Mode Driver):Windows NT

3)Win32驱动程序模型(Win32 Driver Mode):从Windows98开始使用。

其中WDM是目前主流,然而在WinCE系统中,由于硬件资源有限和嵌入式系统的特点,对其的支持非常有限。

3、WinCE系统驱动简介:

1)WinCE毕竟是一个嵌入式系统,有其自身的特殊性,为了提高运行效率,所有驱动皆为动态链接库,驱动实现中可以调用所有标准的API。而在其他Windows系统中可能的驱动文件还有.vxd, .sys和动态链接库。

2)WinCE驱动从结构上讲分为本地驱动(Native Driver)和流接口驱动(Stream Driver)。

——本地驱动主要用于低级、内置的设备。实现它们的接口并不统一,而是针对不同类型的设备相应设计。因此开发过程相对复杂,没有固定的模式,一般做法是通过移植、定制现有的驱动样例来实现。

——流接口驱动是最基本的一种驱动结构,它的接口是一组固定的流接口函数,具有很高的通用性,WinCE的所有驱动程序都可以通过这种方式来实现。流接口驱动程序通过文件系统调用从设备管理器和应用程序接收命令。该驱动程序封装了将这些命令转换为它所控制的设备上的适当操作所需的全部信息。

流接口驱动是动态链接库,由一个叫做设备管理程序的特殊应用程序加载、管理和卸载。与本地驱动程序相比,所有流接口驱动程序使用同一组接口函数集,包括实现函数:XXX_Init、XXX_Deinit、XXX_Open、XXX_Close、XXX_Read、XXX_Write、XXX_PowerUp、XXX_PowerDown、XXX_Seek、XXX_IOControl,这些函数与硬件打交道。用户函数:CreateFile、DeviceIoControl、 ReadFile、 WriteFile,这些函数方便用户使用驱动程序。

3)WinCE下驱动的加载方式:

——通过GWES(Graphics, Windowing, and Events Subsystem):主要加载与显示和输入有关的驱动,如鼠标、键盘驱动等。这些驱动一般为本地驱动。

——通过设备管理器:两种结构的驱动都加载,加载的本地驱动主要由PCMCIA Host Controller,USB Host Controller driver,主要是总线类的驱动;流接口驱动主要有音频驱动,串并口驱动。

——动态加载:前两者都是系统启动时加载的,动态加载则允许设备挂载上系统时将驱动调入内核,主要有外接板卡驱动,USB设备驱动等。

4、流接口驱动函数介绍:

1)DWORD XXX_Init(LPCTSTR pContext, LPCVOID lpvBusContext);

pContext:指向一个字符串,包含注册表中该流接口活动键值的路径

lpvBusContext:

该函数是驱动挂载后第一个被执行的。主要负责完成对设备的初始化操作和驱动的安全性检查。由ActiveDeviceEx通过设备管理器调用。其返回值一般是一个数据结构指针,作为函数参数传递给其他流接口函数。

2)BOOL XXX_Deinit(DWORD hDeviceContext);

hDeviceContext:XXX_Init的返回值。

整个驱动中最后执行。用来停止和卸载设备。由DeactivateDevice触发设备管理器调用。成功返回TRUE。

3)DWORD XXX_Open(DWORD hDeviceContext, DWORD AccessCode , DWORD ShareMode);

hDeviceContext:XXX_Init的返回值。

AccessCode:访问模式标志,读、写或其他。

ShareMode:驱动的共享方式标志。

打开设备,为后面的操作初始化数据就够,准备相应的资源。应用程序通过CreateFile函数间接调用之。返回一个结构指针,用于区分哪个应用程序调用了驱动,这个值还作为参数传递给其他接口函数XXX_Read、XXX_Write、XXX_Seek、XXX_IOControl。

4)BOOL XXX_Close(DWORD hOpenContext);

hOpenContext:XXX_Open返回值。

关闭设备,释放资源。由CloseHandle函数间接调用。

5)DWORD XXX_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count);

hOpenContext:XXX_Open返回值。

pBuffer:缓冲区指针,接收数据。

Count:缓冲区长度。

由ReadFile函数间接调用,用来读取设备上的数据。返回读取的实际数据字节数。

6)DWORD XXX_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD Count);

hOpenContext:XXX_Open返回值。

pBuffer:缓冲区指针,接收数据。

Count:缓冲区长度。

由WriteFile函数间接调用,把数据写到设备上,返回实际写入的数据数。

7)BOOL XXX_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut);

hOpenContext:XXX_Open返回值。

dwCode:控制命令字。

pdwActualOut:实际输出数据长度。

用于向设备发送命令,应用程序通过DeviceIoControl调用来实现该功能。要调用这个接口还需要在应用层和驱动之间建立一套相同的命令,通过宏定义CTL_CODE(DeviceType, Function, Method, Access来实现。如:[!--empirenews.page--]

#define IOCTL_INIT_PORTS \ CTL_CODE(FILE_DEVICE_UNKNOWN,0X801,METHOD_BUFFERED,FILE_ANY_ACCESS)

8)void XXX_PowerDown(DWORD hDeviceContext);

hDeviceContext:XXX_Init的返回值。

负责设备的上电控制。

9)void XXX_PowerUp(DWORD hDeviceContext);

hDeviceContext:XXX_Init的返回值。

负责设备的断电控制

10) DWORD IOC_Seek(DWORD hOpenContext, long Amount, WORD Type)

hOpenContext:XXX_Open返回值。

Amount:指针的偏移量。

Type:指针的偏移方式。

将设备的数据指针指向特定的位置,应用程序通过SetFilePointer函数间接调用。不是所有设备的属性上都支持这项功能。

5、流接口驱动的加载和注册表设置:

系统启动时启动设备管理程序,设备管理程序读取HKEY_LOCAL_MACHINE\Drivers\BuiltIn键的内容并加载已列出的流接口驱动程序。因此注册表对于驱动的加载有着关键作用。下面是一个例子:

【HKEY_LOCAL_MACHINE\Drivers\BuiltI\IOControler】

“Prefix”=”XXX”

“Dll”=”drivername.dll”

其中,“Prefix”=“XXX”中的XXX要和XXX_Init等函数中的一样。CreateFile创建的驱动名前缀也必须和它们一致。

6、驱动程序的编写、编译及其相关目录、配置文件的格式和修改:

1)首先必须在PB相应平台的的driver目录下建立要创建的驱动所在的目录。如在x:\Wince420\platform\smdk2410\drivers目录下建立一个IOCtrol目录。

2)修改Drivers目录下的dirs文件。

3)创建驱动源文件XXX.c,在该文件中实现上述流接口函数。并且加入DLL入口函数:

BOOL DllEntry(HINSTANCE hinstDll, /*@parm Instance pointer. */

DWORD dwReason, /*@parm Reason routine is called. */

LPVOID lpReserved /*@parm system parameter. */

)

4)创建Makefile和Sources和.def文件,控制编译。

5)使用CEC Editor修改cec文件,编译添加的新特性。

6)复制新生成的4个文件到Release目录下,修改注册表文件platform.reg和platform.bib文件。

7)Make Image。

8)DownLoad Image。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

百强品牌总价值连续三年突破万亿美元大关,腾讯、阿里和茅台蝉联前三甲 上海2023年9月8日 /美通社/ -- 今日,2023凯度BrandZ中国品牌盛典以“品牌升维 · 行稳致远&r...

关键字: AN MDASH CE 人工智能

(全球TMT2023年8月24日讯)第三十届北京国际广播电影电视展览会(BIRTV2023)正在北京如火如荼地进行中。在展会上,成都索贝数码科技股份有限公司与深圳市洲明科技股份有限公司宣布签署战略合作协议,双方将携手布...

关键字: 模型 TV 编写 网络视频

妇科大咖云集 共话日间诊疗新模式 北京2023年3月7日 /美通社/ -- 为进一步推广由郎景和院士牵头,朱兰教授等我国多位著名妇科医学专家共同编著《日间宫腔镜手术中心设置及管理流程中国专家共识》,普及日间宫腔镜诊疗理...

关键字: 东风 内窥镜 编写 调试

创新生态,韧性增长,共探食品行业新发展 上海2022年12月19日 /美通社/ -- 12月18日,第十一届“中国食品健康七星奖”(下称“七星奖”)颁奖典礼在上...

关键字: RSQUO 可持续发展 BSP MDASH

北京2022年12月16日 /美通社/ -- 近日,受工业和信息化部节能与综合利用司委托,中汽数据有限公司(简称“中汽数据”)正式公布“2022年汽车行业绿色发展指数(GDI...

关键字: 宝马 供应链 MDASH BSP

广州2022年12月5日 /美通社/ -- 近日,国际独立第三方检测、检验和认证机构德国莱茵TUV大中华区(以下简称“TUV莱茵”)成功举办“质胜...

关键字: 汽车产业 MDASH 汽车工业 汽车行业

南京2022年11月28日 /美通社/ -- 11月23日上午,南京市雨花台区政府副区长郑婕携区科技局、投促局、软件谷管委会相关领导一行四人调研南京灵越信息技术有限公司。 灵越科技门头&灵验喵IP的展...

关键字: CE 信息技术 软件 MDASH

上海2022年11月1日 /美通社/ -- 近日,由上海勃林格殷格翰药业有限公司与华东理工大学药学院合作编写的高等学校通识课精品教材《质量文化导论》正式出版发行。这也是国内首门质量文化课程配套教材。该书的出版有望助力全国...

关键字: 内核 编写

一星期中最糟糕的一天,这居然也成功拿下了吉尼斯记录。10月17日,吉尼斯世界纪录官微发文称,正式认证星期一为一个周里最糟糕的一天,周五是最伟大的一天。看起来有点官微小编搞怪的意思,毕竟尚未见到正式的证书。当然,一些打工人...

关键字: MIDDOT MDASH GUI WORLD

10月17日,Honda的飞机事业子公司——Honda Aircraft Company(以下简称:HACI)在2022年美国公务航空大会暨展览会上,发布超轻型公务机HondaJet的升级版机型&...

关键字: 本田 飞机 ELITE MDASH
关闭
关闭