前面已经讲过WinCE6.0下USB驱动的整体结构,今天来看看USB Host驱动部分。可能是因为USB Host驱动一般不修改的原因,这方面的资料少的可怜,所以只能自己研究了。分析的源码微软已经提供了,在目录WINCE600\PUBLIC\COMMON\OAK\DRIVERS\USB下面。
该目录下包含CLASS、USBD、HCD、COMMON和INC文件夹,其中COMMON和INC文件夹中包含的一个关于锁功能的文件lock.c,HCD文件夹中是对USB1.1和USB2.0等协议的支持,为USBD提供操作控制器的接口,一般不会去做修改,这里不去深究。
USBD
USB Host驱动加载的总入口,usbd.dll,USBD为上层Client层驱动部分使用WINCE600\PUBLIC\COMMON\DDK\INC中,此文件定义了所有的 上面的三个函数在Client驱动部分必须实现这三个接口。
VOID GetUSBDVersion(LPDWORD lpdwMajorVersion, LPDWORD lpdwMinorVersion);
BOOL RegisterClientDriverID(LPCWSTR szUniqueDriverId);
BOOL UnRegisterClientDriverID(LPCWSTR szUniqueDriverId);
BOOL RegisterClientSettings(LPCWSTR lpszDriverLibFile,
LPCWSTR lpszUniqueDriverId, LPCWSTR szReserved,
LPCUSB_DRIVER_SETTINGS lpDriverSettings);
BOOL UnRegisterClientSettings(LPCWSTR lpszUniqueDriverId, LPCWSTR szReserved,
LPCUSB_DRIVER_SETTINGS lpDriverSettings);
HKEY OpenClientRegistryKey(LPCWSTR szUniqueDriverId);
BOOL GetClientRegistryPath(LPWSTR szRegistryPath, DWORD dwRegPathUnit, LPCWSTR szUniqueDriverId);
BOOL RegisterClientDriverID(LPCWSTR szUniqueDriverId);
BOOL UnRegisterClientDriverID(LPCWSTR szUniqueDriverId);
BOOL RegisterClientSettings(LPCWSTR lpszDriverLibFile,
LPCWSTR lpszUniqueDriverId, LPCWSTR szReserved,
LPCUSB_DRIVER_SETTINGS lpDriverSettings);
BOOL UnRegisterClientSettings(LPCWSTR lpszUniqueDriverId, LPCWSTR szReserved,
LPCUSB_DRIVER_SETTINGS lpDriverSettings);
HKEY OpenClientRegistryKey(LPCWSTR szUniqueDriverId);
BOOL GetClientRegistryPath(LPWSTR szRegistryPath, DWORD dwRegPathUnit, LPCWSTR szUniqueDriverId);
可以看出上面几个函数都是通过def文件显式导出的。除此之外,usbdi.h中还有一个函数指针列表结构体_USB_FUNCS,里面包含了USBD的另外一部分接口,是在def中没有导出的,通过函数指针结构体在驱动之间进行传递的。_USB_FUNCS中的函数指针的实体都在文件usbddrv.cpp的文件中,整个USB驱动只有一个_USB_FUNCS的全局变量gc_UsbFuncs,它的声明及初始化在usbd.c中。
USBD提供的主要接口函数归类如下:
USBD的传输函数
IssueControlTransfer IssueBulkTransfer IssueInterruptTransfer IssueIsochTransfer
IsTransferComplete GetTransferStatus GetIsochResults AbortTransfer
CloseTransfer
USBD和USB设备建立通讯管道的函数
OpenPipe AbortPipeTransfers ResetPipe ClosePipe
IsPipeHalted IsDefaultPipeHalted ResetDefaultPipe
USBD针对总线上数据打包的函数
GetFrameNumber GetFrameLength TakeFrameLengthControl
SetFrameLength ReleaseFrameLengthControl
USBD和USB设备进行交互的函数
OpenClientRegistryKey RegisterNotificationRoutine UnRegisterNotificationRoutine
GetUSBDVersion LoadGenericInterfaceDriver TranslateStringDescr
FindInterface RegisterClientDriverID UnRegisterClientDriverID
GetDeviceInfo RegisterClientSettings UnRegisterClientSettings
今天先到这里,明天继续。