📄 tw9906.c
字号:
switch (B_Status)
{
case 0x00:
return VDD_MODE_NTSC;
case 0x01:
return VDD_MODE_PAL;
case 0x02:
return VDD_MODE_SECAM;
default:
return (dev_Read(TW9906_STATUS1_ADDR) & TW9906_VID_FIELD_FRQ_MASK) ? VDD_MODE_PAL : VDD_MODE_NTSC;
}
}
//******************************************************************************
//
// FUNCTION : void dev_TW9906SetVideoInput(BYTE B_InType)
// USAGE : This function sets TW9906 input video type
// INPUT : input video type - COMPOSITE/SVIDEO
// OUTPUT : None
// GLOBALS : None
// USED_REGS :
//******************************************************************************
static void __near dev_TW9906SetVideoInput(BYTE B_InType)
{
msg("dev_TW9906SetVideoInput",0);
msg("B_inType=%d",B_InType);
switch (B_InType)
{
case VDD_INTYP_COMPOSITE :
B_InType = 0x40; // Setting for Composite input (MUX0)
break;
case VDD_INTYP_TUNER :
B_InType = 0x48; // Setting for Tuner input (MUX1)
break;
case VDD_INTYP_COMPOSITE2 :
B_InType = 0x4C; // Setting for Composite input 2(MUX2)
break;
case VDD_INTYP_SVIDEO :
B_InType = 0x54; // MUX3
break;
case VDD_INTYP_COMPONENT :
break;
default :
return;
}
dev_Write(TW9906_INFORM_ADDR,B_InType); //TW9906_INFORM_ADDR
return;
}
//******************************************************************************
//
// FUNCTION : void dev_TW9906SetVideoBrightness(BYTE B_BrightVal)
// USAGE : This function sets the brightness value for TW9906
// INPUT : brightness value
// OUTPUT : None
// GLOBALS : None
// USED_REGS :
//******************************************************************************
static void __near dev_TW9906SetVideoBrightness(BYTE B_BrightVal)
{
dev_Write(TW9906_BRT_ADDR, B_BrightVal);
}
//******************************************************************************
//
// FUNCTION : void dev_TW9906SetVideoContrast(BYTE B_ContrastVal)
// USAGE : This function sets the contrast value for TW9906
// INPUT : contrast value
// OUTPUT : None
// GLOBALS : None
// USED_REGS :
//******************************************************************************
static void __near dev_TW9906SetVideoContrast(BYTE B_ContrastVal)
{
dev_Write(TW9906_CON_ADDR,B_ContrastVal);
}
//******************************************************************************
//
// FUNCTION : void dev_TW9906SetVideoHue(BYTE B_HueVal)
// USAGE : This function sets the hue value for TW9906
// INPUT : hue value
// OUTPUT : None
// GLOBALS : None
// USED_REGS :
//******************************************************************************
static void __near dev_TW9906SetVideoHue(BYTE B_HueVal)
{
dev_Write(TW9906_HUE_ADDR,B_HueVal);
}
//******************************************************************************
//
// FUNCTION : void dev_TW9906SetVideoSaturation(BYTE B_SaturationVal)
// USAGE : This function sets the saturation value for TW9906
// INPUT : saturation value
// OUTPUT : None
// GLOBALS : None
// USED_REGS :
//******************************************************************************
static void __near dev_TW9906SetVideoSaturation(BYTE B_SaturationVal)
{
dev_Write(TW9906_SAT_U_ADDR, B_SaturationVal);
dev_Write(TW9906_SAT_V_ADDR, B_SaturationVal);
}
//******************************************************************************
//
// FUNCTION : BYTE dev_TW9906GetVideoStatus(void)
// USAGE : This function returns the status of the incoming video
// INPUT : None
// OUTPUT : 0 - Locked
// 1 - Not Locked
// GLOBALS : None
// USED_REGS :
//******************************************************************************
static BYTE __near dev_TW9906GetVideoStatus(void)
{
BYTE B_Status;
B_Status = dev_Read(TW9906_STATUS1_ADDR);
if (B_Status==0xff)
{
msg("*** dev_TW9906GetVideoStatus: Gest Status AGAIN",0);
gm_Delay10ms(1);
B_Status = dev_Read(TW9906_STATUS1_ADDR);
}
if((B_Status & 0x80) != 0x80)
return 0x00;
msg("dev_TW9906GetVideoStatus: Gest Status= 0x%x",B_Status);
return (NO_HS | NO_VS);
}
//******************************************************************************
//
// FUNCTION : void dev_TW9906PowerUp(void)
// USAGE : This function powers up the TW9906 modules.
// INPUT : None
// OUTPUT : None
// GLOBALS : None
// USED_REGS : Power Save Control
//
//******************************************************************************
static void __near dev_TW9906PowerUp(void)
{
VideoDecoderPowr_Reset_PinDirectionSet();
VideoDecoderResetLow();
VideoDecoderPowerHigh();
// gm_SetRegBitsByte(GPOUTPUT3, GPIO24_OUT);
msg("dev_TW9906PowerUp",0);
gm_Delay10ms(8); //80
VideoDecoderResetHigh();
gm_Delay10ms(2);
}
//******************************************************************************
//
// FUNCTION : void dev_TW9906PowerDown(void)
// USAGE : This function powers down the TW9906 modules.
// INPUT : None
// OUTPUT : None
// GLOBALS : None
// USED_REGS : Power Save Control
//
//******************************************************************************
static void __near dev_TW9906PowerDown(void)
{
msg("dev_TW9906PowerDown",0);
#if POWER_DOWN_VID_IN_POWER_SAVING
msg("***VID power low",0);
VideoDecoderResetLow();
VideoDecoderPowerLow();
#else //Just put Video decoder into software powerdown in Power saving mode
msg("***VID s/w power down",0);
dev_Write(TW9906_OUTPUT_FORMAT_CTRL, 0xa6); //Tri-state 656 data output port
dev_Write(TW9906_ANALOG_CONTRL_REG, 0x0f); //Software power down
#endif
}
//******************************************************************************
//
// FUNCTION : BYTE dev_TW9906GetVideoInterlace(void)
// USAGE : This function returns the current input video interlace status
// INPUT : None
// OUTPUT : 0 - Non Interlaced
// 1 - Interlaced
// GLOBALS : None
// USED_REGS :
//******************************************************************************
static BYTE __near dev_TW9906GetVideoInterlace(void)
{
BYTE B_Status;
B_Status = dev_Read(TW9906_STATUS2_ADDR);
if(B_Status & 0x08)
return D_NONINTERLACED;
return D_INTERLACED;
}
//******************************************************************************
//
// FUNCTION : TW9906_VideoDecoderEntry
// USAGE : This function is main entry point into the video decoder
// driver.
// INPUT : driver function and WORD value.
// OUTPUT : returns WORD value.
// GLOBALS : None
// USED_REGS : None
//
//******************************************************************************
WORD TW9906_VideoDecoderEntry(BYTE func, void *p1, void *p2)
{
WORD val = (WORD)p1;
WORD val2 = (WORD)p2;
WORD ret = 0;
if (func!=gmd_VID_RAW_READ)
{
msgx("**From Call Driver:TW9906",0);
msgx(" Func number = %d", func);
msgx(" P1= 0x%x", val);
msgx(" P1= 0x%x", val2);
}
switch(func)
{
// case gmd_VID_SET_TWOWIRE_PORT :
// TWO_WIRE_PORT = (BYTE)val;
// break;
case gmd_VID_SET_INPUT :
dev_TW9906SetVideoInput((BYTE)val);
break;
case gmd_VID_SET_OUTPUT_FORMAT :
// default is 656 output.
break;
case gmd_VID_SET_MODE :
dev_TW9906ConfigVideoMode((BYTE)val);
break;
case gmd_VID_SET_MIXER :
// No support for mixer.
break;
case gmd_VID_SET_BRIGHTNESS :
dev_TW9906SetVideoBrightness((BYTE)val);
break;
case gmd_VID_SET_CONTRAST :
dev_TW9906SetVideoContrast((BYTE)val);
break;
case gmd_VID_SET_SATURATION :
dev_TW9906SetVideoSaturation((BYTE)val);
break;
case gmd_VID_SET_HUE :
dev_TW9906SetVideoHue((BYTE)val);
break;
case gmd_VID_SET_SHARPNESS :
// No sharpness support
break;
case gmd_VID_GET_STATUS :
ret = (WORD)dev_TW9906GetVideoStatus();
break;
case gmd_VID_GET_INTERLACE :
ret = (WORD)dev_TW9906GetVideoInterlace();
break;
case gmd_VID_GET_LINES_PER_FIELD:
// No support
ret = 0;
break;
case gmd_VID_GET_SUB_MODE :
ret = (WORD)dev_TW9906GetVideoMode();
break;
case gmd_VID_GET_MODE :
ret = (WORD)dev_TW9906GetVideoMode();
break;
case gmd_VID_PWR_UP :
dev_TW9906PowerUp();
break;
case gmd_VID_PWR_DOWN :
dev_TW9906PowerDown();
break;
case gmd_VID_RAW_READ :
ret = (WORD)dev_Read(val);
break;
case gmd_VID_RAW_WRITE :
dev_Write((BYTE)val,(BYTE)val2);
break;
default :
msg("TW9906: No Video Decoder Function!!",0);
break;
}
return ret;
}
#endif //(USE_VPORT && USE_GSEL_DRVR_MODEL && (DEV_VIDEO_DECODER == DEV_TW9906))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -