hdmi_notice.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. #include "drv_types.h"
  2. #include "hdmi_cfg.h"
  3. #include "hdmi_dbg.h"
  4. #include "hdmi_notice.h"
  5. #include "hdmi_audio.h"
  6. #include "hdmi_processing.h"
  7. #include "hdmi_hpd.h"
  8. #include "hdmi_hw.h"
  9. #include "hdmi_infoframe_api.h"
  10. #include <drv_vip_internal.h>
  11. #include <drv2kmf.h>
  12. #include <drv_event.h>
  13. #include "drv_audio_internal.h"
  14. #include "../audio/drv_audio_common.h"
  15. #include "hdmi.h"
  16. static UINT8 Screen_Mode = 0xff;
  17. extern UINT8 HScalerDownFlag;
  18. UINT32 HDMI_GetNoticedScreenMode()
  19. {
  20. return Screen_Mode;
  21. }
  22. void HDMI_NoticeHandler(HDMI_NOTICE_TYPE_e status, const INT8* src)
  23. {
  24. INT32 Screen = NormalScreen;
  25. static InputPathStatus_t is = {0};
  26. UINT8 value = 0;
  27. hdmidbg("%s: %s %d\n", __FUNCTION__, src, status);
  28. is.msgfromVIP = false;
  29. is.path = INPUTPATH_HDMI;
  30. switch (status)
  31. {
  32. default:
  33. case HDMINOTICE_INITSTATE:
  34. Screen_Mode = 0xff;
  35. is.bActive = false;
  36. is.bNotSupport = false;
  37. return;
  38. #ifdef CONFIG_HDMI_DELAY_START_5V_DETECTION
  39. case HDMINOTICE_NOSIGNAL_DELAY_5V:
  40. Screen = BlueScreen;
  41. is.bActive = false;
  42. is.bNotSupport = false;
  43. noticekmf(KMF2UMF_EVID_DRV, KMF2UMF_EVTYPE_DRV_INFORM_SIGNALSTATUS, (UINT8 *)&is, sizeof(InputPathStatus_t));
  44. hdmidbg("Support ScartOut when HDMI no signal\n");
  45. ScartOut_HDMI_NOSIGNAL();
  46. break;
  47. #endif
  48. case HDMINOTICE_NOSIGNAL:
  49. Screen = BlueScreen;
  50. is.bActive = false;
  51. is.bNotSupport = false;
  52. noticekmf(KMF2UMF_EVID_DRV, KMF2UMF_EVTYPE_DRV_INFORM_SIGNALSTATUS, (UINT8 *)&is, sizeof(InputPathStatus_t));
  53. #ifdef HDMI_DDC5V_WORKAROUND
  54. if(!((MHL_CABLE_IN == TRUE)&&( DrvHDMIPortSelectBitsGet() == CONFIG_HDMI_MHL_PORT)))
  55. {
  56. #ifdef CONFIG_HDMI_GPIO_DETECT
  57. if(
  58. #ifdef CONFIG_HDMI_GPIO_DETECT_PORT_A
  59. (hdmi_get_cur_port() != HDMI_PORT_A) &&
  60. #endif
  61. #ifdef CONFIG_HDMI_GPIO_DETECT_PORT_B
  62. (hdmi_get_cur_port() != HDMI_PORT_B) &&
  63. #endif
  64. #ifdef CONFIG_HDMI_GPIO_DETECT_PORT_C
  65. (hdmi_get_cur_port() != HDMI_PORT_C) &&
  66. #endif
  67. (TRUE))
  68. #endif
  69. HDMI_TurnOff_SW_5V_schedule(0, hdmi_get_cur_port()); //restart HW DDC 5V detection after no signal
  70. }
  71. #endif
  72. hdmidbg("Support ScartOut when HDMI no signal\n");
  73. ScartOut_HDMI_NOSIGNAL();
  74. break;
  75. case HDMINOTICE_HAVESIGNAL:
  76. Screen = NormalScreen;
  77. is.bActive = true;
  78. is.bNotSupport = false;
  79. is.bHscalerDown = false;
  80. if(TRUE == HScalerDownFlag)
  81. {
  82. is.bHscalerDown = true;
  83. }
  84. noticekmf(KMF2UMF_EVID_DRV, KMF2UMF_EVTYPE_DRV_INFORM_SIGNALSTATUS, (UINT8 *)&is, sizeof(InputPathStatus_t));
  85. break;
  86. case HDMINOTICE_NOTSUPPORT:
  87. Screen = BlueScreen;
  88. is.bActive = false;
  89. is.bNotSupport = true;
  90. noticekmf(KMF2UMF_EVID_DRV, KMF2UMF_EVTYPE_DRV_INFORM_SIGNALSTATUS, (UINT8 *)&is, sizeof(InputPathStatus_t));
  91. break;
  92. case HDMINOTICE_PROCESSING_IN:
  93. Screen = BlackScreen;
  94. value = 1;
  95. noticekmf(KMF2UMF_EVID_HDMI, KMF2UMF_EVTYPE_HDMI_PROCESSING, (UINT8 *)&value, 1);
  96. break;
  97. case HDMINOTICE_PROCESSING_OUT:
  98. Screen = BlackScreen;
  99. value = 0;
  100. noticekmf(KMF2UMF_EVID_HDMI, KMF2UMF_EVTYPE_HDMI_PROCESSING, (UINT8 *)&value, 1);
  101. break;
  102. /*
  103. case HDMINOTICE_AVMUTE:
  104. Screen = BlackScreen;
  105. noticekmf(KMF2UMF_EVID_HDMI, KMF2UMF_EVTYPE_HDMI_AVMUTE, (UINT8 *)&value, 1);
  106. break;
  107. case HDMINOTICE_AVUNMUTE:
  108. Screen = NormalScreen;
  109. break;
  110. */
  111. case HDMINOTICE_INACTIVE:
  112. Screen = BlueScreen;
  113. is.bActive = STATUS_SIGNALWEAK;
  114. is.bNotSupport = false;
  115. noticekmf(KMF2UMF_EVID_DRV, KMF2UMF_EVTYPE_DRV_INFORM_SIGNALSTATUS, (UINT8 *)&is, sizeof(InputPathStatus_t));
  116. break;
  117. case HDMINOTICE_HDMIMODE:
  118. value = 1;
  119. noticekmf(KMF2UMF_EVID_HDMI, KMF2UMF_EVTYPE_HDMI_HDMIMODE, (UINT8 *)&value, 1);
  120. break;
  121. case HDMINOTICE_DVIMODE:
  122. value = 0;
  123. noticekmf(KMF2UMF_EVID_HDMI, KMF2UMF_EVTYPE_HDMI_HDMIMODE, (UINT8 *)&value, 1);
  124. break;
  125. case HDMINOTICE_SPD_INFOFRAME_UPDATE:
  126. {
  127. union hdmi_infoframe infoframe;
  128. //struct hdmi_spd_infoframe frame;
  129. infoframe.any.type = HDMI_INFOFRAME_TYPE_SPD;
  130. HDMI_Get_SPD_INFOFRAME(&infoframe.spd);
  131. hdmi_infoframe_log(0, 0, (union hdmi_infoframe*) &infoframe);
  132. noticekmf(KMF2UMF_EVID_HDMI, KMF2UMF_EVTYPE_HDMI_SPD_INFOFRAME_UPDATE, (UINT8 *)&infoframe.spd, sizeof(struct hdmi_spd_infoframe));
  133. break;
  134. }
  135. #ifdef CONFIG_HDMI_SUPPORT_MHL
  136. case HDMINOTICE_MHL_CONTENT_OFF:
  137. Screen = BlackScreen;
  138. value = 0;
  139. break;
  140. case HDMINOTICE_MHL_CONTENT_ON:
  141. if((is.bActive == true)&&(is.bNotSupport == false))
  142. {
  143. Screen = NormalScreen;
  144. VIP_UnmuteScreen();
  145. DRV_HDMI_AudioEnable(); //for MHL CTS 4.2.7.1
  146. }
  147. else
  148. {
  149. Screen = BlackScreen;
  150. }
  151. break;
  152. #endif
  153. }
  154. #ifdef CONFIG_HDMI_SUPPORT_MHL
  155. if ((Screen_Mode != Screen) && ((status == HDMINOTICE_PROCESSING_IN)||(status == HDMINOTICE_PROCESSING_OUT)//||(status == HDMINOTICE_AVMUTE)
  156. ||(status == HDMINOTICE_INACTIVE)||(status == HDMINOTICE_MHL_CONTENT_OFF)))
  157. #else
  158. if ((Screen_Mode != Screen) && ((status == HDMINOTICE_PROCESSING_IN)||(status == HDMINOTICE_PROCESSING_OUT)//||(status == HDMINOTICE_AVMUTE)
  159. ||(status == HDMINOTICE_INACTIVE)))
  160. #endif
  161. {
  162. hdmidbg("%s: %d Screen\n", __FUNCTION__, Screen);
  163. VIP_MuteScreenDirectly(); // VIP_MuteScreen_ISR(); might be pending until the next V sync ISR
  164. DRV_HDMI_AudioDisable();
  165. }
  166. Screen_Mode = Screen;
  167. }
  168. void HDMI_NoticeHotPlug(UINT32 hpd_status)
  169. {
  170. hdmidbg("%s: 0x%08x\n", __FUNCTION__, hpd_status);
  171. noticekmf(KMF2UMF_EVID_HDMI, KMF2UMF_EVTYPE_HDMI_PORTSTATUS, (UINT8 *)&hpd_status, 4);
  172. }
  173. void HDMI_NoticeAudioACP(ACP_PKT_T type)
  174. {
  175. hdmidbg("%s: %d\n", __FUNCTION__, type);
  176. // if (type != ACP_GENERIC_AUDIO &&
  177. // type != ACP_IEC60958_IDENTIFIED)
  178. {
  179. noticekmf(KMF2UMF_EVID_HDMI, KMF2UMF_EVTYPE_HDMI_HDMIAUDIOACP, (UINT8 *)&type, 1);
  180. }
  181. }
  182. //void HDMI_NoticeAudioTypeSupport(BOOL bSupport)
  183. //{
  184. // hdmidbg("%s: %s\n", __FUNCTION__, bSupport ? "Support" : "Not Supported");
  185. //noticekmf(NOTICEMSG_HDMI_AUDIOTYPE, &bSupport);
  186. //}
  187. void HDMI_NoticeAudioMode(HDMI_VIDEO_MODE mode)
  188. {
  189. hdmidbg("%s: %d\n", __FUNCTION__, mode);
  190. switch (mode)
  191. {
  192. case HDMI_MODE:
  193. HDMI_NoticeHandler(HDMINOTICE_HDMIMODE, __FUNCTION__);
  194. break;
  195. case DVI_MODE:
  196. HDMI_NoticeHandler(HDMINOTICE_DVIMODE, __FUNCTION__);
  197. //AI_change_hdmi_mode(HMODE_DVI);
  198. break;
  199. case NO_HDMI_AUDIO:
  200. //ADD MUTE PROTECT TO AVOID UNSMOOTH AUDIO OUTPUT
  201. {
  202. TVFE_Audio_Mute_t MC;
  203. MC.Enable = 1;
  204. MC.Mute_Delay= 0;
  205. MC.Mute_TXSpeed= 0;
  206. MC.Mute_Path = TVFE_AUDIO_MUTE_DRV_ALL_PATH;
  207. DRV_AUDIO_DC_SetMute(&MC);
  208. }
  209. //~MUTE PROTECT
  210. break;
  211. };
  212. }