基于CH374的USB摄像头驱动设计
。对USB摄像头来说,枚举的过程依次如下: ①获取设备描述符。通过设备描述符得到端点0的负载,也就是最大传送包容量。 ②设置地址。给设备分配一个默认地址0之外的地址。 ③获取配置描述符。这个过程包括两个阶段,第1次获取的配置描述符的前4个字节得到配置描述符的真实长度;再以真实长度第2次获取配置描述符,此描述符包含了设备的配置信息和多个接口信息。可以从这里得到可以使用的接口号和对应的信包负载。 ④设置配置信息。设置的主要信息是配置描述符中的第5个字段bConfigurationValue。 ⑤设置接口。USB摄像头不同的接口号对应不同的信包负载。本设计选定的接口号为2,对应信包负载是128字节。 (2) 自定义设置 USB摄像头并不是标准USB外设,需要很多自定义设置,可以称之为"自定义设备请求",它是用标准设备请求包方式传送的,目的是修改内部寄存器,对采集图像和压缩方式进行配置。标准设备请求和自定义设备请求包的不同内容如表1所列。自定义设备请求的内容非常丰富,它包含以下几个方面: ①时序产生设置。包括图像采集频率和振荡器的设置等。 ②图像处理设置。包括图像窗口大小、压缩类型、色彩分配等配置属性。 ③存储器设置。对图像缓冲进行设置。 ④控制及状态设置。包括启动及停止图像采集、数据传输方式、当前状态等配置属性。 2.2 同步传输和图像帧处理 同步传输的过程非常简单,甚至不包含握手信息;但是因为同步传输对时序的要求很高,所以对同步传输数据的处理颇困难。此驱动的设计将同步数据的接收用中断服务程序进行处理,同步数据的处理放在中断服务之外执行。 ①中断服务程序流程如图6所示。每次同步中断发生时,首先从USB主机控制器的缓冲区内读取接收到的128字节同步信包,将数据存储到数据处理程序提供的存储单元中。再发送PID_IN标志和端点号,设置同步传输类型并启动下一次传输。CH374主机会在每1 ms发送1个SOF同步标志,USB设备接收到SOF标志后,会传送下一个同步信包。 2.3 图像数据的预编码 经过处理后的图像帧为S561格式数据,它是一种RGB格式的图像,无法被后续的图像编码器利用。常用的视频压缩标准(如H.263、MPEG4等)输入的视频数据为YUV420格式,所以必须对当前的S56l格式数据进行预编码,使之成为YUV420格式。因为算法比较复杂,在此不详细叙述,请参考文献[1]中bayer_decode( )函数的的源代码。至此,基于CH374的摄像头驱动完成。 3 设计心得 由于此USB主机基于低端嵌入式硬件系统,没有操作系统支持,也没有BUSHOUND类似的USB数据流分析软件支持,难以找到基于嵌入式平台USB同步传输参考程序,所以设计的难度很大。笔者的设计经验是重在参考程序的选择。 此课题的设计可以分成两个部分:一个是底层的CH374主机控制器驱动,主要包括没备探测和枚举(这部分程序的设计可以参考类似主机控制器的驱动程序,如Cypress公司的SL811HS芯片主机驱动程序[3]);另一部分是摄像头初始化、视频数据读取及处理程序,仅有的参考资料是Linux下的开源USB摄像头驱动。在设计过程中首先需要了解Linux设备驱动原理,很好地分析USB摄像头驱动之后才能有设计思路。 结 语 将本驱动加到已有的视频压缩程序中,通过网络传送视频到PC后播放,在大小为QVGA(160×120)的图像属性下,可以达到每秒7帧,基本满足了实际需要。基于CH374的USB摄像头驱动,提供了低成本嵌入式平台实现视频采集的方案,便利视频采集系统不再高不可攀,对视频监控的普及起到了积极作用。
程序中的初始化设置有近百条,具体设置请见参考文献[1]的开源代码。初始化结束后,可以根据需要进行图像格式的设定,SPCA561A支持SQVGA(160×120)、QCIF(176×144)、QVGA(320×240)、CIF(352×288)四种格式。设定结束后启动摄像头采集,进行数据传输。
②同步数据处理程序如图7所示。中断结束后,执行数据处理程序,程序读取同步信包的第一个字节,确认包的序号,此序号的范围是0~0xFF。如果此序号为0xFF,则说明是无效包,需要丢弃。如果此序号为0,则可能是首次采集得到的第一个同步数据包,直接存储此数据到图像帧;也可能是当前图像帧结束后开始的下一帧图像的第一个同步信包,则需要处理已经结束的当前帧图像,同时将当前帧设置为下一帧。至此得到了一帧图像数据。
- 关于摄像头产品的术语详解(03-01)
- 双目立体视觉摄像头模块开发搭建,含源代码、电路图(11-30)
- 摄像好不好只看摄像头就够了?(01-16)
- 如何理解双摄像头的核心竞争力(03-24)
- 智能家居中的数字视频监控、门禁和灯光控制(06-05)
- 视频监视领域的视频压缩与数据流(06-18)