📄 mode_detect.~c
字号:
{
#if(VIDEO_CHIP != VDC_NONE)
I2CRead(ADDR_VIDEO, 0x1f, 0x01);
//------ Check Horizontal Lock & Frequency ------
if (0 == (Data[0] & 0x40))
{
if ((Data[0] & 0x20) && (0x01 != (ucAV_Mode & 0x0f)))
{
// Field rate changed to 60Hz
ucAV_Mode = 0x01;
ucMode_Found = MODE_NOSUPPORT;
ucMode_Times = 0;
Data[0] = 4;
Data[1] = ADDR_VIDEO;
Data[2] = 0x0e;
Data[3] = 0x08; // Start color search from NTSC-M
I2CWrite(Data);
}
else if ((0 == (Data[0] & 0x20)) && (0x02 != (ucAV_Mode & 0x02)))
{
// Field rate changed to 50Hz
ucAV_Mode = 0x02;
ucMode_Found = MODE_NOSUPPORT;
ucMode_Times = 0;
Data[0] = 4;
Data[1] = ADDR_VIDEO;
Data[2] = 0x0e;
Data[3] = 0x08; // Start color search from PAL-BDGHI
I2CWrite(Data);
}
else
{
//------ Check Lock Color ------
if (0x01 == (Data[0] & 0x01))
{
// Lock Color
if (ucAV_Mode & 0x01)
{
if (MODE_VIDEO60HZ == ucMode_Found)
{
ucMode_Times ++;
}
else
{
ucMode_Found = MODE_VIDEO60HZ;
ucMode_Times = 0;
}
}
else
{
if (MODE_VIDEO50HZ == ucMode_Found)
{
ucMode_Times ++;
}
else
{
ucMode_Found = MODE_VIDEO50HZ;
ucMode_Times = 0;
}
}
}
else
{
// Non Lock Color
if (MODE_NOSUPPORT != ucMode_Found)
{
ucMode_Found = MODE_NOSUPPORT;
ucMode_Times = 0;
}
Data[0] = 4;
Data[1] = ADDR_VIDEO;
Data[2] = 0x0e;
if (0x03 == (ucAV_Mode & 0x03))
{
// SECAM -> PAL-BDGHI(50Hz)
Data[3] = 0x08;
I2CWrite(Data);
ucAV_Mode = 0x02;
}
else
{
if (ucMode_Times & 0x01) // Every 2-times , change color
{
switch (ucAV_Mode & 0x70)
{
case 0x00:
Data[3] = 0x18; // NTSC-4.43(50Hz) // PAL-4.43(60Hz)
I2CWrite(Data);
ucAV_Mode = (ucAV_Mode & 0x0f) | 0x10;
break;
case 0x10:
Data[3] = 0x28; // PAL-N(50Hz) // NTSC-4.43(60Hz)
I2CWrite(Data);
ucAV_Mode = (ucAV_Mode & 0x0f) | 0x20;
break;
case 0x20:
Data[3] = 0x38; // NTSC-N(50Hz) // PAL-M(60Hz)
I2CWrite(Data);
ucAV_Mode = (ucAV_Mode & 0x0f) | 0x30;
break;
case 0x30:
if (ucAV_Mode & 0x02)
{
// NTSC-N -> SECAM (50Hz)
Data[3] = 0x5c;
I2CWrite(Data);
ucAV_Mode = 0x03;
}
else
{
// PAL-M -> NTSC_M (60Hz)
Data[3] = 0x08;
I2CWrite(Data);
ucAV_Mode = ucAV_Mode & 0x0f | 0x00;
}
default:
break;
}//end of "switch (ucAV_Mode & 0x70)"
}//end of "if (ucMode_Times & 0x01)"
}//end of "if (0x03 == (ucAV_Mode & 0x03)) else"
}//end of "Non Lock color
}//end of "Check Lock Color"
}//end of "if (0==(Data[0] & 0x40))"
else
{
// Non Horizontal Lock
ucAV_Mode = 0;
if (ucMode_Found != MODE_NOSUPPORT)
{
ucMode_Found = MODE_NOSUPPORT;
ucMode_Times = 0;
}
}
//-------------Check result--------------
if (MODE_NOSUPPORT != ucMode_Found)
{
if (VIDEO_SEARCH_TIMES < ucMode_Times)
{
bLIGHT_PWR = LIGHT_OFF; // Turn off BackLight for reset display
RTDSetByte(HOSTCTRL_02, 0x40); // Wake RTD up
RTDCodeW(OSD_Reset); // Clear OSD
if (SOURCE_YUV == (stGUD1.INPUT_SOURCE & 0x07))
ucMode_Curr = (ucAV_Mode & 0x02) ? MODE_YUV50HZ : MODE_YUV60HZ;
else
ucMode_Curr = ucMode_Found;
ucMode_Times = 0;
bStable = 0; // bStable must be cleared when mode changed
Display_Video_Set();
}
}
else
{
ucMode_Times ++;
if (ucAV_Mode)
{
// Force to display although we cannot lock color
if (VIDEO_SEARCH_TIMES < ucMode_Times
&& (NO_COLOR_TIMES < ucMode_Times || SOURCE_YUV == (stGUD1.INPUT_SOURCE & 0x07)))
{
bLIGHT_PWR = LIGHT_OFF; // Turn off BackLight for reset display
RTDSetByte(HOSTCTRL_02, 0x40); // Wake RTD up
RTDCodeW(OSD_Reset); // Clear OSD
ucAV_Mode = (ucAV_Mode & 0x02) ? 0x82 : 0x81;
if (SOURCE_YUV != (stGUD1.INPUT_SOURCE & 0x07))
ucMode_Curr = (ucAV_Mode & 0x02) ? MODE_VIDEO50HZ : MODE_VIDEO60HZ;
else
ucMode_Curr = (ucAV_Mode & 0x02) ? MODE_YUV50HZ : MODE_YUV60HZ;
ucMode_Times = 0;
bStable = 0; // bStable must be cleared when mode changed
Display_Video_Set();
}
}
else
{
if (NO_MODE_TIMES < ucMode_Times)
{
bStable = 1; // Set bStable to 1 when signal timing is stable.
ucMode_Times = NO_MODE_TIMES - 1;
}
}
}
#else
Display_Video_Set();
#endif
}
//------------------- Check AV Mode -------------------//
void Check_Video_Mode(void)
{
#if(VIDEO_CHIP != VDC_NONE)
I2CRead(ADDR_VIDEO, 0x1f, 0x01);
// Check color
if (0 == (ucAV_Mode & 0x80))
{
if (0 == (Data[0] & 0x01)) ucMode_Curr = MODE_NOSIGNAL; // Color standard changed
}
else
{
if (0 == (Data[0] & 0x01))
{
ucMode_Times = 0;
}
else
{
// When we cannot lock color, we set color standard to PAL-BDGHI if field rate is 50Hz,
// and to NTSC-M if it is 60Hz.
// If we find color is locked, we should update ucAV_Mode to indicate we now get color.
if (VIDEO_SEARCH_TIMES < ++ucMode_Times) ucAV_Mode = ucAV_Mode & 0x0f;
}
}
// Check field rate
if (Data[0] & 0x40)
{
ucMode_Curr = MODE_NOSIGNAL;
}
else
{
if (ucAV_Mode & 0x02) // 50Hz
{
if (0x00 != (Data[0] & 0x20)) ucMode_Curr = MODE_NOSIGNAL;
}
else // 60Hz
{
if (0x00 == (Data[0] & 0x20)) ucMode_Curr = MODE_NOSIGNAL;
}
}
// Check result
if (MODE_NOSIGNAL == ucMode_Curr)
Reset_Mode();
else
bStable = 1; // Set bStable to 1 when signal timing is stable.
#endif
}
void Initial_Mode(void)
{
unsigned char ucOption;
unsigned int usDispLen;
// bit 7 of ucMode_Curr : partial-V display.
// bit 6 of ucMode_Curr : select 720x350 or 720x400 for VGA-50Hz and VGA-60Hz
ucOption = ucMode_Curr & 0xc0;
ucMode_Curr = ucMode_Curr & 0x3f;
RTDSetBit(SD_CTRL_70, 0xf9, VGA_ICLK_DELAY);
if (SOURCE_DVI == (stGUD1.INPUT_SOURCE & 0x07))
{
RTDSetBit(SD_CTRL_70, 0xf9, TMDS_ICLK_DELAY);
usIPH_ACT_STA = CAP_WIN[ucMode_Curr][1];
}
else
{
if (ucOption & 0x40)
{
// Only VGA-50Hz and VGA-60Hz mode will set bit 6 of ucMode_Curr to indicate 720-pixel capture width
// In these case, we should use 720 horizontal settings instead of 640 horizontal settings in table.
usADC_Clock = CAP_WIN[MODE_0720x0400x70HZ][0];
usIPH_ACT_STA = CAP_WIN[MODE_0720x0400x70HZ][1];
usIPH_ACT_WID = CAP_WIN[MODE_0720x0400x70HZ][2];
}
else
{
usADC_Clock = CAP_WIN[ucMode_Curr][0];
usIPH_ACT_STA = CAP_WIN[ucMode_Curr][1];
usIPH_ACT_WID = CAP_WIN[ucMode_Curr][2];
// Calculate pixel clock rate (round to MHz)
usDispLen = (unsigned long)24576 * usADC_Clock / ((unsigned long)usHsync * 500);
usDispLen = (usDispLen >> 1) + (usDispLen & 0x01);
// Use ADC to do H scale-down if pixel clock rate is over spec.
if (MAX_ADC_FREQ < usDispLen && MODE_USER1152x864 <= ucMode_Curr && MODE_USER1600x1200 >= ucMode_Curr)
{
usADC_Clock = ADC_SD_SET[ucMode_Curr - MODE_USER1152x864][0];
usIPH_ACT_STA = ADC_SD_SET[ucMode_Curr - MODE_USER1152x864][1];
usIPH_ACT_WID = ADC_SD_SET[ucMode_Curr - MODE_USER1152x864][2];
}
} //if (ucOption & 0x40)
// Calculate pixel clock rate (round to MHz)
usDispLen = (unsigned long)24576 * usADC_Clock / ((unsigned long)usHsync * 500);
usDispLen = (usDispLen >> 1) + (usDispLen & 0x01);
// To improve ADC performance ,when the data rate is slow, use single channel,otherwise, use dual channel
RTDSetBit(ADC_REG_CLK_EA,0xe0,(45 > usDispLen) ? 0x10 | (ADC_RED_PHASE_FT & 0x0c) |( ADC_BLUE_PHASE_FT & 0x03):
0x00 | (ADC_RED_PHASE_FT & 0x0c) |( ADC_BLUE_PHASE_FT & 0x03));
// To imporve the FIFO efficiency only when input data rate is slow, and display data rate is high.
// RTDSetBit(VGIP_CTRL_04, 0xe3, (40 > usDispLen) ? 0x14 : 0x00);
RTDSetBit(VGIP_CTRL_04, 0xf3, (60 > usDispLen) ? 0x08 : 0x00);
RTDSetByte(PE_CONTROL_3C, 0x00); // HSYNC positive/negtive tracking
RTDSetByte(ADC_FRAME_MODULE_EB,0x06);
// RTDSetByte(ADC_FRAME_MODULE_EB,(usIPH_ACT_WID == 1280) ? 0x04 : 0x00);
// Set ADC bandwidth to reduce high frequency noise
// RTDSetByte(ADC_REG_TEST_E9, (35 > usDispLen) ? 0x08 : (150 > usDispLen) ? 0x10 : 0x18);
#if(ADC_DEFFERENTIAL)
RTDSetBit(ADC_DIFF_MODE_EC,0xff,0x40); //Differential mode
#else
RTDSetBit(ADC_DIFF_MODE_EC,0xbf,0x00); //Single endded mode
#endif
RTDSetByte(ADC_REG_CUR_H_E8, 0x0d | (ADC_GREEN_PHASE_FT & 0x30));
RTDSetBit(ADC_FRAME_MODULE_EB,0xc7, ((ADC_RED_PHASE_FT & 0x10) << 1) | ((ADC_GREEN_PHASE_FT & 0x40) << 2)
|((ADC_BLUE_PHASE_FT & 0x04) << 1));
RTDSetBit(TMDS_CORRECTION_FF,0xff,0x04); //Enable the ADC digital filter
if(ucMode_Curr < MODE_1024x0768x70HZ)
RTDSetByte(ADC_REG_TEST_E9, 0x08);
else
RTDSetByte(ADC_REG_TEST_E9, 0x10);
// Get usIPV_ACT_LEN
if (MODE_UNDEFINED0 > ucMode_Curr)
{
// We've already decided usIPV_ACT_LEN in Detect_VGA_Mode() for undefined SU/SD mode.
// Only defined modes need to decide usIPV_ACT_LEN here.
usIPV_ACT_LEN = CAP_WIN[ucMode_Curr][4];
}
} //if (SOURCE_DVI == (stGUD1.INPUT_SOURCE & 0x07))
// Get standard usIPV_ACT_STA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -