0,前言:
1, 本篇文章只讲wince下的usb host驱动,并深入解析HID驱动。本博客的目的并不是只是为了讲怎么写驱动, 更重要的是:
1,了解wince驱动的架构。
2,学习微软的写作方法,如何去架构一个非常复杂的程序(USB驱动的确是有点复杂,但是微软的代码写的非常的具有条理,是不可多得的学习资料)。
2,学习wince usb驱动,必须对usb的协议有一定了解,可以看看《USB2.0 硬件设计(第2版)》
1,USB驱动的总体结构
这个方面的资料很多,其实也很简单,其实从总体来看,不管细节,USB驱动就那么三层架构而已。如下图:
由于我们只专注于usb host端的驱动,所以只要看左边就可以了,最底层是硬件,硬件上面的第一层是HCD驱动,第二层是USBD,再上面就对应不同的usb设备来,print对应usb打印机,Mass Storage对应U盘,HID对应USB鼠标,USB键盘和其他符合HID设备,HID并不是一个驱动,而是一个类别,所以USB鼠标,USB键盘都要单独的驱动。
下面我们从最底层往上来学习USB驱动。
2,USB Host Controller Hardware (HC 硬件)
就如同串口一样,USB需要有硬件来支持,串口有RS232,RS485……,USB host controller 有OHCI,UHCI……,这个没什么好说的,到底不同那个的硬件有什么不同的特性,这里就不讨论了。赶紧看 下一小节。
3,USB Host Controller Driver(HCD驱动)
前面说了USB接口需要硬件,那么不同的硬件驱动方式肯定有所以不同,这点不像串口。如果你用的是OHCI,那么你必须有针对OHCI的驱动。
我们以OHCI为例,来看看这一层的驱动如何架构。
1.打开目录WINCE600\PUBLIC\COMMON\OAK\DRIVERS\USB\HCD,可以看到:
打开common中的source文件,可以看到里面的程序编译成hcdlib,打开OHC中的cource文件,可以看到里面的程序编译成ohci_lib,打开OHCD2中的source文件,可以看到里面的程序编译成ohcdmdd2。
2.在D:\WINCE600\public\common\CESYSGEN\makefile中可以看到:
从这里已经很明白了,上面的三个文件夹,再加上ceddk就能够编译出ohci2,这个就是OHCI对应的HCD层的驱动了。
3.到这里已经讲完了HCD层,当然里面代码也是值得我们学习的,但是对我们写驱动却没有太多的帮助。我们来看看HCD层提供一些什么样的接口函数吧!
1) 打开 D:\WINCE600\PUBLIC\COMMON\OAK\INC\hcdi.h 可以看到下面的函数。这几个函数是USBD层必须要实现的,你会在hcd层发现系统加载USBD.dll,然后调用上面这些函数,具体得代码,这里就不照抄了,参考D:\WINCE600\public\common\oak\drivers\usb\hcd\common\cdevice.cpp。
BOOL HcdAttach(LPVOID lpvHcd, LPCHCD_FUNCS lpHcdFuncs, LPLPVOID lppvContext);BOOL HcdDetach(LPVOID lpvContext);BOOL HcdDeviceAttached(LPVOID lpvContext, UINT iDevice, UINT iEndpointZero,LPCUSB_DEVICE lpDeviceInfo, LPLPVOID lppvDeviceDetach);