当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]WinCE5.0的USB Camera流接口驱动开发

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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

随着13代酷睿处理器的上市,铭瑄本次同步发布了四款Z790主板,包括两款ATX、一款mATX,以及一款ITX迷你小板。其中,包括新款MS-终结者Z790M D5主板,售价仅1499元。将在10月20日21点随13代酷睿处...

关键字: 酷睿 ATX 接口 DDR

USB-C接口全称为USB Type-C,属于USB 3.0下一代接口,其亮点在于更加纤薄的设计、更快的传输速度(最高可达10Gbps)、更强的电力传输(最高100W),此外USB-C接口还支持双面插入,正反面随便插,相...

关键字: iPhone 15 Lightning USB

GRL东莞实验室将与上海和台北实验室一同,提供Windows Host认证服务 加利福尼亚州圣克拉拉市2022年9月22日 /美通社/ -- 高速信号和充电技术测...

关键字: Windows THUNDERBOLT USB OS

脑机接口(Brain Computer Interface,BCI [4] ),指在人或动物大脑与外部设备之间创建的直接连接,实现脑与设备的信息交换。这一概念其实早已有之,但直到上世纪九十年代以后,才开始有阶段性成果出现...

关键字: 脑机 接口 设备

接下来测试烧写功能,本次采用串口和USB烧写方式。使用ISP串口烧写这是51单片机常用的方案,本次测试比较顺利,没有遇到什么问题。但是USB烧写没有测试成功,USB烧写方式不需要任何的驱动和硬件支持,直接将USB线和ST...

关键字: PCB控制板 USB 串口

仓储机器人领域的领先企业率先实现这一行业里程碑 马萨诸塞州威尔明顿2022年9月16日 /美通社/ -- 仓储处理自主移动机器人(AMR)市场领先企业Locus Robot...

关键字: ROBOTICS AMR USB 移动机器人

(全球TMT2022年9月6日讯)9月5日,思灵机器人发布“Agile Core & Diana”系列产品。本系列产品包括软件Agile Core,和两个智能力控机器人diana7系列。其中,思灵自主研发的操作...

关键字: 机器人 CORE AN 接口

(全球TMT2022年8月26日讯)运输和物流提供商GEODIS和用于营运仓库的自主移动机器人(AMR)企业Locus Robotics宣布了一项新的扩展协议,将在未来24个月内在GEODIS的全球仓库网点总共部署10...

关键字: USB GE AMR ROBOTICS

GEODIS与Locus Robotics签署扩展协议,在全球仓库网点部署1000个LocusBot 田纳星州纳什维尔和马萨诸塞州威明顿2022年8月25日 /美通社/ -- 全球领先的运输和物流提供商GEODIS和用...

关键字: USB ROBOTICS GE AMR

在DDR4出现十年之后,DDR5翩翩来迟。作为十年之久的换代,DDR5的设计上实现了诸多突破:新的通道设计、片内ECC、片上PMIC、更多温度传感器乃至插槽缺口的位移等。新的设计规范和标准,让内存容量、带宽和传输速率得以...

关键字: SPD DDR5 DIMM Rambus 接口

嵌入式教程

6897 篇文章

关注

发布文章

编辑精选

技术子站

关闭