WinCE5.0的USB Camera流接口驱动开发 02
![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
WinCE5.0的USB Camera流接口驱动开发 02
以本实验所采用的USB Camera为例,该USB Cam-era的供应厂商ID为0X046d,设备ID为0x08a2,那么它的加载注册表应该写为:
需要注意的是,注册表的构成都是以十进制数值来标识的,也要注意十进制和十六进制之间数的转换。
3 WinCE5.0下USB摄像头驱动程序
实验使用的USB Camera是中星微公司的301芯片组的Zc030x,它的Vid/Pid为0x046d、0x08a2。由于实时图像数据传送量比较大,很多USB Camera产品在图像传输之前已进行了数据压缩处理,如果不知道解码算法,是没有办法在WinCE上获得图像的。在开发的时候主要使用SnoopyPro,它是一款可以分析USB通信数据的软件,辅助进行Zc030x的驱动开发工作,最后成功开发出Zc030x在WinCE5.0下的驱动程序。下面结合USBCamera驱动开发说明驱动中的数据流向和必要的函数使用。首先是具体的注册表信息:
![](http://embed.chinaitlab.com/UploadFiles_4615/200810/20081024095015946.jpg) 其中,hDevice是由系统提供的当前外设的句柄,通过它可以获取外设的信息,如VID、PID等;UsbFuncs是系统提供的指向USBD函数的函数指针,通过它可以调用USBD函数,如GetlsochResult、IssuelsochTransfer等;AcceptControl指针指向的bool值需要我们确定,如果可控,令其为TRUE,否则为FALSE。
在这个函数里面,要做的工作包括确定外设是否可控,分配和填写设备的上下文内容,调用ActivateDevjce()函数在“Drivers\USB\ClientDrivers\Camera_Class”键值中注册分配到的设备上下文的指针(其中Camera_Class是对USB Camera的命名),同时ActivateDevice在注册表[HKEY_LOCAL_MACHINE\Drivers\Active\N]中登记设备上下文的指针,其中N为整数,它是系统自动分配给此驱动的数字。系统在调用ActivateDevice()过程中,又会自动调用CAM_Init函数。
DWORD CAM_Init(LPCTSTR pContext,LPCVOIDIp VBusContext)
其中,pContext是系统自动传入的字符串内容,也是上面的键名,即[HKEY_LOCAL_MACHINE\Drivers\Active\N];CAM_Init要完成的就是在此键下读出设备上下文的指针,将其作为DWORD返回;IpvBusContext不用考虑。
在USBDeviceAttach()中,最后要完成的工作是在此函数内调用USBD模块的RegisterNotificationRoutine函数登记注册DeviceNotify函数。这个DeviceNotify函数是必需的,在设备被移走后,系统调用这个函数完成相应的善后工作。
BOOL WINAPI DeviceNotify(LPVOID lpvNotifyPa-rameter DWORD dwCode.LPDWORD dwInf01.LPDW0RDdwlnfo2.LPDWORD dwlnfo3.LPDWORD dwlnfo4)
其中,IpvNotifyParameter是设备的上下文句柄,在RegisterNoticationRoutine中作为参数传入;dwCode是系统调用此函数的原因,如设备被移走,dwcode的值就为USB_CLOSE_DEVICE,相应的,用户进行卸载DLL工作;dwInfol,…,dwInfo4没有使用。
自此,系统在USBDeviceAttach中完成对所加USB外设的驱动加载。当有用户调用CreateFile函数,系统会将用户填入CreateFile()的参数值,直接传到CAM_Open()。
DWORD CAM_Open(DWORD hDeviceContext,DWORDAccessCode,DWORD ShareMode)
其中,hDeviceContext是驱动上下文句柄,由系统自动填充;AccessCode是访问模式,ShareMode是共享模式,均由CreateFile()传递过来;CAM_Open的工作是将hDe-viceContext以DWORD的形式返回,再作为CreateFile()的句柄值返回给用户。当用户调用CloseHandle()时,系统将直接调用CAM_Close(),用于关闭一个驱动程序。
B00L CAM_Close(DWORD hOpenContext)
其中,hOpenContext是设备驱动的引用事例句柄,由CAM_Open创建。本驱动中,所有对USB Camera的操作均通过IOControl()映射到CAM_IOControl来完成。下面是CAM_IOControl的部分源码分析:
![](http://embed.chinaitlab.com/UploadFiles_4615/200810/20081024095016465.jpg)
由于本驱动是针对USBCamera的,因此CAM_Write、CAM_Read、CAM_PowerUp、CAM_PowerDown并没有内容;但是只要用户调用WriteFile,系统就将映射到CAM_Write。其他函数类似。通常,Camera对图像的压缩采用标准是MJPEG算法。在Zc030x上正是采用这一算法完成对数据压缩的。只要在驱动上增加MJPEG的解码算法,还原压缩数据,就可以正确显示图像了。至此,整个USB Camera的驱动编写工作完成。经过实验验证,已经实现了最高为25帧/s,大小为320×240的图片的传输。
结 语
本文介绍了WinCE5.0下USB设备驱动框架,结合USB Camera的驱动开发实例说明了在USB驱动框架中驱动数据的流动方向,并已在中星微公司的301PLUS和303这两个系列的摄像头上得到成功运用和实践。所采用的程序设计方法及思想,对其他类似嵌入式系统软件的设计也有较高的参考价值。 |
|
|
|
|
|