其实,winCE的学习已经有两个多月了,之所以说是开始,因为之前没有系统的学习,只是了解了一下学习它所需要的基础知识,了解一下自己哪些方面还不行。
之前已经相对系统的学习了windows MFC编程,EVC会用,PB知道大体功能,操作不熟悉,因为定制内核编译的时候时间太长(在我这破机器上大约需要20多分钟),只定制过2、3次(我感觉我还是很懒的,O(∩_∩)O~)。至于MFC我最大的感触就是API函数太多,虽然方便,但参数太多,记是记不住的,只能混个眼熟,以后用什么再查吧!不过MSDN确实好用,如果有中文版的就更好了,省的我金山词霸找来找去,不过也有可能提高我很糟糕的英语,呵呵,但愿如此!系统上的界面编程没多大问题(参考书让写什么我就抄什么……),可到了更底层硬件相关的驱动部分就傻眼了,因为,我这里只有一本周立功的《ARM&WinCE实验与实践——基于S3C2410》,可我买的板是友善的Mini2440,所以到这就卡壳了!在网上找了好长时间的WinCE驱动编程,没有很详细的参考资料,没办法,自己慢慢磨吧!So从今天起,我要开始学驱动编程,以后的一段时间,我打算坚持每天一贴,把我当天所学的总结一下,呵呵就当是学习笔记了!
一般驱动程序的理解:
必须使用汇编语言对端口进行读写 (对于逻辑设备驱动程序,采用Win32 APIs 从硬件获取数据)
设备驱动程序是操作系统的一部分,难于开发与调试。(对于逻辑设备驱动程序,采对于windows CE,大多数的
设备驱动程序运行于用户态,简单的来说就是一个DLL文件。)
设备驱动程序控制硬件
中断比较难于处理 (Windows CE提供逻辑中断 (SYSINTRs) 、中断由一个用户态的线程进行处理 (IST))
Windows CE 整体上将设备驱动分为三种: 内置驱动;总线;流接口。
驱动分类 – 详细:Audio Drivers ;Battery Drivers ;Block Drivers ;Bluetooth HCI Transport Driver;Direct3D
Device Driver Interfac; DirectDraw Display Drivers ;Display Drivers ;DVD-Video Renderer
IEEE 1394 Drivers; Keyboard Drivers ;Notification LED Drivers ;Parallel Port Drivers ;
PC Card Drivers ;Printer Drivers ;Serial Port Drivers ;Smart Card Drivers ;
Stream Interface Drivers ;Touch Screen Drivers ;USB Drivers ……
驱动的加载过程:大多数的设备驱动由设备管理器(Device.exe)进程在系统启动时进行加载。
另一方面,其中一部分内置驱动程序由GWES.exe进行加载。这些驱动包括显示器驱动 (DDI.dll)、键盘驱动、鼠标驱动、触摸屏驱动等。
1.当Device.exe对设备驱动程序进行安装时将在注册表的[HKEY_LOCAL_ MACHINE]/Drivers项下检查一个字符串,其值为 RootKey,传统地,其名字为 BuiltIn 。
2.然后设备管理器在进行初始化时使用注册信息检查器为它需要安装的各个驱动读取值为RootKey的键。
3.安装DLL,给每一个驱动创建一个Active 键,然后调用ActivateDevice 或者 ActivateDeviceEx将DLL注册为系统中的一个设备驱动程序。
4.ActivateDevice在 [HKEY_LOCAL_MACHINE/Drivers/Active下创建一个新的键值。
驱动加载API:设备驱动程序也能通过应用程序进行手动的安装,这是ActivateDeviceEx的一个首选的功能。
安装驱动一个更老的方法是使用RegisterDevice 与 DeregisterDevice 。
流驱动接口:流接口驱动包括所有提供流接口函数的驱动程序,不管由这个驱动控制的设备是什么类型。
典型的流接口驱动程序有:文件系统驱动 (iostream, fstream);COM, LPT;
使用流接口:CreatFile();ReadFile();CloseHandle();可以直接使用Win32API。
创建一个流驱动程序:1.写出一个导出具体流接口的DLL;
2.编译设备驱动程序
3.对注册表进行配置
流接口的函数:
函数名
|
说明
|
关闭以
hOpenContext
标识的设备上下文。
| |
由设备管理器调用来删除对某一设备的初始化信息。
| |
由设备管理器调用来对某一设备进行初始化。
| |
向设备发送命令
| |
停止向设备供电。只有在软件控制下关机的设备上才可用。
| |
恢复向设备供电
| |
从设备读取数据
| |
在设备中移动数据指针
| |
向设备写数据
|
不好意思,到吃饭的点儿了,先吃饭去……
首先,道个歉,昨天因为圣诞节前夜,和同学出去玩了,忘了第一部分还没写完,就今天补上吧!呵呵,言归正传,继续我的学习,学习才是硬道理!
构建设备驱动程序:1.构建设备驱动程序与构建一个DLL一样简单。
2.可以使用Platform Builder与EVC++。只需创建一个Windows CE DLL项目, 输出适当 的入口点,然后编写
代码。
3.常犯的一个错误是没有将入口点声明为 extern C,因此 C++编译器就不能处理输出的函数名。
注册表设置:(以下摘自书中的例子)在project.reg中填写:[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/Sample]
"Dll" = "mydriver.Dll"
"Prefix" = "DEM"
"Index" = dword:1
"Order" = dword:0
"FriendlyName" = "Demo Driver"
"Ioctl" = dword:0
1. Order:给所有的驱动设置相对安装顺序。Order 为0的驱动先安装,依次安装Order为1,2,…的驱动。Oder可以让
开发者保证有相应依赖关系的多个驱动以适当的顺序进行安装。
2.Index:指定在文件系统中的驱动名的数字部分。在默认情况下,带有前缀COM的驱动在文件系统中分配名字为
COM1,下一个即为COM2。为了保证驱动总是安装成COM2,必须提供Index = 2。
说了这么多,驱动是怎么工作的呢?
1.当CE启动时,Device.exe根据注册表中的设置安装所有驱动程序。
2.当安装mydriver.dll时,device.exe调用DEM1_Init。
3.Application程序调用CreateFile(“DEM1”……)
4.Coredll.dll 处理API调用并切换到 device.exe
5.Device.exe 调用mydriver.dll 的DEM1_Open。
6.CreateFile返回DEM1_Open的retval
好了,流接口驱动编写就主要这么多了,希望对大家有帮助!补充一点,好像有本英文的WinCE驱动编程听说挺不错的,大家可以尝试看看,由于本人英文极差,没敢看那书,记得看2440的英文手册时就差点杀了我,装了个金山词霸,那个麻烦劲不提了!希望大家多看资料多学知识!