Basic concept about Wince device driver development
在工程界有一个流传已久的故事:有个厂里的机器坏了,找人来修。维修工程师围着机器转了几圈,掏出一只粉笔在机器外壳的某个地方画了个圈:把壳子里圈圈下面的零件换了就好了。修好后维修工程师开出账单:$10K. 厂家要求出清单,回答是:画圈,$1, 找到在哪里画圈,$9999.
有朋友问我一些关于wince device driver开发的细节,说实话我已经不记得是怎么知道在哪里画圈的了,只好多解释解释这个圈圈本身吧。可怜啊,我的精神财富就这样只剩下了$1......
1,wince device driver(以下简称cedd)和windows的驱动很不同,cedd其实是一个运行在用户态的DLL。了解这一点很重要,所以不要奇怪cedd是可以弹出一个message box的,我通常用这个来帮助debug,当然直接写log文件也是可以的。
2,开发工具。eVC(embedded visual C++,可以从微软网站上免费下载)就可以用来开发PCMCIA设备卡的cedd了,但是仍然有可能需要platform builder里面的头文件。其它设备驱动必须购买platform builder来进行开发。
3,其实cedd的格式是很死的,因为Microsoft定义了一套device driver interface (DDI),简单说就是一套函数界面,里面的函数一二三四五都必须要实现,基本上也只需要实现那些函数。
4,wince也是有注册表的(Microsoft很小气没有提供注册表查看工具,可以去下载一个叫TRE的小软件)。任何种类的硬件都有一个唯一的设备id, 该id是有设备设计商固化在硬件里的。wince的设备管理器会在启动时(或者热插入时)读到这个设备id, 然后在注册表里面找该id对应的驱动,找到了就启动该驱动。
[HKEY_LOCAL_MACHINE\Drivers\PCMCIA\MyDriver]
"Dll"="sampledev.Dll"
"Class"=
"SubClass"=dword:00
"ProgIF"=dword:02
"VendorID"=
"DeviceID"=
"Prefix"=
上面这段注册表是要由安装程序写进去的。事实上,wince在发现硬件设备以后,还会动态给这个硬件的实例生成一段注册表:
[HKEY_LOCAL_MACHINE\PCMCIA\1]
"MemBase"=
"MemLen"=
"IoBase"=
"IoLen"=
"InterfaceType"
"Irq"=
"SysIntr"=
上面的1是实例号,因为可能有多块卡的。以上信息系统会提供给驱动。
5, cedd也分成好多种类(class),比如总线驱动,ndis网络驱动,电源驱动等等。每个class有一个预定义的type, 这个type也是要写到该驱动的注册表里去。这个世界上最多的一定是stream interface driver,简单说stream interface driver在wince的应用程序看来就是一个普通的文件,可以对它进行打开,读,写,关闭等操作。当然这个文件有一个特殊之处就是可以进行device io control操作,这是普通文件断然不会有的。ioctl的意思就是应用程序和驱动程序之间用预定义好的,只有它们之间理解的,一组功能代码和相应的附带数据进行交互;是比读和写有更大自由度的功能。
6, 在驱动里会用到很多工具函数:wince内核函数...
虽然Microsoft的MSDN是开发界史上最完备的帮助,里面仍然是有足够误导人写出有错误程序的错误的,请注意分辨。
7, 接上面的4, 进入驱动之后要做什么事情? 资源,当然是抢资源, 21世纪最宝贵的东东。驱动程序需要向系统注册它所使用的共享内存,I/O口,中断号。共享内存需要做从物理地址到线性地址的映射。中断需要挂接中断服务处理例程(ISR)。以上所需要的信息(地址,中断号)都来自4里的注册表。这一些工作可以统称为驱动程序的初始化。
8,资源一切就绪,驱动程序就只剩下等待应用程序用CreateFile()把它当作一个文件打开,然后用ReadFile(), WriteFile()或者DeviceIoCtrl()来访问,交互数据。驱动自己的ISR会在有中断时也会冒出来处理一些数据。ISR和xxx_Read(), xxx_Write(), xxx_IOControl()就是驱动的主要功能部分了。
分类
Software评论(5)
发表评论

看的我这个云山雾罩啊~~~
回头你写点关于Tungsten, Cobalt之类的东东的blog我也可以享受下云山味道~
写得很好,受用了。
这和linux驱动有什么区别呢?
要我说,没啥区别。把设备当文件处理本来就是Unix的idea, 被Windows学过去啦。真有区别都在系统内核的Device Manager模块里了。