以文本方式查看主题 - 曙海教育集团论坛 (http://sun4.cn/bbs/index.asp) -- WinCE系统定制与驱动开发 (http://sun4.cn/bbs/list.asp?boardid=36) ---- wince6.0驱动开发 (http://sun4.cn/bbs/dispbbs.asp?boardid=36&id=1826) |
-- 作者:wangxinxin -- 发布时间:2010-11-26 11:14:16 -- wince6.0驱动开发 1、基础知识: 1)系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接 口。设备驱动程序为应用程序屏蔽了硬件细节,在应用程序看来硬件只是一个设备文件,应用程序可以 像操作普通文件一样对硬件设备进行操作。设备驱动是内核的一部分。 2)驱动程序完成以下功能: 3)上层应用程序运行在用户模式(非特权模式,Ring 3),代码被严格约束执行。如不能执行硬件IO指 令。所有的这些被阻止的操作如果想运行必须通过陷阱门来请求操作系统内核。 4)操作系统内核运行在内核模式(特权模式,Ring 0),可以执行所有有效的CPU指令。包括IO操作, 可访问任何内存区。 5)整个硬件系统资源在驱动程序面前是赤裸裸的,驱动可以使用所有系统资源,编写驱动程序时我们必 须格外小心驱动代码的边界条件,确保它们不会损坏整个操作系统。 2、Windows支持的驱动: 限。 3、WinCE系统驱动简介: 1)WinCE毕竟是一个嵌入式系统,有其自身的特殊性,为了提高运行效率,所有驱动皆为动态链接库, 驱动实现中可以调用所有标准的API。而在其他Windows系统中可能的驱动文件还有.vxd, .sys和动态链 接库。 ——本地驱动主要用于低级、内置的设备。实现它们的接口并不统一,而是针对不同类型的设备相应设 计。因此开发过程相对复杂,没有固定的模式,一般做法是通过移植、定制现有的驱动样例来实现。 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):主要加载与显示和输入有关的驱动, 如鼠标、键盘驱动等。这些驱动一般为本地驱动。 Host Controller driver,主要是总线类的驱动;流接口驱动主要有音频驱动,串并口驱动。 要有外接板卡驱动,USB设备驱动等。 4、流接口驱动函数介绍: ActiveDeviceEx通过设备管理器调用。其返回值一般是一个数据结构指针,作为函数参数传递给其他流 接口函数。 2)BOOL XXX_Deinit(DWORD hDeviceContext); 。 打开设备,为后面的操作初始化数据就够,准备相应的资源。应用程序通过CreateFile函数间接调用之 。返回一个结构指针,用于区分哪个应用程序调用了驱动,这个值还作为参数传递给其他接口函数 XXX_Read、XXX_Write、XXX_Seek、XXX_IOControl。 4)BOOL XXX_Close(DWORD hOpenContext);
7)BOOL XXX_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut); 用于向设备发送命令,应用程序通过DeviceIoControl调用来实现该功能。要调用这个接口还需要在应用 层和驱动之间建立一套相同的命令,通过宏定义CTL_CODE(DeviceType, Function, Method, Access来实 现。如: #define IOCTL_INIT_PORTS \\ CTL_CODE (FILE_DEVICE_UNKNOWN,0X801,METHOD_BUFFERED,FILE_ANY_ACCESS) 8)void XXX_PowerDown(DWORD hDeviceContext); hDeviceContext:XXX_Init的返回值。 |