Basic concept about Wince device driver development

| | 评论(5)

在工程界有一个流传已久的故事:有个厂里的机器坏了,找人来修。维修工程师围着机器转了几圈,掏出一只粉笔在机器外壳的某个地方画了个圈:把壳子里圈圈下面的零件换了就好了。修好后维修工程师开出账单:$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()就是驱动的主要功能部分了。

分类

评论(5)

Xiaoyue :

看的我这个云山雾罩啊~~~

mach :

回头你写点关于Tungsten, Cobalt之类的东东的blog我也可以享受下云山味道~

写得很好,受用了。

nickcave :

这和linux驱动有什么区别呢?

mach :

要我说,没啥区别。把设备当文件处理本来就是Unix的idea, 被Windows学过去啦。真有区别都在系统内核的Device Manager模块里了。

发表评论

关于此日记

此日记由mach发表于2006年8月 9日 16:32

此Blog上的上一篇日记Redhat装机行动

此Blog上的下一篇日记刚才在途牛网上的留言

主索引归档页可以看到最新的日记和所有日记。

Powered by Movable Type 4.0