基于DM642 RAW采集格式的视频驱动开发及应用

摘 要:为解决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

时间: 2024-10-16 13:13:16

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

基于低压电量采集平台DW710C的基础开发

实验课题 (1)自定义通信规约,采用java或C++编写简单的PC端上位机软件,实现采集器与PC机的通信.实验可在DW710C-PC工程下进行. (2)实现LCD显示字符.数字.汉字和简单的图像,并能根据上位机发送的命令做相应的显示.此实验需要掌握LCD屏幕的显示原理(可参考LCD屏幕指导手册),并编写程序控制LCD显示(可参考工程DW710C-LCD):知道如何用字模提取软件提取字模:另外还要修改采集器端接收到的命令的解析程序,实现不同命令显示不同内容. 实验说明 采集器的一个485接口与RS

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

实验课题 (1)自己定义通信规约,採用java或C++编写简单的PC端上位机软件,实现採集器与PC机的通信.实验可在DW710C-PCproject下进行. (2)实现LCD显示字符.数字.汉字和简单的图像,并能依据上位机发送的命令做对应的显示.此实验须要掌握LCD屏幕的显示原理(可參考LCD屏幕指导手冊).并编敲代码控制LCD显示(可參考projectDW710C-LCD).知道怎样用字模提取软件提取字模:另外还要改动採集器端接收到的命令的解析程序,实现不同命令显示不同内容. 实验说明 採集器

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

打算记录一下基于FFmpeg的封装格式处理方面的例子.包括了视音频分离,复用,封装格式转换.这是第3篇. 本文记录一个基于FFmpeg的视音频复用器(Simplest FFmpeg muxer).视音频复用器(Muxer)即是将视频压缩数据(例如H.264)和音频压缩数据(例如AAC)合并到一个封装格式数据(例如MKV)中去.如图所示.在这个过程中并不涉及到编码和解码. 本文记录的程序将一个H.264编码的视频码流文件和一个MP3编码的音频码流文件,合成为一个MP4封装格式的文件. 流程 程序的

VFW连接视频驱动不成功问题解决

使用VFW进行视频捕获时,使用capdriverconnect宏连接视频驱动时, 一般方法是 if(capDriverConnect(m_hwnd,0){ //连接视频驱动成功后进行的动作 } else{ afxMessageBox("视频驱动连接失败!"); } 但是实际使用过程发现,这样用很多情况会连接失败,capDriverConnect()返回值为0:然后经过多次研究实验,发现,必须多次连续连接才能成功, 连接的次数还不确定(坑爹的不行,郁闷了我好几天....),最后总结,使用

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

打算记录一下基于FFmpeg的封装格式处理方面的例子.包括了视音频分离,复用,封装格式转换.这是第2篇. 本文记录一个基于FFmpeg的视音频分离器(Simplest FFmpeg demuxer).视音频分离器(Demuxer)即是将封装格式数据(例如MKV)中的视频压缩数据(例如H.264)和音频压缩数据(例如AAC)分离开.如图所示.在这个过程中并不涉及到编码和解码. 本文记录的程序可以将一个MPEG2TS封装的视频文件(其中视频编码为H.264,音频编码为AAC)分离成为两个文件:一个H

常用视频格式与视频编解码标准介绍 转

细细算起来,视频文件可以分成两大类:其一是影像文件,比如说常见的VCD便是一例.其二是流式视频文件,这是随着国际互联网的发展而诞生的后起视频之秀,比如说在线实况转播,就是构架在流式视频技术之上的.流式视频(Streaming Video)采用一种"边传边播"的方法,即先从服务器上下载一部分视频文件,形成视频流缓冲区后实时播放,同时继续下载,为接下来的播放做好准备.这种"边传边播"的方法避免了用户必须等待整个文件从Internet上全部下载完毕才能观看的缺点. 1.A

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

打算记录一下基于FFmpeg的封装格式处理方面的例子.包括了视音频分离,复用,封装格式转换.有关封转格式转换的例子在之前的文章:<最简单的基于FFMPEG的封装格式转换器(无编解码)>中已经有过记录,不再重复.因此计划写3篇文章分别记录视音频的复用器(Muxer)和分离器(Demuxer).其中视音频分离器(Demuxer)记录2篇:一篇简单的,一篇标准的.简单的版本更适合初学者学习.本文是第1篇.首先记录一个基于FFmpeg的视音频分离器简单版(Simplest FFmpeg Demuxer

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

本文介绍一个基于FFMPEG的封装格式转换器.所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(对应.avi,.flv,.mkv,.mp4文件).需要注意的是,本程序并不进行视音频的编码和解码工作.而是直接将视音频压缩码流从一种封装格式文件中获取出来然后打包成另外一种封装格式的文件.传统的转码程序工作原理如下图所示: 上图例举了一个举例:FLV(视频:H.264,音频:AAC)转码为AVI(视频:MPEG2,音频MP3)的例子.可见视频转码的过程通俗地讲相当于把视频和音频

【FFMpeg视频开发与应用基础】四、调用FFmpeg SDK解析封装格式的视频为音频流和视频流

<FFMpeg视频开发与应用基础--使用FFMpeg工具与SDK>视频教程已经在"CSDN学院"上线,视频中包含了从0开始逐行代码实现FFMpeg视频开发的过程,欢迎观看!链接地址:FFMpeg视频开发与应用基础--使用FFMpeg工具与SDK 工程代码地址:FFmpeg_Tutorial 我们平常最常用的音视频文件通常不是单独的音频信号和视频信号,而是一个整体的文件.这个文件会在其中包含音频流和视频流,并通过某种方式进行同步播放.通常,文件的音频和视频通过某种标准格式进行