摘 要:为解决C64X系列数字信号处理器(DSP)视频驱动不能应用于原始数据格式(RAW)采集格式的问题,设计了DM642和电耦合元件(CCD)高清传感器的数据传输接口,并分析、修改用于标准格式的视频驱动,使其优化后适用于RAW采集格式,在此基础上开发了基于多级缓存管理机制的应用程序,最终达到采集速率至少每秒15帧的要求。 
   
  �关键词:视频驱动;DM642;CCD高清传感器;RAW采集格式;缓存管理机制 
  �中图分类号: TP311.11 文献标志码:A 
   � 
  Abstract: To solve the problem that video driver for C64X Digital Signal Processor (DSP) family can not be used in RAW capture mode, the authors designed a data interface between DM642 and the high definition sensor of Charge-Coupled Device (CCD), and analyzed and modified the video driver of standard format. After being optimized, the video driver could be used in RAW capture mode. Applications had been developed based on multilevel buffer management framework. At last, the capture speed achieves the minimum speed of 15 frame per second. 
   Key words: video driver; DM642; CCD high definition sensor; RAW capture mode; buffer management framework 
   
  0 引言� 
  近年来,数字信号处理器(Digital Signal Processor, DSP)在视频监控方面得到广泛应用。C64x系列DSP提供给开发者一种类/微驱动模型(Class/Mini Driver Model),对于视频驱动,数字信号处理器/基本输入输出系统(Digital Signal Processor/Basic Input Output System,DSP/BIOS)提供更高级驱动封装,简化了系统开发流程。常用的视频监控系统是通过解码芯片(如TVP5150)对采集的图像数据解码后,输出�BT.656�或其他标准格式到DSP压缩、处理。但这种系统中的视频驱动不支持原始数据格式(RAW Image Format, RAW),对高分辨率模数(A/D)转换器输出的RAW图像数据具有很大局限性。论文研究了如何通过DM642视频端口接收RAW格式视频数据,并在移植视频驱动程序后,开发多级缓存管理机制的应用程序。� 
   
  1 相关接口设计� 
  设计模块包括两个部分:核心处理模块DM642和视频采集模块。DM642处理器内部集成了TMS320C64X DSP内核,在600�MHz运行速度下,指令可达4�800�MIPS,由于其强大运算能力,可实现实时JPEG编解码算法;视频采集模块由高清摄像头ICX274和12位36�MHz模数转换芯片AD9923A构成。其中,ICX274是一款201万(1�628×1�236)有效像素的电耦合元件(Charge-Coupled Device,CCD)传感器,水平驱动频率36�MHz[1]。� 
  DM642通过模拟串行接口(McBSP)配置AD9923A芯片内部功能相关寄存器,AD9923A驱动ICX274输出模拟视频信号,并正确控制相关双采样电路的采样时刻,完成模拟信号到数字视频信号的转换后,传输到DM642的视频端口(VPORT)[2]。如图1所示,相关接口设计包括两部分:McBSP与视频采集模块的接口;VPORT与视频采集模块的接口,而设计难点在于后者。� 
   
  1.1 McBSP与视频采集模块的接口� 
  DM642支持将McBSP配置成标准串行外设接口(Serial Peripheral Interface,SPI)协议,需要CLKX、DX、DR、FSX四根线,分别对应SCK、MOSI、MISO、SS。但传输数据位数只能配置成8位、12位、16位、20位、24位以及32位[3]。但AD9923A寄存器的配置需要一次传输40位,包括12位地址信号和28位数据信号,且AD9923A接口不满足标准SPI协议,所以将McBSP配置成通用I/O口,以模拟串行接口。因此只需占用VPORT0(VPORT0与McBSP复用)的CLKX、DX、FSX。� 
   
  1.2 VPORT与视频采集模块的接口� 
   
  1.2.1 VPORT介绍� 
  DM642具备三个专用视频端口:VPORT0、VPORT1和VPORT2[4]。其中:VPORT0和VPORT1作为视频采集端口;VPORT2作为视频显示端口。每个VPORT有20根数据线,分A、B两个通道。系统中,视频采集模块与VPORT1接口。DM642视频端口内部集成先入先出队列(First Input First Output, FIFO)用来存储输入、输出数据,通过增强型直接内存存取(Enhanced Direct Memory Access,EDMA)传输实现视频内部FIFO和外部或内部存储器的数据搬移。� 
  VPORT支持如下三种输入格式:� 
  1)双通道8/10位或单通道16/20位BT.656格式的YCbCr(4∶2∶2),分辨率720×576(50�Hz/625行)或720×486(60�Hz/525行);� 
  2)双通道8/10位或单通道16/20位的Y/C格式的YCbCr(4∶2∶2),支持音视频同步码(Society of Motion Picture and Television Engineers,SMPTE) 260M、SMPTE 274M、SMPTE �296M�以及ITU-BT.1120格式,分辨率1�920×1�035,�1�920×��1�080�等,也支持标清CCIR601格式;� 
  3)双通道8/10位或单通道16/20位RAW格式,如图2所示,主要用于从模数转换器(Analog-to-Digital Converter,ADC)获取原始图像数据。� 
   
  1.2.2 RAW采集格式下的接口设计� 
  为了实现从AD9923A获取RAW图像数据,VPORT1必须配置成RAW采集格式。AD9923A支持12位模数转换,因此过滤低4位数字信号,选择VPORT1 A通道8位RAW视频采集格式。� 
  如图1所示,当CAPEN信号被使能时,VPORT1开始采样VPxD数据线的数据。采样时钟最高可达80�MHz,设计中使用AD9923A内置36�MHz单位是Hz吗?若不是,请补充。时钟。采样数据大小通过VCxSTOP1的VCXSTOP和VCYSTOP位设置,VCXSTOP设置低12位,VCYSTOP设置高12位,最大帧数据为16�MB单位是什么?请补充。。当采样数据达到VCXSTOP和VCYSTOP所设置值时,采样完成。此后,CAPEN信号必须保持至少2个时钟周期的无效状态。�

  RAW视频采集的关键因素之一是帧同步处理。由于RAW格式采集的数据不包含任何类似于BT.656数据流的帧启、停标识码(SAV/EAV CODE),也不提供垂直同步信号,帧同步无法实现。但VPORT提供一种实现RAW采集格式下的帧同步解决方法。如图3所示,通过设置VPORT的采样垂直消隐间隔VCVBLNKP,以及开始同步使能SSE间接实现帧同步功能。� 
   
  SSE被置位且视频口采样使能信号有效时,在2个垂直消隐间隔以后,VPORT1开始采集数据。通过设置VCVBLNKP位,定义垂直消隐信号长度。为保证在一帧数据开始时同步,VCVBLNKP必须赋予大于水平消隐的期望值且小于1/2垂直消隐间隔的值,根据需求配置为最大值0xfff。值得注意的是:帧同步操作只在VPORT使能信号(VCEN=1)有效后执行一次,如果在采集过程中,CAPEN信号被噪声干扰,帧同步信号将会丢失。如果需要重新同步,VPORT必须禁用后重新使能。当CAPEN有效时,再开始采集数据。� 
   
  2 视频驱动移植� 
   
  2.1 视频驱动结构分析� 
  DM642视频驱动结构如图4所示,根据BIOS的驱动结构,分为三部分:芯片支持库(Chip Support Library,CSL)驱动、微型(Mini)驱动、类驱动�� [5]。� 
   
  1)CSL驱动。� 
  驱动程序建立在CSL基础上,调用CSL库函数完成对芯片级设备的初始化和控制。在Mini驱动中需要调用CSL层的驱动函数(EDMA配置函数和用户开发的Video Decoder配置函数)进行端口设置。� 
  2)Mini驱动。� 
  Mini驱动执行所有特定设备的控制和初始化,也称为硬件相关层。Mini-Driver驱动分成两个模块:Generic驱动模块和Decoder Specific驱动模块。Generic模块保留IOM Mini驱动的所有应用程序编程接口(Application Programming Interface, API)函数,完成视频端口和EDMA控制器配置,通过EDMA将视频端口FIFO的图像数据搬运到Mini驱动管理的buffer中;Decoder Specific模块完成A/D芯片或视频解码芯片配置,使外围芯片和视频端口配合工作,完成指定格式图像的采集任务。Decoder Specific模块通过外部器件控制(External Device Control, EDC)接口融合到Generic模块中。当驱动移植到不同硬件平台时,只需修改EDC模块,极大提高了代码使用效率。� 
  3)FVID/GIO类驱动。� 
  类驱动程序为应用程序提供接口,也称为硬件不相关层。这部分程序主要功能包括维护设备数据缓冲区,向上提供API接口供应用层程序调用,并协调应用程序对外设操作的同步和阻塞;向下提供适配层与Mini驱动层相连,实现API接口函数到Mini驱动层程序映射。FVID模块为GIO类设备提供一组宏,定义6个IOM命令:FVID_create、FVID_alloc、FVID_control、FVID_exchange、FVID_free和FVID_delete,以扩展GIO功能,支持多级缓存管理机制。� 
   
  2.2 RAW格式的驱动程序移植� 
  视频采集驱动只支持如下模式:单通道或双通道8/10位BT.656模式;单通道16/20位Y/C模式。因此,为了在RAW格式下使用视频驱动,必须修改Mini驱动相应部分[6]。� 
   
  2.2.1 修改VPORT初始化文件� 
  在RAW采集格式下初始化VPORT,主要涉及修改两个文件:vportcap.h和vportcap.c。在vportcap.h文件中声明了VPORTCAP_Params结构体,在该结构体中添加Uint16 sse和Uint16 vcvblinkp两个成员,以使能SSE和VCVBLINKP。� 
  在vportcap.c文件中配置VPORT。表1是RAW采集格式下的VPORTCAP_Params结构体变量配置参数。其中,定义LINE_SZ为1�628,NUM_LINES为1�236,支持分辨率�1�628×��1�236�的8位RAW采集格式。� 
   
  在RAW采集模式下,不必配置scale、resmpl、hCtRst、vCtRst、fldDect、extCtl、fldInv等变量,直接置零。� 
  � 
  2.2.2 定义EDC接口函数� 
  设计中涉及底层硬件AD9923A的控制,必须修改Mini驱动外围芯片控制部分,即EDC接口。重新定义如下三个函数,配置AD9923A以控制ICX274。� 
  1)ICX274_open()。打开ICX274并提供VPORT1单通道操作。� 
  程序中为ICX274创建相应实体,并在初始化时指定采集所用的通道号及端口号。FVID实体的命名规则如下所示,用三个“/”隔开。第一个分量是在DSP/BIOS.cdb文件中定义的驱动名称;第二个分量识别通道(A或B);第三个分量识别传感器所连接端口(VPORT0或VPORT1)。在调用Mini驱动之前,必须在DSP/BIOS Config中注册。在Device Drivers中右击选择插入一个设备驱动,命名为VPlCAPTURE,并配置各个属性(函数表指针、函数表类型和设备ID号等),指明IOM_Fxns函数表地址和设备参数地址[7]。 
  程序前 
  � 
  capVideoPort1=FVID_create(”/VP1CAPTURE/A/1”,�IOM_INPUT,NULL,(Ptr)&CapParamsVP1,NULL); 
  程序后 
  � 
  2)ICX274_ctrl()。以命令方式控制ICX274。� 
  主要命令:EDC_RESET表示重置传感器;EDC_CONFIG表示配置传感器分辨率,为1�628×1�236,修改此命令可添加其他分辨率格式;EDC_START表示使能并开始视频采集。� 
  3)ICX274_close()。关闭ICX274并置于低功耗模式。� 
  其中对ICX274的操作都是DM642通过串行接口写命令到AD9923A,配置相关寄存器,再由AD9923A输出相应时序控制ICX274感光电荷输出[8]。� 
   
  3 应用程序开发� 
  在驱动移植成功的基础上,开发基于多级缓存管理机制的应用程序。图5是视频采集驱动的数据流框图。视频采集模块开始工作后,将采集数据存到DM642输入视频端口的FIFO,当FIFO到达设定阈值时,DSP发出信号产生EDMA中断,启动EDMA通道,搬运FIFO中的图像数据,将其存入SDRAM,等待图像处理。每场图像采集完成后触发VPORT中断,中断服务程序更新图像存储区,继续采集另一场图像。� 
   
  3.1 多级缓存管理机制� 
  FVID驱动的特点是基于帧的操作,驱动分配帧缓存,完成应用程序和驱动之间的帧缓存交换。应用程序调用FVID接口时,主要使用命令字段包括:FVID_alloc、FVID_exchange和FVID_free,对Mini驱动发出指令。为提高所采集图像数据的存取速度,DM642内存管理采用多级缓存管理机制。现以如图5所示的三个buffer为例,解释Mini驱动缓存管理机制。�

   
  根据CCD传感器分辨率,Mini驱动合理分配三个同样大小buffer,设计中buffer大小为1�628×2,即两行图像数据。采集开始时,所有缓存区都处于空闲状态。如图5(a)。采集数据先填充buffer A,buffer A填满产生中断,EDMA通道自动把指针指向buffer B填充,三个buffer交替接收数据。� 
  当应用程序发出I/O请求发送函数时,如图5(b),如果命令字为FVID_alloc,则Mini驱动把当前已经填满的buffer A分配给应用程序,在ChanObj回调函数里返回被分配指针,应用程序可对此图像数据处理。如图5(c)、(d),再通过FVID_exchange将buffer A释放给Mini驱动,以此交替获得buffer B、buffer C。应用程序通过I/O请求发送函数不断从底层驱动获得装有新采集数据的内存块,将处理完的内存块释放给底层驱动重新采集数据,上层和底层并行处理互不干扰[9]。� 
  3.2 视频采集流程� 
  视频采集流程如图6所示[10],右边是流程图中对应类驱动、Mini驱动的程序调用及说明。系统上电或复位后,程序入口地址指向C引导程序_c_int()起始地址。_c_int()自动完成C语言运行环境和寄存器初始化,而后调用BIOS_init()函数初始化DSP/BIOS模块。Main()函数执行用户初始化工作,主要完成CSL初始化,L2 Cache设置,启动DAT模块允许数据快速拷贝;然后初始化RF5,完成CHAN模块、ICC模块和SCOM模块等初始化;最后初始化视频采集通道,分配外部帧存储器,设置视频采集端口参数,配置AD9923A[11]。� 
   
  对于采集通道,FIVD_create()函数创建视频采集通道,并把参数传递给视频采集口参数结构体,FVID_control()配置ICX274[12],包括其模拟输入视频采样格式、分辨率,给出图像缓存区大小和首地址。在main()函数结束返回后,调用BIOS_start()函数启动DSP/BIOS,按优先级执行硬件中断、软件中断、任务线程。� 
   
  4 系统测试� 
  文中为了测试系统采集图像的正确性与完整性,在网络开发套件(Network Development Kit,NDK)基础上,建立传输控制协议/因特网互联协议(Transmission Control Protocol/Internet Protocol,TCP/IP)以太网通信,将DM642服务器端的图像数据传输到上位机客户端显示。ICX274图像传感器默认采集分辨率为1�628×1�236,即有效像素2.01�MB。原始图像未进行JPEG压缩的情况下,短时间内无法通过百兆以太网传输到VC++6.0下的MFC界面显示(客户端)。因此对图像数据进行隔1列、隔3行压缩,将数据量缩小到1/8后传输,客户端接收到的图像如图7所示。在如上的工作状态下测得采集速率至少每秒15帧,满足ICX274每秒15帧图像输出的要求。� 
   
  5 结语� 
  DM642视频监控系统的应用越来越广泛,而视频驱动程序设计的合理性直接关系到采集到的图像质量和采集效率。系统设计了DM642和CCD传感器ICX274的相关接口,并在RAW采集格式基础上,对FVID/GIO类驱动和Mini驱动深入研究并修改,移植视频驱动后,开发多级缓存管理机制的应用程序,对RAW格式高清视频采集的控制和优化具有重大意义。� 
   
  �参考文献:� 
  [1] 
  FOSSUM E �R.� CMOS image �sensors: Electronic� �camera-on-chip� [J]. IEEE Transactions on Electron Devices, 1997, 44(10): 1689-1698. 
  �[2] 
  赵�,刘铁根,李晋申.基于DM642的高速图像识别系统设计[J].电子测量与仪器学报,2007,21(1):86-89. 
  �[3] 
  陈财明,周立丰,于海滨,等.基于TMS320 VC5416图像采集系统的设计与应用[J].江南大学学报:自然科学版,2006,5(2):149-152. 
  �[4] 
  Texas Instruments. TMS320C64x DSP video port/VCXO Interpolated Control (VIC) port reference guide [M]. Texas: Texas Instruments, 2007. 
  �[5] 
  Texas Instruments. The TMS320DM642 video port mini-driver [M]. Texas: Texas Instruments, 2003. 
  �[6] 
  Texas Instruments. Interfacing a CMOS sensor to the TMS320DM642 using RAW capture mode [M]. Texas: Texas Instruments, 2004. 
  �[7] 
  李晨阳,续志军.基于PCI总线的DSP视频采集驱动设计[J].制造业自动化,2010,32(9):3-6. 
  �[8] 
  莫思特,吴志红.200万像素数字摄像机设计及关键技术研究[J].光电工程,2009,36(5):117-121. 
  �[9] 
  XU �FEN,� ZENG �JIAN-JUN,� ZHANG �YUN-LONG.� Design of a DSP-based CMOS imaging system for embedded computer vision [C]// Proceedings of 2008 IEEE Conference on Cybernetics and Intelligent Systems. Washington, DC: IEEE Computer Society, 2008: 430-433. 
  �[10] 
  徐志伟,马登极,林峰,等.基于DM642的视频解码设备TVP5150驱动程序的设计[J].电子器件,2006,29(3):945-950. 
  �[11] 
  许芬.智能视觉传感器及其应用[J].中国仪器仪表,2007(4):26-28. 
  �[12] 
  孙咏,黄丹丹,任俊,等.CPLD在DSP实时图像采集系统中的应用[J].江南大学学报:自然科学版,2006,5(2):158-161. 
   
   收稿日期:2011-07-11;修回日期:2011-09-13。� 
   
  基金项目: 
  “211工程”三期建设项目(S-09102);重庆大学研究生创新团队建设项目(QGSS2011005)。�

http://www.xzbu.com/8/view-43716.htm

基于DM642 RAW采集格式的视频驱动开发及应用的更多相关文章

  1. 【转】基于V4L2的视频驱动开发

    编写基于V4L2视频驱动主要涉及到以下几个知识点:1> 摄像头方面的知识 要了解选用的摄像头的特性,包括访问控制方法.各种参数的配置方法.信号输出类型等.2> Camera解码器.控制器 ...

  2. 基于V4L2的视频驱动开发【转】

    转自:http://blog.chinaunix.net/uid-10747583-id-298573.html Tags:V4L2驱动框架.API.操作流程…… 原文地址:http://www.ee ...

  3. 基于低压电力采集平台DW710C的基础开发

    实验课题 (1)自己定义通信规约,採用java或C++编写简单的PC端上位机软件,实现採集器与PC机的通信.实验可在DW710C-PCproject下进行. (2)实现LCD显示字符.数字.汉字和简单 ...

  4. DAVINCI DM6446 开发攻略——V4L2视频驱动和应用分析

     针对DAVINCI DM6446平台,网络上也有很多网友写了V4L2的驱动,但只是解析Montavista linux-2.6.10 V4L2的原理.结构和函数,深度不够.本文决定把Montavis ...

  5. 最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)

    ===================================================== 最简单的基于FFmpeg的封装格式处理系列文章列表: 最简单的基于FFmpeg的封装格式处理 ...

  6. 最简单的基于FFMPEG的封装格式转换器(无编解码)

    本文介绍一个基于FFMPEG的封装格式转换器.所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(相应.avi,.flv,.mkv,.mp4文件).须要注意的是,本程序并不进行视 ...

  7. 最简单的基于FFmpeg的封装格式处理:视音频分离器(demuxer)

    ===================================================== 最简单的基于FFmpeg的封装格式处理系列文章列表: 最简单的基于FFmpeg的封装格式处理 ...

  8. 最简单的基于FFmpeg的封装格式处理:视音频分离器简化版(demuxer-simple)

    ===================================================== 最简单的基于FFmpeg的封装格式处理系列文章列表: 最简单的基于FFmpeg的封装格式处理 ...

  9. [转载] ffmpeg摄像头视频采集-采集步骤概述并采集一帧视频

    近期由于工作任务,需要开发一个跨平台视频聊天系统,其中就用到了ffmpeg进行采集与编码,网上找了一大堆的资料,虽然都有一些有用的东西,但实在太碎片化了,这几天一直在整理和实验这些资料,边整理,边做一 ...

随机推荐

  1. JS 退出系统并跳转到登录界面的实现代码

    js代码如下: <script language="javascript" type="text/javascript"> function log ...

  2. Excepion

    异常:就是程序在运行时出现不正常的情况. 异常由来:问题也就是现实生活中一个具体的食物,也可以通过java的类的形式进行秒速.并封装成对象.其实就是java对不正常情况进行毛素后的对象体现. 对于问题 ...

  3. MAVEN build ,GOAL plugin ,execution

    http://www.avajava.com/tutorials/lessons/what-are-the-phases-of-the-maven-clean-lifecycle.html https ...

  4. spoj 24

    大数  #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> ...

  5. 密钥登录linux

    一.linux 主机A登录linux主机B 在/etc/hosts文件下加入:(做硬解析) 192.168.1.60 u60 #设置u60为主机名 在节点A上创建RSA秘钥:(A上生成A主机密钥) # ...

  6. css3的动画特效--元素旋转

    开发中,视觉要你实现一个元素的旋转问题,比如说如下图所示: 思路:首先动画动效肯定离不开anmimation动画. 和transition动画一样,animation动画也是CSS3动画的一种,这类动 ...

  7. phpstorm中使用xdebug配置cli模式的调试

    这里略去xdebug的安装,安装很简单可以下载源码包,动态编译进去! 环境: Dev 服务器(IP:192.168.2.100),安装phpstorm,用来做开发任务! Server服务器(IP:19 ...

  8. TCP连接建立系列 — 客户端接收SYNACK和发送ACK

    主要内容:客户端接收SYNACK.发送ACK,完成连接的建立. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 接收入口 tcp_v4_rcv |--&g ...

  9. [Django] 单元测试小记

    从前很少写单元测试了,特别是web应用.最近不知不觉喜欢起来这个事情了,发现单元测试对于软件的模块,正交性有很大促进作用,因为函数,模块写的不合理,单元测试写起来就麻烦的多呀.公司的项目一直都是用Dj ...

  10. SQL结构化查询语句

    SQL结构化查询语句 SQL定义了查询所有关系型数据库的规则. 1.通用语法 SQL语句可以单行或者多行书写,以分号结尾 可以使用空格和缩进增强可读性 不区分大小写,但是关键字建议大写 3种注释 注释 ...