作者:menuconfig
转自:http://blog.youkuaiyun.com/menuconfig/article/details/6060892
---------------------
| 应用程序 |
---------------------
|usb client driver | (层一)
---------------------
| usbd.dll | (层二)
---------------------
| ohci.dll | (层三)
---------------------
wince的USB驱动分为三层,如上图所示.从上到下,姑且将其称为层一,层二,层三。层一通过gc_usbFuncs来调用层二所提供的功能,而层二通过gc_hcdFuncs来调用层三实现的功能,而应用程序则与层一打交道。
HCD初始化时,会创建一个线程,CHub::HubStatusChangeThead().在此线程中,会监视USB口的状态,如果有设备插入,则有如下的调用步骤:
AttachDevice()->CFunction::EnterOperationalState()->HcdDeviceAttached()->LoadDeviceDrivers()->LoadUsbClientDriver()->LoadGroupDriver()->LoadRegisteredClientDriver().
CDevice::AttachDevie()处理设备的初始化,如读设备描述符,配置地址,加载Client Driver等。
在LoadRegisteredClientDriver()内,会根据不同的Class,来调用相应的UsbDeviceAttach().而它的第一个参数就是gc_usbFuncs.在IssueVendorTransfer()之类的函数中,有一参数LPCUSB_FUNCS,该指针就是指向gc_usbFuncs.
http://www.cnblogs.com/cdfyanghua/archive/2008/05/20/1203556.html