您的位置:首页 > 其它

wince USB摄像头驱动学习笔记(修改中)

2011-11-26 21:28 78 查看
USB流驱动与普通流驱动相比,即有很多相同点,又有若干不同。这与USB设备的工作方式、USB协议等有密不可分的关系。最直观的,就是除了XXX_Init、XXX_Open等十个标准流驱动接口函数外,还多了三个特殊的入口函数:USBInstallDriver()、USBDeviceAttach()、USBUnInstallDriver()。下面结合USB驱动启动流程分别对其简单介绍。
一、USB驱动启动流程
WinCE下所有的USB流驱动一般是以DLL(动态链接库)的形式储存在系统中。当USB设备插入后,WINCE的设备管理器就会在注册表的HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients\键下搜索新插入USB设备的相关信息(具体将在后面提到)。
这里我们假设第一次插入设备,系统未搜索到驱动信息,就会弹出一个“未能识别的USB设备”的对话框,要求用户输入驱动程序的名称(即DLL文件的文件名)。在输入名称后,系统会自动调用该DLL的USBInstallDriver函数。该函数负责向注册表添加USB Host驱动的信息,以便再次插入设备时,能够识别该USB设备。其原型如下:
BOOL USBInstallDriver(LPCWSTRszDriverLibFile)
szDriverLibFile:输入的DLL文件名称。
返回值:TRUE表示注册成功,FALSE表示注册失败。
总而言之,USBInstallDriver函数就是在注册表的Drivers\USB\LoadClients\和Drivers\USB\ClientDrivers下写入相关信息。
写入LoadClients时,必须使用两个USBD提供的注册函数:
BOOL RegisterClientDriverID(LPCWSTR szUniqueDriverId)

BOOL RegisterClientSettings(LPCWSTR szDriverLibFile, LPCWSTR szUniqueDriverId,LPCWSTR erved, LPCUSB_DRIVER_SETTINGS lpDriverSettings)
例程里这两个函数一般先用LoadLibrary打开USBD.DLL,再通过GetProcAddress通过函数指针来动态调用。
需要注意的是lpDriverSettings参数是一个USB_DRIVER_SETTINGS结构体。其声明如下:

typedef struct {

DWORD dwCount;

DWORD dwVendorId;

DWORD dwProductId;

DWORD dwReleaseNumber;

DWORD dwDeviceClass;

DWORD dwDeviceSubClass;

DWORD dwDeviceProtocol;

DWORD dwInterfaceClass;

DWORD dwInterfaceSubClass;

DWORD dwInterfaceProtocol;

} USB_DRIVER_SETTINGS;

Count为结构体大小,其他项对应USB描述符。其中除Count外的各字段,如果不设置具体的值,可以设置为USB_NO_INFO。

在WinCE中,这些设置信息分为了三组,每组3个值,

第一组:
dwVendorId、dwProductId、dwReleaseNumber

第二组:
dwDeviceClass、dwDeviceSubClass、dwDeviceProtocol

第三组:
dwInterfaceClass、dwInterfaceSubClass、dwInterfaceProtocol
如果注册成功,将会在HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients\键下出现 “第一组\第二组\第三组\注册ID(这个由RegisterClientDriverID确定)\DLL”这样的建,键值为DLL驱动名称。其中每组又是由三个值中间加下划线组成。如果有一个值设置为USB_NO_INFO,则键名不包括该值。如果整个组中每个值都设置成USB_NO_INFO,则键名为Default。
例如,如果我们将lpDriverSettings配置为:
DriverSettings.dwCount= sizeof(DriverSettings);

DriverSettings.dwVendorId = 0x10C4;

DriverSettings.dwProductId = 0x0003;

DriverSettings.dwReleaseNumber = USB_NO_INFO;

DriverSettings.dwDeviceClass = USB_NO_INFO;

DriverSettings.dwDeviceSubClass = USB_NO_INFO;

DriverSettings.dwDeviceProtocol = USB_NO_INFO;

DriverSettings.dwInterfaceClass = 0;

DriverSettings.dwInterfaceSubClass = 0;

DriverSettings.dwInterfaceProtocol = 0;
那么,在我的系统下,将会生成如下键名:HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients\4292_3\Default\0_0_0\USBTest\DLL= "WebCam" (我的驱动程序为WebCam.dll)。这样系统就能通过注册表识别到驱动程序。
写入ClientDrivers就比较简单,用GetSetKeyValues()就行了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: