📄 vdc_tvp5150.c
字号:
ucTemp = CAdjustRealValue(_MENU_MU_HUE, stVideoData.Hue, _SLIDER_MAX_HUE, _VHUE_MAX, _VHUE_MID, _VHUE_MIN);
ucTemp = ucTemp^0x80;
}
CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x0B), &ucTemp);
}
void CAdjustVideoSharpness(void)
{
BYTE temp;
/*CVdcI2cRead(_VIDEO_DEVICE, ADDRESS(0x08), LENGTH(1));*/
temp = CAdjustRealValue(_MENU_MU_SHARPNESS, stVideoData.VSharpness, _SLIDER_MAX_SHARPNESS,_VSHARPNESS_MAX, _VSHARPNESS_MID, _VSHARPNESS_MIN);
temp = /*(pData[0] & 0xF3) |*/ ((stVideoData.VSharpness&0x03)<<2);
CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x08), &temp);
}
#define Delay_nNOP() _nop_();_nop_();_nop_();_nop_();_nop_()
void VDCPatchPowerOn(void)
{
unsigned int n;
//BYTE m;
register BYTE send, m;
CVdcI2CSendAddr(_VIDEO_DEVICE, 0x03, 0);
CVdcI2CSendByte(0x69);
CVdcI2CSendStop();
CVdcI2CSendAddr(_VIDEO_DEVICE, 0x7f, 0);
CVdcI2CSendByte(0x00);
CVdcI2CSendStop();
CTimerDelayXms(5);
CVdcI2CSendAddr(_VIDEO_DEVICE, 0x21, 0);
CVdcI2CSendByte(0x51);
CVdcI2CSendStop();
CVdcI2CSendAddr(_VIDEO_DEVICE, 0x22, 0);
CVdcI2CSendByte(0x50);
CVdcI2CSendStop();
CVdcI2CSendAddr(_VIDEO_DEVICE, 0x23, 0);
CVdcI2CSendByte(0xff);
CVdcI2CSendStop();
CVdcI2CSendAddr(_VIDEO_DEVICE, 0x24, 0);
CVdcI2CSendByte(0x04);
CVdcI2CSendStop();
CVdcI2CSendAddr(_VIDEO_DEVICE, 0x7e, 0);
for (n=0; n<3744; n++) {
//I2CSendByte(TVP5150A_048011_7);
send = TVP5150A_048011[n];
for (m = 0; m < 8; m++) {
bI2CSDA= (bit)(send & 0x80); // Send each bit, MSB first
Delay_nNOP();
bI2CSCL= 1;
Delay_nNOP();
bI2CSCL = 0;
send = send << 1;
}
bI2CSDA = 1;
bI2CSCL = 1;
Delay_nNOP();
//Delay_nNOP();
bI2CSCL = 0;
//Delay_nNOP();
}
CVdcI2CSendStop();
CVdcI2CSendAddr(_VIDEO_DEVICE, 0x7f, 0);
CVdcI2CSendByte(0x00);
CVdcI2CSendStop();
CTimerDelayXms(5);
CVdcI2CSendAddr(_VIDEO_DEVICE, 0x21, 0);
CVdcI2CSendByte(0x00);
CVdcI2CSendStop();
CVdcI2CSendAddr(_VIDEO_DEVICE, 0x22, 0);
CVdcI2CSendByte(0x00);
CVdcI2CSendStop();
CVdcI2CSendAddr(_VIDEO_DEVICE, 0x23, 0);
CVdcI2CSendByte(0xff);
CVdcI2CSendStop();
CVdcI2CSendAddr(_VIDEO_DEVICE, 0x24, 0);
CVdcI2CSendByte(0x04);
CVdcI2CSendStop();
}
//--------------------------------------------------
// Description : Video initialize
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CVideoInitial(void)
{
//reset whole chip...
CVIDEO_POWER_ON();
CTimerDelayXms(5);
bVIDEORESET = _HIGH;
CTimerDelayXms(5);
bVIDEORESET = _LOW; // Active low
CTimerDelayXms(1);
bVIDEORESET = _HIGH;
CTimerDelayXms(20);
VDCPatchPowerOn();
CVdcWrite(tVideoInit_5150);
//x.hu, request to set scaler in CVideoExist()
SET_VIDEO_TABLE_SET_SCALER();
}
BYTE CVideoGetStatus(void)
{
BYTE temp, count=0;
CVdcI2cRead(_VIDEO_DEVICE, ADDRESS(0x88), LENGTH(1)); //get signal information.
do {
temp = pData[0]& 0x26;
// x.hu, 20050718:
// With TVP5150AM1, decrease the time may cause unstable to catch signal
CTimerDelayXms(5); // OK
// if video is difficult to capture, add delay time
//CTimerDelayXms(5*8);
CVdcI2cRead(_VIDEO_DEVICE, ADDRESS(0x88), LENGTH(1)); //get signal information.
if((pData[0] & 0x26) == temp)
count++;
else
count=0;
}while(count<3);
// we don't check color lock status for 5150 to show W/B signal
temp |= 0x08;
return temp;
}
//--------------------------------------------------
// Description : Check if color locked
// Input Value : ucColorStandard --> Color standard
// Output Value : Return _TRUE if color is locked, otherwise _FALSE
//--------------------------------------------------
bit CVideoIsColorLocked(BYTE ucColorStandard)
{
BYTE temp;
/*
//set color standard
temp = (ucColorStandard & 0x0E);
CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x28), &temp);
//CTimerDelayXms(100); // must longer than 40ms.
//get lock information
temp = CVideoGetStatus();
if((temp & _BIT3) == _BIT3)
return _TRUE;
else
return _FALSE;
*/
//x.hu, 20050803, update
//set color standard
temp = (ucColorStandard & 0x0E);
CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x28), &temp);
CTimerDelayXms(5);
return _TRUE;
}
//--------------------------------------------------
// Description : Polling to get a locked color standard
// Input Value : None
// Output Value : Return _TRUE if color locked
//--------------------------------------------------
bit CVideoColorFormatProc(void)
{
BYTE ucVdcColorReg,count=0;
if(CVideoIsColorLocked(_AUTO_MODE)) //set to auto detection mode and then check color is lock or not.
{
/*
//CVdcI2cRead(_VIDEO_DEVICE, ADDRESS(0x8C), LENGTH(1));
do {
CVdcI2cRead(_VIDEO_DEVICE, ADDRESS(0x8c), LENGTH(1)); //get signal information.
temp = pData[0];
CTimerDelayXms(5);
CVdcI2cRead(_VIDEO_DEVICE, ADDRESS(0x8c), LENGTH(1)); //get signal information.
if(pData[0] == temp)
count++;
else
count=0;
}while(count<3);
*/
CVdcI2cRead(_VIDEO_DEVICE, ADDRESS(0x8C), LENGTH(1));
do {
ucVdcColorReg = pData[0];
CTimerDelayXms(5);
//CTimerDelayXms(2);
CVdcI2cRead(_VIDEO_DEVICE, ADDRESS(0x8c), LENGTH(1)); //get signal information.
if(pData[0] == ucVdcColorReg)
count++;
else
count=0;
}while(count<3);
ucVdcColorReg = pData[0];
//Here we can get color mode information.
//switch(ucVdcColorReg) {
switch(ucVdcColorReg&0x0f) {
case 0x01: // ntsc-m
case 0x03: // PAL-BGHIN
case 0x05: // PAL-M
case 0x07: // PAL-N
case 0x09: // N-4.43
case 0x0b: // SECAM
ucVdcColorReg = (ucVdcColorReg&0x0F)+1; // convert
break;
default:
ucVdcColorReg = 0x00;
break;
}
//x.hu, write color mode
CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x28), &ucVdcColorReg); //set to designate color mode.
ucModeFound = ucVdcColorReg>>1; //get current color mode information.
return _TRUE;
}
else
{
return _FALSE;
}
}
/*
//--------------------------------------------------
// Description : Set to designate mode according to current channel
// Input Value : ucInputChannel --> choose input channel, like AV or SV channels
// Output Value : None
//--------------------------------------------------
void CVideoModeProc(BYTE ucInputChannel)
{
BYTE temp;
if(ucInputChannel == _AV_CHANNEL)
temp = _AV1_PORT;
else if(ucInputChannel == _AV2_CHANNEL)
temp = _AV2_PORT;
else if(ucInputChannel == _SV_CHANNEL)
temp = _SV_PORT;
//First, set channel.
CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x00), &temp);
//CTimerDelayXms(60); //x.hu, for test
CTimerDelayXms(1);
//set color mode to auto for detection.
temp = _AUTO_MODE;
CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x28), &temp);
//Second, set general setting...
switch(ucInputChannel)
{
case _AV_CHANNEL:
case _AV2_CHANNEL:
//Enable YCbCr output and the clock output
temp = 0x29;
//CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x03), &temp);
break;
case _SV_CHANNEL:
break;
default:
break;
}
}
*/
//--------------------------------------------------
// Description : Check Video Channel if Signal Exist
// Input Value : ucInputChannel --> choose input channel, like AV or SV channels
// Output Value : Return _TRUE if video signal exist, otherwise _FALSE
//--------------------------------------------------
bit CVideoIsExist(BYTE ucInputChannel)
{
BYTE ucVdcStatusReg;
// x.hu, test for no signal video scan
// CScalerCodeW(tVIDEO_TABLE_SET_SCALER);
#if (_PCB_TYPE == _PCB_RIGHTECH_A && _PCB_RIGHTECH_A_USE_PV013BA1 == _FALSE)
// this version use NJM2244 to select video source from V1/V2, and TVP5150AM1 get the signal at A1P1A (0x00)
if (GET_VIDEO_TABLE_SET_SCALER()) {
CScalerCodeW(tVIDEO_TABLE_SET_SCALER);
CLR_VIDEO_TABLE_SET_SCALER();
//CVideoModeProc(ucInputChannel);
if (ucInputChannel == _AV_CHANNEL) {
VideoSelCHAV1();
CTimerDelayXms(1);
CVdcWrite(tVideoAV1_5150);
}
else if (ucInputChannel == _AV2_CHANNEL){
VideoSelCHAV2();
CTimerDelayXms(1);
CVdcWrite(tVideoAV1_5150);
}
}
#else
if (GET_VIDEO_TABLE_SET_SCALER()) { //200D test
CScalerCodeW(tVIDEO_TABLE_SET_SCALER);
CLR_VIDEO_TABLE_SET_SCALER();
//CVideoModeProc(ucInputChannel);
if (ucInputChannel == _AV_CHANNEL) {
CVdcWrite(tVideoAV1_5150);
}
else if (ucInputChannel == _AV2_CHANNEL){
CVdcWrite(tVideoAV2_5150);
}
}
#endif
CTimerDelayXms(1); //for signal switch finish.
ucVdcStatusReg = CVideoGetStatus();
if((ucVdcStatusReg & _BIT5) == _BIT5) //field rate.
{
SET50HZ();
}
else
{
SET60HZ();
}
if((ucVdcStatusReg & (_BIT1 | _BIT2)) == (_BIT1 | _BIT2)) //H/V sync lock.
{
if(CVideoColorFormatProc()) //if color lock.
{
if(CModeMeasureReady()) //Measure H/V sync.
{
if(CModeMeasureData())
{
stModeInfo.ModeCurr = _VIDEO_EXIST;
return _TRUE;
}
else
{
return _FALSE; //Measure failed.
}
}
else
{
return _FALSE;
}
}
else
return _FALSE; //color lock failed.
}
else
{
return _FALSE; //Sync lock failed.
}
}
//--------------------------------------------------
// Description : Check if video signal is changed
// Input Value : None
// Output Value : Return _TRUE if video signal is changed
//--------------------------------------------------
bit CVideoIsChange(void)
{
BYTE temp;
temp = CVideoGetStatus();
#if 0
// x.hu, add: can't identify no signal to reset
if ((temp & (_BIT1|_BIT2)) != (_BIT1 | _BIT2))
{
//return _FALSE;
//if (ucVideoChangeCnt < _VIDEO_CHANGECNT_MAX) {
// ucVideoChangeCnt++;
//}
return _TRUE;
}
if (ucCurrState == _ACTIVE_STATE) {
if(CHECK50HZ() && ((temp & _BIT5)==0x00)) // 50Hz-->60Hz
{
//return _TRUE;
if (ucVideoChangeCnt) {
ucVideoChangeCnt--;
if (ucVideoChangeCnt==0) {
ucVideoChangeCnt = _VIDEO_CHANGECNT_MAX;
return _TRUE;
}
}
else {
ucVideoChangeCnt = _VIDEO_CHANGECNT_MAX;
return _TRUE;
}
}
else if(CHECK60HZ() && ((temp & _BIT5)==_BIT5)) // 60Hz-->50Hz
{
//return _TRUE;
if (ucVideoChangeCnt) {
ucVideoChangeCnt--;
if (ucVideoChangeCnt==0) {
ucVideoChangeCnt = _VIDEO_CHANGECNT_MAX;
return _TRUE;
}
}
else {
ucVideoChangeCnt = _VIDEO_CHANGECNT_MAX;
return _TRUE;
}
}
else
{
//return _FALSE;
if (ucVideoChangeCnt < _VIDEO_CHANGECNT_MAX) {
ucVideoChangeCnt++;
}
return _FALSE;
}
}
else {
if(CHECK50HZ() && ((temp & _BIT5)==0x00)) // 50Hz-->60Hz
{
return _TRUE;
}
else if(CHECK60HZ() && ((temp & _BIT5)==_BIT5)) // 60Hz-->50Hz
{
return _TRUE;
}
else
{
return _FALSE;
}
}
#else //reuse this for:
// x.hu, test to add the following statement, may be update
// x.hu, 20050804, update, detect whether the video is changed btween PAL and NTSC
/*if ((temp & (_BIT1|_BIT2)) != (_BIT1 | _BIT2)) // H/V sync state
{
return _TRUE;
}*/
if ((temp & (_BIT1|_BIT2)) != (_BIT1 | _BIT2)) // H/V sync state
{
#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
SET_VIDEO_PN_ACTION();
#endif
return _TRUE;
}
// update over
//add over
if(CHECK50HZ() && ((temp & _BIT5)==0x00)) // 50Hz-->60Hz
{
return _TRUE;
}
else if(CHECK60HZ() && ((temp & _BIT5)==_BIT5)) // 60Hz-->50Hz
{
return _TRUE;
}
else
{
return _FALSE;
}
#endif
}
//---------------------------------------
// Description : power save Video Decoder
// Input Value: None
// Output Value: None
//---------------------------------------
void CVideoPowerState(BYTE state)
{
state = state;
/* BYTE temp;
CVdcI2cRead(_VIDEO_DEVICE, ADDRESS(0x02), LENGTH(1));
temp = pData[0]&0xFE;
temp |= (state&0x01);
CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x02), &temp);
CTimerDelayXms(20);
//CTimerDelayXms(50);
*/
}
//----------------------------------------
// Description : Enable Video Data Output or not
// Input Value: None
// Output Value: None
//----------------------------------------
void CVideoDataEnable(BIT bEnable)
{
BYTE temp;
if(bEnable){
temp = 0x09; //Enable data output and enable data clock, GPCL output enable
}
else{
temp = 0x00; //Disable data & clock output
}
CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x03), &temp);
CTimerDelayXms(1);
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -