⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dm642main.c

📁 在CCS环境下的一个视频采集源代码
💻 C
字号:
/********************************************************************/
/*  				DM642 Video Processing Code					    */
/*  										HITSGS Soc Center	    */
/*  												2007-8-15	    */
/********************************************************************/
#include <csl.h>
#include <csl_emifa.h>
#include <csl_gpio.h>
#include <csl_irq.h>
#include <csl_chip.h>
#include <csl_dat.h>
#include <csl_timer.h>

#include "defines.h"
#include "seeddm642.h"
#include "DM642_RTDX.h"
#include "menu.h"
#include "iic.h"
#include "vportcap.h"
#include "vportdis.h"
#include "TVP51xx.h"
#include "saa7105.h"   
#include "PixelProc.h"

//----------------------------------------------------------
// base system
I2C_Handle VPDM642IIC;
EDC_Handle SAA7105;
GPIO_Handle hGPIO;
TIMER_Handle hTimer;

// system operation & control 
System_Status sys_stat = Throughput;
System_Status sys_stat_prev;
UserSettings us;
Packet packet;
//----------------------------------------------------------

// timer related variables
signed int TimerCntPrev;
signed int TimerCnt = 0;

// critical signal
Uint8 CriticalProcess = 0;
Uint8 CriticalIIC = 0;

// uniform variables for temporary usage
int i = 0;
int j = 0;

//----------------------------------------------------------
// current video format [NTSC/PAL/etc.]
Uint8 NTSCorPAL = 0;
// video port handles
VP_Handle vpHchannel0;
VP_Handle vpHchannel1;
VP_Handle vpHchannel2;
//----------------------------------------------------------

//----------------------------------------------------------
// EDMA transfer counter
extern volatile Uint32 capNewFrame;
extern volatile Uint32 disNewFrame;
//----------------------------------------------------------

//----------------------------------------------------------
// IIC Address
const Uint8 TVP5150_I2C_ADDR = 0xB8;	// TVP5150 IIC Address
const Uint8 SAA7105H_I2C_ADDR = 0x88;	// SAA7105 IIC Address
const Uint8 EEPROMAddr = 0xA0;			// EEPROM IIC Address
const Uint8 ATMegaAddr = 0xCC;			// mega88 MCU IIC Address
Uint8 addrI2C;
//----------------------------------------------------------

//----------------------------------------------------------
// TVP5150 config parameters
Uint8 vFromat = 0;

Uint8 input_sel = 0x00;				// address at 0x00
Uint8 misc_ctrl = 0x6D;				// address at 0x03
Uint8 output_format = 0x47;			// address at 0x0D
Uint8 pin_cfg = 0x02;				// address at 0x0F, Pin27 for CAPEN
Uint8 chro_ctrl_2 = 0x14;			// address at 0x1B
//----------------------------------------------------------

//----------------------------------------------------------
// SAA7105 config parameters
SAA7105_ConfParams SAA7105cfg = {
  SAA7105_AFMT_COMPOSITE,
  SAA7105_MODE_NTSC720,
  SAA7105_IFMT_YCBCR422_INTERLACED,
  TRUE,								// bool enableSlaveMode
  TRUE,								// bool enableBT656Sync
  NULL,                  			// handleI2C
};  
//----------------------------------------------------------

Uint32 srcYbuffer  = 0;
Uint32 srcCbbuffer = 0; 
Uint32 srcCrbuffer = 0;

//------------------------------------------------------------------
//FxnImagProcess
//------------------------------------------------------------------
void FxnImagProcess()
{
	SourceAddrType gChooseSrcAddr;

	CriticalProcess = 1;

	switch(sys_stat){
	case Throughput:			// direct display
		gChooseSrcAddr = CaptureAddr;
		break;

	case Freeze:				// freezed picture
		savePic_down(disYbuffer, tempYbuffer1,
		        disCrbuffer, tempCrbuffer1,
		        disCbbuffer, tempCbbuffer1);
		gChooseSrcAddr = TemporaryAddr;
		break;
	
	case Save:					// save the picture which was freezed
		savePic_down(disYbuffer, imageYbuffer(us.CurrentPos-1),
		        disCrbuffer, imageCrbuffer(us.CurrentPos-1),
		        disCbbuffer, imageCbbuffer(us.CurrentPos-1));
		gChooseSrcAddr = StorageAddr;
		break;

	case Mirror:				// mirror processing
		MirrorPic(imageYbuffer(us.CurrentPos-1), tempYbuffer1,
				  imageCrbuffer(us.CurrentPos-1), tempCrbuffer1,
	              imageCbbuffer(us.CurrentPos-1), tempCbbuffer1);
		gChooseSrcAddr = TemporaryAddr;
		break;

	case Flip:					// flip processing
		FlipPic(imageYbuffer(us.CurrentPos-1), tempYbuffer1,
				imageCrbuffer(us.CurrentPos-1), tempCrbuffer1,
	            imageCbbuffer(us.CurrentPos-1), tempCbbuffer1);
		gChooseSrcAddr = TemporaryAddr;
		break;

	case Replay:				// replay pictures which was saved
		gChooseSrcAddr = StorageAddr;
		break;

	case Invert:				// inverse processing
		InvertPic(imageYbuffer(us.CurrentPos-1), tempYbuffer1,
				  imageCrbuffer(us.CurrentPos-1), tempCrbuffer1,
	              imageCbbuffer(us.CurrentPos-1), tempCbbuffer1);
		gChooseSrcAddr = TemporaryAddr;
		break;

	case Combine:				// multipictures display
		i = us.MP_num[us.MP_index-1];

		savePic(imageYbuffer(i-1), tempYbuffer2,
				imageCrbuffer(i-1), tempCrbuffer2,
	            imageCbbuffer(i-1), tempCbbuffer2);

		MultiPic4(tempYbuffer2, tempYbuffer1,
				 tempCrbuffer2, tempCrbuffer1,
	             tempCbbuffer2, tempCbbuffer1);
		gChooseSrcAddr = TemporaryAddr;
		break;
	}
	
	// check register to change the src address
	if (gChooseSrcAddr == TemporaryAddr){
		srcYbuffer = tempYbuffer1;
		srcCbbuffer = tempCbbuffer1;
		srcCrbuffer = tempCrbuffer1;
	}
	else if (gChooseSrcAddr == StorageAddr){
		srcYbuffer = imageYbuffer(us.CurrentPos-1);
		srcCbbuffer = imageCbbuffer(us.CurrentPos-1);
		srcCrbuffer = imageCrbuffer(us.CurrentPos-1);
	}
	else{
		srcYbuffer = capYbuffer;
		srcCbbuffer = capCbbuffer;
		srcCrbuffer = capCrbuffer;
	}

	CriticalProcess = 0;
}

void LoopTick()
{
	if (sys_stat == sys_stat_prev){
		if (us.uptodate == 1 ){
			FxnImagProcess();
			us.uptodate = 0;
		}
	}
	else{
		if (sys_stat_prev == Combine)		// leave combine status
			us.MP_index = 0;

		FxnImagProcess();	
		sys_stat_prev = sys_stat;
	}
}

// entry point
void main()
{
//----------------------------------------------------------
//	CSL Initialization
//----------------------------------------------------------
	TSK_disable();
	CSL_init();
	CHIP_config(&SEEDDM642percfg);
	
//----------------------------------------------------------
//	EMIFA Initialization
//----------------------------------------------------------
	EMIFA_config(&Seeddm642ConfigA);

//----------------------------------------------------------
//	Interrupt Vector Initialization
//----------------------------------------------------------
    IRQ_nmiEnable();
    IRQ_globalEnable();
    DAT_open(DAT_CHAANY, DAT_PRI_LOW, 0);	    // open a channel for data copy

//----------------------------------------------------------
//	IIC Initialization
//----------------------------------------------------------
	VPDM642IIC = I2C_open(I2C_PORT0,I2C_OPEN_RESET);
	I2C_config(VPDM642IIC,&SEEDDM642IIC_Config);
	
//----------------------------------------------------------
//  GPIO Initialization
//----------------------------------------------------------
	hGPIO = GPIO_open(GPIO_DEV0,GPIO_OPEN_RESET);
	GPIO_config(hGPIO,&MyGPIOConfig);

//----------------------------------------------------------
//  TIMER Initialization
//----------------------------------------------------------
	hTimer = TIMER_open(TIMER_DEV1,TIMER_OPEN_RESET);
	TIMER_config(hTimer,&MyTIMERConfig);
	TIMER_start(hTimer);

//----------------------------------------------------------
//  MENU & System Status Initialization
//----------------------------------------------------------
	InitMenu();
	sys_stat = Throughput;
		
//----------------------------------------------------------
//	TVP5150 Initialization
//----------------------------------------------------------
	// TVP5150 IIC Address
	addrI2C = TVP5150_I2C_ADDR >>1;
	// TVP5150 Configuration
    SEED_IIC_write(VPDM642IIC, addrI2C,0x00, input_sel);//00
    SEED_IIC_write(VPDM642IIC, addrI2C,0x03, misc_ctrl);//6d
    SEED_IIC_write(VPDM642IIC, addrI2C,0x0D, output_format);//47
    SEED_IIC_write(VPDM642IIC, addrI2C,0x0F, pin_cfg);//02
    SEED_IIC_write(VPDM642IIC, addrI2C,0x1B, chro_ctrl_2);//14
    // read back the current TVP5150 video format
    SEED_IIC_read(VPDM642IIC, addrI2C,0x8c, &vFromat);
    vFromat = vFromat & 0xff;
	switch (vFromat){
		case TVP51XX_NTSCM:
		case TVP51XX_NTSC443:
			NTSCorPAL = 1;			// NTSC Mode
			break;
		case TVP51XX_PALBGHIN:
		case TVP51XX_PALM:
			NTSCorPAL = 0;			// PAL Mode
			break;
		default:
			NTSCorPAL = 2;			// Unsopported Mode
			break;
	}
	if(NTSCorPAL ==2){
		// Unsopported Mode, system halted
		for(;;);
	} 

//----------------------------------------------------------
//	SAA7105 Initialization
//----------------------------------------------------------
	// fill the structure for config
	SAA7105cfg.hI2C = VPDM642IIC;

	// call the EDC functions to config the device
	SAA7105 = SAA7105_Fxns.open("SAA7105 Device",0);
	SAA7105_Fxns.ctrl(SAA7105,EDC_CONFIG, (Arg)&SAA7105cfg);

	//addrI2C = SAA7105H_I2C_ADDR >> 1;
    //SEED_IIC_read(VPDM642IIC, addrI2C,0xFD, &vFromat);

//-----------------------------------------------------
//	Video Port 1 Initialization
//----------------------------------------------------------
	// set VP1 as SAA7105 CVBS output
	vpHchannel1 = bt656_8bit_ncfd(1);

//----------------------------------------------------------
//	Video Port 2 Initialization
//----------------------------------------------------------
	// set VP2 as TVP5150 CVBS input
	vpHchannel2 = bt656_8bit_ncfc(2);
	bt656_capture_start(vpHchannel2);
	
//----------------------------------------------------------
//	Capture one frame and start display
//----------------------------------------------------------
	while(capNewFrame == 0){}
	capNewFrame =0;
	savePic(capYbuffer, disYbuffer, 
		    capCrbuffer, disCrbuffer, 
            capCbbuffer, disCbbuffer);

	// start display procedure
	bt656_display_start(vpHchannel1);


//----------------------------------------------------------
//	Set image source buffer
//----------------------------------------------------------
	srcYbuffer = capYbuffer;
	srcCbbuffer = capCbbuffer;
	srcCrbuffer = capCrbuffer;

//----------------------------------------------------------
//	Capture and Display
//----------------------------------------------------------
	TSK_enable();
}


void tskVideoLoopback()
{
	j++;
	while(1){
		LoopTick();
		// capture buffer is ready while display buffer is empty
 		if (capNewFrame == 1 && disNewFrame == 1){
			// transfer data into display buffer and clear the done signal
			capNewFrame = 0;
			disNewFrame = 0;

			savePic(srcYbuffer, disYbuffer, 
				    srcCrbuffer, disCrbuffer, 
		            srcCbbuffer, disCbbuffer);

		}
	}
}

void tskGpioCheck()
{
	KeyName GPIOPIN;
	Uint32 temp = 0;

	CriticalIIC = 1;
	temp = GPIO_read(hGPIO,0xFFFF);

	if (!(temp & GPIO_PIN1)) GPIOPIN = KEY_Throughput;
	if (!(temp & GPIO_PIN2)) GPIOPIN = KEY_Mirror;
	if (!(temp & GPIO_PIN6)) GPIOPIN = KEY_UP;
	if (!(temp & GPIO_PIN7)) GPIOPIN = KEY_Invert;
	if (!(temp & GPIO_PIN10)) GPIOPIN = KEY_Freeze;
	if (!(temp & GPIO_PIN11)) GPIOPIN = KEY_Save;
	if (!(temp & GPIO_PIN12)) GPIOPIN = KEY_Replay;
	if (!(temp & GPIO_PIN13)) GPIOPIN = KEY_Combine;
	if (!(temp & GPIO_PIN14)) GPIOPIN = KEY_DOWN;
	if (!(temp & GPIO_PIN15)) GPIOPIN = KEY_Flip;



	if (temp != 0xFED6){	
		
		// add timer to advoid IIC problem.
		TimerCntPrev = TIMER_getCount(hTimer);

		if( (TimerCntPrev-TimerCnt)>TIMERCNT ){
			// process menu input at not critical period
			if (CriticalProcess == 0){
				TickMenu(GPIOPIN);
				// notify slave
				addrI2C = ATMegaAddr>>1;
				Mega88_IIC_write(VPDM642IIC, addrI2C, packet.type, packet.data);
			}
		} 
		else if( (TimerCntPrev-TimerCnt) < 0 ){
			if( (0xFFFFFFFF-TimerCnt+TimerCntPrev)>TIMERCNT ){
				// process menu input at not critical period
				if (CriticalProcess == 0){
					TickMenu(GPIOPIN);
					// notify slave
					addrI2C = ATMegaAddr>>1;
					Mega88_IIC_write(VPDM642IIC, addrI2C, packet.type, packet.data);
				}
			}	
		}

		TimerCnt = TIMER_getCount(hTimer);
	}
	CriticalIIC = 0;
}


//----------------------------------------------------------
//EEPROM Read and Write
//----------------------------------------------------------
//	addrI2C = EepromAdd>>1;
//	Eeprom_IIC_write(VPDM642IIC, addrI2C, 0x20, 0x30, 0x00);
//	Eeprom_IIC_read(VPDM642IIC, addrI2C, 0x20, 0x30, &vFromat);

⌨️ 快捷键说明

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