| ARM Cortex-A8/A9开发板 | ARM11开发板ARM11开发套件 | ARM9开发板ARM9开发套件 | 飞思卡尔I.MX28I.MX6开发板 |
| tiny210/mini210开发板 | mini6410开发板/套餐 | Tiny6410开发板无线套件 | mini2440开发板/套餐 | micro2440开发板带核心板 | 友善开发板配件 模块 | QQ2440 V3 SBC-2410X |
| FL2440 OK2440-IV V4 | OK2440-III OK2440V3 | TE2440-II TE2440V2 | OK6410 S3C6410 ARM11 | FL6410/OK6410B ARM11 | TE6410 S3C6410 ARM11 | TE-9263 AT91SAM9263 | 开发板配件 模块和其他 |
| Xilinx开发板/fpga开发套件 | altera开发板/fpga开发套件 | 基于FMC FPGA/DSP子卡 |
| BeagleBoard原厂开发板 | PandaBoard原厂开发板 |
| TI DM3730 DevKit8500D | TI系列 omap3530开发板 | ATMEL系列 开发板 | Samsung系列 开发板 | 开发板配件-仿真器 模块 | NXP LPC3250 mini3250 |
| Tiny210 三星S5PV210 | Mini210/Mini210s开发板 | Tiny4412开发板Cortex-A9 | Tiny6410开发板 ARM11 | mini2440开发板 ARM9 | micro2440开发板 ARM9 | mini6410开发板 ARM11 | 友善ARM开发板配件 模块 |
| keil ARM仿真器/开发工具 | STM32开发板 Cortex-M3 | NXP LPC开发板Cortex-M3 | ATMEL系列 ARM开发板 | Luminary EKK8962开发板 | Freescale i.MX31开发板 | 三星s3c2440 s3c6410开发板 |
| FL2440 OK2440-IV V4 | OK6410 S3C6410 ARM11 | FL6410/OK6410B ARM11 | OK210/-A Cortex-A8 | TE2440-II TE2440V2 | TE6410 S3C6410 ARM11 | TE-9263 AT91SAM9263 | ARM开发板配件 模块等 |
| Real6410开发板/套餐 | Real210开发板/Real2410 | WIFI GPS GPRS模块摄像头 |
| Xilinx开发板/开发套件KIT | Altera开发板/开发套件KIT | 配套模块 |
| NXP LPC开发板 ARM7 | Cortex-M3 STM32开发板 | 最小系统模块类(初学者勿选) | 开发工具 仿真器 调试器 | TFT液晶屏LCD 液晶模块 |
| DM642开发板/DM642实验箱 | DM6446开发板/DSP实验箱 | DSP仿真器 液晶屏 摄像头等 |
| DM3730/AM3715/AM3359 | OMAP3530AM1808AM3517 | 飞思卡尔Cortex-A9开发板 | ATMEL系列ARM开发板 | NXP LPC3250 LPC1788 | Samsung系列ARM开发板 | STM32系列F207/F407 | ARM开发板配件-仿真器 模块 |
| Realv210 S5PV210开发板 | Real6410开发板 ARM11 | WIFI GPS GPRS模块摄像头 |
| NXP LPC开发板 ARM7 | Cortex-M3 STM32开发板 | ARM小系统模块(初学勿选) | 开发工具 ARM仿真器 调试器 | TFT液晶屏LCD 液晶模块 |
| keil ARM仿真器/开发工具 | STM32开发板 Cortex-M3 | NXP LPC开发板Cortex-M3 | ATMEL系列 ARM开发板 | Luminary EKK8962开发板 | Freescale i.MX31开发板 | 三星s3c2440 s3c6410开发板 |
| Exynos4412开发板A9四核 | UT-S5PV210 S5PC100 | UT-S3C6410开发板 ARM11 | idea 6410开发板 ARM11 | UT-S3C2450开发板 ARM9 | UT-S3C2416开发板 ARM9 | UT-S3C6410核心板 工控 |
| Xilinx开发板 FPGA开发套件 | altera开发板 FPGA开发套件 | FMC模块 配件 下载线 |
| DM642开发板/DM642实验箱 | DM6446开发板/DSP实验箱 | DSP仿真器 液晶屏 摄像头等 |
| s3c2410 ARM9 FS2410 | s3c2440开发板 ARM9 | s3c44B0开发板 ARM7 | s3c6410 2450 2443/13 | PXA270 PXA320 PXA255 | Atmel 9200 9261 9G20 | Philips NXP开发板YL-LPC | FS-EP9315开发板ARM9 | LCD液晶屏TFT真彩/触摸屏 | ARM仿真器/仿真调试工具 | ARM开发板配套ARM核心板 |
| 三星s3c2410 s3c44B0 | 三星s3c6410 s3c2443 | Intel PXA270 PXA320 | UP-CUP OMAP5910平台 | FPGA Xilinx altera平台 | 配件-仿真器 模块 液晶屏LCD | 龙芯开发板UP-DRAGON-I | 物联网教学科研设备 | EDA/FPGA/SOPC教学科研 |
| utu2440-F-V4.5 含核心板 | utu2440-S-V4.1 单板结构 | YC2440-F-V5.1开发板 豪华型 | YC-ePC-A系列人机界面 | Mars-EDA套件CPLD FPGA | 触摸屏LCD 摄像头 WI-FI模块 |
| ARM开发板/开发平台 | FPGA开发板/开发平台 | 编程器/烧写器下载器烧录 | ZLG 仿真器ARM FPGA DSP | ZLG周立功逻辑分析仪 |
| DSP初学者开发套件(DSK) | DSP仿真器/仿真系统 | DSP开发板/DSP试验箱 | DaVinci系列多媒体平台 | Xilinx FPGA大学计划产品 | SEED教学实验系统 | FPGA/DSP FPGA开发板 | TI原厂开发板套件/CCS软件 |
| ARM开发板 | XSCALE开发板 | ARM仿真器 | SOPC开发板 | DSP开发板 | 达芬奇系列DSP开发平台 | DSP仿真器 | DSP实验箱 | DSP专业研究平台 | ARM实验箱系列 |
| 广嵌实验室项目产品 | GEC2440/GEC6410开发板 |
| 泰克Tektronix示波器 | 普源RIGOL示波器 | USB虚拟示波器 |
| UT-S5PC100 UT-S5PV210 | UT-S3C6410开发板 ARM11 | idea 6410开发板 ARM11 | UT-S3C2450开发板 ARM9 | UT-S3C2416开发板 ARM9 | UT-S3C6410核心板 工控 | 开发板模块wifi gps等 |
| EMA OMAP3530开发板 | EMA OMAP 3530核心板 |
| 三星s3c2410 s3c44B0 | 三星s3c6410 s3c2443 | Intel PXA270 PXA320 | UP-CUP OMAP5910平台 | FPGA Xilinx Altera平台 | 配件-仿真器 模块 液晶屏LCD | 龙芯系列 UP-DRAGON-I |
| utu2440-F-V4.5 含核心板 | utu2440-S-V4.1 单板结构 | YC2440-F-V5.1开发板 豪华型 | 触摸屏LCD 摄像头 WI-FI模块 | Mars-EDA套件CPLD FPGA | ePC系列工控一体机ARM9 A8 |
| ARM开发板/开发平台 | FPGA开发板/开发平台 | 编程器/烧写器下载器烧录 | ZLG 仿真器ARM FPGA DSP | ZLG周立功逻辑分析仪 |
| DSP初学者开发套件(DSK) | DSP仿真器 | DSP开发板 | DSP实验箱 | Xilinx FPGA大学计划产品 |
| ARM开发板 | XSCALE开发板 | ARM仿真器 | SOPC开发板 | DSP开发板 | 达芬奇系列DSP开发平台 | DSP仿真器 | DSP实验箱 | DSP专业研究平台 | ARM实验箱系列 |
| ARM开发板S3C6410等 | Cortex-A8/ARM11仿真器 | ADSP Blackfin开发板 | FPGA Spartan-3E开发板 |
| GEC2410开发套件ARM9 | GEC2440开发套件ARM9 |
| 泰克 示波器 |
引 言
WinCE5.0是一个32位、多任务、多线程的实时嵌入式操作系统。USB Camera 以其良好的性能和低廉的价格得到广泛的应用,同时因其灵活、方便的特性,易于集成到嵌入式系统中。
通过采用USB Camera可以在WinCE5.0下方便地得到实时图像。但是由于嵌入式硬件环境的多样性以及WinCE5.0对USB设备驱动开发只提供了一些底层支持,摄像头厂商尚未提供WinCE5.0下USB摄像头的驱动,因此开发出WinCE5.0下USB摄像头驱动具有实际的意义和价值。本文正是针对这一情况,对WinCE5.0下USB设备驱动开发进行研究,并设计出基于流接口驱动模型的USB摄像头驱动程序。现在已经开发出来的驱动适用于Zc030x PLUS这一系列的摄像头。Samstmg 2410为实验的硬件平台。

1 WinCE5.0下USB总线驱动框架
USB系统由USB主机、一个或多个USB设备和物理总线组成。主机上又分两层:较高的包含USB设备驱动程序的软件层和主机控制器硬件层,也称作“适配层”。主机的主要任务是控制对USB设备的双向数据传输。物理总线是一组USB电缆,用来将控制器和外围设备连接起来。WinCE5.0的USB系统软件由两层组成:USB设备驱动程序层和底层的由WinCE5.0实现的USB函数层。
USB设备驱动程序使用USB函数来建立与它们所控制设备的连接,并对这些设备进行配置和通信。较低的USB函数层本身又由两部分组成——较高的通用串行总线驱动程序(USBD)模块和较低的主控制器驱动程序(HCD)模块。HCD提供了抽象的主机控制器,且对主机控制器所见到的USB系统的数据传输进行抽象。USBD提供一个抽象的设备,且对USBD客户和USB设备功能部件之间的数据传输进行抽象。USB设备驱动程序使用USBD接口函数与外围设备进行通信。
IHV和USB设备制造商利用USBD提供的函数来实现USB设备的驱动程序。OEM负责给基于WinCE的平台提供HCD模块,这样相应的硬件才能与USBD模块进行交互。图1说明了与主机的USB硬件和外围设备相对应的软件的各个层。
2 WinCE5.0下流驱动模型
基于WinCE5.0平台的两种专用的驱动模型为:本机设备驱动程序和流接口驱动程序。本机设备驱动程序适合于集成到WinCE 5.0 平台的设备;而后者则是一般类型的设备驱动程序,适用于大部分外围设备,如调制解调器、打印机等。对大多数USB外围设备来说,适用于采用流接口驱动程序模型来开发驱动程序。
流接口驱动程序是一种可以定制接口的驱动模型,一般由设备管理器负责管理。它把设备管理器和应用程序的命令转换成所控设备的适当动作所需信息。流接口驱动程序需要实现一组固定的流接口函数,供给WinCE5.0系统内核使用。

USB设备的流接口驱动程序和WinCE5.0系统其他部件间的关系如图2所示。流接口驱动程序通过系统提供的文件系统API与应用程序交互;而系统通过设备管理器完成对流接口驱动程序的加载、卸载等管理工作;流接口驱动程序通过调用USBD模块提供的接口函数实现与底层USB设备通信。
本文使用的流接口函数方法如表1所列。

USB设备驱动程序必须输出的函数有:
①USBDeviecAttach()。当USB设备连接到计算机上时,USBD模块就会调用此函数。这个函数主要用于初始化USB设备,取得USB设备信息,配置USB设备,并且申请必需的资源。
②USBInstallDriver ()。主要用于创建一个驱动程序加载所需的注册表信息,例如读/写超时、设备名称等。
③USBUninstallDriver ()。主要用于释放驱动程序所占用的资源,以及删除UsbInstallDriver ()函数创建的注册表等。
上述3个函数接口是所有的USB驱动程序必须提供的,缺一不可。
另外较为重要的是USB设备驱动程序的注册表配置。一般的USB设备驱动程序的注册表配置在[HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients\口]下,每个驱动程序的子键都有Group 1_ID\Group2_ID\Group3_ID\DriverName 格式,设备的子键由供应商、设备类和协议信息通过下划线组成。表2列出了允许的组合。

以本实验所采用的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驱动开发说明驱动中的数据流向和必要的函数使用。首先是具体的注册表信息:

其中,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的部分源码分析:

由于本驱动是针对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这两个系列的摄像头上得到成功运用和实践。所采用的程序设计方法及思想,对其他类似嵌入式系统软件的设计也有较高的参考价值。