📄 dm642main.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 + -