本人使用的dm6437的开发板下有一个程序video_loopback。今天要做一个详细的分析。来看看其中的门道。
我的目的:
1.打算使用video_loopback程序修改它成为我所用的程序。(加上我的算法)
2.将之改造测试我的算法的一个程序。
如何来做:
我先来分析程序的结构一步一步的找到一些蛛丝马迹。呵呵。自顶向下!!!现在用到了。
1.打开video_loopback工程,在source目录里面有三个文件:main.c,tvp5164.c,vodeo_loopback_test.c
省去一些步骤,直接到video_loopback_test.c,看下面的代码:
/* Setup Front-End */
tvp5146_init( ntsc_pal_mode, output_mode ); //初始化5146芯片
vpfe_init( ntsc_pal_mode ); //初始化前端
/* Setup Back-End */
vpbe_init( LOOPBACK, ntsc_pal_mode, output_mode );
//程序看起来很简单
/* Wait for the USER to press something useful */
//在这里可以加上自己的算法程序来处理图像。在前段处理完成显示之前来处理!(这里需要我测试的,现在只是理论。)
while ( 1 )
{
EVMDM6437_I2C_GPIO_waitForIntr( -1 ); //等待外部中断来处理
/*
if ( EVMDM6437_DIP_get( JP1_JUMPER ) != ntsc_pal_mode )
break;
if ( EVMDM6437_DIP_get( SW7_SWITCH ) != output_mode )
break;*/ //zq change
}
问题:如何抓取一张图片?(现在还不知道,但是方向有了,就是研究vpfe_init这个函数)
看看下面的代码:
static void vpfe_init( Uint32 ntsc_pal_mode )
{
Uint32 video_buffer = DDR_BASE + ( DDR_SIZE / 2 );//在这里我们看到了video_buffer这就是图像数据缓冲区这里除以2的原因据我分析是后一半的内存开始
Uint32 width;
Uint32 height;
if ( ntsc_pal_mode == NTSC )
{
width = 720;
height = 480;
}
else
{
width = 720;
//height = 480;
height = 576; //zq change
}
VPFE_CCDC_SYN_MODE = 0x00032F84; // interlaced, with VD pority as negative
VPFE_CCDC_HD_VD_WID = 0;
VPFE_CCDC_PIX_LINES = 0x02CF020D;
/*
* sph = 1, nph = 1440, according to page 32-33 of the CCDC spec
* for BT.656 mode, this setting captures only the 720x480 of the
* active NTSV video window
*/
VPFE_CCDC_HORZ_INFO = width << 1; // Horizontal lines
VPFE_CCDC_HSIZE_OFF = width << 1; // Horizontal line offset
VPFE_CCDC_VERT_START = 0; // Vertical start line
VPFE_CCDC_VERT_LINES = height >> 1; // Vertical lines
VPFE_CCDC_CULLING = 0xFFFF00FF; // Disable cullng
/*
* Interleave the two fields
*/
VPFE_CCDC_SDOFST = 0x00000249;
VPFE_CCDC_SDR_ADDR = video_buffer;
VPFE_CCDC_CLAMP = 0;
VPFE_CCDC_DCSUB = 0;
VPFE_CCDC_COLPTN = 0xEE44EE44;
VPFE_CCDC_BLKCMP = 0;
VPFE_CCDC_FPC_ADDR = 0x86800000;
VPFE_CCDC_FPC = 0;
VPFE_CCDC_VDINT = 0;
VPFE_CCDC_ALAW = 0;
VPFE_CCDC_REC656IF = 0x00000003;
/*
* Input format is Cb:Y:Cr:Y, w/ Y in odd-pixel position
*/
VPFE_CCDC_CCDCFG = 0x00000800;
VPFE_CCDC_FMTCFG = 0;
VPFE_CCDC_FMT_HORZ = 0x000002D0;
VPFE_CCDC_FMT_VERT = 0x0000020E;
VPFE_CCDC_FMT_ADDR0 = 0;
VPFE_CCDC_FMT_ADDR1 = 0;
VPFE_CCDC_FMT_ADDR2 = 0;
VPFE_CCDC_FMT_ADDR3 = 0;
VPFE_CCDC_FMT_ADDR4 = 0;
VPFE_CCDC_FMT_ADDR5 = 0;
VPFE_CCDC_FMT_ADDR6 = 0;
VPFE_CCDC_FMT_ADDR7 = 0;
VPFE_CCDC_PRGEVEN_0 = 0;
VPFE_CCDC_PRGEVEN_1 = 0;
VPFE_CCDC_PRGODD_0 = 0;
VPFE_CCDC_PRGODD_1 = 0;
VPFE_CCDC_VP_OUT = 0x041A2D00;
VPFE_CCDC_PCR = 0x00000001; // Enable CCDC
}
看看上面这些定义就有点晕!!!
联系客服