dm642main.c

来自「上传源码文件为配合SeedVPM642板视频开发」· C语言 代码 · 共 531 行

C
531
字号
/********************************************************************/
/*  Copyright 2004 by SEED Incorporated.							*/
/*  All rights reserved. Property of SEED Incorporated.				*/
/*  Restricted rights to use, duplicate or disclose this code are	*/
/*  granted through contract.									    */
/*  															    */
/********************************************************************/
#include <csl.h>
#include <csl_emifa.h>
#include <csl_i2c.h>
#include <csl_gpio.h>
#include <csl_irq.h>
#include <csl_chip.h>
#include <csl_dat.h>
#include "iic.h"
#include "vportcap.h"
#include "vportdis.h"
#include "sa7121h.h"
#include "TVP51xx.h"
#include "seeddm642.h"
#include "seeddm642_aic23.h"
#include "math.h"

/*SEEDDM642的emifa的设置结构*/
EMIFA_Config Seeddm642ConfigA ={
	   0x00052078,/*gblctl EMIFA(B)global control register value */
	   			  /*将CLK6、4、1使能;将MRMODE置1;使能EK2EN,EK2RATE*/
	   0xffffffd3,/*cectl0 CE0 space control register value*/
	   			  /*将CE0空间设为SDRAM*/
	   0x73a28e01,/*cectl1 CE1 space control register value*/
	   			  /*Read hold: 1 clock;
	   			    MTYPE : 0000,选择8位的异步接口
	   			    Read strobe :001110;14个clock宽度
	   			    TA:2 clock; Read setup 2 clock;
	   			    Write hold :2 clock; Write strobe: 14 clock
	   			    Write setup :7 clock
	   			    --					 ---------------
	   			  	  \		 14c		/1c
	   			 	   \----------------/ */
	   0x22a28a22, /*cectl2 CE2 space control register value*/
       0x22a28a42, /*cectl3 CE3 space control register value*/
	   0x57115000, /*sdctl SDRAM control register value*/
	   0x0000081b, /*sdtim SDRAM timing register value*/
	   0x001faf4d, /*sdext SDRAM extension register value*/
	   0x00000002, /*cesec0 CE0 space secondary control register value*/
	   0x00000002, /*cesec1 CE1 space secondary control register value*/
	   0x00000002, /*cesec2 CE2 space secondary control register value*/
	   0x00000073 /*cesec3 CE3 space secondary control register value*/	
};

/*SEEDDM642的IIC的设置结构*/
I2C_Config SEEDDM642IIC_Config = {
    0,  /* master mode,  i2coar;采用主模式   */
    0,  /* no interrupt, i2cimr;只写,不读,采用无中断方式*/
    (20-5), /* scl low time, i2cclkl;  */
    (20-5), /* scl high time,i2cclkh;  */
    1,  /* configure later, i2ccnt;*/
    0,  /* configure later, i2csar;*/
    0x4ea0, /* master tx mode,     */
            /* i2c runs free,      */
            /* 8-bit data + NACK   */
            /* no repeat mode      */
    (75-1), /* 4MHz clock, i2cpsc  */
};

CHIP_Config SEEDDM642percfg = {
	CHIP_VP2+\
	CHIP_VP1+\
	CHIP_VP0+\
	CHIP_I2C+\
	CHIP_MCASP0
};

I2C_Handle hSeeddm642i2c;
int portNumber;
extern SA7121H_ConfParams sa7121hPAL[45];
extern SA7121H_ConfParams sa7121hNTSC[45];
Uint8 vFromat = 0;
Uint8 misc_ctrl = 0x6D;
Uint8 output_format = 0x47;
// 地址为0 for cvbs port1,选择复合信号做为输入
Uint8 input_sel = 0x00;
/*地址为0xf,将Pin27设置成为CAPEN功能*/	
Uint8 pin_cfg = 0x02;
/*地址为1B*/
Uint8 chro_ctrl_2 = 0x14;
/*图像句柄的声明*/
VP_Handle vpHchannel0;
VP_Handle vpHchannel1;
VP_Handle vpHchannel2;

/*确定图像的参数*/
int numPixels = 720;//每行720个像素
int numLines  = 576;//每帧576行(PAL)


/******************MY CODES***********/
/*寻找亮度范围的函数及其参数声明*/
void FindPosition();
Uint8 intThreshold = 0xd5;
/*确定处理的范围*/
/*A             */
/*              */
/*             D*/ 
int intAPixels =350;
int intALines = 1;
int intDPixels = 370;
int intDLines = 288; 
int min,max,test,blocklength;
/*图象替换的函数及其参数声明*/
int nBlocks=25;
int nBlocksLines=12;
/*基于角度图象替换的函数及其参数声明*/
void VideoCut(int k);
/*基于亮度带图象替换的函数及其参数声明*/
void VideoCutL(int max1,int min1);
/******************************/
/*采集与显示缓冲区的首址*/
Uint32 capYbuffer  = 0x80000000;
Uint32 capCbbuffer = 0x800675c0; 
Uint32 capCrbuffer = 0x8009b0a0;

Uint32 disYbuffer  = 0x80100000;
Uint32 disCbbuffer = 0x801675c0; 
Uint32 disCrbuffer = 0x8019b0a0;
Uint32 tempYbuffer = 0x80200000;   //临时

/*图像格式标志*/
Uint8 NTSCorPAL = 0;
extern far void vectors();
extern volatile Uint32 capNewFrame;
extern volatile Uint32 disNewFrame;

/*设置需打开的音频的句柄*/
SEEDDM642_AIC23_Handle dm642aic23handle0,dm642aic23handle1;
SEEDDM642_AIC23_Config codecstate = SEEDDM642_AIC23_DEFAULTCONFIG;
MCASP_Handle SEEDdm642codec;

Uint32 codecdata[2];
static Uint32 knumber=0; 
static int kk=0;
double sinvale; 
static int *temp;


/*此程序可将四个采集口的数据经过Video Port0送出*/
void main()
{
	Uint8 addrI2C;
	int i;
	int k=0,kCount=1;
 /*产生数据点*/
	int aa,bb;
	
	temp=(int *)0x80300000;
   for(aa=0;aa<4000;aa++)
   {
      
      sinvale=((double)(0x7fff))*sin(3.1415926536898*(aa+2000)/4000.0); 
      bb=sinvale;
      *(temp+aa)=bb;         
   }
   
   for(aa=4000;aa<8000;aa++)
   {        
      *(temp+aa)=-*(temp+aa-4000);         
   }

/*-------------------------------------------------------*/
/* perform all initializations                           */
/*-------------------------------------------------------*/
	/*Initialise CSL,初始化CSL库*/
	CSL_init();
	CHIP_config(&SEEDDM642percfg);
/*----------------------------------------------------------*/
	/*EMIFA的初始化,将CE0设为SDRAM空间,CE1设为异步空间
	 注,DM642支持的是EMIFA,而非EMIF*/
	EMIFA_config(&Seeddm642ConfigA);
/*----------------------------------------------------------*/
	/*中断向量表的初始化*/
	//Point to the IRQ vector table
    IRQ_setVecs(vectors);
    IRQ_nmiEnable();
    IRQ_globalEnable();
    IRQ_map(IRQ_EVT_AXINT0, 10);
    IRQ_map(IRQ_EVT_VINT2, 11);
    IRQ_map(IRQ_EVT_VINT0, 12);
    IRQ_reset(IRQ_EVT_VINT0);
    IRQ_reset(IRQ_EVT_VINT2);
    IRQ_reset(IRQ_EVT_AXINT0);	
    
    /*打开一个数据拷贝的数据通路*/
    DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);	
/*----------------------------------------------------------*/	
	/*进行IIC的初始化*/
	hSeeddm642i2c = I2C_open(I2C_PORT0,I2C_OPEN_RESET);
	I2C_config(hSeeddm642i2c,&SEEDDM642IIC_Config);
/*----------------------------------------------------------*/
	/*进行TVP5150pbs的初始化*/
	/*选择TVP5150,设置第三通路*/
	GPIO_RSET(GPGC,0x0);/*将GPIO0不做为GPINT使用*/
	GPIO_RSET(GPDIR,0x1);/*将GPIO0做为输出*/
	GPIO_RSET(GPVAL,0x1);/*GPIO0输出为高,选择IIC1总线,配置
						   第二路,即为U22*/
	EVMDM642_waitusec(100);
	addrI2C = 0xB8 >>1;
   _IIC_write(hSeeddm642i2c, addrI2C,0x00, input_sel);
   _IIC_write(hSeeddm642i2c, addrI2C,0x03, misc_ctrl);
   _IIC_write(hSeeddm642i2c, addrI2C,0x0D, output_format);
   _IIC_write(hSeeddm642i2c, addrI2C,0x0F, pin_cfg);
   _IIC_write(hSeeddm642i2c, addrI2C,0x1B, chro_ctrl_2);
    /*回读当前摄像设备的格式*/
   _IIC_read(hSeeddm642i2c, addrI2C,0x8c, &vFromat);
    vFromat = vFromat & 0xff;
	switch (vFromat)
	{
		case TVP51XX_NTSCM:
		case TVP51XX_NTSC443:
			NTSCorPAL = 1;/*系统为NTSC的模式*/
			break;
		case TVP51XX_PALBGHIN:
		case TVP51XX_PALM:
			NTSCorPAL = 0;/*系统为PAL的模式*/
			break;
		default:
			NTSCorPAL = 2;/*系统为不支持的模式*/
			break;
	}
	if(NTSCorPAL ==2)
	{
		/*系统不支持的模式,重新配置*/
		for(;;)
		{}
	}  		  
/*----------------------------------------------------------*/	
	/*进行SAA7121H的初始化*/
	GPIO_RSET(GPVAL,0x0);/*GPIO0输出为低,选择IIC1总线,配置图像输出*/						  
	addrI2C = 0xB8 >>1; /*选择第0路的I2C的地址*/
	EVMDM642_waitusec(100);
	/*将第0路的视频输入口的数据口设为高阻状态,
	  使能SCLK,将第27脚设为输入*/
	_IIC_write(hSeeddm642i2c, addrI2C,0x03, 0x1);
	/*配置SAA7121H*/
	GPIO_RSET(GPVAL,0x1);/*GPIO0输出为低,选择IIC1总线,配置图像输出*/
	/*初始化Video Port0*/
	/*将Vedio Port1设为encoder输出*/
	portNumber = 0;
	vpHchannel0 = bt656_8bit_ncfd(portNumber);
	addrI2C = 0x88 >>1;					      
	for(i =0; i<43; i++)
	{
		if(NTSCorPAL == 1)
		{
			_IIC_write(hSeeddm642i2c, 
					   addrI2C,
					   (sa7121hNTSC[i].regsubaddr), 
					   (sa7121hNTSC[i].regvule));
		}
		else
		{
			_IIC_write(hSeeddm642i2c, 
					   addrI2C,
					   (sa7121hPAL[i].regsubaddr), 
					   (sa7121hPAL[i].regvule));	
		}		
	}
/*----------------------------------------------------------*/	
	/*AIC23B的初始化*/
	
	/*配置第一路音频输入*/

	dm642aic23handle0 = EVMDM642_AIC23_open(hSeeddm642i2c,0,&codecstate);
	
	/*配置第二路音频输入*/
	codecstate.regs[SEEDDM642_AIC23_DIGIF] = 0x13;
    codecstate.regs[SEEDDM642_AIC23_SAMPLERATE] = 0x0e;
	dm642aic23handle1 = EVMDM642_AIC23_open(hSeeddm642i2c,1,&codecstate);
			
/*----------------------------------------------------------*/
	/*MCASP的初始化*/
	SEEDdm642codec = SEEDDM642_AIC23_openCodec();
	//IRQ_enable(IRQ_EVT_AXINT0);  
/*----------------------------------------------------------*/	
/*----------------------------------------------------------*/
	/*初始化Video Port1*/
	/*将Vedio Port2设为采集输入*/
	portNumber = 2;
	vpHchannel1 = bt656_8bit_ncfc(portNumber);
	bt656_capture_start(vpHchannel1);
	/*等待第一帧数据采集完成*/
	while(capNewFrame == 0){}
	/*将数据存入显示缓冲区,并清采集完成的标志*/
	capNewFrame =0;
	for(i=0;i<numLines;i++)
	{
		/*传送临时Y缓冲区*/
		DAT_copy((void *)(capYbuffer + i * numPixels), 
	             (void *)(tempYbuffer + i * numPixels),
	             numPixels);			  
	 }
	 for(i=0;i<0x33ae0;i++)
	{
	    *((Uint8 *)(disCrbuffer +i)) =0x80;
	    *((Uint8 *)(disCbbuffer +i)) =0x80;

	}
	 
	for(i=0;i<numLines;i++)
	{
		/*传送Y缓冲区*/
		DAT_copy((void *)(tempYbuffer + i * numPixels), 
	            (void *)(disYbuffer + i * numPixels),
	             numPixels);   
	}
//	for(i=0;i<numLines;i++)
//	{
		/*传送Y缓冲区*/
//		DAT_copy((void *)(capYbuffer + i * numPixels), 
//	             (void *)(disYbuffer + i * numPixels),
//	             numPixels);
	    /*传送Cb缓冲区*/
//	    DAT_copy((void *)(capCbbuffer + i * (numPixels >> 1)), 
//	             (void *)(disCbbuffer + i * (numPixels >> 1)),
//	            numPixels>>1);
		/*传送Cr缓冲区*/
//	    DAT_copy((void *)(capCrbuffer + i * (numPixels >> 1)), 
//	             (void *)(disCrbuffer + i * (numPixels >> 1)),
//	             numPixels>>1);
//	 }
	/*启动显示模块*/
	bt656_display_start(vpHchannel0);
	/*建立显示的实时循环*/

	
	for(;;)
	{
		/*当采集区的数据已经采集好,而显示缓冲区的数据已空*/
		if((capNewFrame == 1)&&(disNewFrame == 1))
		{
			/*将数据装入显示缓冲区,并清采集完成的标志*/
			capNewFrame =0;
			disNewFrame =0;	
			k=knumber/160;
			
	      FindPosition();
	      blocklength=max-min;
		
			kCount++;
			if(kCount==2)
			{
		
			kCount=0;
			}
		    VideoCutL(max,min);
	        for(i=0;i<numLines;i++)
			{
				/*传送Y缓冲区*/
			    DAT_copy((void *)(tempYbuffer + i * numPixels), 
			             (void *)(disYbuffer + i * numPixels),
			             numPixels);			 
				/*传送Y缓冲区*/
			//	DAT_copy((void *)(capYbuffer + i * numPixels), 
			 //            (void *)(disYbuffer + i * numPixels),
			 //            numPixels);
			    /*传送Cb缓冲区*/
			 //   DAT_copy((void *)(capCbbuffer + i * (numPixels >> 1)), 
			 //            (void *)(disCbbuffer + i * (numPixels >> 1)),
			 //            numPixels>>1);
				/*传送Cr缓冲区*/
			  //  DAT_copy((void *)(capCrbuffer + i * (numPixels >> 1)), 
			  //           (void *)(disCrbuffer + i * (numPixels >> 1)),
			  //           numPixels>>1);
			 }
		}
		
	}
	
//	for(;;)
//	{}
/*----------------------------------------------------------*/
	/*采集与回放*/	
}    


interrupt void McaspTrIsr(void)
{
	IRQ_disable(IRQ_EVT_AXINT0);
	
	codecdata[0] = MCASP_RGETH(SEEDdm642codec,RBUF1);
	MCASP_RSETH(SEEDdm642codec,XBUF0,codecdata[0]);
	
	codecdata[1] = MCASP_RGETH(SEEDdm642codec,RBUF3);
	MCASP_RSETH(SEEDdm642codec,XBUF2,*(temp+knumber));
    
     kk++;  
			  
	if(kk==12)
			  
	{             
	    knumber++;
    	kk=0;    
 
	}

 									
	if(knumber==8000)
	{			
	  knumber=0;
	}
						

  
 IRQ_enable(IRQ_EVT_AXINT0);  
}
 


/*图象分割*/
 
    /*  
void VideoCut(int k)
{   
 
    int i=0;
    int m=0;   
   
   
    if(k<nBlocks)
    
    //区域奇数行//
	{
	for(i=0;i<nBlocksLines;i++)
			{
				
				DAT_copy((void *)(capYbuffer+k*nBlocksLines*numPixels + i * numPixels), 
			             (void *)(tempYbuffer +k*nBlocksLines*numPixels+i * numPixels),
			             numPixels);			   
			 }
			 
	//区域偶数行//		 
	for(i=numLines/2;i<numLines/2+nBlocksLines;i++)
			{
				
				DAT_copy((void *)(capYbuffer+k*nBlocksLines*numPixels+i * numPixels), 
			             (void *)(tempYbuffer+k*nBlocksLines*numPixels+i * numPixels),
			            numPixels);			   
			 }
	//k++;
	}
	
	    if(k>=nBlocks)
    
    //区域奇数行//
	{
	m=2*nBlocks-k-1;
	for(i=0;i<nBlocksLines;i++)
			{
			
				DAT_copy((void *)(capYbuffer+m*nBlocksLines*numPixels + i * numPixels), 
			             (void *)(tempYbuffer +m*nBlocksLines*numPixels+i * numPixels),
			             numPixels);			   
			 }
			 
	//区域偶数行//		 
	for(i=numLines/2;i<numLines/2+nBlocksLines;i++)
			{
				
				DAT_copy((void *)(capYbuffer+m*nBlocksLines*numPixels+i * numPixels), 
			             (void *)(tempYbuffer+m*nBlocksLines*numPixels+i * numPixels),
			            numPixels);			   
			 }
	}

}
 */	
 
/*****进行阈值分割处理*********/
void FindPosition()
{
	int i,j;
	max=0;
	min=0;
	test=0;
	
	//方框内奇数行
	for(i=intALines;i<intDLines;i++)
	{
	    for(j=intAPixels;j<intDPixels;j++) 
	    {
	        *(Uint8 *)(capYbuffer + i*numPixels + j) = *(Uint8 *)(capYbuffer + i*numPixels + j)<intThreshold?0x00:0xFF;
	    	/*找出亮度最大的区间*/			
	         
	             if(*(Uint8 *)(capYbuffer + i*numPixels + j) == 0xFF)
	             {
	             test=i;
	             if(min==0)
	             {min=test;}             
	             max=max>test?max:test;
	             
	             }
	          	 
    	    
	    }	 
	}

}


void VideoCutL(int max1,int min1 )
{
    int BlockStartLine,i;
    BlockStartLine=(max1+min1)/2-6;      
	
	for(i=0;i<nBlocksLines;i++)
			{
			
				DAT_copy((void *)(capYbuffer+BlockStartLine*numPixels + i * numPixels), 
			             (void *)(tempYbuffer +BlockStartLine*numPixels+i * numPixels),
			             numPixels);			   
			 }
			 
	for(i=numLines/2;i<numLines/2+nBlocksLines;i++)
			{
				
				DAT_copy((void *)(capYbuffer+BlockStartLine*numPixels+i * numPixels), 
			             (void *)(tempYbuffer+BlockStartLine*numPixels+i * numPixels),
			            numPixels);			   
			 }	
	
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?