hdmi_xvycc.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. #include "drv_types.h"
  2. #include "hdmi_dbg.h"
  3. #include "hdmi_hw.h"
  4. #include "hdmi_notice.h"
  5. #include "hdmi_xvycc.h"
  6. #include <drv_vip_internal.h>
  7. #ifdef SUPPORT_XVYCC
  8. void hdmi_handler_xvycc(void)
  9. {
  10. VIP_xvYccData XVYccData;
  11. UINT8 GBG_Profile;
  12. UINT8 GBD_Color_Space = 0;
  13. UINT8 GBD_Color_Precision;
  14. UINT8 Format_Flag;
  15. UINT32 ulGBD_data[8];
  16. UINT8 *pubGBD_data;
  17. ulGBD_data[0] = HDMI_RegisterRead(HDMIRX_0224_DW_0224); //224
  18. ulGBD_data[1] = HDMI_RegisterRead(HDMIRX_GBD_data_31_0_); //228
  19. ulGBD_data[2] = HDMI_RegisterRead(HDMIRX_GBD_data_63_32_);
  20. ulGBD_data[3] = HDMI_RegisterRead(HDMIRX_GBD_data_95_64_);
  21. ulGBD_data[4] = HDMI_RegisterRead(HDMIRX_GBD_data_127_96_);
  22. ulGBD_data[5] = HDMI_RegisterRead(HDMIRX_GBD_data_159_128_);
  23. ulGBD_data[6] = HDMI_RegisterRead(HDMIRX_GBD_data_191_160_);
  24. ulGBD_data[7] = HDMI_RegisterRead(HDMIRX_GBD_data_223_192_);
  25. pubGBD_data = (UINT8*)(&ulGBD_data[0]);
  26. GBG_Profile = HDMI_RegisterRead(HDMIRX_GBD_profile_2_0_);
  27. switch (GBG_Profile)
  28. {
  29. case 0:
  30. hdmidbg(">>xvYCC Profile=0(P0)\n");
  31. GBD_Color_Space = pubGBD_data[3] & 0x07;//0xbe0e0226[2:0]
  32. GBD_Color_Precision = (pubGBD_data[3] & 0x18) >> 3; //0xbe0e0226[4:3]
  33. Format_Flag = (pubGBD_data[3] & 0x80) >> 7; //0xbe0e0226[7]
  34. if (Format_Flag == 0)
  35. {
  36. XVYccData.ucFormat = VERTICES;
  37. hdmidbg(">>xvYCC Format_Flag=vertices/facets.ucFormat=%d\n", XVYccData.ucFormat);
  38. switch (GBD_Color_Precision)
  39. {
  40. case 0: // 8bits
  41. XVYccData.ucGBD_Color_Precision = 8;
  42. //hdmidbg(">>xvYCC GBD_Color_Precision= 8bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision);
  43. //{0xbe0e022c[0],0xbe0e022b[0],0,0xbe0e022a[1:0],0xbe0e0229[2:0]}
  44. XVYccData.Vertices.usBlack_MAP_Y = ((((UINT16) pubGBD_data[9]) & 0x01) << 7) | ((((UINT16) pubGBD_data[8]) & 0x01) << 6) | ((((UINT16) pubGBD_data[7]) & 0x03) << 3) | (((UINT16) pubGBD_data[6]) & 0x07);
  45. XVYccData.Vertices.usBlack_MAP_Cb = ((UINT16) pubGBD_data[10]) & 0xff; // 0xbe0e022d[7:0]
  46. XVYccData.Vertices.usBlack_MAP_Cr = ((UINT16) pubGBD_data[11]) & 0xff; // 0xbe0e022e[7:0]
  47. XVYccData.Vertices.usRed_MAP_Y = ((UINT16) pubGBD_data[12]) & 0xff; // 0xbe0e022f[7:0]
  48. XVYccData.Vertices.usRed_MAP_Cb = ((UINT16) pubGBD_data[13]) & 0xff; // 0xbe0e0230[7:0]
  49. XVYccData.Vertices.usRed_MAP_Cr = ((UINT16) pubGBD_data[14]) & 0xff; // 0xbe0e0231[7:0]
  50. XVYccData.Vertices.usGreen_MAP_Y = ((UINT16) pubGBD_data[15]) & 0xff; // 0xbe0e0232[7:0]
  51. XVYccData.Vertices.usGreen_MAP_Cb = ((UINT16) pubGBD_data[16]) & 0xff; // 0xbe0e0233[7:0]
  52. XVYccData.Vertices.usGreen_MAP_Cr = ((UINT16) pubGBD_data[17]) & 0xff; // 0xbe0e0234[7:0]
  53. XVYccData.Vertices.usBlue_MAP_Y = ((UINT16) pubGBD_data[18]) & 0xff; // 0xbe0e0235[7:0]
  54. XVYccData.Vertices.usBlue_MAP_Cb = ((UINT16) pubGBD_data[19]) & 0xff; // 0xbe0e0236[7:0]
  55. XVYccData.Vertices.usBlue_MAP_Cr = ((UINT16) pubGBD_data[20]) & 0xff; // 0xbe0e0237[7:0]
  56. break;
  57. case 1: // 10bits
  58. XVYccData.ucGBD_Color_Precision = 10;
  59. //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 10bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision);
  60. XVYccData.Vertices.usBlack_MAP_Y = ((((UINT16) pubGBD_data[9]) & 0x01) << 9) | ((((UINT16) pubGBD_data[8]) & 0x01) << 8) | ((((UINT16) pubGBD_data[7]) & 0x03) << 5) | ((((UINT16) pubGBD_data[6]) & 0x07) << 2) | ((((UINT16) pubGBD_data[10]) & 0xc0) >> 6);
  61. XVYccData.Vertices.usBlack_MAP_Cb = ((((UINT16) pubGBD_data[10]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[11]) & 0xf0) >> 4);
  62. XVYccData.Vertices.usBlack_MAP_Cr = ((((UINT16) pubGBD_data[11]) & 0x0f) << 6) | ((((UINT16) pubGBD_data[12]) & 0xfc) >> 2);
  63. XVYccData.Vertices.usRed_MAP_Y = ((((UINT16) pubGBD_data[12]) & 0x03) << 8) | (((UINT16) pubGBD_data[13]) & 0xff);
  64. XVYccData.Vertices.usRed_MAP_Cb = ((((UINT16) pubGBD_data[14]) & 0xff) << 2) | ((((UINT16) pubGBD_data[15]) & 0xc0) >> 6);
  65. XVYccData.Vertices.usRed_MAP_Cr = ((((UINT16) pubGBD_data[15]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[16]) & 0xf0) >> 4);
  66. XVYccData.Vertices.usGreen_MAP_Y = ((((UINT16) pubGBD_data[16]) & 0x0f) << 6) | ((((UINT16) pubGBD_data[17]) & 0xfc) >> 2);
  67. XVYccData.Vertices.usGreen_MAP_Cb = ((((UINT16) pubGBD_data[17]) & 0x03) << 8) | (((UINT16) pubGBD_data[18]) & 0xff);
  68. XVYccData.Vertices.usGreen_MAP_Cr = ((((UINT16) pubGBD_data[19]) & 0xff) << 2) | ((((UINT16) pubGBD_data[20]) & 0xc0) >> 2);
  69. XVYccData.Vertices.usBlue_MAP_Y = ((((UINT16) pubGBD_data[20]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[21]) & 0xf0) >> 4);
  70. XVYccData.Vertices.usBlue_MAP_Cb = ((((UINT16) pubGBD_data[21]) & 0x0f) << 6) | ((((UINT16) pubGBD_data[22]) & 0xfc) >> 2);
  71. XVYccData.Vertices.usBlue_MAP_Cr = ((((UINT16) pubGBD_data[22]) & 0x03) << 8) | (((UINT16) pubGBD_data[23]) & 0xff);
  72. break;
  73. case 2: // 12bits
  74. XVYccData.ucGBD_Color_Precision = 12;
  75. //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 12bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision);
  76. XVYccData.Vertices.usBlack_MAP_Y = ((((UINT16) pubGBD_data[9]) & 0x01) << 11) | ((((UINT16) pubGBD_data[8]) & 0x01) << 10) | ((((UINT16) pubGBD_data[7]) & 0x03) << 7) | ((((UINT16) pubGBD_data[6]) & 0x07) << 4) | ((((UINT16) pubGBD_data[10]) & 0xf0) >> 4);
  77. XVYccData.Vertices.usBlack_MAP_Cb = ((((UINT16) pubGBD_data[10]) & 0x0f) << 8) | (((UINT16) pubGBD_data[11]) & 0xff);
  78. XVYccData.Vertices.usBlack_MAP_Cr = ((((UINT16) pubGBD_data[12]) & 0xff) << 4) | ((((UINT16) pubGBD_data[13]) & 0xf0) >> 4);
  79. XVYccData.Vertices.usRed_MAP_Y = ((((UINT16) pubGBD_data[13]) & 0x0f) << 8) | (((UINT16) pubGBD_data[14]) & 0xff);
  80. XVYccData.Vertices.usRed_MAP_Cb = ((((UINT16) pubGBD_data[15]) & 0xff) << 4) | ((((UINT16) pubGBD_data[16]) & 0xf0) >> 4);
  81. XVYccData.Vertices.usRed_MAP_Cr = ((((UINT16) pubGBD_data[16]) & 0x0f) << 8) | (((UINT16) pubGBD_data[17]) & 0xff);
  82. XVYccData.Vertices.usGreen_MAP_Y = ((((UINT16) pubGBD_data[18]) & 0xff) << 4) | ((((UINT16) pubGBD_data[19]) & 0xf0) >> 4);
  83. XVYccData.Vertices.usGreen_MAP_Cb = ((((UINT16) pubGBD_data[19]) & 0x0f) << 8) | (((UINT16) pubGBD_data[20]) & 0xff);
  84. XVYccData.Vertices.usGreen_MAP_Cr = ((((UINT16) pubGBD_data[21]) & 0xff) << 4) | ((((UINT16) pubGBD_data[22]) & 0xf0) >> 4);
  85. XVYccData.Vertices.usBlue_MAP_Y = ((((UINT16) pubGBD_data[22]) & 0x0f) << 8) | (((UINT16) pubGBD_data[23]) & 0xff);
  86. XVYccData.Vertices.usBlue_MAP_Cb = ((((UINT16) pubGBD_data[24]) & 0xff) << 4) | ((((UINT16) pubGBD_data[25]) & 0xf0) >> 4);
  87. XVYccData.Vertices.usBlue_MAP_Cr = ((((UINT16) pubGBD_data[25]) & 0x0f) << 8) | (((UINT16) pubGBD_data[26]) & 0xff);
  88. break;
  89. default: // Unkown
  90. hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= Unknow\n");
  91. break;
  92. }
  93. hdmidbg(">>xvYCC GBD Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision);
  94. hdmidbg(">>usBlack_MAP_Y=0x%x. usBlack_MAP_Cb=0x%x. usBlack_MAP_Cr=0x%x\n", XVYccData.Vertices.usBlack_MAP_Y, XVYccData.Vertices.usBlack_MAP_Cb, XVYccData.Vertices.usBlack_MAP_Cr);
  95. hdmidbg(">>usRed_MAP_Y=0x%x. usRed_MAP_Cb=0x%x. usRed_MAP_Cr=0x%x\n", XVYccData.Vertices.usRed_MAP_Y, XVYccData.Vertices.usRed_MAP_Cb, XVYccData.Vertices.usRed_MAP_Cr);
  96. hdmidbg(">>usGreen_MAP_Y=0x%x. usGreen_MAP_Cb=0x%x. usGreen_MAP_Cr=0x%x\n", XVYccData.Vertices.usGreen_MAP_Y, XVYccData.Vertices.usGreen_MAP_Cb, XVYccData.Vertices.usGreen_MAP_Cr);
  97. hdmidbg(">>usBlue_MAP_Y=0x%x. usBlue_MAP_Cb=0x%x. usBlue_MAP_Cr=0x%x\n", XVYccData.Vertices.usBlue_MAP_Y, XVYccData.Vertices.usBlue_MAP_Cb, XVYccData.Vertices.usBlue_MAP_Cr);
  98. }
  99. else if (Format_Flag == 1)
  100. {
  101. XVYccData.ucFormat = GAMUT_RANGE;
  102. hdmidbg(">>xvYCC Format_Flag=gamut range.ucFormat=%d\n", XVYccData.ucFormat);
  103. switch (GBD_Color_Precision)
  104. {
  105. case 0: // 8bits
  106. XVYccData.ucGBD_Color_Precision = 8;
  107. //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 8bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision);
  108. XVYccData.GamutRange.usMin_Red_data = ((UINT16) pubGBD_data[4]) & 0xff;// {0xbe0e0227[7:0]}
  109. XVYccData.GamutRange.usMax_Red_data = ((UINT16) pubGBD_data[5]) & 0xff;// {0xbe0e0228[7:0]}
  110. XVYccData.GamutRange.usMin_Green_data = ((((UINT16) pubGBD_data[9]) & 0x01) << 7) | ((((UINT16) pubGBD_data[8]) & 0x01) << 6) | ((((UINT16) pubGBD_data[7]) & 0x03) << 3) | (((UINT16) pubGBD_data[6]) & 0x07);
  111. XVYccData.GamutRange.usMax_Green_data = ((UINT16) pubGBD_data[10]) & 0xff; // 0xbe0e022d[7:0]
  112. XVYccData.GamutRange.usMin_Blue_data = ((UINT16) pubGBD_data[11]) & 0xff; // 0xbe0e022e[7:0]
  113. XVYccData.GamutRange.usMax_Blue_data = ((UINT16) pubGBD_data[12]) & 0xff; // 0xbe0e022f[7:0]
  114. break;
  115. case 1: // 10bits
  116. XVYccData.ucGBD_Color_Precision = 10;
  117. //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 10bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision);
  118. XVYccData.GamutRange.usMin_Red_data = ((((UINT16) pubGBD_data[4]) & 0xff) << 2) | ((((UINT16) pubGBD_data[5]) & 0xc0) >> 6);
  119. XVYccData.GamutRange.usMax_Red_data = ((((UINT16) pubGBD_data[5]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[9]) & 0x01) << 3) | ((((UINT16) pubGBD_data[8]) & 0x01) << 2) | ((((UINT16) pubGBD_data[7]) & 0x2) >> 1);
  120. XVYccData.GamutRange.usMin_Green_data = ((((UINT16) pubGBD_data[7]) & 0x01) << 9) | ((((UINT16) pubGBD_data[6]) & 0x07) << 6) | ((((UINT16) pubGBD_data[10]) & 0xf3) >> 2);
  121. XVYccData.GamutRange.usMax_Green_data = ((((UINT16) pubGBD_data[10]) & 0x03) << 8) | (((UINT16) pubGBD_data[11]) & 0xff);
  122. XVYccData.GamutRange.usMin_Blue_data = ((((UINT16) pubGBD_data[12]) & 0xff) << 2) | ((((UINT16) pubGBD_data[13]) & 0xc0) >> 6);
  123. XVYccData.GamutRange.usMax_Blue_data = ((((UINT16) pubGBD_data[13]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[14]) & 0xf0) >> 4);
  124. break;
  125. case 2: // 12bits
  126. XVYccData.ucGBD_Color_Precision = 12;
  127. //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 12bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision);
  128. XVYccData.GamutRange.usMin_Red_data = ((((UINT16) pubGBD_data[4]) & 0xff) << 4) | ((((UINT16) pubGBD_data[5]) & 0xf0) >> 4);
  129. XVYccData.GamutRange.usMax_Red_data = ((((UINT16) pubGBD_data[5]) & 0x0f) << 8) | ((((UINT16) pubGBD_data[9]) & 0x01) << 7) | ((((UINT16) pubGBD_data[8]) & 0x01) << 6) | ((((UINT16) pubGBD_data[7]) & 0x03) << 3) | (((UINT16) pubGBD_data[6]) & 0x07);
  130. XVYccData.GamutRange.usMin_Green_data = ((((UINT16) pubGBD_data[10]) & 0xff) << 4) | ((((UINT16) pubGBD_data[11]) & 0xf0) >> 4);
  131. XVYccData.GamutRange.usMax_Green_data = ((((UINT16) pubGBD_data[11]) & 0x0f) << 8) | (((UINT16) pubGBD_data[12]) & 0xff);
  132. XVYccData.GamutRange.usMin_Blue_data = ((((UINT16) pubGBD_data[13]) & 0xff) << 4) | ((((UINT16) pubGBD_data[14]) & 0xf0) >> 4);
  133. XVYccData.GamutRange.usMax_Blue_data = ((((UINT16) pubGBD_data[14]) & 0x0f) << 8) | (((UINT16) pubGBD_data[15]) & 0xff);
  134. break;
  135. default: // Unkown
  136. hdmidbg(">>xvYCC GBD_Color_Precision= Unknow\n");
  137. break;
  138. }
  139. hdmidbg(">>xvYCC GBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision);
  140. hdmidbg(">>usMin_Red_data=0x%x. usMax_Red_data=0x%x\n", XVYccData.GamutRange.usMin_Red_data, XVYccData.GamutRange.usMax_Red_data);
  141. hdmidbg(">>usMin_Green_data=0x%x. usMax_Green_data=0x%x\n", XVYccData.GamutRange.usMin_Green_data, XVYccData.GamutRange.usMax_Green_data);
  142. hdmidbg(">>usMin_Blue_data=0x%x. usMax_Blue_data=0x%x\n", XVYccData.GamutRange.usMin_Blue_data, XVYccData.GamutRange.usMax_Blue_data);
  143. }
  144. else
  145. {
  146. hdmidbg(">>xvYCC Error: Format_Flag=Unkown\n");
  147. }
  148. break;
  149. case 1:
  150. case 2:
  151. case 3:
  152. hdmidbg(">>xvYCC Profile=%d(P%d)\n", GBG_Profile, GBG_Profile);
  153. GBD_Color_Space = pubGBD_data[6] & 0x07;//0xbe0e0229[2:0]
  154. GBD_Color_Precision = (pubGBD_data[7] & 0x18) >> 3; //0xbe0e022a[4:3]
  155. Format_Flag = pubGBD_data[9] & 0x01;//0xbe0e022c[0]
  156. if (Format_Flag == 0)
  157. {
  158. XVYccData.ucFormat = VERTICES;
  159. hdmidbg(">>xvYCC Format_Flag=vertices/facets.ucFormat=%d\n", XVYccData.ucFormat);
  160. switch (GBD_Color_Precision)
  161. {
  162. case 0: // 8bits
  163. XVYccData.ucGBD_Color_Precision = 8;
  164. //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 8bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision);
  165. XVYccData.Vertices.usBlack_MAP_Y = ((UINT16) pubGBD_data[10]) & 0xff; // 0xbe0e022d[7:0]
  166. XVYccData.Vertices.usBlack_MAP_Cb = ((UINT16) pubGBD_data[11]) & 0xff ; // 0xbe0e022e[7:0]
  167. XVYccData.Vertices.usBlack_MAP_Cr = ((UINT16) pubGBD_data[12]) & 0xff; // 0xbe0e022f[7:0]
  168. XVYccData.Vertices.usRed_MAP_Y = ((UINT16) pubGBD_data[13]) & 0xff; // 0xbe0e0230[7:0]
  169. XVYccData.Vertices.usRed_MAP_Cb = ((UINT16) pubGBD_data[14]) & 0xff; // 0xbe0e0231[7:0]
  170. XVYccData.Vertices.usRed_MAP_Cr = ((UINT16) pubGBD_data[15]) & 0xff; // 0xbe0e0232[7:0]
  171. XVYccData.Vertices.usGreen_MAP_Y = ((UINT16) pubGBD_data[16]) & 0xff; // 0xbe0e0233[7:0]
  172. XVYccData.Vertices.usGreen_MAP_Cb = ((UINT16) pubGBD_data[17]) & 0xff; // 0xbe0e0234[7:0]
  173. XVYccData.Vertices.usGreen_MAP_Cr = ((UINT16) pubGBD_data[18]) & 0xff; // 0xbe0e0235[7:0]
  174. XVYccData.Vertices.usBlue_MAP_Y = ((UINT16) pubGBD_data[19]) & 0xff; // 0xbe0e0236[7:0]
  175. XVYccData.Vertices.usBlue_MAP_Cb = ((UINT16) pubGBD_data[20]) & 0xff; // 0xbe0e0237[7:0]
  176. XVYccData.Vertices.usBlue_MAP_Cr = ((UINT16) pubGBD_data[21]) & 0xff; // 0xbe0e0238[7:0]
  177. break;
  178. case 1: // 10bits
  179. XVYccData.ucGBD_Color_Precision = 10;
  180. //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 10bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision);
  181. XVYccData.Vertices.usBlack_MAP_Y = ((((UINT16) pubGBD_data[10]) & 0xff) << 2) | ((((UINT16) pubGBD_data[11]) & 0xc0) >> 6);
  182. XVYccData.Vertices.usBlack_MAP_Cb = ((((UINT16) pubGBD_data[11]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[12]) & 0xf0) >> 4);
  183. XVYccData.Vertices.usBlack_MAP_Cr = ((((UINT16) pubGBD_data[12]) & 0x0f) << 6) | ((((UINT16) pubGBD_data[13]) & 0xfc) >> 2);
  184. XVYccData.Vertices.usRed_MAP_Y = ((((UINT16) pubGBD_data[13]) & 0x03) << 8) | (((UINT16) pubGBD_data[14]) & 0xff);
  185. XVYccData.Vertices.usRed_MAP_Cb = ((((UINT16) pubGBD_data[15]) & 0xff) << 2) | ((((UINT16) pubGBD_data[16]) & 0xc0) >> 6);;
  186. XVYccData.Vertices.usRed_MAP_Cr = ((((UINT16) pubGBD_data[16]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[17]) & 0xf0) >> 4);
  187. XVYccData.Vertices.usGreen_MAP_Y = ((((UINT16) pubGBD_data[17]) & 0x0f) << 6) | ((((UINT16) pubGBD_data[18]) & 0xfc) >> 2);
  188. XVYccData.Vertices.usGreen_MAP_Cb = ((((UINT16) pubGBD_data[18]) & 0x03) << 8) | (((UINT16) pubGBD_data[19]) & 0xff);
  189. XVYccData.Vertices.usGreen_MAP_Cr = ((((UINT16) pubGBD_data[20]) & 0xff) << 2) | ((((UINT16) pubGBD_data[21]) & 0xc0) >> 6);
  190. XVYccData.Vertices.usBlue_MAP_Y = ((((UINT16) pubGBD_data[21]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[22]) & 0xf0) >> 4);
  191. XVYccData.Vertices.usBlue_MAP_Cb = ((((UINT16) pubGBD_data[22]) & 0x0f) << 6) | ((((UINT16) pubGBD_data[23]) & 0xfc) >> 2);
  192. XVYccData.Vertices.usBlue_MAP_Cr = ((((UINT16) pubGBD_data[23]) & 0x03) << 8) | (((UINT16) pubGBD_data[24]) & 0xff);
  193. break;
  194. case 2: // 12bits
  195. XVYccData.ucGBD_Color_Precision = 12;
  196. //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 12bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision);
  197. XVYccData.Vertices.usBlack_MAP_Y = ((((UINT16) pubGBD_data[10]) & 0xff) << 4) | ((((UINT16) pubGBD_data[11]) & 0xf0) >> 4);
  198. XVYccData.Vertices.usBlack_MAP_Cb = ((((UINT16) pubGBD_data[11]) & 0x0f) << 8) | (((UINT16) pubGBD_data[12]) & 0xff);
  199. XVYccData.Vertices.usBlack_MAP_Cr = ((((UINT16) pubGBD_data[13]) & 0xff) << 4) | ((((UINT16) pubGBD_data[14]) & 0xf0) >> 4);
  200. XVYccData.Vertices.usRed_MAP_Y = ((((UINT16) pubGBD_data[14]) & 0x0f) << 8) | (((UINT16) pubGBD_data[15]) & 0xff);
  201. XVYccData.Vertices.usRed_MAP_Cb = ((((UINT16) pubGBD_data[16]) & 0xff) << 4) | ((((UINT16) pubGBD_data[17]) & 0xf0) >> 4);
  202. XVYccData.Vertices.usRed_MAP_Cr = ((((UINT16) pubGBD_data[17]) & 0x0f) << 8) | (((UINT16) pubGBD_data[18]) & 0xff);
  203. XVYccData.Vertices.usGreen_MAP_Y = ((((UINT16) pubGBD_data[19]) & 0xff) << 4) | ((((UINT16) pubGBD_data[20]) & 0xf0) >> 4);
  204. XVYccData.Vertices.usGreen_MAP_Cb = ((((UINT16) pubGBD_data[20]) & 0x0f) << 8) | (((UINT16) pubGBD_data[21]) & 0xff);
  205. XVYccData.Vertices.usGreen_MAP_Cr = ((((UINT16) pubGBD_data[22]) & 0xff) << 4) | ((((UINT16) pubGBD_data[23]) & 0xf0) >> 4);
  206. XVYccData.Vertices.usBlue_MAP_Y = ((((UINT16) pubGBD_data[23]) & 0x0f) << 8) | (((UINT16) pubGBD_data[24]) & 0xff);
  207. XVYccData.Vertices.usBlue_MAP_Cb = ((((UINT16) pubGBD_data[25]) & 0xff) << 4) | ((((UINT16) pubGBD_data[26]) & 0xf0) >> 4);
  208. XVYccData.Vertices.usBlue_MAP_Cr = ((((UINT16) pubGBD_data[26]) & 0x0f) << 8) | (((UINT16) pubGBD_data[27]) & 0xff);
  209. break;
  210. default: // Unkown
  211. hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= Unknow\n");
  212. break;
  213. }
  214. hdmidbg(">>xvYCC GBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision);
  215. hdmidbg(">>usBlack_MAP_Y=0x%x. usBlack_MAP_Cb=0x%x. usBlack_MAP_Cr=0x%x\n", XVYccData.Vertices.usBlack_MAP_Y, XVYccData.Vertices.usBlack_MAP_Cb, XVYccData.Vertices.usBlack_MAP_Cr);
  216. hdmidbg(">>usRed_MAP_Y=0x%x. usRed_MAP_Cb=0x%x. usRed_MAP_Cr=0x%x\n", XVYccData.Vertices.usRed_MAP_Y, XVYccData.Vertices.usRed_MAP_Cb, XVYccData.Vertices.usRed_MAP_Cr);
  217. hdmidbg(">>usGreen_MAP_Y=0x%x. usGreen_MAP_Cb=0x%x. usGreen_MAP_Cr=0x%x\n", XVYccData.Vertices.usGreen_MAP_Y, XVYccData.Vertices.usGreen_MAP_Cb, XVYccData.Vertices.usGreen_MAP_Cr);
  218. hdmidbg(">>usBlue_MAP_Y=0x%x. usBlue_MAP_Cb=0x%x. usBlue_MAP_Cr=0x%x\n", XVYccData.Vertices.usBlue_MAP_Y, XVYccData.Vertices.usBlue_MAP_Cb, XVYccData.Vertices.usBlue_MAP_Cr);
  219. }
  220. else if (Format_Flag == 1)
  221. {
  222. XVYccData.ucFormat = GAMUT_RANGE;
  223. hdmidbg(">>xvYCC Format_Flag=gamut range.ucFormat=%d\n", XVYccData.ucFormat);
  224. switch (GBD_Color_Precision)
  225. {
  226. case 0: // 8bits
  227. XVYccData.ucGBD_Color_Precision = 8;
  228. //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 8bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision);
  229. XVYccData.GamutRange.usMin_Red_data = ((UINT16) pubGBD_data[10]) & 0xff;// {0xbe0e022d[7:0]}
  230. XVYccData.GamutRange.usMax_Red_data = ((UINT16) pubGBD_data[11]) & 0xff;// {0xbe0e022e[7:0]}
  231. XVYccData.GamutRange.usMin_Green_data = ((UINT16) pubGBD_data[12]) & 0xff;// {0xbe0e022f[7:0]}
  232. XVYccData.GamutRange.usMax_Green_data = ((UINT16) pubGBD_data[13]) & 0xff; // 0xbe0e0230[7:0]
  233. XVYccData.GamutRange.usMin_Blue_data = ((UINT16) pubGBD_data[14]) & 0xff; // 0xbe0e0231[7:0]
  234. XVYccData.GamutRange.usMax_Blue_data = ((UINT16) pubGBD_data[15]) & 0xff; // 0xbe0e0232[7:0]
  235. break;
  236. case 1: // 10bits
  237. XVYccData.ucGBD_Color_Precision = 10;
  238. //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 10bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision);
  239. XVYccData.GamutRange.usMin_Red_data = ((((UINT16) pubGBD_data[10]) & 0xff) << 2) | ((((UINT16) pubGBD_data[11]) & 0xfc) >> 2);
  240. XVYccData.GamutRange.usMax_Red_data = ((((UINT16) pubGBD_data[11]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[12]) & 0xf0) >> 4);
  241. XVYccData.GamutRange.usMin_Green_data = ((((UINT16) pubGBD_data[12]) & 0x0f) << 8) | (((UINT16) pubGBD_data[13]) & 0xff);
  242. XVYccData.GamutRange.usMax_Green_data = ((((UINT16) pubGBD_data[13]) & 0x03) << 8) | (((UINT16) pubGBD_data[14]) & 0xff);
  243. XVYccData.GamutRange.usMin_Blue_data = ((((UINT16) pubGBD_data[15]) & 0xff) << 2) | ((((UINT16) pubGBD_data[16]) & 0xfc) >> 2);
  244. XVYccData.GamutRange.usMax_Blue_data = ((((UINT16) pubGBD_data[16]) & 0x3f) << 4) | ((((UINT16) pubGBD_data[17]) & 0xf0) >> 4);
  245. break;
  246. case 2: // 12bits
  247. XVYccData.ucGBD_Color_Precision = 12;
  248. //hdmidbg(">>xvYCC Data Received: GBD_Color_Precision= 12bits. ucGBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision);
  249. XVYccData.GamutRange.usMin_Red_data = ((((UINT16) pubGBD_data[10]) & 0xff) << 4) | ((((UINT16) pubGBD_data[11]) & 0xf0) >> 4);
  250. XVYccData.GamutRange.usMax_Red_data = ((((UINT16) pubGBD_data[11]) & 0x0f) << 8) | (((UINT16) pubGBD_data[12]) & 0xff);
  251. XVYccData.GamutRange.usMin_Green_data = ((((UINT16) pubGBD_data[13]) & 0xff) << 4) | ((((UINT16) pubGBD_data[14]) & 0xf0) >> 4);
  252. XVYccData.GamutRange.usMax_Green_data = ((((UINT16) pubGBD_data[14]) & 0x0f) << 8) | (((UINT16) pubGBD_data[15]) & 0xff);
  253. XVYccData.GamutRange.usMin_Blue_data = ((((UINT16) pubGBD_data[16]) & 0xff) << 4) | ((((UINT16) pubGBD_data[17]) & 0xf0) >> 4);
  254. XVYccData.GamutRange.usMax_Blue_data = ((((UINT16) pubGBD_data[17]) & 0x0f) << 8) | (((UINT16) pubGBD_data[18]) & 0xff);
  255. break;
  256. default: // Unkown
  257. hdmidbg(">>xvYCC GBD_Color_Precision= Unknow\n");
  258. break;
  259. }
  260. hdmidbg(">>xvYCC GBD_Color_Precision=%d\n", XVYccData.ucGBD_Color_Precision);
  261. hdmidbg(">>usMin_Red_data=0x%x. usMax_Red_data=0x%x\n", XVYccData.GamutRange.usMin_Red_data, XVYccData.GamutRange.usMax_Red_data);
  262. hdmidbg(">>usMin_Green_data=0x%x. usMax_Green_data=0x%x\n", XVYccData.GamutRange.usMin_Green_data, XVYccData.GamutRange.usMax_Green_data);
  263. hdmidbg(">>usMin_Blue_data=0x%x. usMax_Blue_data=0x%x\n", XVYccData.GamutRange.usMin_Blue_data, XVYccData.GamutRange.usMax_Blue_data);
  264. }
  265. else
  266. {
  267. hdmidbg("xvYCC Error: Format_Flag=Unkown\n");
  268. }
  269. break;
  270. case 4:
  271. case 5:
  272. case 6:
  273. case 7:
  274. hdmidbg("Not defined Profile=%d\n", GBG_Profile);
  275. break;
  276. }
  277. switch (GBD_Color_Space)
  278. {
  279. case xvYCC_RGB:
  280. hdmidbg("xvYCC_RGB\n");
  281. XVYccData.ucGBD_Color_Space = xvYCC_RGB;
  282. break;
  283. case xvYCC601:
  284. hdmidbg("xvYCC601\n");
  285. XVYccData.ucGBD_Color_Space = xvYCC601;
  286. break;
  287. case xvYCC709:
  288. hdmidbg("xvYCC709\n");
  289. XVYccData.ucGBD_Color_Space = xvYCC709;
  290. break;
  291. case XYZ:
  292. hdmidbg("XYZ\n");
  293. XVYccData.ucGBD_Color_Space = XYZ;
  294. break;
  295. default:
  296. hdmidbg("xvYCC_UNKNOWN_METRY\n");
  297. XVYccData.ucGBD_Color_Space = xvYCC_UNKNOWN_METRY;
  298. break;
  299. }
  300. }
  301. #endif