#include "drv_types.h" #include "hdmi_cfg.h" #include "hdmi_dbg.h" #include "hdmi_notice.h" #include "hdmi_audio.h" #include "hdmi_processing.h" #include "hdmi_hpd.h" #include "hdmi_hw.h" #include "hdmi_infoframe_api.h" #include #include #include #include "drv_audio_internal.h" #include "../audio/drv_audio_common.h" #include "hdmi.h" static UINT8 Screen_Mode = 0xff; extern UINT8 HScalerDownFlag; UINT32 HDMI_GetNoticedScreenMode() { return Screen_Mode; } void HDMI_NoticeHandler(HDMI_NOTICE_TYPE_e status, const INT8* src) { INT32 Screen = NormalScreen; static InputPathStatus_t is = {0}; UINT8 value = 0; hdmidbg("%s: %s %d\n", __FUNCTION__, src, status); is.msgfromVIP = false; is.path = INPUTPATH_HDMI; switch (status) { default: case HDMINOTICE_INITSTATE: Screen_Mode = 0xff; is.bActive = false; is.bNotSupport = false; return; #ifdef CONFIG_HDMI_DELAY_START_5V_DETECTION case HDMINOTICE_NOSIGNAL_DELAY_5V: Screen = BlueScreen; is.bActive = false; is.bNotSupport = false; noticekmf(KMF2UMF_EVID_DRV, KMF2UMF_EVTYPE_DRV_INFORM_SIGNALSTATUS, (UINT8 *)&is, sizeof(InputPathStatus_t)); hdmidbg("Support ScartOut when HDMI no signal\n"); ScartOut_HDMI_NOSIGNAL(); break; #endif case HDMINOTICE_NOSIGNAL: Screen = BlueScreen; is.bActive = false; is.bNotSupport = false; noticekmf(KMF2UMF_EVID_DRV, KMF2UMF_EVTYPE_DRV_INFORM_SIGNALSTATUS, (UINT8 *)&is, sizeof(InputPathStatus_t)); #ifdef HDMI_DDC5V_WORKAROUND if(!((MHL_CABLE_IN == TRUE)&&( DrvHDMIPortSelectBitsGet() == CONFIG_HDMI_MHL_PORT))) { #ifdef CONFIG_HDMI_GPIO_DETECT if( #ifdef CONFIG_HDMI_GPIO_DETECT_PORT_A (hdmi_get_cur_port() != HDMI_PORT_A) && #endif #ifdef CONFIG_HDMI_GPIO_DETECT_PORT_B (hdmi_get_cur_port() != HDMI_PORT_B) && #endif #ifdef CONFIG_HDMI_GPIO_DETECT_PORT_C (hdmi_get_cur_port() != HDMI_PORT_C) && #endif (TRUE)) #endif HDMI_TurnOff_SW_5V_schedule(0, hdmi_get_cur_port()); //restart HW DDC 5V detection after no signal } #endif hdmidbg("Support ScartOut when HDMI no signal\n"); ScartOut_HDMI_NOSIGNAL(); break; case HDMINOTICE_HAVESIGNAL: Screen = NormalScreen; is.bActive = true; is.bNotSupport = false; is.bHscalerDown = false; if(TRUE == HScalerDownFlag) { is.bHscalerDown = true; } noticekmf(KMF2UMF_EVID_DRV, KMF2UMF_EVTYPE_DRV_INFORM_SIGNALSTATUS, (UINT8 *)&is, sizeof(InputPathStatus_t)); break; case HDMINOTICE_NOTSUPPORT: Screen = BlueScreen; is.bActive = false; is.bNotSupport = true; noticekmf(KMF2UMF_EVID_DRV, KMF2UMF_EVTYPE_DRV_INFORM_SIGNALSTATUS, (UINT8 *)&is, sizeof(InputPathStatus_t)); break; case HDMINOTICE_PROCESSING_IN: Screen = BlackScreen; value = 1; noticekmf(KMF2UMF_EVID_HDMI, KMF2UMF_EVTYPE_HDMI_PROCESSING, (UINT8 *)&value, 1); break; case HDMINOTICE_PROCESSING_OUT: Screen = BlackScreen; value = 0; noticekmf(KMF2UMF_EVID_HDMI, KMF2UMF_EVTYPE_HDMI_PROCESSING, (UINT8 *)&value, 1); break; /* case HDMINOTICE_AVMUTE: Screen = BlackScreen; noticekmf(KMF2UMF_EVID_HDMI, KMF2UMF_EVTYPE_HDMI_AVMUTE, (UINT8 *)&value, 1); break; case HDMINOTICE_AVUNMUTE: Screen = NormalScreen; break; */ case HDMINOTICE_INACTIVE: Screen = BlueScreen; is.bActive = STATUS_SIGNALWEAK; is.bNotSupport = false; noticekmf(KMF2UMF_EVID_DRV, KMF2UMF_EVTYPE_DRV_INFORM_SIGNALSTATUS, (UINT8 *)&is, sizeof(InputPathStatus_t)); break; case HDMINOTICE_HDMIMODE: value = 1; noticekmf(KMF2UMF_EVID_HDMI, KMF2UMF_EVTYPE_HDMI_HDMIMODE, (UINT8 *)&value, 1); break; case HDMINOTICE_DVIMODE: value = 0; noticekmf(KMF2UMF_EVID_HDMI, KMF2UMF_EVTYPE_HDMI_HDMIMODE, (UINT8 *)&value, 1); break; case HDMINOTICE_SPD_INFOFRAME_UPDATE: { union hdmi_infoframe infoframe; //struct hdmi_spd_infoframe frame; infoframe.any.type = HDMI_INFOFRAME_TYPE_SPD; HDMI_Get_SPD_INFOFRAME(&infoframe.spd); hdmi_infoframe_log(0, 0, (union hdmi_infoframe*) &infoframe); noticekmf(KMF2UMF_EVID_HDMI, KMF2UMF_EVTYPE_HDMI_SPD_INFOFRAME_UPDATE, (UINT8 *)&infoframe.spd, sizeof(struct hdmi_spd_infoframe)); break; } #ifdef CONFIG_HDMI_SUPPORT_MHL case HDMINOTICE_MHL_CONTENT_OFF: Screen = BlackScreen; value = 0; break; case HDMINOTICE_MHL_CONTENT_ON: if((is.bActive == true)&&(is.bNotSupport == false)) { Screen = NormalScreen; VIP_UnmuteScreen(); DRV_HDMI_AudioEnable(); //for MHL CTS 4.2.7.1 } else { Screen = BlackScreen; } break; #endif } #ifdef CONFIG_HDMI_SUPPORT_MHL if ((Screen_Mode != Screen) && ((status == HDMINOTICE_PROCESSING_IN)||(status == HDMINOTICE_PROCESSING_OUT)//||(status == HDMINOTICE_AVMUTE) ||(status == HDMINOTICE_INACTIVE)||(status == HDMINOTICE_MHL_CONTENT_OFF))) #else if ((Screen_Mode != Screen) && ((status == HDMINOTICE_PROCESSING_IN)||(status == HDMINOTICE_PROCESSING_OUT)//||(status == HDMINOTICE_AVMUTE) ||(status == HDMINOTICE_INACTIVE))) #endif { hdmidbg("%s: %d Screen\n", __FUNCTION__, Screen); VIP_MuteScreenDirectly(); // VIP_MuteScreen_ISR(); might be pending until the next V sync ISR DRV_HDMI_AudioDisable(); } Screen_Mode = Screen; } void HDMI_NoticeHotPlug(UINT32 hpd_status) { hdmidbg("%s: 0x%08x\n", __FUNCTION__, hpd_status); noticekmf(KMF2UMF_EVID_HDMI, KMF2UMF_EVTYPE_HDMI_PORTSTATUS, (UINT8 *)&hpd_status, 4); } void HDMI_NoticeAudioACP(ACP_PKT_T type) { hdmidbg("%s: %d\n", __FUNCTION__, type); // if (type != ACP_GENERIC_AUDIO && // type != ACP_IEC60958_IDENTIFIED) { noticekmf(KMF2UMF_EVID_HDMI, KMF2UMF_EVTYPE_HDMI_HDMIAUDIOACP, (UINT8 *)&type, 1); } } //void HDMI_NoticeAudioTypeSupport(BOOL bSupport) //{ // hdmidbg("%s: %s\n", __FUNCTION__, bSupport ? "Support" : "Not Supported"); //noticekmf(NOTICEMSG_HDMI_AUDIOTYPE, &bSupport); //} void HDMI_NoticeAudioMode(HDMI_VIDEO_MODE mode) { hdmidbg("%s: %d\n", __FUNCTION__, mode); switch (mode) { case HDMI_MODE: HDMI_NoticeHandler(HDMINOTICE_HDMIMODE, __FUNCTION__); break; case DVI_MODE: HDMI_NoticeHandler(HDMINOTICE_DVIMODE, __FUNCTION__); //AI_change_hdmi_mode(HMODE_DVI); break; case NO_HDMI_AUDIO: //ADD MUTE PROTECT TO AVOID UNSMOOTH AUDIO OUTPUT { TVFE_Audio_Mute_t MC; MC.Enable = 1; MC.Mute_Delay= 0; MC.Mute_TXSpeed= 0; MC.Mute_Path = TVFE_AUDIO_MUTE_DRV_ALL_PATH; DRV_AUDIO_DC_SetMute(&MC); } //~MUTE PROTECT break; }; }