mt8193hdcp.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050
  1. #ifdef HDMI_MT8193_SUPPORT
  2. #include "mt8193hdmictrl.h"
  3. #include "mt8193hdcp.h"
  4. #include "mt8193_ctrl.h"
  5. #include "mt8193ddc.h"
  6. /* no encrypt key */
  7. const unsigned char HDCP_NOENCRYPT_KEY[HDCP_KEY_RESERVE] = {
  8. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  9. 0xaa,
  10. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  11. 0xaa,
  12. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  13. 0xaa,
  14. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  15. 0xaa,
  16. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  17. 0xaa,
  18. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  19. 0xaa,
  20. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  21. 0xaa,
  22. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  23. 0xaa,
  24. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  25. 0xaa,
  26. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  27. 0xaa,
  28. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  29. 0xaa,
  30. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  31. 0xaa,
  32. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  33. 0xaa,
  34. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  35. 0xaa,
  36. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  37. 0xaa,
  38. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  39. 0xaa,
  40. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  41. 0xaa,
  42. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
  43. };
  44. /* encrypt key */
  45. const unsigned char HDCP_ENCRYPT_KEY[HDCP_KEY_RESERVE] = {
  46. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  47. 0xaa,
  48. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  49. 0xaa,
  50. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  51. 0xaa,
  52. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  53. 0xaa,
  54. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  55. 0xaa,
  56. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  57. 0xaa,
  58. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  59. 0xaa,
  60. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  61. 0xaa,
  62. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  63. 0xaa,
  64. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  65. 0xaa,
  66. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  67. 0xaa,
  68. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  69. 0xaa,
  70. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  71. 0xaa,
  72. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  73. 0xaa,
  74. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  75. 0xaa,
  76. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  77. 0xaa,
  78. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  79. 0xaa,
  80. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
  81. };
  82. static unsigned char bHdcpKeyExternalBuff[HDCP_KEY_RESERVE] = {
  83. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  84. 0xaa,
  85. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  86. 0xaa,
  87. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  88. 0xaa,
  89. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  90. 0xaa,
  91. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  92. 0xaa,
  93. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  94. 0xaa,
  95. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  96. 0xaa,
  97. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  98. 0xaa,
  99. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  100. 0xaa,
  101. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  102. 0xaa,
  103. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  104. 0xaa,
  105. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  106. 0xaa,
  107. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  108. 0xaa,
  109. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  110. 0xaa,
  111. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  112. 0xaa,
  113. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  114. 0xaa,
  115. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  116. 0xaa,
  117. 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
  118. };
  119. #ifdef CONFIG_MTK_MT8193_HDCP_SUPPORT
  120. static unsigned char _bHdcpOff;
  121. #else
  122. static unsigned char _bHdcpOff = 1;
  123. #endif
  124. unsigned char _bflagvideomute = 0;
  125. unsigned char _bflagaudiomute = 0;
  126. static unsigned int i4HdmiShareInfo[MAX_HDMI_SHAREINFO];
  127. static unsigned char HDMI_AKSV[HDCP_AKSV_COUNT];
  128. static unsigned char bKsv_buff[KSV_BUFF_SIZE];
  129. static unsigned char bHdcpKeyBuff[HDCP_KEY_RESERVE];
  130. static unsigned char _fgRepeater = FALSE;
  131. static unsigned char _bReCompRiCount;
  132. static unsigned char _bReAUTHCount;
  133. static unsigned char _bReCheckReadyBit;
  134. static unsigned char bSHABuff[20];
  135. static HDMI_HDCP_KEY_T bhdcpkey = EXTERNAL_KEY;
  136. void vShowHdcpRawData(void)
  137. {
  138. unsigned short bTemp, i, j, k;
  139. MT8193_HDCP_FUNC();
  140. hdmi_print("==============================hdcpkey=====\n");
  141. hdmi_print(" | 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n");
  142. hdmi_print("=========================================\n");
  143. for (bTemp = 0; bTemp < 3; bTemp++) {
  144. j = bTemp * 128;
  145. for (i = 0; i < 8; i++) {
  146. if (((i * 16) + j) < 0x10)
  147. hdmi_print("0%x: ", (i * 16) + j);
  148. else
  149. hdmi_print("%x: ", (i * 16) + j);
  150. for (k = 0; k < 16; k++) {
  151. if (k == 15) {
  152. if ((j + (i * 16 + k)) < 287) { /* for Buffer overflow error */
  153. if (bHdcpKeyExternalBuff[j + (i * 16 + k)] > 0x0f)
  154. hdmi_print("%2x\n",
  155. bHdcpKeyExternalBuff[j + (i * 16 + k)]);
  156. else
  157. hdmi_print("0%x\n",
  158. bHdcpKeyExternalBuff[j + (i * 16 + k)]);
  159. }
  160. } else {
  161. if ((j + (i * 16 + k)) < 287) { /* for Buffer overflow error */
  162. if (bHdcpKeyExternalBuff[j + (i * 16 + k)] > 0x0f)
  163. hdmi_print("%2x ",
  164. bHdcpKeyExternalBuff[j + (i * 16 + k)]);
  165. else
  166. hdmi_print("0%x ",
  167. bHdcpKeyExternalBuff[j + (i * 16 + k)]);
  168. } else {
  169. hdmi_print("\n");
  170. hdmi_print
  171. ("===============================\n");
  172. return;
  173. }
  174. }
  175. }
  176. }
  177. }
  178. }
  179. void mt8193_hdcpkey(unsigned char *pbhdcpkey)
  180. {
  181. unsigned short i;
  182. MT8193_HDCP_FUNC();
  183. for (i = 0; i < 287; i++)
  184. bHdcpKeyExternalBuff[i] = *pbhdcpkey++;
  185. vMoveHDCPInternalKey(EXTERNAL_KEY);
  186. }
  187. void vMoveHDCPInternalKey(HDMI_HDCP_KEY_T key)
  188. {
  189. unsigned char *pbDramAddr;
  190. unsigned short i;
  191. MT8193_HDCP_FUNC();
  192. bhdcpkey = key;
  193. pbDramAddr = bHdcpKeyBuff;
  194. for (i = 0; i < 287; i++) {
  195. if (key == INTERNAL_ENCRYPT_KEY)
  196. pbDramAddr[i] = HDCP_ENCRYPT_KEY[i];
  197. else if (key == INTERNAL_NOENCRYPT_KEY)
  198. pbDramAddr[i] = HDCP_NOENCRYPT_KEY[i];
  199. else if (key == EXTERNAL_KEY)
  200. pbDramAddr[i] = bHdcpKeyExternalBuff[i];
  201. }
  202. }
  203. void vInitHdcpKeyGetMethod(unsigned char bMethod)
  204. {
  205. MT8193_HDCP_FUNC();
  206. if (bMethod == NON_HOST_ACCESS_FROM_EEPROM) {
  207. vWriteHdmiSYSMsk(HDMI_SYS_CFG1C, (I2CM_ON | EXT_E2PROM_ON),
  208. (I2CM_ON | EXT_E2PROM_ON));
  209. } else if (bMethod == NON_HOST_ACCESS_FROM_MCM) {
  210. vWriteHdmiSYSMsk(HDMI_SYS_CFG1C, (I2CM_ON | MCM_E2PROM_ON),
  211. (I2CM_ON | MCM_E2PROM_ON));
  212. } else if (bMethod == NON_HOST_ACCESS_FROM_GCPU) {
  213. vWriteHdmiSYSMsk(HDMI_SYS_CFG1C, AES_EFUSE_ENABLE,
  214. (AES_EFUSE_ENABLE | I2CM_ON | EXT_E2PROM_ON | MCM_E2PROM_ON));
  215. }
  216. }
  217. unsigned char fgHostKey(void)
  218. {
  219. unsigned char bTemp;
  220. MT8193_HDCP_FUNC();
  221. bTemp = bReadByteHdmiGRL(GRL_HDCP_CTL);
  222. vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp | HDCP_CTL_HOST_KEY);
  223. return TRUE;
  224. }
  225. unsigned char bReadHdmiIntMask(void)
  226. {
  227. unsigned char bMask;
  228. MT8193_HDCP_FUNC();
  229. bMask = bReadByteHdmiGRL(GRL_INT_MASK);
  230. return bMask;
  231. }
  232. void vHalHDCPReset(void)
  233. {
  234. unsigned char bTemp;
  235. MT8193_HDCP_FUNC();
  236. if (fgHostKey())
  237. bTemp = HDCP_CTL_CP_RSTB | HDCP_CTL_HOST_KEY;
  238. else
  239. bTemp = HDCP_CTL_CP_RSTB;
  240. vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp);
  241. for (bTemp = 0; bTemp < 5; bTemp++)
  242. udelay(255);
  243. bTemp = bReadByteHdmiGRL(GRL_HDCP_CTL);
  244. bTemp &= (~HDCP_CTL_CP_RSTB);
  245. vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp);
  246. vSetCTL0BeZero(FALSE);
  247. }
  248. void vSetHDCPState(HDCP_CTRL_STATE_T e_state)
  249. {
  250. MT8193_HDCP_FUNC();
  251. e_hdcp_ctrl_state = e_state;
  252. }
  253. void vHDCPReset(void)
  254. {
  255. unsigned char bMask;
  256. MT8193_HDCP_FUNC();
  257. bMask = bReadHdmiIntMask();
  258. vWriteHdmiIntMask(0xff); /* disable INT HDCP */
  259. vHalHDCPReset();
  260. vSetHDCPState(HDCP_RECEIVER_NOT_READY);
  261. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  262. }
  263. unsigned char fgIsHDCPCtrlTimeOut(void)
  264. {
  265. MT8193_HDCP_FUNC();
  266. if (mt8193_TmrValue[HDMI_HDCP_PROTOCAL_CMD] <= 0)
  267. return TRUE;
  268. else
  269. return FALSE;
  270. }
  271. void vSendHdmiCmd(unsigned char u8cmd)
  272. {
  273. MT8193_DRV_FUNC();
  274. mt8193_hdmiCmd = u8cmd;
  275. }
  276. void vClearHdmiCmd(void)
  277. {
  278. MT8193_DRV_FUNC();
  279. mt8193_hdmiCmd = 0xff;
  280. }
  281. void vSetHDCPTimeOut(unsigned int i4_count)
  282. {
  283. MT8193_HDCP_FUNC();
  284. mt8193_TmrValue[HDMI_HDCP_PROTOCAL_CMD] = i4_count;
  285. }
  286. unsigned int i4SharedInfo(unsigned int u4Index)
  287. {
  288. MT8193_HDCP_FUNC();
  289. return i4HdmiShareInfo[u4Index];
  290. }
  291. void vSetSharedInfo(unsigned int u4Index, unsigned int i4Value)
  292. {
  293. MT8193_DRV_FUNC();
  294. i4HdmiShareInfo[u4Index] = i4Value;
  295. }
  296. void vMiAnUpdateOrFix(unsigned char bUpdate)
  297. {
  298. unsigned char bTemp;
  299. MT8193_HDCP_FUNC();
  300. if (bUpdate == TRUE) {
  301. bTemp = bReadByteHdmiGRL(GRL_CFG1);
  302. bTemp |= CFG1_HDCP_DEBUG;
  303. vWriteByteHdmiGRL(GRL_CFG1, bTemp);
  304. } else {
  305. bTemp = bReadByteHdmiGRL(GRL_CFG1);
  306. bTemp &= ~CFG1_HDCP_DEBUG;
  307. vWriteByteHdmiGRL(GRL_CFG1, bTemp);
  308. }
  309. }
  310. void vReadAksvFromReg(unsigned char *PrBuff)
  311. {
  312. unsigned char bTemp, i;
  313. MT8193_HDCP_FUNC();
  314. for (i = 0; i < 5; i++) { /* AKSV count 5 bytes */
  315. bTemp = bReadByteHdmiGRL(GRL_RD_AKSV0 + i * 4);
  316. *(PrBuff + i) = bTemp;
  317. }
  318. }
  319. void vWriteAksvKeyMask(unsigned char *PrData)
  320. {
  321. unsigned char bData;
  322. /* - write wIdx into 92. */
  323. MT8193_HDCP_FUNC();
  324. bData = (*(PrData + 2) & 0x0f) | ((*(PrData + 3) & 0x0f) << 4);
  325. vWriteHdmiSYSMsk(HDMI_SYS_CFG1C, (bData << 16), SYS_KEYMASK2);
  326. bData = (*(PrData + 0) & 0x0f) | ((*(PrData + 1) & 0x0f) << 4);
  327. vWriteHdmiSYSMsk(HDMI_SYS_CFG1C, (bData << 8), SYS_KEYMASK1);
  328. }
  329. void vEnableAuthHardware(void)
  330. {
  331. unsigned char bTemp;
  332. MT8193_HDCP_FUNC();
  333. bTemp = bReadByteHdmiGRL(GRL_HDCP_CTL);
  334. bTemp |= HDCP_CTL_AUTHEN_EN;
  335. vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp);
  336. }
  337. unsigned char fgIsRepeater(void)
  338. {
  339. MT8193_HDCP_FUNC();
  340. return (_fgRepeater == TRUE);
  341. }
  342. void vRepeaterOnOff(unsigned char fgIsRep)
  343. {
  344. unsigned char bTemp;
  345. MT8193_HDCP_FUNC();
  346. bTemp = bReadByteHdmiGRL(GRL_HDCP_CTL);
  347. if (fgIsRep == TRUE)
  348. bTemp |= HDCP_CTRL_RX_RPTR;
  349. else
  350. bTemp &= ~HDCP_CTRL_RX_RPTR;
  351. vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp);
  352. }
  353. void vStopAn(void)
  354. {
  355. unsigned char bTemp;
  356. MT8193_HDCP_FUNC();
  357. bTemp = bReadByteHdmiGRL(GRL_HDCP_CTL);
  358. bTemp |= HDCP_CTL_AN_STOP;
  359. vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp);
  360. }
  361. void bReadDataHdmiGRL(unsigned char bAddr, unsigned char bCount, unsigned char *bVal)
  362. {
  363. unsigned char i;
  364. MT8193_HDCP_FUNC();
  365. for (i = 0; i < bCount; i++)
  366. *(bVal + i) = bReadByteHdmiGRL(bAddr + i * 4);
  367. }
  368. void vWriteDataHdmiGRL(unsigned char bAddr, unsigned char bCount, unsigned char *bVal)
  369. {
  370. unsigned char i;
  371. MT8193_HDCP_FUNC();
  372. for (i = 0; i < bCount; i++)
  373. vWriteByteHdmiGRL(bAddr + i * 4, *(bVal + i));
  374. }
  375. void vSendAn(void)
  376. {
  377. unsigned char bHDCPBuf[HDCP_AN_COUNT];
  378. MT8193_HDCP_FUNC();
  379. /* Step 1: issue command to general a new An value */
  380. /* (1) read the value first */
  381. /* (2) set An control as stop to general a An first */
  382. vStopAn();
  383. /* Step 2: Read An from Transmitter */
  384. bReadDataHdmiGRL(GRL_WR_AN0, HDCP_AN_COUNT, bHDCPBuf);
  385. /* Step 3: Send An to Receiver */
  386. fgDDCDataWrite(RX_ID, RX_REG_HDCP_AN, HDCP_AN_COUNT, bHDCPBuf);
  387. }
  388. void vExchangeKSVs(void)
  389. {
  390. unsigned char bHDCPBuf[HDCP_AKSV_COUNT];
  391. MT8193_HDCP_FUNC();
  392. /* Step 1: read Aksv from transmitter, and send to receiver */
  393. if (fgHostKey()) {
  394. fgDDCDataWrite(RX_ID, RX_REG_HDCP_AKSV, HDCP_AKSV_COUNT, HDMI_AKSV);
  395. } else {
  396. /* fgI2CDataRead(HDMI_DEV_GRL, GRL_RD_AKSV0, HDCP_AKSV_COUNT, bHDCPBuf); */
  397. bReadDataHdmiGRL(GRL_RD_AKSV0, HDCP_AKSV_COUNT, bHDCPBuf);
  398. fgDDCDataWrite(RX_ID, RX_REG_HDCP_AKSV, HDCP_AKSV_COUNT, bHDCPBuf);
  399. }
  400. /* Step 4: read Bksv from receiver, and send to transmitter */
  401. fgDDCDataRead(RX_ID, RX_REG_HDCP_BKSV, HDCP_BKSV_COUNT, bHDCPBuf);
  402. /* fgI2CDataWrite(HDMI_DEV_GRL, GRL_WR_BKSV0, HDCP_BKSV_COUNT, bHDCPBuf); */
  403. vWriteDataHdmiGRL(GRL_WR_BKSV0, HDCP_BKSV_COUNT, bHDCPBuf);
  404. }
  405. void vHalSendAKey(unsigned char bData)
  406. {
  407. MT8193_HDCP_FUNC();
  408. vWriteByteHdmiGRL(GRL_KEY_PORT, bData);
  409. }
  410. void vSendAKey(unsigned char *prAKey)
  411. {
  412. unsigned char bData;
  413. unsigned short ui2Index;
  414. MT8193_HDCP_FUNC();
  415. for (ui2Index = 0; ui2Index < 280; ui2Index++) {
  416. /* get key from flash */
  417. if ((ui2Index == 5) && (bCheckPordHotPlug(PORD_MODE | HOTPLUG_MODE) == FALSE)) {
  418. vSetHDCPState(HDCP_RECEIVER_NOT_READY);
  419. return;
  420. }
  421. bData = *(prAKey + ui2Index);
  422. vHalSendAKey(bData);
  423. }
  424. }
  425. void bClearGRLInt(unsigned char bInt)
  426. {
  427. MT8193_DRV_FUNC();
  428. vWriteByteHdmiGRL(GRL_INT, bInt);
  429. }
  430. unsigned char bReadGRLInt(void)
  431. {
  432. unsigned char bStatus;
  433. MT8193_DRV_FUNC();
  434. bStatus = bReadByteHdmiGRL(GRL_INT);
  435. return bStatus;
  436. }
  437. unsigned char bCheckHDCPStatus(unsigned char bMode)
  438. {
  439. unsigned char bStatus = 0;
  440. MT8193_HDCP_FUNC();
  441. bStatus = bReadByteHdmiGRL(GRL_HDCP_STA);
  442. bStatus &= bMode;
  443. if (bStatus) {
  444. vWriteByteHdmiGRL(GRL_HDCP_STA, bMode);
  445. return TRUE;
  446. } else {
  447. return FALSE;
  448. }
  449. }
  450. unsigned char fgCompareRi(void)
  451. {
  452. unsigned char bTemp;
  453. unsigned char bHDCPBuf[4];
  454. MT8193_HDCP_FUNC();
  455. /* Read R0/ Ri from Transmitter */
  456. /* fgI2CDataRead(HDMI_DEV_GRL, GRL_RI_0, HDCP_RI_COUNT, bHDCPBuf+HDCP_RI_COUNT); */
  457. bReadDataHdmiGRL(GRL_RI_0, HDCP_RI_COUNT, &bHDCPBuf[HDCP_RI_COUNT]);
  458. /* Read R0'/ Ri' from Receiver */
  459. fgDDCDataRead(RX_ID, RX_REG_RI, HDCP_RI_COUNT, bHDCPBuf);
  460. MT8193_HDCP_LOG("bHDCPBuf[0]=0x%x,bHDCPBuf[1]=0x%x,bHDCPBuf[2]=0x%x,bHDCPBuf[3]=0x%x\n",
  461. bHDCPBuf[0], bHDCPBuf[1], bHDCPBuf[2], bHDCPBuf[3]);
  462. /* compare R0 and R0' */
  463. for (bTemp = 0; bTemp < HDCP_RI_COUNT; bTemp++) {
  464. if (bHDCPBuf[bTemp] == bHDCPBuf[bTemp + HDCP_RI_COUNT])
  465. continue;
  466. else
  467. break;
  468. }
  469. if (bTemp == HDCP_RI_COUNT)
  470. return TRUE;
  471. else
  472. return FALSE;
  473. }
  474. void vEnableEncrpt(void)
  475. {
  476. unsigned char bTemp;
  477. MT8193_HDCP_FUNC();
  478. bTemp = bReadByteHdmiGRL(GRL_HDCP_CTL);
  479. bTemp |= HDCP_CTL_ENC_EN;
  480. vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp);
  481. }
  482. void vHalWriteKsvListPort(unsigned char *prKsvData, unsigned char bDevice_Count, unsigned char *prBstatus)
  483. {
  484. unsigned char bIndex;
  485. MT8193_HDCP_FUNC();
  486. if ((bDevice_Count * 5) < KSV_BUFF_SIZE) {
  487. for (bIndex = 0; bIndex < (bDevice_Count * 5); bIndex++)
  488. vWriteByteHdmiGRL(GRL_KSVLIST, *(prKsvData + bIndex));
  489. for (bIndex = 0; bIndex < 2; bIndex++)
  490. vWriteByteHdmiGRL(GRL_KSVLIST, *(prBstatus + bIndex));
  491. }
  492. }
  493. void vHalWriteHashPort(unsigned char *prHashVBuff)
  494. {
  495. unsigned char bIndex;
  496. MT8193_HDCP_FUNC();
  497. for (bIndex = 0; bIndex < 20; bIndex++)
  498. vWriteByteHdmiGRL(GRL_REPEATER_HASH + bIndex * 4, *(prHashVBuff + bIndex));
  499. }
  500. void vEnableHashHardwrae(void)
  501. {
  502. unsigned char bData;
  503. MT8193_HDCP_FUNC();
  504. bData = bReadByteHdmiGRL(GRL_HDCP_CTL);
  505. bData |= HDCP_CTL_SHA_EN;
  506. vWriteByteHdmiGRL(GRL_HDCP_CTL, bData);
  507. }
  508. void vReadKSVFIFO(void)
  509. {
  510. unsigned char bTemp, bIndex, bDevice_Count; /* , bBlock; */
  511. unsigned char bStatus[2], bBstatus1;
  512. MT8193_HDCP_FUNC();
  513. fgDDCDataRead(RX_ID, RX_REG_BSTATUS1 + 1, 1, &bBstatus1);
  514. fgDDCDataRead(RX_ID, RX_REG_BSTATUS1, 1, &bDevice_Count);
  515. bDevice_Count &= DEVICE_COUNT_MASK;
  516. if ((bDevice_Count & MAX_DEVS_EXCEEDED) || (bBstatus1 & MAX_CASCADE_EXCEEDED)) {
  517. vSetHDCPState(HDCP_RE_DO_AUTHENTICATION);
  518. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  519. return;
  520. }
  521. if (bDevice_Count > 32) {
  522. for (bTemp = 0; bTemp < 2; bTemp++) { /* retry 1 times */
  523. fgDDCDataRead(RX_ID, RX_REG_BSTATUS1, 1, &bDevice_Count);
  524. bDevice_Count &= DEVICE_COUNT_MASK;
  525. if (bDevice_Count <= 32)
  526. break;
  527. }
  528. if (bTemp == 2)
  529. bDevice_Count = 32;
  530. }
  531. vSetSharedInfo(SI_REPEATER_DEVICE_COUNT, bDevice_Count);
  532. if (bDevice_Count == 0) {
  533. for (bIndex = 0; bIndex < 5; bIndex++)
  534. bKsv_buff[bIndex] = 0;
  535. for (bIndex = 0; bIndex < 2; bIndex++)
  536. bStatus[bIndex] = 0;
  537. for (bIndex = 0; bIndex < 20; bIndex++)
  538. bSHABuff[bIndex] = 0;
  539. } else {
  540. fgDDCDataRead(RX_ID, RX_REG_KSV_FIFO, bDevice_Count * 5, bKsv_buff);
  541. }
  542. fgDDCDataRead(RX_ID, RX_REG_BSTATUS1, 2, bStatus);
  543. fgDDCDataRead(RX_ID, RX_REG_REPEATER_V, 20, bSHABuff);
  544. if ((bDevice_Count * 5) < KSV_BUFF_SIZE)
  545. vHalWriteKsvListPort(bKsv_buff, bDevice_Count, bStatus);
  546. vHalWriteHashPort(bSHABuff);
  547. vEnableHashHardwrae();
  548. vSetHDCPState(HDCP_COMPARE_V);
  549. /* set time-out value as 0.5 sec */
  550. vSetHDCPTimeOut(HDCP_WAIT_V_RDY_TIMEOUE);
  551. }
  552. unsigned char bReadHDCPStatus(void)
  553. {
  554. unsigned char bTemp;
  555. MT8193_HDCP_FUNC();
  556. bTemp = bReadByteHdmiGRL(GRL_HDCP_STA);
  557. return bTemp;
  558. }
  559. void vHDCPInitAuth(void)
  560. {
  561. MT8193_HDCP_FUNC();
  562. vSetHDCPTimeOut(HDCP_WAIT_RES_CHG_OK_TIMEOUE); /* 100 ms */
  563. vSetHDCPState(HDCP_WAIT_RES_CHG_OK);
  564. }
  565. void vDisableHDCP(unsigned char fgDisableHdcp)
  566. {
  567. MT8193_HDCP_FUNC();
  568. if (fgDisableHdcp) {
  569. vHDCPReset();
  570. if (fgDisableHdcp == 1)
  571. vMoveHDCPInternalKey(EXTERNAL_KEY);
  572. else if (fgDisableHdcp == 2)
  573. vMoveHDCPInternalKey(INTERNAL_NOENCRYPT_KEY);
  574. else if (fgDisableHdcp == 3)
  575. vMoveHDCPInternalKey(INTERNAL_ENCRYPT_KEY);
  576. _bHdcpOff = 1;
  577. } else {
  578. vSetHDCPState(HDCP_RE_DO_AUTHENTICATION);
  579. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  580. _bHdcpOff = 0;
  581. }
  582. }
  583. void mt8193_mutehdmi(unsigned char u1flagvideomute, unsigned char u1flagaudiomute)
  584. {
  585. MT8193_HDCP_LOG("u1flagvideomute = %d, u1flagaudiomute = %d\n", u1flagvideomute,
  586. u1flagaudiomute);
  587. _bflagvideomute = u1flagvideomute;
  588. _bflagaudiomute = u1flagaudiomute;
  589. if (_bHdcpOff == 1) {
  590. if (u1flagvideomute == TRUE)
  591. vBlackHDMIOnly();
  592. else
  593. vUnBlackHDMIOnly();
  594. if (u1flagaudiomute == TRUE)
  595. MuteHDMIAudio();
  596. else
  597. UnMuteHDMIAudio();
  598. }
  599. }
  600. void HdcpService(HDCP_CTRL_STATE_T e_hdcp_state)
  601. {
  602. unsigned char bIndx, bTemp;
  603. unsigned char bMask;
  604. MT8193_HDCP_FUNC();
  605. if (_bHdcpOff == 1) {
  606. vSetHDCPState(HDCP_RECEIVER_NOT_READY);
  607. vHDMIAVUnMute();
  608. vWriteHdmiIntMask(0xff);
  609. }
  610. switch (e_hdcp_state) {
  611. case HDCP_RECEIVER_NOT_READY:
  612. MT8193_HDCP_LOG("HDCP_RECEIVER_NOT_READY\n");
  613. break;
  614. case HDCP_READ_EDID:
  615. break;
  616. case HDCP_WAIT_RES_CHG_OK:
  617. MT8193_HDCP_LOG("HDCP_WAIT_RES_CHG_OK\n");
  618. _bReAUTHCount = 0;
  619. if (fgIsHDCPCtrlTimeOut()) {
  620. if (_bHdcpOff == 1) { /* disable HDCP */
  621. vSetHDCPState(HDCP_RECEIVER_NOT_READY);
  622. vHDMIAVUnMute();
  623. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  624. } else {
  625. vSetHDCPState(HDCP_RE_DO_AUTHENTICATION);
  626. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  627. }
  628. }
  629. break;
  630. case HDCP_INIT_AUTHENTICATION:
  631. MT8193_HDCP_LOG("HDCP_INIT_AUTHENTICATION\n");
  632. _bReAUTHCount++;
  633. vHDMIAVMute();
  634. vSetSharedInfo(SI_HDMI_HDCP_RESULT, 0);
  635. if (!fgDDCDataRead(RX_ID, RX_REG_BCAPS, 1, &bTemp)) {
  636. vSetHDCPTimeOut(HDCP_WAIT_300MS_TIMEOUT);
  637. break;
  638. }
  639. vMiAnUpdateOrFix(TRUE);
  640. if (fgHostKey()) {
  641. for (bIndx = 0; bIndx < HDCP_AKSV_COUNT; bIndx++)
  642. HDMI_AKSV[bIndx] = bHdcpKeyBuff[1 + bIndx];
  643. if ((_bReAUTHCount > 2)
  644. || ((HDMI_AKSV[0] == 0) && (HDMI_AKSV[1] == 0) && (HDMI_AKSV[2] == 0)
  645. && (HDMI_AKSV[3] == 0))) {
  646. vSetHDCPState(HDCP_RECEIVER_NOT_READY);
  647. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  648. _bReAUTHCount = 0;
  649. return;
  650. }
  651. } else {
  652. vReadAksvFromReg(&HDMI_AKSV[0]);
  653. }
  654. if ((bhdcpkey == INTERNAL_ENCRYPT_KEY) || (bhdcpkey == EXTERNAL_KEY))
  655. vWriteAksvKeyMask(&HDMI_AKSV[0]);
  656. vEnableAuthHardware();
  657. fgDDCDataRead(RX_ID, RX_REG_BCAPS, 1, &bTemp);
  658. vSetSharedInfo(SI_REPEATER_DEVICE_COUNT, 0);
  659. if (bTemp & RX_BIT_ADDR_RPTR)
  660. _fgRepeater = TRUE;
  661. else
  662. _fgRepeater = FALSE;
  663. if (fgIsRepeater())
  664. vRepeaterOnOff(TRUE);
  665. else
  666. vRepeaterOnOff(FALSE);
  667. vSendAn();
  668. vExchangeKSVs();
  669. if (fgHostKey()) {
  670. vSendAKey(&bHdcpKeyBuff[6]); /* around 190msec */
  671. vSetHDCPTimeOut(HDCP_WAIT_R0_TIMEOUT);
  672. } else {
  673. vSetHDCPTimeOut(HDCP_WAIT_R0_TIMEOUT); /* 100 ms */
  674. }
  675. /* change state as waiting R0 */
  676. vSetHDCPState(HDCP_WAIT_R0);
  677. break;
  678. case HDCP_WAIT_R0:
  679. MT8193_HDCP_LOG("HDCP_WAIT_R0\n");
  680. bTemp = bCheckHDCPStatus(HDCP_STA_RI_RDY);
  681. if (bTemp == TRUE) {
  682. vSetHDCPState(HDCP_COMPARE_R0);
  683. } else {
  684. vSetHDCPState(HDCP_RE_DO_AUTHENTICATION);
  685. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  686. break;
  687. }
  688. case HDCP_COMPARE_R0:
  689. MT8193_HDCP_LOG("HDCP_COMPARE_R0\n");
  690. if (fgCompareRi() == TRUE) {
  691. vMiAnUpdateOrFix(FALSE);
  692. vEnableEncrpt(); /* Enabe encrption */
  693. vSetCTL0BeZero(TRUE);
  694. /* change state as check repeater */
  695. vSetHDCPState(HDCP_CHECK_REPEATER);
  696. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  697. vSetSharedInfo(SI_HDMI_HDCP_RESULT, 0x01); /* step 1 OK. */
  698. } else {
  699. vSetHDCPState(HDCP_RE_COMPARE_R0);
  700. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  701. _bReCompRiCount = 0;
  702. }
  703. break;
  704. case HDCP_RE_COMPARE_R0:
  705. MT8193_HDCP_LOG("HDCP_RE_COMPARE_R0\n");
  706. _bReCompRiCount++;
  707. if (fgIsHDCPCtrlTimeOut() && _bReCompRiCount > 3) {
  708. vSetHDCPState(HDCP_RE_DO_AUTHENTICATION);
  709. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  710. _bReCompRiCount = 0;
  711. } else {
  712. if (fgCompareRi() == TRUE) {
  713. vMiAnUpdateOrFix(FALSE);
  714. vEnableEncrpt(); /* Enabe encrption */
  715. vSetCTL0BeZero(TRUE);
  716. /* change state as check repeater */
  717. vSetHDCPState(HDCP_CHECK_REPEATER);
  718. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  719. vSetSharedInfo(SI_HDMI_HDCP_RESULT, 0x01); /* step 1 OK. */
  720. } else {
  721. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  722. }
  723. }
  724. break;
  725. case HDCP_CHECK_REPEATER:
  726. MT8193_HDCP_LOG("HDCP_CHECK_REPEATER\n");
  727. /* if the device is a Repeater, */
  728. if (fgIsRepeater()) {
  729. _bReCheckReadyBit = 0;
  730. vSetHDCPState(HDCP_WAIT_KSV_LIST);
  731. vSetHDCPTimeOut(HDCP_WAIT_KSV_LIST_TIMEOUT);
  732. } else {
  733. vSetHDCPState(HDCP_WAIT_RI);
  734. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  735. }
  736. break;
  737. case HDCP_WAIT_KSV_LIST:
  738. MT8193_HDCP_LOG("HDCP_WAIT_KSV_LIST\n");
  739. fgDDCDataRead(RX_ID, RX_REG_BCAPS, 1, &bTemp);
  740. if ((bTemp & RX_BIT_ADDR_READY)) {
  741. _bReCheckReadyBit = 0;
  742. vSetHDCPState(HDCP_READ_KSV_LIST);
  743. } else if (_bReCheckReadyBit > HDCP_CHECK_KSV_LIST_RDY_RETRY_COUNT) {
  744. vSetHDCPState(HDCP_RE_DO_AUTHENTICATION);
  745. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  746. _bReCheckReadyBit = 0;
  747. ; break;
  748. } else {
  749. _bReCheckReadyBit++;
  750. vSetHDCPState(HDCP_WAIT_KSV_LIST);
  751. vSetHDCPTimeOut(HDCP_WAIT_KSV_LIST_RETRY_TIMEOUT);
  752. ; break;
  753. }
  754. case HDCP_READ_KSV_LIST:
  755. MT8193_HDCP_LOG("HDCP_READ_KSV_LIST\n");
  756. vReadKSVFIFO();
  757. break;
  758. case HDCP_COMPARE_V:
  759. MT8193_HDCP_LOG("HDCP_COMPARE_V\n");
  760. bTemp = bReadHDCPStatus();
  761. if ((bTemp & HDCP_STA_V_MATCH) || (bTemp & HDCP_STA_V_RDY)) {
  762. if ((bTemp & HDCP_STA_V_MATCH)) { /* for Simplay #7-20-5 */
  763. vSetHDCPState(HDCP_WAIT_RI);
  764. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  765. vSetSharedInfo(SI_HDMI_HDCP_RESULT, (i4SharedInfo(SI_HDMI_HDCP_RESULT) | 0x02));
  766. /* step 2 OK. */
  767. } else {
  768. vSetHDCPState(HDCP_RE_DO_AUTHENTICATION);
  769. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  770. }
  771. }
  772. break;
  773. case HDCP_WAIT_RI:
  774. MT8193_HDCP_LOG("HDCP_WAIT_RI\n");
  775. vHDMIAVUnMute();
  776. bMask = bReadHdmiIntMask();
  777. vWriteHdmiIntMask(0xfd);
  778. break;
  779. case HDCP_CHECK_LINK_INTEGRITY:
  780. MT8193_HDCP_LOG("HDCP_CHECK_LINK_INTEGRITY\n");
  781. if (fgCompareRi() == TRUE) {
  782. vSetSharedInfo(SI_HDMI_HDCP_RESULT, (i4SharedInfo(SI_HDMI_HDCP_RESULT) | 0x04));
  783. /* step 3 OK. */
  784. if (fgIsRepeater()) {
  785. if (i4SharedInfo(SI_HDMI_HDCP_RESULT) == 0x07) { /* step 1, 2, 3. */
  786. vSetSharedInfo(SI_HDMI_HDCP_RESULT, (i4SharedInfo(SI_HDMI_HDCP_RESULT) | 0x08));
  787. /* all ok. */
  788. }
  789. } else { /* not repeater, don't need step 2. */
  790. if (i4SharedInfo(SI_HDMI_HDCP_RESULT) == 0x05) { /* step 1, 3. */
  791. vSetSharedInfo(SI_HDMI_HDCP_RESULT, (i4SharedInfo(SI_HDMI_HDCP_RESULT) | 0x08));
  792. /* all ok. */
  793. }
  794. }
  795. } else {
  796. bMask = bReadHdmiIntMask();
  797. vWriteHdmiIntMask(0xff); /* disable INT HDCP */
  798. _bReCompRiCount = 0;
  799. vSetHDCPState(HDCP_RE_COMPARE_RI);
  800. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  801. }
  802. break;
  803. case HDCP_RE_COMPARE_RI:
  804. MT8193_HDCP_LOG("HDCP_RE_COMPARE_RI\n");
  805. _bReCompRiCount++;
  806. if (_bReCompRiCount > 5) {
  807. vSetHDCPState(HDCP_RE_DO_AUTHENTICATION);
  808. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  809. _bReCompRiCount = 0;
  810. } else {
  811. if (fgCompareRi() == TRUE) {
  812. _bReCompRiCount = 0;
  813. vSetHDCPState(HDCP_CHECK_LINK_INTEGRITY);
  814. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  815. vSetSharedInfo(SI_HDMI_HDCP_RESULT, (i4SharedInfo(SI_HDMI_HDCP_RESULT) | 0x04));
  816. /* step 3 OK. */
  817. if (fgIsRepeater()) {
  818. if (i4SharedInfo(SI_HDMI_HDCP_RESULT) == 0x07) { /* step 1, 2, 3. */
  819. vSetSharedInfo(SI_HDMI_HDCP_RESULT,
  820. (i4SharedInfo(SI_HDMI_HDCP_RESULT) | 0x08));
  821. /* all ok. */
  822. }
  823. } else {
  824. if (i4SharedInfo(SI_HDMI_HDCP_RESULT) == 0x05) { /* step 1, 3. */
  825. vSetSharedInfo(SI_HDMI_HDCP_RESULT,
  826. (i4SharedInfo(SI_HDMI_HDCP_RESULT) | 0x08));
  827. /* all ok. */
  828. }
  829. }
  830. bMask = bReadHdmiIntMask();
  831. vWriteHdmiIntMask(0xfd);
  832. } else {
  833. vSetHDCPState(HDCP_RE_COMPARE_RI);
  834. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  835. }
  836. }
  837. break;
  838. case HDCP_RE_DO_AUTHENTICATION:
  839. MT8193_HDCP_LOG("HDCP_RE_DO_AUTHENTICATION\n");
  840. vHDMIAVMute();
  841. vHDCPReset();
  842. if (i4SharedInfo(SI_HDMI_RECEIVER_STATUS) != HDMI_PLUG_IN_AND_SINK_POWER_ON) {
  843. vSetHDCPState(HDCP_RECEIVER_NOT_READY);
  844. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  845. } else {
  846. vSetHDCPState(HDCP_WAIT_RESET_OK);
  847. vSetHDCPTimeOut(HDCP_WAIT_RE_DO_AUTHENTICATION);
  848. }
  849. break;
  850. case HDCP_WAIT_RESET_OK:
  851. MT8193_HDCP_LOG("HDCP_WAIT_RESET_OK\n");
  852. if (fgIsHDCPCtrlTimeOut()) {
  853. vSetHDCPState(HDCP_INIT_AUTHENTICATION);
  854. vSendHdmiCmd(HDMI_HDCP_PROTOCAL_CMD);
  855. }
  856. break;
  857. default:
  858. break;
  859. }
  860. }
  861. #endif