DM642 图像存储

/*
* Copyright 2004 by Texas Instruments Incorporated.
* All rights reserved. Property of Texas Instruments Incorporated.
* Restricted rights to use, duplicate or disclose this code are
* granted through contract.

*/
#include <std.h>       //如果使用C语言,必须将此文件作为第一个头文件。
#include <tsk.h> 
#include <sem.h>   
#include <gio.h>

#include <csl_dat.h>
#include <csl_cache.h> //使用CSL库,要用到的一些头文件,可参考CSL


#include <fvid.h>      //视频驱动头文件
#include <edc.h>
#include <vport.h> 
#include <vportcap.h>
#include <vportdis.h>
#include <saa7105.h>   
#include <tvp51xx.h>    
#include <dec643.h>    //芯片头文件。
//#include <evmdm642.h>

#include <evmdm642_capParamsSDTVDefault.h>   //捕获设备配置文件
#include <evmdm642_disParamsVGADefault.h>   //如用VGA显示,需要的显示设备配置文件

#include "colorbar.h"                       //如显示彩色滚动条,需要,否则不需要。

VPORT_PortParams EVMDM642_vCapParamsPort 
= EVMDM642_CAP_PARAMS_PORT_EMBEDDED_DEFAULT;   //定义捕获端口。


/* caputure configuration parameters */
/* embedded sync mode is recommended as it offers better re-sync capability */

/* The available capture modes are */
/* NTSC720                         */
/* PAL720                          */
static VPORTCAP_Params EVMDM642_vCapParamsChan 
= EVMDM642_CAP_PARAMS_CHAN_EMBEDDED_DEFAULT(PAL720);    
//捕获(即采集端口)端口, 为PAL制式。可依据需要改为NTSC制式

static TVP51XX_ConfParams EVMDM642_vCapParamsTVP51XX 
= EVMDM642_CAP_PARAMS_TVP51XX_EMBEDDED_DEFAULT(PAL601, COMPOSITE, 0);

/* coefficients for color space conversion */
static const short coeffs[5] = {0x2543, 0x3313, -0x0C8A, -0x1A04, 0x408D}; 
//VGA显示,需将 YCbCr656转换为RGB565,这是必要的转换矩阵


/* display configuration parameters */
VPORT_PortParams EVMDM642_vDisParamsPort   //显示端口定义
= EVMDM642_DIS_PARAMS_PORT_DEFAULT;

/* The available display modes are: **
** VGA(640x480@60fps)               **
** SVGA(800x600@60fps)              **
** XGA(1024x768@60fps)              */                

static VPORTDIS_Params EVMDM642_vDisParamsChan   
= EVMDM642_DIS_PARAMS_CHAN_RGB565_DEFAULT(VGA);

//这里的显示端口定义为VGA,即支持的是VGA输出。

static SAA7105_ConfParams EVMDM642_vDisParamsSAA7105 
= EVMDM642_DIS_PARAMS_SAA7105_RGB565_DEFAULT(VGA);

/* heap IDs defined in the BIOS configuration file */
extern Int EXTERNALHEAP; //在DSP/BIOS中已定义

/*
* ======== main ========
*/
main()
{
    /******************************************************/
    /* open CSL DAT module for fast copy                  */
    /******************************************************/
    CSL_init();                               //调用任何CSL库中的函数,必须先在此调用该函数。

    CACHE_clean(CACHE_L2ALL, 0, 0);           //清洗Cache               
    CACHE_setL2Mode(CACHE_256KCACHE);         //设置Cache模式
    CACHE_enableCaching(CACHE_EMIFA_CE00);    //使能EMIFA CE0空间
    CACHE_enableCaching(CACHE_EMIFA_CE01);    //使能EMIFA CE1空间
    DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);
}

/*
* ======== tskVideoLoopback ========
* video loopback function.
*/
void tskVideoLoopback()
{       
    Int i;
    Int status;    
    Int frames = 0;

    FVID_Handle disChan; 
    FVID_Frame *disFrameBuf;

    FVID_Handle capChan;
    FVID_Frame *capFrameBuf;

    /*设置显示的行数 VGA制式为480,PAL制为576*/
    Int numLinesDis = EVMDM642_vDisParamsChan.imgVSizeFld1;

    /*设置采集的行数 PAL制为576*/
    Int numLinesCap = (EVMDM642_vCapParamsChan.fldYStop1 -
                EVMDM642_vCapParamsChan.fldYStrt1+1)*2;

    /*判断是显示区域大,还是采集区域大,取其小者480*/   
    Int numLines = (numLinesDis > numLinesCap) ? numLinesCap : numLinesDis;

    /*设置采集像素数 PAL制为720*/
    Int numPixels = (EVMDM642_vCapParamsChan.fldXStop1 - 
              EVMDM642_vCapParamsChan.fldXStrt1+1);

    /*设置采集行的增量 PAL制为720*/
    Int capLinePitch = (EVMDM642_vCapParamsChan.fldXStop1 - 
                       EVMDM642_vCapParamsChan.fldXStrt1+1);
    
    /*设置显示行的增量 VGA制为640*/
    Int disLinePitch = EVMDM642_vDisParamsChan.imgHSizeFld1;
      
   // numLines *= 2; /* both fields */    //如果输出为PAL制,前面numLinesCap不要*2,这里再*2


    /******************************************************/
    /* allocate both capture and display frame buffers    */
    /* in external heap memory                            */
    /******************************************************/
    EVMDM642_vDisParamsChan.segId = EXTERNALHEAP;
    EVMDM642_vDisParamsSAA7105.hI2C = DEC643_I2C_hI2C;

    EVMDM642_vCapParamsChan.segId = EXTERNALHEAP;
    EVMDM642_vCapParamsTVP51XX.hI2C = DEC643_I2C_hI2C;

    /******************************************************/
    /* initialization of capture driver                   */
    /******************************************************/
    capChan = FVID_create("/VP1CAPTURE/A/1", 
            IOM_INPUT, &status, (Ptr)&EVMDM642_vCapParamsChan, NULL);    
                
    /******************************************************/
    /* initialization of display driver                   */
    /******************************************************/
    disChan = FVID_create("/VP2DISPLAY", IOM_OUTPUT, 
        &status, (Ptr)&EVMDM642_vDisParamsChan, NULL);
      
    /******************************************************/
    /* configure video encoder & decoder                  */
    /******************************************************/
    FVID_control(disChan, VPORT_CMD_EDC_BASE + EDC_CONFIG, 
        (Ptr)&EVMDM642_vDisParamsSAA7105);

    FVID_control(capChan, VPORT_CMD_EDC_BASE + EDC_CONFIG, 
        (Ptr)&EVMDM642_vCapParamsTVP51XX);
        

    CACHE_clean(CACHE_L2ALL, 0, 0);        //CSL函数,冲洗Cache

    /******************************************************/
    /* start capture & display operation                  */    
    /******************************************************/
    FVID_control(disChan, VPORT_CMD_START, NULL);

    FVID_control(capChan, VPORT_CMD_START, NULL);
    
    /********************************************************/
    /* request a frame buffer from display & capture driver */
    /********************************************************/
    FVID_alloc(disChan, &disFrameBuf);

    FVID_alloc(capChan, &capFrameBuf);

    frames ++;

    while(1)
    {/* loop forever */
           
        /***************************************************/
        /* copy data from capture buffer to display buffer */
        /***************************************************/
        for(i = 0; i < numLines; i++) 
        {
            yc2rgb16(coeffs, capFrameBuf->frame.iFrm.y1 + i * (capLinePitch),
                capFrameBuf->frame.iFrm.cb1 + (capLinePitch >> 1) * i, 
                capFrameBuf->frame.iFrm.cr1 + (capLinePitch >> 1) * i, 
                disFrameBuf->frame.rpFrm.buf + (disLinePitch << 1) * i, 
                numPixels);
        }//调用函数yc2rgb16,将YCbCr656转化为RGB565,这个函数为TI的汇编代码编写。
        
        FVID_exchange(capChan, &capFrameBuf);    //采集一帧视频

      /*FillFrmBufRGB(&disFrameBuf->frame.rpFrm, 
             EVMDM642_vDisParamsChan.imgHSizeFld1,
             EVMDM642_vDisParamsChan.imgVSizeFld1, 
             frames %(EVMDM642_vDisParamsChan.imgHSizeFld1 >> 3));*/
        //上面这段代码,是VGA显示时,显示七色滚动条的。如果想显示采集的图像,不需这个。

        CACHE_clean(CACHE_L2ALL, 0, 0);
                   
        FVID_exchange(disChan, &disFrameBuf);    //显示一帧视频。
        
        frames ++;             

你可能感兴趣的:(DM642 图像存储)