📄 drvvd.c
字号:
}
/******************************************************************************/
///Program Output & Video's setting
///@param penMsSysInfo \b IN: display system information
/******************************************************************************/
void MDrv_VD_ProgMultiInput( MS_SYS_INFO *penMsSysInfo )
{
u8SVflag = 0;
#if (ENABLE_SCART_VIDEO)
if (penMsSysInfo->enInputSourceType == INPUT_SOURCE_SCART
#if (INPUT_SCART_VIDEO_COUNT == 2)
|| penMsSysInfo->enInputSourceType == INPUT_SOURCE_SCART2
#endif
)
{
/* power on fast blanking ADC, select FB MUX */
MDrv_WriteByte (BK_ADC_ATOP_40_L,
((MDrv_ReadByte(BK_ADC_ATOP_40_L)&0xbf) | (INPUT_SCART_FB_MUX) << 4) // i.e. 0x80[6:4]
);
MDrv_WriteByte (BK_ADC_ATOP_42_L, 0xEC); // i.e. 0x83
}
else
{
/* power down fast blanking ADC */
MDrv_WriteRegBit (BK_ADC_ATOP_40_L, ENABLE, _BIT6); // i.e. 0x80[6]
MDrv_WriteByte (BK_ADC_ATOP_42_L, 0xEC); // i.e. 0x83
}
#endif
switch( penMsSysInfo->enInputSourceType )
{
#if (ENABLE_SCART_VIDEO)
case INPUT_SOURCE_SCART:
#if (INPUT_SCART_VIDEO_COUNT == 2)
case INPUT_SOURCE_SCART2:
#endif
#endif
case INPUT_SOURCE_CVBS:
#if (INPUT_AV_VIDEO_COUNT == 2)
case INPUT_SOURCE_CVBS2:
#endif
// MDrv_WriteRegBit(BK_SECAM_01, DISABLE, _BIT3); // Disable Secam-SV <- removed because this register is combined with COMB_10[7]
MDrv_WriteRegBit (BK_COMB_10, DISABLE, _BIT7); // <- SET COMB
MDrv_WriteRegBit (BK_COMB_60, DISABLE, _BIT6); // <- SET COMB
MDrv_WriteByte( BK_AFEC_1A, ( MDrv_ReadByte( BK_AFEC_1A ) ) & ~0xC0 ); // disable SV input
MDrv_WriteRegBit( BK_AFEC_1F, DISABLE, _BIT7); // disable clamp C
#if (ENABLE_SCART_VIDEO)
if(!(IsSrcTypeAV(penMsSysInfo->enInputSourceType))) // i.e. SCART
{
MS_ADC_SETTING adcSetting;
// for setting ADC gain and offset
adcSetting.u8RedGain = 0x80;
adcSetting.u8GreenGain = 0x80;
adcSetting.u8BlueGain = 0x80;
adcSetting.u8RedOffset = 0x80;
adcSetting.u8GreenOffset = 0x80;
adcSetting.u8BlueOffset = 0x80;
MDrv_WriteByte (BK_ADC_ATOP_44_H, 0xFF); // i.e. ATOP 0x88
MDrv_WriteByte (BK_ADC_ATOP_44_L, 0x10); // i.e. ATOP 0x87
MDrv_WriteByte (BK_ADC_ATOP_41_L, 0x18); // i.e. ATOP 0x81
MDrv_WriteByte (BK_ADC_ATOP_41_H, 0x40); // i.e. ATOP 0x82
MDrv_WriteByte (BK_ADC_ATOP_43_H, 0x2E); // i.e. ATOP 0x85
MDrv_WriteByte (BK_ADC_ATOP_43_L, 0x30); // i.e. ATOP 0x84
// seven 070927 MDrv_WriteByte (BK_ADC_ATOP_1C_L, MDrv_ReadByte(BK_ADC_ATOP_1C_L) & 0xE0); // i.e. ATOP 0x36 set SOG level (BIT4~0) to 0
// seven 070927 MDrv_WriteByte (BK_ADC_ATOP_2C_L, 0x00); // i.e. ATOP 0x58 set VClamp to VCLAMP_RGB_ClampGnd (i.e. 0)
MDrv_WriteByte (BK_ADC_ATOP_1C_H, 0x40); // i.e. ATOP 0x37
MDrv_WriteByte (BK_ADC_ATOP_4C_L, 0x31); // i.e. ATOP 0x98
MDrv_WriteRegBit (BK_ADC_ATOP_2D_H, ENABLE, _BIT6); // i.e. ATOP 0x5C disable ADC clamp from VD
// seven 070927 MDrv_WriteByte (BK_ADC_DTOP_0B_L, 0xFF); // i.e. DTOP 0x14 set clamp placement
// seven 070927 MDrv_WriteByte (BK_ADC_DTOP_0B_H, 0x40); // i.e. DTOP 0x15 set clamp duration
MDrv_WriteByte (BK_ADC_DTOP_07_L, 0x8A); // i.e. DTOP 0x0D
MDrv_WriteByte (BK_ADC_DTOP_10_L, 0x00); // i.e. DTOP 0x20
MDrv_WriteByte(BK_AFEC_7F, 0x66); // Switch to Comb Y/U/V 444 input.
}
else
{
MDrv_WriteByte( BK_AFEC_7F, 0x65); // Switch to Comb Y/U/V 444 input.
}
#endif
break;
case INPUT_SOURCE_SVIDEO:
#if (INPUT_SV_VIDEO_COUNT == 2)
case INPUT_SOURCE_SVIDEO2:
#endif
u8SVflag = 1;
// MDrv_WriteRegBit( BK_SECAM_01, ENABLE, _BIT3 ); // Enable Secam-SV <- removed because this register is combined with COMB_10[7]
MDrv_WriteRegBit (BK_COMB_10, ENABLE, _BIT7); // <- SET COMB
MDrv_WriteRegBit (BK_COMB_60, DISABLE, _BIT6); // <- SET COMB
MDrv_WriteByte( BK_AFEC_1A, ( MDrv_ReadByte(BK_AFEC_1A) )| 0xC0); // Enable SV input
MDrv_WriteRegBit( BK_AFEC_1F, ENABLE, _BIT7); // Enable clamp C
MDrv_WriteByte( BK_AFEC_7F, 0x65); // Switch to Comb Y/U/V 444 input. <- 0x65 used in Saturn
break;
}
}
/******************************************************************************/
///Set VD 's video horizontal total
///@param u32HTotal \b IN: video horizontal total
/******************************************************************************/
void MDrv_VD_SetHTotal(U32 u32HTotal)
{
MDrv_WriteRegBit( BK_AFEC_A0, ENABLE, _BIT7 );
u32HTotal = ( u32HTotal + 1 ) & 0xFFFE;
#if( ENABLE_DYNAMIC_VD_HTOTAL )
{
U32 u32Mid;
u32Mid = MAKEWORD(MDrv_ReadByte(BK_AFEC_9D), MDrv_ReadByte(BK_AFEC_9D));
u32Mid = u32Mid>>5;
u32Mid = (u32Mid+u32HTotal)>>1;
MDrv_WriteByte( BK_AFEC_9D, (u32Mid>>3) ); // bit3~10
MDrv_WriteByte( BK_AFEC_9E, (U8)u32Mid<<5 ); // bit0~2
MDrv_Timer_Delayms(75);
MDrv_WriteByte( BK_AFEC_9D, u32HTotal >> 3 );
MDrv_WriteByte( BK_AFEC_9E, (U8)u32HTotal << 5 );
MDrv_Timer_Delayms(75);
}
#else
MDrv_WriteByte( BK_AFEC_9D, u32HTotal >> 3 );
MDrv_WriteByte( BK_AFEC_9E, (U8)u32HTotal << 5 );
#endif
MDrv_WriteRegBit( BK_AFEC_A0, DISABLE, _BIT7 );
#if (PATCH_PAL_VTOTAL624SHAKE)
MDrv_Write2Byte( BK_COMB_52, u32HTotal );
MDrv_WriteRegBit( BK_COMB_50, DISABLE, _BIT0 ); // disable H/W auto Htotal
#endif
}
/******************************************************************************/
///Program Field information for different signal type.
///@param enSignalType \b IN:
///enSignalType is Video signal type
///- SIG_NTSC
///- SIG_PAL
///- SIG_SECAM
///- SIG_NTSC_443
///- SIG_PAL_M
///- SIG_PAL_NC
///@param penMsSysInfo \b IN: penMsSysInfo is input type
/******************************************************************************/
void MDrv_VD_ProgramDiffField( EN_VD_SIGNALTYPE enSignalType, MS_SYS_INFO *penMsSysInfo )
{
u8VideoSystem = enSignalType;
switch( enSignalType )
{
case SIG_PAL:
// 1135
MDrv_VD_SetHTotal( VD_HT_PAL * ( VD_USE_FB + 1 ) );
MDrv_WriteByte( BK_AFEC_7B, 0xB6 ); // 656_HDES.
u16LatchH = 1135;
DRVVD_DBG(printf("SIG_PAL \r\n"));
break;
case SIG_NTSC_443:
// PAL-60: 1127
MDrv_VD_SetHTotal( VD_HT_NTSC_443 * ( VD_USE_FB + 1 ) );
MDrv_WriteByte( BK_AFEC_7B, 0xB4 ); // 656_HDES.
u16LatchH = 1127;
DRVVD_DBG(printf("SIG_NTSC_443 \r\n"));
break;
case SIG_SECAM:
// 1097
MDrv_VD_SetHTotal( VD_HT_SECAM * ( VD_USE_FB + 1 ) );
MDrv_WriteByte( BK_AFEC_7B, 0xB2 ); // 656_HDES.
u16LatchH = 1097;
DRVVD_DBG(printf("SIG_SECAM \r\n"));
break;
case SIG_PAL_M:
// 909
MDrv_VD_SetHTotal( VD_HT_PAL_M * ( VD_USE_FB + 1 ) );
MDrv_WriteByte( BK_AFEC_7B, 0x8E ); // 656_HDES.
u16LatchH = 909;
DRVVD_DBG(printf("SIG_PAL_M \r\n"));
break;
case SIG_PAL_NC:
// 917
MDrv_VD_SetHTotal( VD_HT_PAL_NC * ( VD_USE_FB + 1 ) );
MDrv_WriteByte( BK_AFEC_7B, 0x93 ); // 656_HDES.
u16LatchH = 917;
DRVVD_DBG(printf("SIG_PAL_NC \r\n"));
break;
default:
//case SIG_NTSC: //910
MDrv_VD_SetHTotal(VD_HT_NTSC*(VD_USE_FB+1));
MDrv_WriteByte( BK_AFEC_7B, 0x6D ); // 656_HDES.
u16LatchH = 910;
DRVVD_DBG(printf("SIG_NTSC \r\n"));
break;
} // switch
MDrv_WriteByteMask (BK_COMB_1C, _BIT7|_BIT5, _BIT7|_BIT6|_BIT5); // (BIT7:1, BIT6:0, BIT5:1) Use AFEC vsync switch to DAC output.
if(IsUseInternalSVPort(penMsSysInfo->enInputPortType))
{
if (SIG_NTSC == enSignalType)
{
MDrv_WriteByteMask( BK_COMB_48, 0x20, 0x30 );
}
else // SIG_NTSC_443, SIG_PAL, SIG_PAL_M, SIG_PAL_NC, SIG_SECAM
{
MDrv_WriteByteMask( BK_COMB_48, 0x30, 0x30 );
}
switch (enSignalType)
{
case SIG_PAL_M:
case SIG_PAL_NC:
MDrv_WriteByteMask( BK_COMB_6C, 0x04, 0x0C );
break;
case SIG_PAL:
MDrv_WriteByteMask( BK_COMB_6C, 0x08, 0x0C );
break;
case SIG_NTSC_443:
if (g_VdInfo.u16VideoStatus & VD_PAL_SWITCH)
{
MDrv_WriteByteMask( BK_COMB_6C, 0x08, 0x0C );
}
else
{
MDrv_WriteByteMask( BK_COMB_6C, 0x0C, 0x0C );
}
break;
default: // SIG_NTSC, SIG_SECAM
MDrv_WriteByteMask( BK_COMB_6C, 0x00, 0x0C );
break;
}
MDrv_WriteByteMask( BK_COMB_10, 0x00, 0x10 );
}
else
{
MDrv_WriteByteMask( BK_COMB_48, 0x20, 0x30 );
MDrv_WriteByteMask( BK_COMB_6C, 0x00, 0x0C );
MDrv_VD_SetupComb (penMsSysInfo->enInputPortType);
if (SIG_NTSC_443 == enSignalType)
{
}
else
{
}
}
if (enSignalType == SIG_NTSC_443)
{
MDrv_WriteByteMask( BK_COMB_50, 0x06, 0x07 );
MDrv_WriteByte( BK_COMB_52, 0x67 );
MDrv_WriteByte( BK_COMB_53, 0x04 );
MDrv_WriteRegBit(BK_COMB_6B, DISABLE, _BIT0); // Turn off 2D comb peaking
}
else
{
MDrv_WriteByteMask( BK_COMB_50, 0x07, 0x07 );
MDrv_WriteByte( BK_COMB_52, 0x8D );
MDrv_WriteByte( BK_COMB_53, 0x03 );
MDrv_WriteRegBit(BK_COMB_6B, ENABLE, _BIT0); // Turn on 2D comb peaking
}
MDrv_WriteByte(BK_COMB_42, 0x80);
MDrv_Timer_Delayms(10);
MDrv_WriteByte(BK_COMB_42, 0xff);
if (enSignalType == SIG_SECAM)
{
MDrv_WriteByte(BK_VBI_99, 0x6D);
MDrv_WriteByte(BK_VBI_9A, 0x9A);
}
else
{
MDrv_WriteByte(BK_VBI_99, 0x8C);
MDrv_WriteByte(BK_VBI_9A, 0x01);
}
u8BackupNoiseMag = 0x20;
MDrv_VD_FinetuneComb(enSignalType);
}
/******************************************************************************/
///Fine tune COMB filter when mode changed (i.e. based on signal type)
///@param enSignalType \b IN:
///enSignalType is Video signal type
///- SIG_NTSC
///- SIG_PAL
///- SIG_SECAM
///- SIG_NTSC_443
///- SIG_PAL_M
///- SIG_PAL_NC
/******************************************************************************/
void MDrv_VD_FinetuneComb(EN_VD_SIGNALTYPE enSignalType)
{
/*++ Comb fine tune (Color team) ++*/
#if (PANEL_TYPE_SEL == Pnl_TMD07_DT || PANEL_TYPE_SEL == Pnl_AU07_DT)// kevin 071218
MDrv_WriteByte(BK_COMB_72, 0x7090);
#elif (PANEL_TYPE_SEL == Pnl_CPT07_AT || PANEL_TYPE_SEL == Pnl_AU07_AT)
MDrv_WriteByte(BK_COMB_72, 0x7890);
#else
MDrv_WriteByte(BK_COMB_72, 0x8090);
#endif
if ((enSignalType == SIG_NTSC) || (enSignalType == SIG_NTSC_443))
{
DRVVD_DBG(printf("===> MDrv_VD_FinetuneComb NTSC\n"));
MDrv_Write2Byte(BK_COMB_16, 0xB770);
MDrv_WriteRegBit(BK_COMB_38, DISABLE, _BIT4);
//MDrv_WriteByte(BK_COMB_31, 0x35);
//MDrv_WriteByte(BK_COMB_33, 0x35);
}
else
{
DRVVD_DBG(printf("===> MDrv_VD_FinetuneComb PAL\n"));
MDrv_WriteRegBit(BK_COMB_16, ENABLE, _BIT1);
MDrv_WriteRegBit(BK_COMB_38, ENABLE, _BIT4);
//MDrv_WriteByte(BK_COMB_31, 0x25);
//MDrv_WriteByte(BK_COMB_33, 0x30);
}
/*-- Comb fine tune (Color team) --*/
}
/******************************************************************************/
///Program Field information for different signal type.
///@param u32src \b IN
///- u32src is flash's Source code address
///@param u32dst \b IN
///- u32dst is SDRAM's DSP code address
///@param u32len \b IN
///- u32len is DSP code 's length
/******************************************************************************/
void MDrv_VDMCU_Init(U32 u32src, U32 u32dst, U32 u32len)
{
XBYTE[VD_MCU_RESET] |= 0x01; //halt VD MCU first
XBYTE[VD_MCU_READ_WRITE] = 0x00; //disable Read/write
//get demux binary information
XBYTE[VD_MCU_READ_WRITE] = 0x00; //read/write turn off
//--------------------------------------------------------
// Load code
//--------------------------------------------------------
// copy code from flash to SDRAM
MDrv_MIU_XCopy(MCPY_LOADVDMCUFW, u32src, u32dst, u32len);
DRVVD_DBG(printf("\r\n VD load code OK"));
/*// seven 070912_00
//--------------------------------------------------------
// Start
//--------------------------------------------------------
MDrv_WriteByte( VDMCU_SDRAM_CODE_MAP, VARBYTE(u32dst, 1) );
DRVVD_DBG(printf("code map = 0x%bx\n", VARBYTE(u32dst, 1)));
MDrv_WriteByte( VDMCU_SDRAM_CODE_MAP_H, VARBYTE(u32dst, 0) & 0x7 );
DRVVD_DBG(printf("code map h = 0x%bx\n", VARBYTE(u32dst, 0) & 0x7));
// end*/
// release VD_MCU and run code on SDRAM
// clear MCU2MIU_RST and enable MIU_FETCH_EN
// MDrv_WriteByte( VDMCU_MIU_MAP_CMD, (MDrv_ReadByte(VDMCU_MIU_MAP_CMD) & ~0x80) | 0x02 );
// XBYTE[BK_CHIPTOP_17_L] = XBYTE[BK_CHIPTOP_17_L] & ~(0x0C) | 0x04;
// XBYTE[BK_CHIPTOP_17_L] = XBYTE[BK_CHIPTOP_17_L] & ~(0x0E) | 0x06; // inverse clock
XBYTE[VD_MCU_RESET] &= 0xfe;
DRVVD_DBG(printf("\r\n Start VD MCU code...."));
}
//LACHESIS_070110
/******************************************************************************/
///Adjust blacklevel
///@param blacklevel \b IN: blacklevel value
///- 0 - 0x1FF
/******************************************************************************/
void MDrv_VD_SetBlacklevel( U16 u16Blacklevel )
{
// U8 u8Bank; <- remove the bank change code
// u8Bank = MDrv_ReadByte( BK_SELECT_00 ); // store bank <- remove the bank change code
// MDrv_WriteByte( BK_SELECT_00, REG_BANK_AFEC ); <- remove the bank change code
MDrv_WriteRegBit( BK_AFEC_38, ENABLE, _BIT7 );
#if 1// kevin 071218
MDrv_WriteRegBit( BK_AFEC_38, ENABLE, _BIT6 );
#else
if( HIBYTE(u16Blacklevel) )
MDrv_WriteRegBit( BK_AFEC_38, ENABLE, _BIT6 );
else
MDrv_WriteRegBit( BK_AFEC_38, DISABLE, _BIT6 );
#endif
MDrv_WriteByte( BK_AFEC_3A, LOBYTE(u16Blacklevel) );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -