hdmi_video.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750
  1. #include "drv_types.h"
  2. #include "hdmi_dbg.h"
  3. #include "hdmi_hw.h"
  4. #include "hdmi_notice.h"
  5. #include "hdmi_video.h"
  6. #include "hdmi_xvycc.h"
  7. #include "drv_hdmi_external.h"
  8. #include "../vip/533/reg_vip_def.h"
  9. #include "../vip/533/drv_reg_access.h"
  10. #include "hdmi.h"
  11. #include "hdmi_time.h"
  12. //#define HDMI_SHOW_AVI_INFO
  13. static HDMI_TIMING_PARAM_t* pHDMIVideoTimingTable = NULL;
  14. static UINT32 u32HDMIVideoTimingTblSize = 0;
  15. #ifdef CONFIG_SUPPORT_DEBUG_MESSAGE
  16. #ifdef HDMI_SHOW_AVI_INFO
  17. static void print_avi_info(void);
  18. #endif
  19. static void print_video_timing(void);
  20. #endif
  21. static void print_send_to_vip_info(VIP_InterfaceKIC *pstKic);
  22. extern INT32 GetCustomerData(INT8 *pcTableName, INT8 **tablestart, UINT32 *tablesize);
  23. static UINT8 gbSupportMaxHz = 85;
  24. UINT8 HScalerDownFlag = FALSE;
  25. #if 0
  26. static void dump(const UINT8 *ptr, INT32 size)
  27. {
  28. INT32 i = 0, n = 0;
  29. INT8 str[3 * 0x10 + 8];
  30. for (i = 0; i < size ; i++)
  31. {
  32. if (n >= 0)
  33. {
  34. n += sprintf(&str[n], "%02x ", ptr[i]);
  35. }
  36. if (n >= 3 * 0x10 || i + 1 == size)
  37. {
  38. n = 0;
  39. hdmidbg("%s\n", str);
  40. }
  41. }
  42. }
  43. #endif
  44. static UINT8 get_colorimetry(UINT32 vertical)
  45. {
  46. UINT8 outColorimetry;
  47. outColorimetry = HDMI_RegisterRead(HDMIRX_R_AVI_C);
  48. /* Patch? */
  49. if (outColorimetry == AVI_C_NODATA)
  50. {
  51. outColorimetry = (vertical > 576) ? AVI_C_ITU709 : AVI_C_ITU601;
  52. }
  53. return outColorimetry;
  54. }
  55. static UINT8 get_pixel_fmt(void)
  56. {
  57. UINT8 outPixelFmt;
  58. HDMI_RegisterWrite(HDMIRX_R_DnSAMPLING_EN, 0);
  59. switch (HDMI_RegisterRead(HDMIRX_R_AVI_Y))
  60. {
  61. case AVI_Y_YCC422:
  62. outPixelFmt = YUV_422;
  63. break;
  64. case AVI_Y_YCC444:
  65. outPixelFmt = YUV_444;
  66. break;
  67. case AVI_Y_RGB:
  68. outPixelFmt = RGB;
  69. break;
  70. default:
  71. outPixelFmt = YUV_444;
  72. break;
  73. }
  74. return outPixelFmt;
  75. }
  76. static UINT8 get_ratio(void)
  77. {
  78. UINT8 outRatio;
  79. outRatio = (HDMI_RegisterRead(HDMIRX_R_AVI_M)<<4) | HDMI_RegisterRead(HDMIRX_R_AVI_R) ;
  80. return outRatio;
  81. }
  82. static DRV_HDMI3DStructure_e get_3d_fmt(void)
  83. {
  84. DRV_HDMI3DStructure_e fmt;
  85. DRV_HDMIVSITYPE_e vsi_hdmi_video_fmt;
  86. fmt = NONE_3D;
  87. vsi_hdmi_video_fmt = HDMI_RegisterRead(HDMIRX_R_VSI_PB_7_0_) >> 5;
  88. if (vsi_hdmi_video_fmt == DRV_HDMI_VSI_TYEP_3D)
  89. {
  90. fmt = HDMI_RegisterRead(HDMIRX_R_VSI_PB_15_8_) >> 4;
  91. switch (fmt)
  92. {
  93. case DRV_HDMI_3D_STRUCT_FP:
  94. case DRV_HDMI_3D_STRUCT_FA:
  95. case DRV_HDMI_3D_STRUCT_LA:
  96. case DRV_HDMI_3D_STRUCT_SS_F:
  97. case DRV_HDMI_3D_STRUCT_L_D:
  98. case DRV_HDMI_3D_STRUCT_L_D_G:
  99. case DRV_HDMI_3D_STRUCT_TB:
  100. case DRV_HDMI_3D_STRUCT_SS_H:
  101. break;
  102. default:
  103. fmt = NONE_3D;
  104. break;
  105. }
  106. }
  107. hdmidbg("%s: %d\n", __FUNCTION__, fmt);
  108. return fmt;
  109. }
  110. #ifdef SUPPORT_XVYCC
  111. static UINT8 get_xvYCC(void)
  112. {
  113. UINT8 fmt;
  114. fmt = XV_YCC_NONE;
  115. if (HDMI_RegisterRead(HDMIRX_R_GBD_exist))
  116. {
  117. fmt = (HDMI_RegisterRead(HDMIRX_AVI_EC) == 0) ? XV_YCC_601 :
  118. (HDMI_RegisterRead(HDMIRX_AVI_EC) == 1) ? XV_YCC_709 : XV_YCC_UNKNOWN_METRY;
  119. }
  120. return fmt;
  121. }
  122. #endif
  123. static UINT32 get_pixel_clock(void)
  124. {
  125. UINT32 uiPixelClock = 0;
  126. if (HDMI_RegisterRead(HDMIRX_R_system_clk_cnt))
  127. {
  128. #ifdef CONFIG_CRYSTAL_USE_24MHZ
  129. uiPixelClock = (24000000 / HDMI_RegisterRead(HDMIRX_R_system_clk_cnt)) * HDMI_RegisterRead(HDMIRX_R_pixel_rate_cnt);
  130. #else
  131. uiPixelClock = (24576000 / HDMI_RegisterRead(HDMIRX_R_system_clk_cnt)) * HDMI_RegisterRead(HDMIRX_R_pixel_rate_cnt);
  132. #endif
  133. hdmidbg("pixel_clk>> %d, sys_clk_cnt: 0x%x R_pixel_rate_cnt: 0x%x\n", uiPixelClock, HDMI_RegisterRead(HDMIRX_R_system_clk_cnt), HDMI_RegisterRead(HDMIRX_R_pixel_rate_cnt));
  134. }
  135. return uiPixelClock;
  136. }
  137. static PLF_VideoID_t get_VideoID(VIP_InterfaceKIC *pstKic)
  138. {
  139. PLF_VideoID_t eVideoID = PLF_VIDEO_TIMING_ID_NON_VIDEO_TIMING;
  140. UINT8 i;
  141. for(i = 0;i < u32HDMIVideoTimingTblSize;i++)
  142. {
  143. if(pHDMIVideoTimingTable[i].fInterlace != pstKic->bInterlace)
  144. continue;
  145. else if(pHDMIVideoTimingTable[i].wVFreq != pstKic->uiVfreq)
  146. continue;
  147. else if(abs(pHDMIVideoTimingTable[i].wHActive - pstKic->uiHactive) > (pHDMIVideoTimingTable[i].wHActive * HDMI_HVAILD_TOLERANCE_PERMILE / 1000))
  148. continue;
  149. else if(abs(pHDMIVideoTimingTable[i].wVActive - pstKic->uiVactive) > (pHDMIVideoTimingTable[i].wVActive * HDMI_VVAILD_TOLERANCE_PERMILE / 1000))
  150. continue;
  151. else
  152. {
  153. eVideoID = pHDMIVideoTimingTable[i].eVideoID;
  154. hdmidbg("[%s]ID[0x%x]: HAct:%d VAct:%d VHz:%d Inter:%d\n", __FUNCTION__, pHDMIVideoTimingTable[i].eVideoID, pHDMIVideoTimingTable[i].wHActive, pHDMIVideoTimingTable[i].wVActive, pHDMIVideoTimingTable[i].wVFreq, pHDMIVideoTimingTable[i].fInterlace);
  155. break;
  156. }
  157. }
  158. return eVideoID;
  159. }
  160. static BOOL HDMI_VideoNotSupport(VIP_InterfaceKIC *pstKic)
  161. {
  162. BOOL NotSupport = false;
  163. hdmidbg("pixel clk:0x%x HDMI=%d\n",HDMI_RegisterRead(HDMIRX_R_pixel_rate_cnt) , HDMI_RegisterRead(HDMIRX_R_HDMI_en));
  164. if((HDMI_RegisterRead(HDMIRX_R_pixel_rate_cnt) > 0xd00) || (!HDMI_RegisterRead(HDMIRX_R_HDMI_en) && (HDMI_RegisterRead(HDMIRX_R_pixel_rate_cnt) > 0x6b0))) //HDMI mode:246.7MHz, DVI mode: 165MHz
  165. {
  166. NotSupport = true;
  167. }
  168. else if((HDMI_RegisterRead(HDMIRX_R_pixel_rate_cnt) > 0x700) && pstKic->bInterlace == 1) //for 1920x1080i@120, bandwith is not enough issue
  169. {
  170. NotSupport = true;
  171. }
  172. return NotSupport;
  173. }
  174. void HDMI_GetVideoTimingTable(void)
  175. {
  176. GetCustomerData("gHDMI_VideoTimingTable", (void *)&pHDMIVideoTimingTable, &u32HDMIVideoTimingTblSize);
  177. //Calc Table Size
  178. u32HDMIVideoTimingTblSize = u32HDMIVideoTimingTblSize/sizeof(HDMI_TIMING_PARAM_t);
  179. }
  180. UINT8 HDMI_GetInputInformation(VIP_InterfaceKIC *pstKic) // return value: 0 - Not Support, 1 - Support, 2 - No signale
  181. {
  182. UINT8 ucModeSupport = 1; //Support
  183. UINT32 Vactive_o, Vactive_e;
  184. ULONG pixel_clk_freq = 0, vfreq = 0;
  185. INT32 iWait= 500;
  186. UINT8 hdmi_frmcnt = 0;
  187. UINT8 hdmi_frmcnt_debounce = 50;
  188. UINT8 hdmi_frmcnt_check=0;
  189. UINT32 Vtotal;
  190. HScalerDownFlag = FALSE;
  191. pstKic->ucInputSource = HDMI;
  192. pstKic->uiHfreq = -1;
  193. pstKic->ucFrameRate = -1;
  194. if(HDMI_RegisterRead(HDMIRX_R_HT)==0)
  195. {
  196. iWait= 500;
  197. printk("%s:HDMIRX_R_HT == 0!!!!!!\n", __FUNCTION__);
  198. while (iWait>0)
  199. {
  200. if((VIP_RegisterRead(VIP_sta_hdmi_hs_active)==TRUE)&&
  201. (VIP_RegisterRead(VIP_sta_hdmi_vs_active)==TRUE))
  202. {
  203. break;
  204. }
  205. HDMI_DelayMs(1);
  206. iWait--;
  207. }
  208. if(iWait == 0)
  209. {
  210. printk("%s:Reach Wait Limit 500Ms!!\n", __FUNCTION__);
  211. }
  212. else
  213. {
  214. iWait= 1000;
  215. hdmi_frmcnt_check=0;
  216. printk("%s:HDMIRX_R_HT == 0!!!!!!\n", __FUNCTION__);
  217. while ((iWait>0) && (hdmi_frmcnt_check < hdmi_frmcnt_debounce))
  218. {
  219. if(hdmi_frmcnt!=VIP_RegisterRead(VIP_sta_hdmi_frmcnt))
  220. {
  221. hdmi_frmcnt=VIP_RegisterRead(VIP_sta_hdmi_frmcnt);
  222. hdmi_frmcnt_check=0;
  223. }
  224. else
  225. {
  226. hdmi_frmcnt_check++;
  227. }
  228. HDMI_DelayMs(1);
  229. iWait--;
  230. }
  231. if(iWait == 0)
  232. {
  233. printk("%s:Reach Wait Limit 1000Ms\n!!", __FUNCTION__);
  234. }
  235. vfreq = 6000 /(hdmi_frmcnt+1);
  236. }
  237. }
  238. /* Interlace */
  239. pstKic->bInterlace = HDMI_RegisterRead(HDMIRX_R_Interlace);
  240. /* Vertical */
  241. Vactive_o = HDMI_RegisterRead(HDMIRX_top_de_v_width_lock);
  242. Vactive_e = HDMI_RegisterRead(HDMIRX_btn_de_v_width_lock);
  243. //HW issue:workaround for front porch = 0 case, hw VDEE report is wrong -- start --
  244. if(((INT32)(HDMI_RegisterRead(HDMIRX_R_TOP_VDEE) - HDMI_RegisterRead(HDMIRX_R_TOP_VDES))) < 0)
  245. {
  246. Vactive_o = Vactive_o + 1;
  247. }
  248. if(((INT32)(HDMI_RegisterRead(HDMIRX_R_BTM_VDEE) - HDMI_RegisterRead(HDMIRX_R_BTM_VDES))) < 0)
  249. {
  250. Vactive_e = Vactive_e + 1;
  251. }
  252. //HW issue:workaround for front porch = 0 case, hw VDEE report is wrong -- end --
  253. if (Vactive_o != 0)
  254. {
  255. pstKic->uiVactive = Vactive_o;
  256. pstKic->uiVtotal = HDMI_RegisterRead(HDMIRX_R_TOP_VT);
  257. pstKic->uiVstart = HDMI_RegisterRead(HDMIRX_R_TOP_VDES);
  258. }
  259. else
  260. {
  261. pstKic->uiVactive = Vactive_e;
  262. pstKic->uiVtotal = HDMI_RegisterRead(HDMIRX_R_BTM_VT);
  263. pstKic->uiVstart = HDMI_RegisterRead(HDMIRX_R_BTM_VDES);
  264. }
  265. //for 487i, top Vactive = 244, bottom Vactive = 243, if send 244 to VIP, the last line will be garbage
  266. if(pstKic->bInterlace == 1)
  267. {
  268. if(Vactive_o == (Vactive_e + 1))
  269. pstKic->uiVactive = Vactive_e;
  270. else
  271. pstKic->uiVactive = Vactive_o;
  272. }
  273. pstKic->uiVend = pstKic->uiVstart + pstKic->uiVactive ;
  274. /* Horizontal */
  275. pstKic->uiHactive = HDMI_RegisterRead(HDMIRX_de_h_width_lock) / (HDMI_RegisterRead(HDMIRX_R_AVI_PR) + 1);
  276. /* Patch: hactive should be a even number in DVI mode */
  277. if (HDMI_RegisterRead(HDMIRX_R_HDMI_en) == 0)
  278. {
  279. pstKic->uiHactive &= 0xfffffffe;
  280. }
  281. pstKic->uiHtotal = HDMI_RegisterRead(HDMIRX_R_HT) + 1;
  282. pstKic->uiHstart = HDMI_RegisterRead(HDMIRX_R_HDES) + 1;
  283. pstKic->uiHend = pstKic->uiHstart + pstKic->uiHactive;
  284. /* Other */
  285. pstKic->ucVpol = HDMI_RegisterRead(HDMIRX_R_Vsync_Polarity);
  286. pstKic->ucHpol = HDMI_RegisterRead(HDMIRX_R_Hsync_Polarity);
  287. pstKic->bDviEnable = HDMI_RegisterRead(HDMIRX_R_HDMI_en) ? 0 : 1;
  288. /* Color format */
  289. pstKic->ucDataFormat = get_pixel_fmt();
  290. /* Patch: In order to improve picture quality, transform YCC444 to YCC422 for SD resolution */
  291. if (HDMI_RegisterRead(HDMIRX_R_AVI_Y) == AVI_Y_YCC444 && HDMI_RegisterRead(HDMIRX_R_HDMI_en) &&
  292. ((pstKic->uiHactive == 720) &&
  293. (pstKic->uiVactive == 480 || pstKic->uiVactive == 240 || pstKic->uiVactive == 576 || pstKic->uiVactive == 288)))
  294. {
  295. hdmidbg("YC444toYC422 for SD\n");
  296. HDMI_RegisterWrite(HDMIRX_R_DnSAMPLING_EN, 1);
  297. pstKic->ucDataFormat = YUV_422;
  298. }
  299. pstKic->ucR_AVI_S = HDMI_RegisterRead(HDMIRX_R_AVI_S);
  300. pstKic->ucITC = HDMI_RegisterRead(HDMIRX_AVI_ITC);
  301. pstKic->ucColorimetry = get_colorimetry((pstKic->uiVactive * (pstKic->bInterlace + 1)));
  302. pstKic->ucAspectRatio = get_ratio();
  303. //pstKic->ucxvYCC = get_xvYCC();
  304. if(pstKic->bDviEnable == 1) //DVI mode, RGB range is full range
  305. pstKic->ucRGBRange = 2;
  306. else
  307. {
  308. pstKic->ucRGBRange = HDMI_RegisterRead(HDMIRX_AVI_Q);
  309. if(pstKic->ucRGBRange == 0) //in CEA-861-D spec.: if RGB Range = default, RGB pixel data values should be assumed to have the limited range when receiving a CE video format, and the full range when receiving an IT format.
  310. {
  311. if(HDMI_RegisterRead(HDMIRX_AVI_ITC) == 1) //IT format
  312. pstKic->ucRGBRange = 2; //full range
  313. else //CE format
  314. pstKic->ucRGBRange = 0; //Default
  315. }
  316. }
  317. pstKic->uc3DStructure = get_3d_fmt();
  318. /* Patch: Sel field pol for 1080i */
  319. if (HDMI_RegisterRead(HDMIRX_R_Interlace) == 1 && pstKic->uiVactive == 540 &&
  320. (HDMI_RegisterRead(HDMIRX_R_TOP_VDES) + 1) != HDMI_RegisterRead(HDMIRX_R_BTM_VDES))
  321. {
  322. HDMI_RegisterWrite(HDMIRX_R_FIELD_POL, 1);
  323. }
  324. else
  325. {
  326. HDMI_RegisterWrite(HDMIRX_R_FIELD_POL, 0);
  327. }
  328. pixel_clk_freq = get_pixel_clock();
  329. if (HDMI_RegisterRead(HDMIRX_R_Interlace) == 1)
  330. {
  331. Vtotal = HDMI_RegisterRead(HDMIRX_R_BTM_VT);
  332. }
  333. else
  334. {
  335. Vtotal = pstKic->uiVtotal ;
  336. }
  337. /* get vfreq */
  338. if ((pstKic->uiHtotal > 1) && Vtotal) //H total = HDMIRX_R_HT + 1
  339. {
  340. vfreq = (pixel_clk_freq + ((pstKic->uiHtotal * Vtotal) >> 1)) / (pstKic->uiHtotal * Vtotal);
  341. }
  342. /*
  343. else
  344. {
  345. vfreq = 0;
  346. }
  347. */
  348. switch (HDMI_RegisterRead(HDMIRX_dcm)) //0xbe0e00dc[1:0]
  349. {
  350. case 0: // DCM Factor =1
  351. //hdmidbg("%s>> VFreq = %ld Hz = (((0x%lx+((0x%x*0x%x)>>1))/(0x%x*0x%x)))/1\n", __FUNCTION__, vfreq, pixel_clk_freq, pstKic->uiHtotal, pstKic->uiVtotal, pstKic->uiHtotal, pstKic->uiVtotal);
  352. break;
  353. case 1: // DCM Factor =1.25
  354. vfreq = (vfreq << 2) / 5; // divide 1.25=*4/5
  355. //hdmidbg("%s>> VFreq = %ld Hz = (((0x%lx+((0x%x*0x%x)>>1))/(0x%x*0x%x)))/1.25\n", __FUNCTION__, vfreq, pixel_clk_freq, pstKic->uiHtotal, pstKic->uiVtotal, pstKic->uiHtotal, pstKic->uiVtotal);
  356. break;
  357. case 2: // DCM Factor =1.5
  358. vfreq = (vfreq << 1) / 3; // devide 1.5=*2/3
  359. //hdmidbg("%s>> VFreq = %ld Hz = (((0x%lx+((0x%x*0x%x)>>1))/(0x%x*0x%x)))/1.5\n", __FUNCTION__, vfreq, pixel_clk_freq, pstKic->uiHtotal, pstKic->uiVtotal, pstKic->uiHtotal, pstKic->uiVtotal);
  360. break;
  361. case 3: // DCM Factor =2
  362. vfreq = vfreq >> 1;
  363. //hdmidbg("%s>> VFreq = %ld Hz = (((0x%lx+((0x%x*0x%x)>>1))/(0x%x*0x%x)))/2\n", __FUNCTION__, vfreq, pixel_clk_freq, pstKic->uiHtotal, pstKic->uiVtotal, pstKic->uiHtotal, pstKic->uiVtotal);
  364. break;
  365. default : // DCM Factor =1
  366. //hdmidbg("%s>> (Default) VFreq = %ld Hz = (((0x%lx+((0x%x*0x%x)>>1))/(0x%x*0x%x)))/1\n", __FUNCTION__, vfreq, pixel_clk_freq, pstKic->uiHtotal, pstKic->uiVtotal, pstKic->uiHtotal, pstKic->uiVtotal);
  367. break;
  368. }
  369. if (HDMI_VideoNotSupport(pstKic) == true)
  370. {
  371. ucModeSupport = 0; // Not Support
  372. }
  373. else if ((pstKic->uiHtotal > 1) && pstKic->uiVtotal != 0) //H total = HDMIRX_R_HT + 1
  374. {
  375. if (vfreq == 73)
  376. {
  377. vfreq = 72; // the experience from VIP
  378. }
  379. else if (vfreq == 59 || vfreq == 61)
  380. {
  381. vfreq = 60; // the experience from VIP
  382. }
  383. else if (vfreq == 74)
  384. {
  385. vfreq = 75; // the experience from VIP
  386. }
  387. else if (vfreq == 49)
  388. {
  389. vfreq = 50; // the experience from VIP
  390. }
  391. else if (vfreq == 57)
  392. {
  393. vfreq = 56;
  394. }
  395. else if (vfreq == 86)
  396. {
  397. vfreq = 85;
  398. }
  399. else if (vfreq == 76)
  400. {
  401. vfreq = 75;
  402. }
  403. else if (vfreq == 71)
  404. {
  405. vfreq = 70;
  406. }
  407. }
  408. else
  409. {
  410. hdmidbg("else:Htotal %d Vtotal %d\n",pstKic->uiHtotal, pstKic->uiVtotal);
  411. }
  412. pstKic->uiVfreq = vfreq;
  413. printk("[H] VHz:%d \n",pstKic->uiVfreq);
  414. if(vfreq > gbSupportMaxHz)
  415. {
  416. hdmidbg("VHz not support, Max is %d \n", gbSupportMaxHz);
  417. ucModeSupport = 0;
  418. }
  419. #ifndef CONFIG_SUPPORT_4K_2K_30
  420. if((pstKic->uiHactive > 2000)||(pstKic->uiVactive > 1500))// 4kx2K not support
  421. {
  422. hdmidbg("not support 4kx2K\n");
  423. ucModeSupport = 0;
  424. }
  425. #endif
  426. pstKic->uiTimingIndex = get_VideoID(pstKic);
  427. #ifdef CONFIG_SUPPORT_DEBUG_MESSAGE
  428. print_video_timing();
  429. #ifdef HDMI_SHOW_AVI_INFO
  430. print_avi_info();
  431. #endif
  432. #endif
  433. print_send_to_vip_info(pstKic);
  434. if (pstKic->uiHactive == 0 && pstKic->uiVactive == 0)
  435. {
  436. hdmidbg("HAct=0 & VAct=0. \n");
  437. ucModeSupport = 2; // Regard it as "No Signal". SW Workaround
  438. }
  439. #ifdef CONFIG_SUPPORT_4K_2K_30
  440. if (pstKic->uiHactive == 3840)
  441. {
  442. hdmidbg("......4K x 2K.....\n");
  443. pstKic->uiHactive = (pstKic->uiHactive)/2;
  444. pstKic->uiHtotal = (pstKic->uiHtotal)/2;
  445. pstKic->uiHstart = (pstKic->uiHstart)/2 ;
  446. pstKic->uiHend = (pstKic->uiHend)/2;
  447. *((u8 *)0xbe000257) = 0x18 ;
  448. HScalerDownFlag = TRUE;
  449. }
  450. else
  451. {
  452. *((u8 *)0xbe000257) = 0x01 ;//Bit0: 1 => Bypass mode
  453. }
  454. #endif
  455. return ucModeSupport;
  456. }
  457. void HDMI_VSI_handler(void)
  458. {
  459. hdmidbg("Get VSI PB\n");
  460. // HDMIRX_R_VSI_PB_7_0_ bit 7 ~ bit 5(HDMI_Video_Format):
  461. // 000 - No additional HDMI video format
  462. // 001 - 1 byte of parameter value follows
  463. // 010 - 3D format
  464. // HDMIRX_R_VSI_PB__15_8_ bit 7 ~ bit 4(3D_Structure):
  465. // 0000 - Frame packing
  466. // 0110 - Top-and Bottom
  467. // 1000 - Side-by-Side(Half)
  468. // HDMIRX_R_VSI_PB_23_16_ bit 7 ~ bit 4(3D_Ext_Data):
  469. // 00xx - Horizontal sub-sampling
  470. // 0100 - Odd/Left pic Odd/Right pic
  471. // 0101 - Odd/Left pic Even/Right pic
  472. // 0110 - Even/Left pic Odd/Right pic
  473. // 0111 - Even/Left pic Even/Right pic
  474. #if 0
  475. #define VSI_VIDEO_FMT_3D_FMT 0x2
  476. if ((HDMI_RegisterRead(HDMIRX_R_VSI_PB_7_0_) >> 5) == VSI_VIDEO_FMT_3D_FMT)
  477. {
  478. UINT8 uc3D_Struc = (HDMI_RegisterRead(HDMIRX_R_VSI_PB__15_8_) >> 4);
  479. if ((uc3D_Struc & 0xc) || (uc3D_Struc == 0x7))
  480. {
  481. uc3D_Struc = NONE_3D; // unused. Set 2D
  482. }
  483. if (Active_flag)
  484. {
  485. VIP_SourceScreenMode(HDMI, BlackScreen, __LINE__);
  486. ModeSupport_flag = HDMI_SendVipInfo();
  487. VIP_SourceScreenMode(HDMI, NormalScreen, __LINE__);
  488. }
  489. }
  490. #endif
  491. }
  492. BOOL HDMI_IsAviChanged(VIP_InterfaceKIC *pstKic)
  493. {
  494. BOOL ret = false;
  495. UINT8 bCurPixelFormat = get_pixel_fmt();
  496. UINT8 bCurAspectRatio= get_ratio();
  497. if(bCurPixelFormat != pstKic->ucDataFormat)
  498. {
  499. hdmidbg("Pixel Format change %d->%d\n",pstKic->ucDataFormat, bCurPixelFormat);
  500. pstKic->ucDataFormat = bCurPixelFormat;
  501. ret = true;
  502. }
  503. if(bCurAspectRatio != pstKic->ucAspectRatio)
  504. {
  505. hdmidbg("Aspect Ratio change %d->%d\n",pstKic->ucAspectRatio, bCurAspectRatio);
  506. pstKic->ucAspectRatio = bCurAspectRatio;
  507. ret = true;
  508. }
  509. return ret;
  510. }
  511. void HDMI_SetSupportMaxHz(UINT8 bSupportMaxHz)
  512. {
  513. gbSupportMaxHz = bSupportMaxHz;
  514. hdmidbg("Support Max Hz:%d\n", gbSupportMaxHz);
  515. }
  516. #ifdef CONFIG_SUPPORT_DEBUG_MESSAGE
  517. #ifdef HDMI_SHOW_AVI_INFO
  518. /* Note: debug use only */
  519. static void print_avi_info(void)
  520. {
  521. /* Auxiliary Video Information. Check CEA-861-D for more details */
  522. hdmidbg("AVI Info\n");
  523. hdmidbg("version: 0x%x (Must be 0x2)\n", HDMI_RegisterRead(HDMIRX_R_AVI_Ver));
  524. hdmidbg("Pixel color format (Y=%d): %s\n", HDMI_RegisterRead(HDMIRX_R_AVI_Y),
  525. HDMI_RegisterRead(HDMIRX_R_AVI_Y) == 0x0 ? "RGB" :
  526. HDMI_RegisterRead(HDMIRX_R_AVI_Y) == 0x1 ? "YCbCr422" :
  527. HDMI_RegisterRead(HDMIRX_R_AVI_Y) == 0x2 ? "YCbCr444" : "Future use"
  528. );
  529. hdmidbg("Bar Info (B=%d): %s\n", HDMI_RegisterRead(HDMIRX_R_AVI_B),
  530. HDMI_RegisterRead(HDMIRX_R_AVI_B) == 0x0 ? "Not valid" :
  531. HDMI_RegisterRead(HDMIRX_R_AVI_B) == 0x1 ? "Vertical Bar Info Valid" :
  532. HDMI_RegisterRead(HDMIRX_R_AVI_B) == 0x2 ? "Horizontal Bar Info Valid" :
  533. HDMI_RegisterRead(HDMIRX_R_AVI_B) == 0x3 ? "Horizontal/Vertical Bar Info Valid" : ""
  534. );
  535. hdmidbg("Scan Info (S=%d): %s\n", HDMI_RegisterRead(HDMIRX_R_AVI_S),
  536. HDMI_RegisterRead(HDMIRX_R_AVI_S) == 0x0 ? "No Data" :
  537. HDMI_RegisterRead(HDMIRX_R_AVI_S) == 0x1 ? "Overscanned" :
  538. HDMI_RegisterRead(HDMIRX_R_AVI_S) == 0x2 ? "Underscanned" : "Future use"
  539. );
  540. hdmidbg("Colorimetry (C=%d): %s\n", HDMI_RegisterRead(HDMIRX_R_AVI_C),
  541. HDMI_RegisterRead(HDMIRX_R_AVI_C) == 0x0 ? "No data" :
  542. HDMI_RegisterRead(HDMIRX_R_AVI_C) == 0x1 ? "ITU601" :
  543. HDMI_RegisterRead(HDMIRX_R_AVI_C) == 0x2 ? "ITU709" :
  544. HDMI_RegisterRead(HDMIRX_R_AVI_C) == 0x3 ? "Extended(Check EC)" : ""
  545. );
  546. hdmidbg("Picture Aspect Ratio (M=%d): %s\n", HDMI_RegisterRead(HDMIRX_R_AVI_M),
  547. HDMI_RegisterRead(HDMIRX_R_AVI_M) == 0x0 ? "No data" :
  548. HDMI_RegisterRead(HDMIRX_R_AVI_M) == 0x1 ? "4:3" :
  549. HDMI_RegisterRead(HDMIRX_R_AVI_M) == 0x2 ? "16:9" : "Future use"
  550. );
  551. hdmidbg("Active Format Aspect Ratio (R=%d): %s\n", HDMI_RegisterRead(HDMIRX_R_AVI_R),
  552. HDMI_RegisterRead(HDMIRX_R_AVI_R) == 0x8 ? "Same as picutre aspect ratio" :
  553. HDMI_RegisterRead(HDMIRX_R_AVI_R) == 0x9 ? "4:3(Center)" :
  554. HDMI_RegisterRead(HDMIRX_R_AVI_R) == 0xA ? "16:9(Center)" :
  555. HDMI_RegisterRead(HDMIRX_R_AVI_R) == 0xB ? "14:9(Center)" : "Per DVB AFD active_format field"
  556. );
  557. hdmidbg("IT Content(ITC=%d): %s\n", HDMI_RegisterRead(HDMIRX_AVI_ITC),
  558. HDMI_RegisterRead(HDMIRX_AVI_ITC) == 0x0 ? "No data" : "IT Content"
  559. );
  560. hdmidbg("Gamut Metadata packet %d\n", HDMI_RegisterRead(HDMIRX_R_GBD_exist));
  561. // if( HDMI_RegisterRead(HDMIRX_R_GBD_exist) )
  562. // {
  563. hdmidbg("Extended Colorimetry (EC=%d): %s\n", HDMI_RegisterRead(HDMIRX_AVI_EC),
  564. HDMI_RegisterRead(HDMIRX_AVI_EC) == 0x0 ? "xvYCC601" :
  565. HDMI_RegisterRead(HDMIRX_AVI_EC) == 0x1 ? "xvYCC709" : "Reserved"
  566. );
  567. // }
  568. hdmidbg("RGB Quantizatio n Range (Q=%d): %s\n", HDMI_RegisterRead(HDMIRX_AVI_Q),
  569. HDMI_RegisterRead(HDMIRX_AVI_Q) == 0x0 ? "Default" :
  570. HDMI_RegisterRead(HDMIRX_AVI_Q) == 0x1 ? "Limited Range" :
  571. HDMI_RegisterRead(HDMIRX_AVI_Q) == 0x2 ? "Full Range" : "Reserved"
  572. );
  573. hdmidbg("Non-Uniform Picture Scaling (SC=%d): %s\n", HDMI_RegisterRead(HDMIRX_R_AVI_SC),
  574. HDMI_RegisterRead(HDMIRX_R_AVI_SC) == 0x0 ? "No known non-uniform scaling" :
  575. HDMI_RegisterRead(HDMIRX_R_AVI_SC) == 0x1 ? "Scaled horizontally" :
  576. HDMI_RegisterRead(HDMIRX_R_AVI_SC) == 0x2 ? "Scaled vertically" :
  577. HDMI_RegisterRead(HDMIRX_R_AVI_SC) == 0x3 ? "Scaled horizontally and vertically" : ""
  578. );
  579. hdmidbg("Pixel Repetition Factor (PR): %d\n", HDMI_RegisterRead(HDMIRX_R_AVI_PR));
  580. hdmidbg("Video Codes (VIC=%d): %s\n", HDMI_RegisterRead(HDMIRX_R_AVI_VIC),
  581. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 1) ? "640x480p @ 59.94/60Hz" :
  582. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 2 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 3) ? "720x480p @ 59.94/60Hz" :
  583. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 4) ? "1280x720p @ 59.94/60Hz" :
  584. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 5) ? "1920x1080i @ 59.94/60Hz" :
  585. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 6 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 7) ? "720(1440)x480i @ 59.94/60Hz" :
  586. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 8 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 9) ? "720(1440)x240p @ 59.94/60Hz" :
  587. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 10 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 11) ? "2880x480i @ 59.94/60Hz" :
  588. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 12 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 13) ? "2880x240p @ 59.94/60Hz" :
  589. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 14 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 15) ? "1440x480p @ 59.94/60Hz" :
  590. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 16) ? "1920x1080p @ 59.94/60Hz" :
  591. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 17 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 18) ? "720x576p @ 50Hz" :
  592. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 19) ? "1280x720p @ 50Hz" :
  593. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 20) ? "1920x1080i @ 50Hz" :
  594. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 21 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 22) ? "720(1440)x576i @ 50Hz" :
  595. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 23 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 24) ? "720(1440)x288p @ 50Hz" :
  596. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 25 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 26) ? "2880x576i @ 50Hz" :
  597. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 27 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 28) ? "2880x288p @ 50Hz" :
  598. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 29 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 30) ? "1440x576p @ 50Hz" :
  599. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 31) ? "1920x1080p @ 50Hz" :
  600. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 32) ? "1920x1080p @ 23.98/24Hz" :
  601. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 33) ? "1920x1080p @ 25Hz" :
  602. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 34) ? "1920x1080p @ 29.98/30Hz" :
  603. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 35 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 36) ? "2880x480p @ 59.94/60Hz" :
  604. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 37 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 38) ? "2880x576p @ 50Hz" :
  605. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 39) ? "1920x1080i(1250) @ 50Hz" :
  606. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 40) ? "1920x1080i @ 100Hz" :
  607. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 41) ? "1280x720p @ 100Hz" :
  608. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 42 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 43) ? "720x576p @ 100Hz" :
  609. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 44 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 45) ? "720(1440)x576i @ 100Hz" :
  610. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 46) ? "1920x1080i @ 119.88/120Hz" :
  611. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 47) ? "1920x720p @ 119.88/120Hz" :
  612. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 48 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 49) ? "720x480p @ 119.88/120Hz" :
  613. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 50 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 51) ? "720(1440)x480i @ 119.88/120Hz" :
  614. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 52 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 53) ? "720x576p @ 200Hz" :
  615. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 54 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 55) ? "720(1440)x576i @ 200Hz" :
  616. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 56 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 57) ? "720x480p @ 239.76/240Hz" :
  617. (HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 58 || HDMI_RegisterRead(HDMIRX_R_AVI_VIC) == 59) ? "720(1440)x480i @ 239.76/240Hz" : "Can't supported"
  618. );
  619. hdmidbg("Start line number : %d\n", HDMI_RegisterRead(HDMIRX_R_AVI_SLN));
  620. hdmidbg("End line number : %d\n", HDMI_RegisterRead(HDMIRX_R_AVI_ELN));
  621. hdmidbg("Start pixel number: %d\n", HDMI_RegisterRead(HDMIRX_R_AVI_SPN));
  622. hdmidbg("End pixel number : %d\n", HDMI_RegisterRead(HDMIRX_R_AVI_EPN));
  623. }
  624. #endif
  625. static void print_video_timing(void)
  626. {
  627. hdmidbg("Print Video Timing info:\n");
  628. hdmidbg("V Top:\n\tTotal:%d\n\tDE Start:%d, End: %d, sw_Valid:%d\n\thw_Valid:%d\n", HDMI_RegisterRead(HDMIRX_R_TOP_VT), HDMI_RegisterRead(HDMIRX_R_TOP_VDES), HDMI_RegisterRead(HDMIRX_R_TOP_VDEE), HDMI_RegisterRead(HDMIRX_R_TOP_VDEE) - HDMI_RegisterRead(HDMIRX_R_TOP_VDES), HDMI_RegisterRead(HDMIRX_top_de_v_width_lock));
  629. hdmidbg("V Bottom:\n\tTotal:%d\n\tDE Start:%d, End: %d, sw_Valid:%d\n\thw_Valid:%d\n", HDMI_RegisterRead(HDMIRX_R_BTM_VT), HDMI_RegisterRead(HDMIRX_R_BTM_VDES), HDMI_RegisterRead(HDMIRX_R_BTM_VDEE), HDMI_RegisterRead(HDMIRX_R_BTM_VDEE) - HDMI_RegisterRead(HDMIRX_R_BTM_VDES), HDMI_RegisterRead(HDMIRX_btn_de_v_width_lock));
  630. hdmidbg("H:\n\tTotal:%d\n\tDE Start:%d, End:%d, sw_valid:%d\n\thw_Valid:%d\n", HDMI_RegisterRead(HDMIRX_R_HT) + 1, HDMI_RegisterRead(HDMIRX_R_HDES) + 1, HDMI_RegisterRead(HDMIRX_R_HDEE) + 1, HDMI_RegisterRead(HDMIRX_R_HDEE) - HDMI_RegisterRead(HDMIRX_R_HDES), HDMI_RegisterRead(HDMIRX_de_h_width_lock));
  631. hdmidbg("Other:\n");
  632. hdmidbg("\tV Sync Polarity:%d\n", HDMI_RegisterRead(HDMIRX_R_Vsync_Polarity));
  633. hdmidbg("\tH Sync Polarity:%d\n", HDMI_RegisterRead(HDMIRX_R_Hsync_Polarity));
  634. hdmidbg("\tInterlace:%d\n", HDMI_RegisterRead(HDMIRX_R_Interlace));
  635. hdmidbg("\tHDMI mode:%d\n", HDMI_RegisterRead(HDMIRX_R_HDMI_en));
  636. hdmidbg("\tpixel repitition:%d\n", HDMI_RegisterRead(HDMIRX_R_PR_EN));
  637. hdmidbg("\tdeep color:%d\n", HDMI_RegisterRead(HDMIRX_dcm));
  638. }
  639. #endif
  640. static void print_send_to_vip_info(VIP_InterfaceKIC *pstKic)
  641. {
  642. printk("[H]Print Send to VIP info:\n");
  643. printk("[H]\tID:0x%x HT:%d VT:%d HA:%d VA:%d\n\tHStart:%d HEnd:%d VStart:%d VEnd:%d VHz:%d Inter:%d\n", pstKic->uiTimingIndex, pstKic->uiHtotal, pstKic->uiVtotal, pstKic->uiHactive , pstKic->uiVactive,
  644. pstKic->uiHstart, pstKic->uiHend, pstKic->uiVstart, pstKic->uiVend, pstKic->uiVfreq,
  645. pstKic->bInterlace);
  646. printk("[H]\tdata format:%d range:%d AR:0x%x ITC:%d\n", pstKic->ucDataFormat, pstKic->ucRGBRange, pstKic->ucAspectRatio, pstKic->ucITC);
  647. }