📄 videosourceswitch.c
字号:
#include "Common.h"
#include "Global.h"
#include "ICControl.h"
#include "VideoSourceSwitch.h"
#include "System.h"
#include "SRC_ctrl.h"
#include "TWICreg.h"
#include "Timer0.h"
#include "TxxInitTable.h"
#include "VideoDetect.h"
Source code uiaSrcMux1[]={
{0x0100, itypeCVBS, isrcVIDEO },
{0x1406, itypeSVIDEO, isrcVIDEO },
#ifdef PC_MODE
{0x2A24, itypeRGB, isrcANALOG },
#endif
#ifdef YPbPr
{0x2824, itypeYPBPR, isrcVIDEO },
#endif
#ifdef DIGI_AVAILABLE
{0x0100, itypeRGB565, isrcDIGITAL },
{0x2824, itype656, isrcDIGITAL },
#endif
};
void SourceSelect(void)
{
ClosePanel(0x10, 0xff, 0x40); // blue screen
if((EepPublic.cSource==0)||(uiaSrcMux1[EepPublic.cSource].VideoType==itypeRGB565)||(uiaSrcMux1[EepPublic.cSource].VideoType==itypeSVIDEO))
{
SetSignalStd(); //set the chroma and the comb filter
SetOPTiming(); //set the scaler,line buffer,output PLL,display window
}
IC_WritByte(TWIC_P0,0x0f,0x70); //for position shift,ADC Power Down Control
IC_WritByte(TWIC_P0,0x0f,0x00); //for position shift
IC_WritByte(TWIC_P0,0x31,0x00); //Source Select Reg, Clear All.
IC_WritByte(TWIC_P0,0x1a, 0x87); //ADC Analog AGC Selection,dynamic gain
if(uiaSrcMux1[EepPublic.cSource].SourceRoute==isrcVIDEO)
{
IC_WritByte(TWIC_P0,0x10, IC_ReadByte(TWIC_P0, 0x10)&~0x10);
IC_WritByte(TWIC_P0,0x18, uiaSrcMux1[EepPublic.cSource].ADCMUX>>8); // cMux1);
IC_WritByte(TWIC_P0,0x19, uiaSrcMux1[EepPublic.cSource].ADCMUX&0xFF); // cMux2);
IC_WritByte(TWIC_P0,0x31, 0x04); //Select VD input
if(uiaSrcMux1[EepPublic.cSource].VideoType==itypeSVIDEO)
{
IC_WritByte(TWIC_P0,0x11, 0x0d);
IC_WritByte(TWIC_P2,0x07, 0x06|0x20);
IC_WritByte(TWIC_P2,0x00, IC_ReadByte(TWIC_P2,0x00)|0x01);
IC_WritByte(TWIC_P2,0x01, IC_ReadByte(TWIC_P2,0x01)&~ENYPbPr);
IC_WritByte(TWIC_P0,0x16, 0xD3); //Line Lock PLL Divider Reg
IC_WritByte(TWIC_P2,0x03, IC_ReadByte(TWIC_P2,0x03)|0x03);
IC_WritByte(TWIC_P0,0x17, 0x4C); // kenny 20060627
twdDelay(500);
//m_cBuff[0]= IC_ReadByte(TWIC_P2, 0x3A);
//if((m_cBuff[0]&0x06)==0x06)
if((IC_ReadByte(TWIC_P2, 0x3A)&0x06)==0x06)
{
NoSignal=0;
if(m_bPanelClose==1) //sm061011
OpenPanel();
}
}
else if((uiaSrcMux1[EepPublic.cSource].VideoType==itypeCVBS))
{ // CVBS
if(EepPublic.cSource==1)
IC_WritByte(TWIC_P0,0x11, 0x08);
else if(EepPublic.cSource==2)
IC_WritByte(TWIC_P0,0x11, 0x04);
else if(EepPublic.cSource==3)
IC_WritByte(TWIC_P0,0x11, 0x00);
IC_WritByte(TWIC_P2,0x07, 0x21);//0x05|0x22);
IC_WritByte(TWIC_P2,0x00, IC_ReadByte(TWIC_P2,0x00)&0xfe);
IC_WritByte(TWIC_P2,0x01, IC_ReadByte(TWIC_P2,0x01)&~ENYPbPr);
IC_WritByte(TWIC_P0,0x16, 0xD3);//Line Lock PLL Divider Reg
IC_WritByte(TWIC_P2,0x07, 0x02|0x20);
if(m_cChroma==S_NTSC_4)
IC_WritByte(TWIC_P2,0x03, IC_ReadByte(TWIC_P2,0x03)&0xf8|0x03);
else
IC_WritByte(TWIC_P2,0x03, IC_ReadByte(TWIC_P2,0x03)&0xfc);
twdDelay(500);
if((IC_ReadByte(TWIC_P2, 0x3A)&0x06)==0x06)
{
NoSignal=0;
if(m_bPanelClose==1) //sm061011
OpenPanel();
}
}
else if (uiaSrcMux1[EepPublic.cSource].VideoType==itypeYPBPR)
{
IC_WritByte(TWIC_P0,0x11, 0x55);
IC_WritByte(TWIC_P2,0x07, 0x20);
IC_WritByte(TWIC_P2,0x01, IC_ReadByte(TWIC_P2,0x01)|ENYPbPr);
}
}
else if(uiaSrcMux1[EepPublic.cSource].SourceRoute==isrcANALOG) //rouce route videodecoder
{
IC_WritByte(TWIC_P0,0x18, uiaSrcMux1[EepPublic.cSource].ADCMUX>>8); // cMux1);
IC_WritByte(TWIC_P0,0x19, uiaSrcMux1[EepPublic.cSource].ADCMUX&0xFF); // cMux2);
IC_WritByte(TWIC_P2,0x07, 0x06&~0x20);
if (uiaSrcMux1[EepPublic.cSource].VideoType==itypeRGB)
{
IC_WritByte(TWIC_P0,0x16, 0x00);
IC_WritByte(TWIC_P0,0x31, 0x08); //Select SDC RGB, SOY input.
IC_WritByte(TWIC_P0,0x40, 0xC2);
IC_WritByte(TWIC_P0,0x17, 0xC8);
IC_WritByte(TWIC_P0,0x1A, IC_ReadByte(TWIC_P0,0x1A)&0xF8);
//~ Enable Interrupt ~//
IC_WritByte(TWIC_P0,0x33, 0xB0);
IC_WritByte(TWIC_P0,0x32, 0xFF);
IC_WritByte(TWIC_P0,0x37, 0x40);
IC_WritByte(TWIC_P0,0x39, 0x10);
twdDelay(50); // For H/W stable.
}
}
#ifdef DIGI_AVAILABLE
else if(uiaSrcMux1[EepPublic.cSource].SourceRoute==isrcDIGITAL)
{
if (uiaSrcMux1[EepPublic.cSource].VideoType==itypeRGB565)
{
IC_WritByte(TWIC_P0,0x16, 0xD3);
IC_WritByte(TWIC_P0,0x40, 0xC2);
IC_WritByte(TWIC_P0,0x17, 0xC8);
IC_WritByte(TWIC_P0,0xfe, 0x58);
SRC_565();
}else if (uiaSrcMux1[EepPublic.cSource].VideoType==itype656)
{
IC_WritByte(TWIC_P0,0xfe, 0xa8);
SRC_656();
}
}
#endif
if(uiaSrcMux1[EepPublic.cSource].SourceRoute!=isrcVIDEO)
Detect_Sig(1); //tune sound control 20060809
twdDelay(500);
IC_WritByte(TWIC_P0, 0xE2, 0x11);
}
/* S E T S I G N A L S T D */
/*-------------------------------------------------------------------------
set chroma agc(P20x0c),chroma DTO increment0,1,2,3,(P20x18,19,1a,1b)
and Comb Filter Configuration(P20x82)
-------------------------------------------------------------------------*/
void SetSignalStd(void)
{
uCHAR RegIdx,ValIdx;//ruby,ChromaIdx;
IC_WritByte(TWIC_P2, 0x3f, 0x01); // reset comb filter //add by Sherman 06'01'16
ValIdx=m_cChroma*SignalStdRegP2Cnt; // S_NTSC=0x00
for (RegIdx=0; RegIdx<SignalStdRegP2Cnt; RegIdx++, ValIdx++){
IC_WritByte(TWIC_P2, ucaSignalStdRegP2[RegIdx], ucaSignalStdValP2[ValIdx]);
}
twdDelay(100);
IC_WritByte(TWIC_P2, 0x3f, 0x00);
SetIPVideoType();
}
/* S E T O P T I M I N G */
/*-------------------------------------------------------------------------
set the scaler,line buffer,output PLL,display window
-------------------------------------------------------------------------*/
void SetOPTiming(void)
{
if((m_cStandard==S_NTSC)||(m_cStandard==S_NTSC_4)||(m_cStandard==S_PAL_M))
{
// kenny 20060512 ====================================================
m_cBuff[0]=0;
m_cBuff[1]=stInitOUT_T[0].ucRegAdr;
while (m_cBuff[1] != 0xBF)
{
IC_WritByte(TWIC_P0,m_cBuff[1],stInitOUT_T[m_cBuff[0]].ucRegVal);
m_cBuff[1]=stInitOUT_T[++m_cBuff[0]].ucRegAdr;
}
//kenny 20060721
#ifdef TCON
IC_WritByte(TWIC_P0, 0xe0, IC_ReadByte(TWIC_P0,0xe0)|0x01);// 0xb9);
#else
//kenny 20060721
IC_WritByte(TWIC_P0, 0xe0, IC_ReadByte(TWIC_P2,0xe0)&~0x01);// 0xb9);
#endif
IC_WritByte(TWIC_P0, 0xe2, 0x11);
// kenny 20060512 ====================================================
//m_wBuff[1]=(uWORD)(m_cScaleratio)*P0ScaleAdrCnt;
m_wBuff[1]=0*P0ScaleAdrCnt;
for (m_wBuff[0]=0; m_wBuff[0]<P0ScaleAdrCnt; m_wBuff[0]++, m_wBuff[1]++){
IC_WritByte(TWIC_P0, ucaZoomAdrP0[m_wBuff[0]], ucaZoomDataP0_NTSC[m_wBuff[1]]);
}
//m_wBuff[1]=(uWORD)(m_cScaleratio)*P2ScaleAdrCnt;
m_wBuff[1]=0*P2ScaleAdrCnt;
for (m_wBuff[0]=0; m_wBuff[0]<P2ScaleAdrCnt; m_wBuff[0]++, m_wBuff[1]++){
IC_WritByte(TWIC_P2, ucaZoomAdrP2[m_wBuff[0]], ucaZoomDataP2_NTSC[m_wBuff[1]]);
}
#ifdef SimulateSTH
m_wBuff[1]=m_cScaleratio*P1ScaleAdrCnt;
for (m_wBuff[0]=0; m_wBuff[0]<P1ScaleAdrCnt; m_wBuff[0]++, m_wBuff[1]++){
IC_WritByte(TW803_P1, ucaZoomAdrP1[m_wBuff[0]], ucaZoomDataP1_NTSC[m_wBuff[1]]);
}
#endif
}
else
{
//m_wBuff[1]=(uWORD)(m_cScaleratio)*P0ScaleAdrCnt;
m_wBuff[1]=0*P0ScaleAdrCnt;
for (m_wBuff[0]=0; m_wBuff[0]<P0ScaleAdrCnt; m_wBuff[0]++, m_wBuff[1]++){
IC_WritByte(TWIC_P0, ucaZoomAdrP0[m_wBuff[0]], ucaZoomDataP0_PAL[m_wBuff[1]]);
}
//m_wBuff[1]=(uWORD)(m_cScaleratio)*P2ScaleAdrCnt;
m_wBuff[1]=0*P2ScaleAdrCnt;
for (m_wBuff[0]=0; m_wBuff[0]<P2ScaleAdrCnt; m_wBuff[0]++, m_wBuff[1]++){
IC_WritByte(TWIC_P2, ucaZoomAdrP2[m_wBuff[0]], ucaZoomDataP2_PAL[m_wBuff[1]]);
}
// Add by Sherman 06'01'06
#ifdef SimulateSTH
m_wBuff[1]=m_cScaleratio*P1ScaleAdrCnt;
for (m_wBuff[0]=0; m_wBuff[0]<P1ScaleAdrCnt; m_wBuff[0]++, m_wBuff[1]++){
IC_WritByte(TW803_P1, ucaZoomAdrP1[m_wBuff[0]], ucaZoomDataP1_PAL[m_wBuff[1]]);
}
#endif
// end of add by Sherman
}
IC_WritByte(TWIC_P0, 0xe2, 0x11);
}
/* S E T I P V I D E O T Y P E */
/*-------------------------------------------------------------------------
set video source selection of Comb Filter(P20x00),
set bandwidth control register(P20x01)
set comb filtering mode register(P20x03)
-------------------------------------------------------------------------*/
void SetIPVideoType(void)
{
if(m_cChroma==S_NTSC){
m_wVTotal=525;
IC_WritByte(TWIC_P2,0x00, IC_ReadByte(TWIC_P2,0x00)&0x01);
IC_WritByte(TWIC_P2,0x01, IC_ReadByte(TWIC_P2,0x01)|0x09);
if(uiaSrcMux1[EepPublic.cSource].VideoType==itypeSVIDEO)
IC_WritByte(TWIC_P2,0x03, 0x03);
else IC_WritByte(TWIC_P2,0x03, 0x00);
}
else if(m_cChroma==S_PAL){
m_wVTotal=625;
IC_WritByte(TWIC_P2,0x00, IC_ReadByte(TWIC_P2,0x00)&0x01|0x32);
IC_WritByte(TWIC_P2,0x01, IC_ReadByte(TWIC_P2,0x01)|0x08);
IC_WritByte(TWIC_P2,0x03, IC_ReadByte(TWIC_P2,0x03)&0x01|0x02);
}
else if(m_cChroma==S_SECAM){
m_wVTotal=625;
IC_WritByte(TWIC_P2,0x00, IC_ReadByte(TWIC_P2,0x00)&0x01|0x28);
IC_WritByte(TWIC_P2,0x03, IC_ReadByte(TWIC_P2,0x03)&0x01|0x02);
}
else if(m_cChroma==S_PAL_M){
m_wVTotal=525;
IC_WritByte(TWIC_P2,0x00, IC_ReadByte(TWIC_P2,0x00)&0x01|0x04);
}
else if(m_cChroma==S_PAL_CN){
m_wVTotal=625;
IC_WritByte(TWIC_P2,0x00, IC_ReadByte(TWIC_P2,0x00)&0x01|0x26);
}
else if(m_cChroma==S_NTSC_4){
m_wVTotal=525;
IC_WritByte(TWIC_P2,0x00, IC_ReadByte(TWIC_P2,0x00)&0x01|0x00);
if(uiaSrcMux1[EepPublic.cSource].VideoType==itypeSVIDEO)
IC_WritByte(TWIC_P2,0x03, 0x03);
else IC_WritByte(TWIC_P2,0x03, 0x03);
}
}
//#ifdef AUTO_DETECT
void Detect_Sig(bit detect)
{
m_cBuff[0]=1;
if ((uiaSrcMux1[EepPublic.cSource].VideoType==itypeRGB565)|(uiaSrcMux1[EepPublic.cSource].VideoType==itype656))
{
IC_WritByte(TWIC_P0, 0x33,0x00);
twdDelay(50);
IC_WritByte(TWIC_P0, 0x32,0x3f);
twdDelay(50);
m_cBuff[0]=IC_ReadByte(TWIC_P0, 0x32); //interrupt status register
m_cBuff[0] &= 0x01; //if lost vsync
}
if (uiaSrcMux1[EepPublic.cSource].VideoType==itypeRGB)
{
// m_cBuff[0]=!SyncChangDect();
}
if (uiaSrcMux1[EepPublic.cSource].SourceRoute==isrcVIDEO)
{
m_cBuff[0]=IC_ReadByte(TWIC_P2, 0x3A)&0x01; // if signal detected
}
if(m_cBuff[0]) // No signal
{
if((detect)||(NoSignal!=m_cBuff[0])) // When switch to signal lost input or Signal lost
{
Timer0Stop();
ClosePanel(0x10, 0xff, 0x40);
}
}
else
{
if((detect)|| (NoSignal!=m_cBuff[0])) //When video switch and signal is normal
{
OpenPanel();
}
}
NoSignal= m_cBuff[0];
}
//#endif //AUTO_DETECT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -