cbus_drv.c 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403
  1. /******************************************************************************/
  2. //!file drv_cbus.c
  3. //!brief CBUS Driver.
  4. //
  5. /******************************************************************************/
  6. #include <linux/string.h>
  7. #include "cbus_debug.h"
  8. #include "cbus_drv.h"
  9. #include "cbus_drv_internal.h"
  10. #include "cbus_enums.h"
  11. #include "../hdmi_time.h"
  12. #include "../hdmi_hw.h"
  13. #include "../hdmi.h"
  14. #include "../hdmi_processing.h"
  15. #include "drv_gpio.h"
  16. #include <linux/delay.h>
  17. //------------------------------------------------------------------------------
  18. // CBUS Driver Instance Data
  19. //------------------------------------------------------------------------------
  20. CbusDrvInstanceData_t cbusDrvInstance;
  21. CbusDrvInstanceData_t *pDrvCbus = &cbusDrvInstance;
  22. void CbusDrvInitCbusRegsList(void)
  23. {
  24. HDMI_RegisterWrite(HDMIRX_CBUS_r_dev_state, MHL_DEV_STATE);
  25. HDMI_RegisterWrite(HDMIRX_CBUS_r_mhl_version, MHL_VERSION);
  26. HDMI_RegisterWrite(HDMIRX_CBUS_r_dev_cat, MHL_DEV_CAT_POW_PLIM);
  27. HDMI_RegisterWrite(HDMIRX_CBUS_r_adopter_id_h, MHL_DEV_CAT_ADOPTER_ID_H);
  28. HDMI_RegisterWrite(HDMIRX_CBUS_r_adopter_id_l, MHL_DEV_CAT_ADOPTER_ID_L);
  29. HDMI_RegisterWrite(HDMIRX_CBUS_r_vid_link_mode, MHL_VID_LINK_MODE);
  30. HDMI_RegisterWrite(HDMIRX_CBUS_r_log_dev_map, MHL_LOG_DEV_MAP);
  31. HDMI_RegisterWrite(HDMIRX_CBUS_r_bandwidth, MHL_LINK_CLK_FREQUENCY);
  32. HDMI_RegisterWrite(HDMIRX_CBUS_r_feature_flag, MHL_FEATURE_SUPPORT);
  33. HDMI_RegisterWrite(HDMIRX_CBUS_r_int_stat_size, MHL_INT_STAT_SIZE);
  34. }
  35. //------------------------------------------------------------------------------
  36. // Function: CbusDrvStatus
  37. // Description: Returns a status flag word containing CBUS driver-specific
  38. // information about the state of the device.
  39. // Parameters: none
  40. // Returns: status flags word for the CBUS Driver
  41. //------------------------------------------------------------------------------
  42. CBUS_DRV_STATUS_e CbusDrvStatus(void)
  43. {
  44. CBUS_DRV_STATUS_e statusFlags;
  45. statusFlags = pDrvCbus->statusFlags;
  46. pDrvCbus->statusFlags &= ~(CBUS_INT | CBUS_TRANS_INT | CBUS_LINK_INT | CBUS_WAKE_INT |CBUS_DISCV_INT |CBUS_CONNT_INT |CBUS_ATTACH_INT | CBUS_DEATCH_INT | CBUS_SRC_DISCONT_INT); // INT flag only valid first time it is read.
  47. return(statusFlags);
  48. }
  49. //------------------------------------------------------------------------------
  50. // Function: CbusDrvInterruptStatusGet
  51. // Description: Returns the last Interrupt Status data retrieved by the CBUS ISR.
  52. // Parameters: pData - pointer to return data buffer(1 byte).
  53. // Returns: pData - Destination for interrupt status data.
  54. //------------------------------------------------------------------------------
  55. void CbusDrvInterruptStatusGet(UINT32 *pData, UINT32 *pData2)
  56. {
  57. CbusDrvInstanceData_t *pDrvCbus;
  58. pDrvCbus = &cbusDrvInstance;
  59. *pData = pDrvCbus->CBUS_TRANS_INT_STATUS;
  60. *pData2 = pDrvCbus->CBUS_LINK_INT_STATUS;
  61. }
  62. //------------------------------------------------------------------------------
  63. // Function: CbusDrvInterruptStatusSet
  64. // Description: Clears the interrupt variable
  65. // Parameters: channel
  66. //------------------------------------------------------------------------------
  67. void CbusDrvInterruptStatusSet(UINT32 intBits, UINT32 intBits2)
  68. {
  69. CbusDrvInstanceData_t *pDrvCbus;
  70. pDrvCbus = &cbusDrvInstance;
  71. pDrvCbus->CBUS_TRANS_INT_STATUS = intBits;
  72. pDrvCbus->CBUS_LINK_INT_STATUS = intBits;
  73. }
  74. //------------------------------------------------------------------------------
  75. // Function: CbusDrvConnectedGet
  76. // Description: Returns the Connected Status retrieved by the CBUS ISR.
  77. // Parameters: pData - pointer to return data buffer(1 byte).
  78. // Returns: pData - Destination for bus status data.
  79. //------------------------------------------------------------------------------
  80. void CbusDrvConnectedGet(UINT8 *pData)
  81. {
  82. CbusDrvInstanceData_t *pDrvCbus;
  83. pDrvCbus = &cbusDrvInstance;
  84. *pData = pDrvCbus->Connected;
  85. }
  86. //------------------------------------------------------------------------------
  87. // Function: CbusDrvCableAttachGet
  88. // Description: Returns the CableAttach Status retrieved by the CBUS ISR.
  89. // Parameters: pData - pointer to return data buffer(1 byte).
  90. // Returns: pData - Destination for bus status data.
  91. //------------------------------------------------------------------------------
  92. void CbusDrvCableAttachGet(UINT8 *pData)
  93. {
  94. CbusDrvInstanceData_t *pDrvCbus;
  95. pDrvCbus = &cbusDrvInstance;
  96. *pData = pDrvCbus->CableAttach;
  97. }
  98. //------------------------------------------------------------------------------
  99. // Function: CbusDrvSrcPathEnStatusGet
  100. // Description: Returns the SrcPathEn Status of DrvCbus
  101. // Parameters: None
  102. // Returns: SrcPathEn Status
  103. //------------------------------------------------------------------------------
  104. BOOL CbusDrvSrcPathEnStatusGet(void)
  105. {
  106. CbusDrvInstanceData_t *pDrvCbus;
  107. pDrvCbus = &cbusDrvInstance;
  108. return pDrvCbus->SrcPathEn;
  109. }
  110. //------------------------------------------------------------------------------
  111. // Function: CbusDrvMSCSubDataGet
  112. // Description: Returns the MSC sub-cmd and data bytes retrieved by the CBUS ISR.
  113. // Parameters: pbCmdType, pbData - pointer to return data
  114. // Returns: pbCmdType - the oldest received MSC sub-command type value
  115. // pbData - the oldest received MSC sub-command data value
  116. // return TRUE if data is available, otherwise return FALSE
  117. //------------------------------------------------------------------------------
  118. BOOL CbusDrvMSCSubDataGet(UINT8 *pbCmdType, UINT8 *pbData)
  119. {
  120. CbusDrvInstanceData_t *pDrvCbus;
  121. BOOL success = TRUE;
  122. pDrvCbus = &cbusDrvInstance;
  123. if(pDrvCbus->stMscSubCmd_R.bLock == TRUE)
  124. {
  125. mhldbg("[%s] data lockedn", __FUNCTION__);
  126. success = FALSE;
  127. }
  128. else
  129. {
  130. if(pDrvCbus->stMscSubCmd_R.bSize > 0)
  131. {
  132. mhldbg("[%s] CmdType:0x%x Data:0x%x size:%d SIndex:%d EIndex:%d\n", __FUNCTION__,
  133. pDrvCbus->stMscSubCmd_R.bCmdType[pDrvCbus->stMscSubCmd_R.bStartIndex],
  134. pDrvCbus->stMscSubCmd_R.bData[pDrvCbus->stMscSubCmd_R.bStartIndex],
  135. pDrvCbus->stMscSubCmd_R.bSize,
  136. pDrvCbus->stMscSubCmd_R.bStartIndex,
  137. pDrvCbus->stMscSubCmd_R.bEndIndex);
  138. *pbCmdType = pDrvCbus->stMscSubCmd_R.bCmdType[pDrvCbus->stMscSubCmd_R.bStartIndex];
  139. *pbData= pDrvCbus->stMscSubCmd_R.bData[pDrvCbus->stMscSubCmd_R.bStartIndex];
  140. pDrvCbus->stMscSubCmd_R.bSize--;
  141. if(pDrvCbus->stMscSubCmd_R.bSize != 0)
  142. pDrvCbus->stMscSubCmd_R.bStartIndex = (pDrvCbus->stMscSubCmd_R.bStartIndex + 1) %MHL_MSC_SUB_CMD_MAX_SIZE;
  143. success = TRUE;
  144. }
  145. else
  146. success = FALSE;
  147. }
  148. return success;
  149. }
  150. //------------------------------------------------------------------------------
  151. // Function: CbusDrvMSCSubDataInsert
  152. // Description: Insert the MSC sub-cmd and data bytes
  153. // Parameters: bCmdType - MSC sub-command type value
  154. // bData - MSC sub-command data value
  155. // return TRUE if data is inserted successful, otherwise return FALSE
  156. //------------------------------------------------------------------------------
  157. BOOL CbusDrvMSCSubDataInsert(UINT8 bCmdType, UINT8 bData)
  158. {
  159. CbusDrvInstanceData_t *pDrvCbus;
  160. BOOL success = TRUE;
  161. pDrvCbus = &cbusDrvInstance;
  162. if(pDrvCbus->stMscSubCmd_R.bLock == TRUE)
  163. {
  164. mhldbg("[%s] data lockedn", __FUNCTION__);
  165. success = FALSE;
  166. }
  167. else
  168. {
  169. pDrvCbus->stMscSubCmd_R.bLock = TRUE;
  170. if(pDrvCbus->stMscSubCmd_R.bSize == MHL_MSC_SUB_CMD_MAX_SIZE)
  171. success = FALSE;
  172. else
  173. {
  174. if(pDrvCbus->stMscSubCmd_R.bSize != 0)
  175. pDrvCbus->stMscSubCmd_R.bEndIndex = (pDrvCbus->stMscSubCmd_R.bEndIndex + 1) %MHL_MSC_SUB_CMD_MAX_SIZE;
  176. pDrvCbus->stMscSubCmd_R.bCmdType[pDrvCbus->stMscSubCmd_R.bEndIndex] = bCmdType;
  177. pDrvCbus->stMscSubCmd_R.bData[pDrvCbus->stMscSubCmd_R.bEndIndex] = bData;
  178. pDrvCbus->stMscSubCmd_R.bSize++;
  179. mhldbg("[%s] CmdType:0x%x Data:0x%x size:%d SIndex:%d EIndex:%d\n", __FUNCTION__,
  180. pDrvCbus->stMscSubCmd_R.bCmdType[pDrvCbus->stMscSubCmd_R.bEndIndex],
  181. pDrvCbus->stMscSubCmd_R.bData[pDrvCbus->stMscSubCmd_R.bEndIndex],
  182. pDrvCbus->stMscSubCmd_R.bSize,
  183. pDrvCbus->stMscSubCmd_R.bStartIndex,
  184. pDrvCbus->stMscSubCmd_R.bEndIndex);
  185. }
  186. pDrvCbus->stMscSubCmd_R.bLock = FALSE;
  187. }
  188. return success;
  189. }
  190. //------------------------------------------------------------------------------
  191. // Function: CbusDrvMsgDataGet
  192. // Description: Returns the last MSG data retrieved by the CBUS ISR.
  193. // Parameters: pData - pointer to return data buffer(?? bytes).
  194. // Returns: pData - Destination for msg data.
  195. //------------------------------------------------------------------------------
  196. void CbusDrvMsgDataGet(UINT8 *pData0, UINT8 *pData1)
  197. {
  198. CbusDrvInstanceData_t *pDrvCbus;
  199. pDrvCbus = &cbusDrvInstance;
  200. *pData0 = pDrvCbus->msgData0;
  201. *pData1 = pDrvCbus->msgData1;
  202. }
  203. //------------------------------------------------------------------------------
  204. // Function: CbusDrvDevCapGet
  205. // Description: Returns the Device Capability data retrieved by the CBUS ISR.
  206. // Parameters: pOffset - return offset
  207. // pData - return fetched data
  208. //------------------------------------------------------------------------------
  209. void CbusDrvDevCapGet(UINT8 *pOffset, UINT8 *pData)
  210. {
  211. CbusDrvInstanceData_t *pDrvCbus;
  212. pDrvCbus = &cbusDrvInstance;
  213. *pOffset = pDrvCbus->bReadDevCap_Offset;
  214. *pData = pDrvCbus->bReadDevCap_Data;
  215. }
  216. //------------------------------------------------------------------------------
  217. // Function: CbusDrvDdcAbortReasonGet
  218. // Description: Returns the last DDC Abort reason received by the CBUS ISR.
  219. // Parameters: pData - pointer to return data buffer(1 byte).
  220. // Returns: pData - Destination for DDC Abort reason data.
  221. //------------------------------------------------------------------------------
  222. void CbusDrvDdcAbortReasonGet(UINT8 *pData)
  223. {
  224. CbusDrvInstanceData_t *pDrvCbus;
  225. pDrvCbus = &cbusDrvInstance;
  226. *pData = pDrvCbus->ddcAbortReason;
  227. }
  228. //------------------------------------------------------------------------------
  229. // Function: CbusDrvMscAbortReasonGet
  230. // Description: Returns the last MSC Abort reason received by the CBUS ISR.
  231. // Parameters: pData - pointer to return data buffer(1 byte).
  232. // Returns: pData - Destination for MSC Abort reason data.
  233. //------------------------------------------------------------------------------
  234. void CbusDrvMscAbortReasonGet(UINT8 *pData)
  235. {
  236. CbusDrvInstanceData_t *pDrvCbus;
  237. pDrvCbus = &cbusDrvInstance;
  238. *pData = pDrvCbus->MscAbortReason;
  239. }
  240. //------------------------------------------------------------------------------
  241. // Function: CbusDrvMscFailReasonGet
  242. // Description: Returns the last MSC Fail reason received by the CBUS ISR.
  243. // Parameters: pData - pointer to return data buffer(1 byte).
  244. // Returns: pData - Destination for MSC Fail reason data.
  245. //------------------------------------------------------------------------------
  246. void CbusDrvMscFailReasonGet(UINT8 *pData)
  247. {
  248. CbusDrvInstanceData_t *pDrvCbus;
  249. pDrvCbus = &cbusDrvInstance;
  250. *pData = pDrvCbus->MscFailReason;
  251. }
  252. //------------------------------------------------------------------------------
  253. // Function: CbusDrvDevCapReadyGet
  254. // Description: Returns if the peer's device capability values are ready
  255. // Parameters: channel
  256. // Returns: TRUE/FALSE
  257. //------------------------------------------------------------------------------
  258. BOOL CbusDrvDevCapReadyGet(void)
  259. {
  260. CbusDrvInstanceData_t *pDrvCbus;
  261. pDrvCbus = &cbusDrvInstance;
  262. if(pDrvCbus->statusFlags & CBUS_DCAP_RDY_RECEIVED_FM_PEER)
  263. {
  264. pDrvCbus->statusFlags &= ~CBUS_DCAP_RDY_RECEIVED_FM_PEER;
  265. return(TRUE);
  266. }
  267. return(FALSE);
  268. }
  269. //------------------------------------------------------------------------------
  270. // Function: CbusDrvDevCapChangedGet
  271. // Description: Returns if the peer's device capability values are changed
  272. // Returns: TRUE/FALSE
  273. //------------------------------------------------------------------------------
  274. BOOL CbusDrvDevCapChangedGet(void)
  275. {
  276. CbusDrvInstanceData_t *pDrvCbus;
  277. pDrvCbus = &cbusDrvInstance;
  278. if(pDrvCbus->statusFlags & CBUS_DCAP_CHG_RECEIVED_FM_PEER)
  279. {
  280. pDrvCbus->statusFlags &= ~CBUS_DCAP_CHG_RECEIVED_FM_PEER;
  281. return(TRUE);
  282. }
  283. return(FALSE);
  284. }
  285. //------------------------------------------------------------------------------
  286. // Function: CbusDrvReqWrtGet
  287. // Description: Returns if the peer is requesting for scratchpad write permission
  288. // Returns: TRUE/FALSE
  289. //------------------------------------------------------------------------------
  290. BOOL CbusDrvReqWrtGet(void)
  291. {
  292. CbusDrvInstanceData_t *pDrvCbus;
  293. pDrvCbus = &cbusDrvInstance;
  294. if(pDrvCbus->statusFlags & CBUS_REQ_WRT_RECEIVED_FM_PEER)
  295. {
  296. pDrvCbus->statusFlags &= ~CBUS_REQ_WRT_RECEIVED_FM_PEER;
  297. return(TRUE);
  298. }
  299. return(FALSE);
  300. }
  301. //------------------------------------------------------------------------------
  302. // Function: CbusDrvGrtWrtGet
  303. // Description: Returns if the peer is requesting for scratchpad write permission
  304. // Returns: TRUE/FALSE
  305. //------------------------------------------------------------------------------
  306. BOOL CbusDrvGrtWrtGet(void)
  307. {
  308. CbusDrvInstanceData_t *pDrvCbus;
  309. pDrvCbus = &cbusDrvInstance;
  310. if(pDrvCbus->statusFlags & CBUS_GRT_WRT_RECEIVED_FM_PEER)
  311. {
  312. pDrvCbus->statusFlags &= ~CBUS_GRT_WRT_RECEIVED_FM_PEER;
  313. return(TRUE);
  314. }
  315. return(FALSE);
  316. }
  317. //------------------------------------------------------------------------------
  318. // Function: CbusDrvNackFromPeerGet
  319. // Description: Returns the last MSC NACK received by the CBUS ISR.
  320. // Parameters: NONE
  321. // Returns: TRUE if a new MSC NACK data was received, FALSE if not.
  322. //------------------------------------------------------------------------------
  323. BOOL CbusDrvNackFromPeerGet(void)
  324. {
  325. CbusDrvInstanceData_t *pDrvCbus;
  326. pDrvCbus = &cbusDrvInstance;
  327. if(pDrvCbus->statusFlags & CBUS_NACK_RECEIVED_FM_PEER)
  328. {
  329. pDrvCbus->statusFlags &= ~CBUS_NACK_RECEIVED_FM_PEER;
  330. return(TRUE);
  331. }
  332. return(FALSE);
  333. }
  334. //------------------------------------------------------------------------------
  335. // Function: CbusDrvAbortFromPeerGet
  336. // Description: Returns the last MSC Abort received by the CBUS ISR.
  337. // Parameters: NONE
  338. // Returns: TRUE if a new MSC ABORT data was received, FALSE if not.
  339. //------------------------------------------------------------------------------
  340. BOOL CbusDrvAbortFromPeerGet(void)
  341. {
  342. CbusDrvInstanceData_t *pDrvCbus;
  343. pDrvCbus = &cbusDrvInstance;
  344. if(pDrvCbus->statusFlags & CBUS_ABORT_RECEIVED_FM_PEER)
  345. {
  346. pDrvCbus->statusFlags &= ~CBUS_ABORT_RECEIVED_FM_PEER;
  347. return(TRUE);
  348. }
  349. return(FALSE);
  350. }
  351. //------------------------------------------------------------------------------
  352. // Function: CbusDrvIneffectCodeFromPeerGet
  353. // Description: Returns the last MSC Ineffect Code received by the CBUS ISR.
  354. // Parameters: NONE
  355. // Returns: TRUE if a new MSC INEFFECT_CODE data was received, FALSE if not.
  356. //------------------------------------------------------------------------------
  357. BOOL CbusDrvIneffectCodeFromPeerGet(void)
  358. {
  359. CbusDrvInstanceData_t *pDrvCbus;
  360. pDrvCbus = &cbusDrvInstance;
  361. if(pDrvCbus->statusFlags & CBUS_INEFFECT_CODE_RECEIVED_FM_PEER)
  362. {
  363. pDrvCbus->statusFlags &= ~CBUS_INEFFECT_CODE_RECEIVED_FM_PEER;
  364. return(TRUE);
  365. }
  366. return(FALSE);
  367. }
  368. //------------------------------------------------------------------------------
  369. // Function: CbusDrvWrtBurstAckGet
  370. // Description: Returns if the peer is return ACK for WRITE_BURST
  371. // Returns: TRUE/FALSE
  372. //------------------------------------------------------------------------------
  373. BOOL CbusDrvWrtBurstAckGet(void)
  374. {
  375. CbusDrvInstanceData_t *pDrvCbus;
  376. pDrvCbus = &cbusDrvInstance;
  377. if(pDrvCbus->statusFlags & CBUS_WRT_BURST_ACK_RECEIVED_FM_PEER)
  378. {
  379. pDrvCbus->statusFlags &= ~CBUS_WRT_BURST_ACK_RECEIVED_FM_PEER;
  380. return(TRUE);
  381. }
  382. return(FALSE);
  383. }
  384. //------------------------------------------------------------------------------
  385. // Function: CbusDrvWrtStateAckGet
  386. // Description: Returns if the peer is return ACK for WRITE_STATE
  387. // Returns: TRUE/FALSE
  388. //------------------------------------------------------------------------------
  389. BOOL CbusDrvWrtStateAckGet(void)
  390. {
  391. CbusDrvInstanceData_t *pDrvCbus;
  392. pDrvCbus = &cbusDrvInstance;
  393. if(pDrvCbus->statusFlags & CBUS_WRT_STATE_ACK_RECEIVED_FM_PEER)
  394. {
  395. pDrvCbus->statusFlags &= ~CBUS_WRT_STATE_ACK_RECEIVED_FM_PEER;
  396. return(TRUE);
  397. }
  398. return(FALSE);
  399. }
  400. //------------------------------------------------------------------------------
  401. // Function: CbusDrvWrtStateAckInfoGet
  402. // Description: Returns if the peer is return ACK for WRITE_STATE
  403. // Returns: TRUE/FALSE
  404. //------------------------------------------------------------------------------
  405. BOOL CbusDrvWrtStateAckInfoGet(UINT8 *pOffset, UINT8 *pData)
  406. {
  407. CbusDrvInstanceData_t *pDrvCbus;
  408. pDrvCbus = &cbusDrvInstance;
  409. if(pDrvCbus->statusFlags & CBUS_WRT_STATE_ACK_RECEIVED_FM_PEER)
  410. {
  411. pDrvCbus->statusFlags &= ~CBUS_WRT_STATE_ACK_RECEIVED_FM_PEER;
  412. *pOffset = pDrvCbus->AckWrtStatOffset;
  413. *pData = pDrvCbus->AckWrtStatData;
  414. return(TRUE);
  415. }
  416. return(FALSE);
  417. }
  418. //------------------------------------------------------------------------------
  419. // Function: DrvMHLPortSelectBitsGet
  420. // Description: Reads the MHL selected port(s)bit-field.
  421. // Parameters: None
  422. // Returns: MHL selected port(s)bit-field.
  423. //
  424. //------------------------------------------------------------------------------
  425. UINT8 DrvMHLPortSelectBitsGet(void)
  426. {
  427. return(HDMI_RegisterRead(HDMIRX_R_mhl_port_sel));
  428. }
  429. //------------------------------------------------------------------------------
  430. // Function: CbusDrvWriteCommand
  431. // Description: Write the specified Sideband Channel command to the CBUS.
  432. // Command can be a MSC_MSG command(RCP/RAP/UCP..), or another command
  433. // such as READ_DEVCAP, GET_VENDOR_ID, SET_HPD, CLR_HPD, etc.
  434. //
  435. // Parameters: channel - CBUS channel to write
  436. // pReq - Pointer to a cbus_req_t structure containing the
  437. // command to write
  438. // Returns: TRUE - successful write
  439. // FALSE - write failed
  440. //------------------------------------------------------------------------------
  441. BOOL CbusDrvWriteCommand(cbus_req_t *pReq)
  442. {
  443. BOOL success = TRUE;
  444. #ifdef CBUS_DETAIL_DEBUG_MSG
  445. UINT8 i = 0;
  446. UINT8 bStr[100] = "";
  447. #endif
  448. CbusDrvInstanceData_t *pDrvCbus;
  449. pDrvCbus = &cbusDrvInstance;
  450. if(pDrvCbus->Connected)
  451. {
  452. //print request for debug
  453. /*
  454. printk("[MHL] %s cmd:0x%x len:%d data:", __FUNCTION__, pReq->command, pReq->length);
  455. for(i = 0; i < pReq->length; i++)
  456. printk("0x%x ", pReq->msgData[i]);
  457. printk("\n");
  458. */
  459. switch(pReq->command)
  460. {
  461. case MHL_SET_INT: // Set one interrupt register = 0x60
  462. mhldbg("[%s] MHL_SET_INT data:0x%02x\n", __FUNCTION__, pReq->msgData[0]);
  463. HDMI_RegisterWrite(HDMIRX_CBUS_r_wrt_stat_offset_i, pReq->offsetData + 0x20); // set offset
  464. HDMI_RegisterWrite(HDMIRX_CBUS_r_wrt_stat_din, pReq->msgData[0]);
  465. HDMI_RegisterWrite(HDMIRX_CBUS_r_wrt_stat_req,1);
  466. break;
  467. case MHL_WRITE_STAT: // Write one status register = 0x60 | 0x80
  468. mhldbg("[%s] MHL_WRITE_STAT data:0x%02x\n", __FUNCTION__, pReq->msgData[0]);
  469. HDMI_RegisterWrite(HDMIRX_CBUS_r_wrt_stat_offset_i, pReq->offsetData + 0x30); // set offset
  470. HDMI_RegisterWrite(HDMIRX_CBUS_r_wrt_stat_din,pReq->msgData[0]);
  471. HDMI_RegisterWrite(HDMIRX_CBUS_r_wrt_stat_req,1);
  472. break;
  473. case MHL_READ_DEVCAP:
  474. mhldbg("[%s] MHL_READ_DEVCAP offset:0x%x\n", __FUNCTION__, pReq->offsetData);
  475. HDMI_RegisterWrite(HDMIRX_CBUS_r_red_devc_offset,pReq->offsetData);
  476. HDMI_RegisterWrite(HDMIRX_CBUS_r_red_devc_req, 1);
  477. break;
  478. case MHL_GET_STATE:
  479. mhldbg("[%s] MHL_GET_STATE data:0x%02x\n", __FUNCTION__, pReq->msgData[0]);
  480. // Set the offset and outgoing data byte right away
  481. HDMI_RegisterWrite(HDMIRX_CBUS_r_get_state_data,pReq->msgData[0]);
  482. HDMI_RegisterWrite(HDMIRX_CBUS_r_get_state_req, 1);
  483. break;
  484. case MHL_GET_VENDOR_ID:
  485. mhldbg("[%s] MHL_GET_VENDOR_ID\n", __FUNCTION__);
  486. HDMI_RegisterWrite(HDMIRX_CBUS_r_get_ven_id_req, 1);
  487. break;
  488. case MHL_SET_HPD:
  489. mhldbg("[%s] MHL_SET_HPD\n", __FUNCTION__);
  490. HDMI_RegisterWrite(HDMIRX_CBUS_r_set_hpd_req,1);
  491. break;
  492. case MHL_CLR_HPD:
  493. mhldbg("[%s] MHL_CLR_HPD\n", __FUNCTION__);
  494. HDMI_RegisterWrite(HDMIRX_CBUS_r_clr_hpd_req,1);
  495. break;
  496. case MHL_GET_SC1_ERRORCODE: // 0x69 - Get channel 1 command error code
  497. mhldbg("[%s] MHL_GET_SC1_ERRORCODE\n", __FUNCTION__);
  498. HDMI_RegisterWrite(HDMIRX_CBUS_r_get_src1_err_req,1);
  499. break;
  500. case MHL_GET_DDC_ERRORCODE: // 0x6A - Get DDC channel command error code.
  501. mhldbg("[%s] MHL_GET_DDC_ERRORCODE\n", __FUNCTION__);
  502. HDMI_RegisterWrite(HDMIRX_CBUS_r_get_ddc_err_req,1);
  503. break;
  504. case MHL_GET_MSC_ERRORCODE: // 0x6B - Get MSC command error code.
  505. mhldbg("[%s] MHL_GET_MSC_ERRORCODE\n", __FUNCTION__);
  506. HDMI_RegisterWrite(HDMIRX_CBUS_r_get_msc_err_req,1);
  507. break;
  508. case MHL_GET_SC3_ERRORCODE: // 0x6D - Get channel 3 command error code.
  509. mhldbg("[%s] MHL_GET_SC3_ERRORCODE\n", __FUNCTION__);
  510. HDMI_RegisterWrite(HDMIRX_CBUS_r_get_src3_err_req,1);
  511. break;
  512. case MHL_MSC_MSG:
  513. mhldbg("[%s] MHL_MSC_MSG data:0x%02x 0x%02x\n", __FUNCTION__, pReq->msgData[0], pReq->msgData[1]);
  514. switch(pReq->msgData[0])
  515. {
  516. case MHL_MSC_MSG_RCP: // MSC Sub-Command 0x10
  517. HDMI_RegisterWrite(HDMIRX_CBUS_r_rcp_cmd_code,pReq->msgData[1]);
  518. HDMI_RegisterWrite(HDMIRX_CBUS_r_rcp_cmd_req,1);
  519. break;
  520. case MHL_MSC_MSG_RAP: // MSC Sub-Command 0x20
  521. HDMI_RegisterWrite(HDMIRX_CBUS_r_rap_cmd_code,pReq->msgData[1]);
  522. HDMI_RegisterWrite(HDMIRX_CBUS_r_rap_cmd_req,1);
  523. break;
  524. case MHL_MSC_MSG_UCP: // MSC Sub-Command 0x30
  525. HDMI_RegisterWrite(HDMIRX_CBUS_r_ucp_cmd_code,pReq->msgData[1]);
  526. HDMI_RegisterWrite(HDMIRX_CBUS_r_ucp_cmd_req,1);
  527. break;
  528. case MHL_MSC_MSG_RAPK: // MSC Sub-Command 0x21
  529. HDMI_RegisterWrite(HDMIRX_CBUS_r_rap_act_ack_code,pReq->msgData[1]);
  530. HDMI_RegisterWrite(HDMIRX_CBUS_r_rap_act_ack_req,1);
  531. break;
  532. default:
  533. break;
  534. }
  535. break;
  536. case MHL_WRITE_BURST:
  537. #ifdef CBUS_DETAIL_DEBUG_MSG
  538. memset(bStr, 0, 100);
  539. for(i = 0; i< MHL_MAX_BUFFER_SIZE;i++)
  540. {
  541. char bTemp[10] = "";
  542. sprintf(bTemp, "0x%x ",pReq->msgData[i]);
  543. strcat(bStr,bTemp);
  544. }
  545. mhldbg("[%s] MHL_WRITE_BURST len:%d data:%s\n", __FUNCTION__, pReq->length, bStr);
  546. #else
  547. mhldbg("[%s] MHL_WRITE_BURST len:%d\n", __FUNCTION__, pReq->length);
  548. #endif
  549. HDMI_RegisterWrite(HDMIRX_CBUS_r_wrt_burst_offset_i, pReq->offsetData + 0x40);
  550. HDMI_RegisterWrite(HDMIRX_CBUS_r_wrt_burst_num, pReq->length);
  551. // Now copy all bytes from array to local scratchpad
  552. HDMI_RegisterWrite(HDMIRX_CBUS_r_wrt_burst_dina, *((UINT32*)&pReq->msgData[0]));
  553. HDMI_RegisterWrite(HDMIRX_CBUS_r_wrt_burst_dinb, *((UINT32*)&pReq->msgData[4]));
  554. HDMI_RegisterWrite(HDMIRX_CBUS_r_wrt_burst_dinc, *((UINT32*)&pReq->msgData[8]));
  555. HDMI_RegisterWrite(HDMIRX_CBUS_r_wrt_burst_dind, *((UINT32*)&pReq->msgData[12]));
  556. HDMI_RegisterWrite(HDMIRX_CBUS_r_wrt_burst_req,1);// Trigger the CBUS command transfer
  557. break;
  558. default:
  559. success = FALSE;
  560. break;
  561. }
  562. }
  563. else
  564. {
  565. success = FALSE;
  566. }
  567. return(success);
  568. }
  569. //------------------------------------------------------------------------------
  570. // Function: CbusDrvInitialize
  571. // Description: Attempts to initialize the CBUS. If register reads return 0xFF,
  572. // it declares error in initialization.
  573. // Initializes discovery enabling registers and anything needed in
  574. // config register, interrupt masks.
  575. // Returns: TRUE if no problem
  576. //------------------------------------------------------------------------------
  577. BOOL CbusDrvInitialize(void)
  578. {
  579. BOOL success = TRUE;
  580. /* Initialize CBUS System Reg. */
  581. sysset_Cbus_Init();
  582. /* Initialize CBUS channels. */
  583. // Setup local DEVCAP registers for read by the peer
  584. CbusDrvInitCbusRegsList();
  585. //set supported RCP key
  586. CbusDrvSetSupportRcpKey();
  587. //clear all driver status
  588. memset(pDrvCbus, 0, sizeof(CbusDrvInstanceData_t));
  589. //Set reset=0(0AA8[0])to enable engine
  590. // Enable CBUS_TRANS_INT
  591. HDMI_RegisterWrite(HDMIRX_CBUS_r_intr_en1,
  592. rcp_act_intr|
  593. ucp_cmd_intr|
  594. ucp_act_intr|
  595. //EDID_rd_intr|
  596. //msge_act_intr|
  597. //OTHR_cmd_intr|
  598. //device_status2_intr|
  599. //device_status3_intr|
  600. //get_ddc_err_intr|
  601. get_msc_err_intr|
  602. get_src1_err_intr|
  603. get_src3_err_intr|
  604. rap_cmd_intr|
  605. rap_act_ack_intr|
  606. rap_act_intr|
  607. rcp_cmd_intr|
  608. connected_rdy_intr|
  609. link_mode_intr|
  610. wrt_burst_intr|
  611. set_hpd_intr|
  612. clr_hpd_intr|
  613. //get_state_intr|
  614. //get_ven_id_intr|
  615. red_devc_intr|
  616. dcap_chg_intr|
  617. dscr_chg_intr|
  618. req_wrt_intr|
  619. grt_wrt_intr|
  620. req_3d_intr|
  621. //edid_chg_intr|
  622. wrt_stat_intr);
  623. // Enable CBUS_LINK_INT
  624. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_wake_int_en,1);//
  625. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_discv_int_en,1);//
  626. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_connt_int_en,1);//
  627. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_attach_int_en,1);//
  628. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_detach_int_en,1);//
  629. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_src_disconnected_int_en,1);//
  630. HDMI_RegisterWrite(HDMIRX_R_align_cnt_24,4);
  631. HDMI_RegisterWrite(HDMIRX_R_align_cnt_pp,4);
  632. //reset cbus
  633. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_cbus_reset, 1);
  634. HDMI_RegisterWrite(HDMIRX_CBUS_r_reset_reg, 1);
  635. //HDMI_RegisterWrite(HDMIRX_CBUS_cfg_debounce_reset, 1);
  636. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_buf_reset, 1);
  637. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_cbus_reinit, 1);
  638. sysset_Cbus_Z_CBUS_SINK_DISCOVER(Z_CBUS_SINK_DISCOVER_CFG_HARDWARE_AUTO);
  639. sysset_Cbus_Z_CBUS_SINK_ON(Z_CBUS_SINK_ON_CFG_HARDWARE_AUTO);
  640. HDMI_DelayMs(100);
  641. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_cbus_reset, 0);
  642. HDMI_RegisterWrite(HDMIRX_CBUS_r_reset_reg, 0);
  643. //HDMI_RegisterWrite(HDMIRX_CBUS_cfg_debounce_reset, 0);
  644. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_buf_reset, 0);
  645. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_cbus_reinit, 0);
  646. //Set Min and Max wake up pulse width unit
  647. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_wake_pulse_w1_max, 0xba001);//IC default 1720
  648. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_wake_pulse_w2_max, 0x1aa004);//IC default 1720
  649. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_wake_pulse_w1_min, 0x4dfa8);//For MEIZU MX
  650. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_wake_pulse_w2_min, 0x12C000);//For MEIZU MX
  651. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_bittime_max, 30);//MHL CTS 4.3.18.1
  652. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_ack0_start, 8);//MHL CTS 4.3.8.1
  653. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_ack0_end, 21);//MHL CTS 4.3.8.1
  654. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_cbus_arb, 6);//MHL CTS 4.3.8.1
  655. HDMI_RegisterWrite(HDMIRX_CBUS_r_abort_next_reg, 40000);//@IST 20160712 MHL CTS 6.3.6.5
  656. //HDMI_RegisterWrite(HDMIRX_CBUS_r_abort_next_reg, 35000);//@IST 20170221 MHL CTS 6.3.6.5
  657. HDMI_RegisterWrite(HDMIRX_CBUS_r_msc_r_cmd_receiver_timeout_reg, 4000);//MHL CTS 6.3.10.6
  658. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_txclk_div, 24);//MHL CTS 4.3.10.2 331 A1 ECO modify
  659. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_cbus_float_min, 0x168000);//MHL CTS 4.3.5.1
  660. HDMI_RegisterWrite(HDMIRX_CBUS_r_msc_s_pkt_sender_timeout_reg, 1756);//MHL CTS 6.3.10.6
  661. HDMI_RegisterWrite(HDMIRX_CBUS_r_msc_s_pkt_receiver_timeout_reg, 1756);//MHL CTS 6.3.10.6
  662. HDMI_RegisterWrite(HDMIRX_CBUS_r_msc_r_pkt_receiver_timeout_reg, 1756);//MHL CTS 6.3.10.6
  663. HDMI_RegisterWrite(HDMIRX_CBUS_r_base_timer_reg, 2400);//For 24 M CTS 6.3.6.5
  664. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_cbus_disconn_max, 0xe66);//cbus low 150us as discon //40.69ns * 0xe66 = 150us
  665. //disable auto-retry
  666. HDMI_RegisterWrite(HDMIRX_CBUS_r_rap_auto_nack_retry, 0);
  667. HDMI_RegisterWrite(HDMIRX_CBUS_r_rcp_auto_nack_retry, 0);
  668. HDMI_RegisterWrite(HDMIRX_CBUS_r_ucp_auto_nack_retry, 0);
  669. //Set Min and Max discover pulse width unit
  670. //HDMI_RegisterWrite(HDMIRX_CBUS_cfg_discv_width_min, 1680);//IC default 1720
  671. //HDMI_RegisterWrite(HDMIRX_CBUS_cfg_discv_width_max, 3250);//IC default 3250
  672. return(success);
  673. }
  674. //------------------------------------------------------------------------------
  675. // Function: CbusDrvProcessInterrupts
  676. // Description: Check CBUS registers for a CBUS event
  677. //------------------------------------------------------------------------------
  678. void CbusDrvProcessInterrupts(void)
  679. {
  680. UINT32 CbusTransIntStatus, CbusLinkIntStatus;
  681. //UINT8 writeBurstLen;
  682. UINT8 bTmpData = 0;
  683. CbusDrvInstanceData_t *pDrvCbus;
  684. pDrvCbus = &cbusDrvInstance;
  685. // Read CBUS interrupt status. Return if nothing happening on the interrupt front
  686. CbusTransIntStatus = HDMI_RegisterRead(HDMIRX_CBUS_r_intr_status1);
  687. CbusLinkIntStatus = HDMI_RegisterRead(CBUS_LINK_8034_DW_8034);
  688. CbusLinkIntStatus = CbusLinkIntStatus & 0xFF;
  689. CbusLinkIntStatus = CbusLinkIntStatus | (HDMI_RegisterRead(HDMIRX_CBUS_cfg_src_disconnected_int_p) << 8);
  690. // An interrupt occurred, save the status.
  691. pDrvCbus->CBUS_TRANS_INT_STATUS = CbusTransIntStatus;
  692. pDrvCbus->CBUS_LINK_INT_STATUS = CbusLinkIntStatus;
  693. pDrvCbus->statusFlags |= CBUS_INT ;
  694. //mhldbg("HDMI_RegisterRead(CBUS_LINK_8034_DW_8034) = 0x%08x \n",HDMI_RegisterRead(CBUS_LINK_8034_DW_8034));
  695. //mhldbg("HDMI_RegisterRead(HDMIRX_CBUS_cfg_src_disconnected_int_p) = 0x%08x \n",HDMI_RegisterRead(HDMIRX_CBUS_cfg_src_disconnected_int_p));
  696. if(CbusTransIntStatus)
  697. {
  698. /***********************************************
  699. * Interrupts of reciving command from Src
  700. ************************************************/
  701. // Get any VS or MSC data received
  702. if(CbusTransIntStatus & rcp_act_intr)
  703. {
  704. mhldbg("[INT] rcp_act_intr\n");
  705. //pDrvCbus->MSCSubCmd = MHL_MSC_MSG_RCP;
  706. //pDrvCbus->RCP_ACT_NUM = 0;
  707. while(HDMI_RegisterRead(HDMIRX_CBUS_r_rcp_act_num) > 0)
  708. {
  709. //pDrvCbus->RCP_ACT_CODE = HDMI_RegisterRead(HDMIRX_CBUS_r_rcp_act_code);
  710. //if(pDrvCbus->RCP_ACT_NUM == MHL_MSC_SUB_CMD_MAX_SIZE)
  711. bTmpData = HDMI_RegisterRead(HDMIRX_CBUS_r_rcp_act_code);
  712. mhldbg("recv RCP 0x%x size:%d\n", bTmpData, HDMI_RegisterRead(HDMIRX_CBUS_r_rcp_act_num));
  713. if(CbusDrvMSCSubDataInsert(MHL_MSC_MSG_RCP, bTmpData) == FALSE)
  714. {
  715. #if 0 //drop received mssages when MSCSubData stack full
  716. mhldbg("druop received RCP 0x%x\n", HDMI_RegisterRead(HDMIRX_CBUS_r_rcp_act_code));
  717. HDMI_RegisterWrite(HDMIRX_CBUS_r_rcp_act_ack, 1);
  718. #else
  719. mhldbg("ERR! recv RCP Full or Locked\n");
  720. break; //MSCSubData size is full, process remain message later
  721. #endif
  722. }
  723. else
  724. {
  725. HDMI_RegisterWrite(HDMIRX_CBUS_r_rcp_act_ack, 1); //send RCPK
  726. }
  727. }
  728. if(HDMI_RegisterRead(HDMIRX_CBUS_r_rcp_act_num) == 0)
  729. HDMI_RegisterWrite(HDMIRX_CBUS_r_rcp_act_intr, 1); //Clear HW interrupt flag
  730. }
  731. if(CbusTransIntStatus & rap_act_intr)
  732. {
  733. mhldbg("[INT] rap_act_intr\n");
  734. bTmpData = HDMI_RegisterRead(HDMIRX_CBUS_r_rap_act_code);
  735. mhldbg("recv RAP 0x%x\n", bTmpData);
  736. if(CbusDrvMSCSubDataInsert(MHL_MSC_MSG_RAP, bTmpData) == FALSE)
  737. {
  738. mhldbg("ERR! recv RAP Full or Locked\n");
  739. }
  740. else
  741. {
  742. HDMI_RegisterWrite(HDMIRX_CBUS_r_rap_act_intr, 1); //Clear HW interrupt flag
  743. }
  744. }
  745. if(CbusTransIntStatus & ucp_act_intr)
  746. {
  747. mhldbg("[INT] ucp_act_intr\n");
  748. while(HDMI_RegisterRead(HDMIRX_CBUS_r_ucp_act_num) > 0)
  749. {
  750. if(pDrvCbus->stMscSubCmd_R.bSize == MHL_MSC_SUB_CMD_MAX_SIZE)
  751. {
  752. #if 0 //drop received mssages when MSCSubData stack full
  753. mhldbg("druop received UCP 0x%x\n", HDMI_RegisterRead(HDMIRX_CBUS_r_ucp_act_code));
  754. HDMI_RegisterWrite(HDMIRX_CBUS_r_ucp_act_ack, 1);
  755. #else
  756. break; //MSCSubData size is full, handle remain message later
  757. #endif
  758. }
  759. else
  760. {
  761. pDrvCbus->stMscSubCmd_R.bEndIndex = (pDrvCbus->stMscSubCmd_R.bEndIndex + 1) %MHL_MSC_SUB_CMD_MAX_SIZE;
  762. pDrvCbus->stMscSubCmd_R.bCmdType[pDrvCbus->stMscSubCmd_R.bEndIndex] = MHL_MSC_MSG_UCP;
  763. pDrvCbus->stMscSubCmd_R.bData[pDrvCbus->stMscSubCmd_R.bEndIndex] = HDMI_RegisterRead(HDMIRX_CBUS_r_ucp_act_code);
  764. HDMI_RegisterWrite(HDMIRX_CBUS_r_ucp_act_ack, 1);
  765. pDrvCbus->stMscSubCmd_R.bSize++;
  766. }
  767. }
  768. if(HDMI_RegisterRead(HDMIRX_CBUS_r_ucp_act_num) == 0)
  769. HDMI_RegisterWrite(HDMIRX_CBUS_r_ucp_act_intr, 1); //Clear HW interrupt flag
  770. }
  771. //Peer's Device Capability ready
  772. if(CbusTransIntStatus & connected_rdy_intr)
  773. {
  774. mhldbg("[INT] connected_rdy_intr\n");
  775. pDrvCbus->statusFlags |= CBUS_DCAP_RDY_RECEIVED_FM_PEER;
  776. HDMI_RegisterWrite(HDMIRX_CBUS_r_connected_rdy_intr, 1);//Clear HW interrupt flag
  777. }
  778. //Peer's change link mode
  779. if(CbusTransIntStatus & link_mode_intr)
  780. {
  781. mhldbg("[INT] link_mode_intr status:0x%x\n", HDMI_RegisterRead(HDMIRX_CBUS_r_link_mode_status));
  782. if((HDMI_RegisterRead(HDMIRX_CBUS_r_link_mode_status) & 0x08) != 0)
  783. pDrvCbus->SrcPathEn = TRUE;
  784. else
  785. pDrvCbus->SrcPathEn = FALSE;
  786. HDMI_RegisterWrite(HDMIRX_CBUS_r_link_mode_intr, 1);//Clear HW interrupt flag
  787. #ifdef CONFIG_HDMI_MHL_PORT
  788. if( (DrvHDMIPortSelectBitsGet()==CONFIG_HDMI_MHL_PORT) &&
  789. (0 == HDMI_RegisterRead(HDMIRX_ref_freq_cnt)))
  790. {
  791. mhldbg("set HDMIRX_PDACJ_CK\n");
  792. HDMI_RegisterWrite(HDMIRX_PDACJ_CK, 0);//For CTS Nosiglal issue
  793. HDMI_DelayMs(2);
  794. HDMI_RegisterWrite(HDMIRX_PDACJ_CK, 1);
  795. }
  796. #endif
  797. }
  798. //Peer changed our device scratchpad
  799. if(CbusTransIntStatus & dscr_chg_intr)
  800. {
  801. mhldbg("[INT] dscr_chg_intr\n");
  802. pDrvCbus->statusFlags |= CBUS_SCRATCHPAD_WRITTEN_BY_PEER;
  803. HDMI_RegisterWrite(HDMIRX_CBUS_r_dscr_chg_intr, 1);//Clear HW interrupt flag
  804. }
  805. //Peer's Device Capability changed
  806. if(CbusTransIntStatus & dcap_chg_intr)
  807. {
  808. mhldbg("[INT] dcap_chg_intr\n");
  809. pDrvCbus->statusFlags |= CBUS_DCAP_CHG_RECEIVED_FM_PEER;
  810. HDMI_RegisterWrite(HDMIRX_CBUS_r_dcap_chg_intr, 1);//Clear HW interrupt flag
  811. }
  812. //Peer sends Request-to-Write
  813. if(CbusTransIntStatus & req_wrt_intr)
  814. {
  815. mhldbg("[INT] req_wrt_intr\n");
  816. pDrvCbus->statusFlags |= CBUS_REQ_WRT_RECEIVED_FM_PEER;
  817. HDMI_RegisterWrite(HDMIRX_CBUS_r_req_wrt_intr, 1);//Clear HW interrupt flag
  818. }
  819. //Peer sends Grant-to-Write
  820. if(CbusTransIntStatus & grt_wrt_intr)
  821. {
  822. mhldbg("[INT] grt_wrt_intr\n");
  823. pDrvCbus->statusFlags |= CBUS_GRT_WRT_RECEIVED_FM_PEER;
  824. HDMI_RegisterWrite(HDMIRX_CBUS_r_grt_wrt_intr, 1);//Clear HW interrupt flag
  825. }
  826. //Peer request for 3D information
  827. if(CbusTransIntStatus & req_3d_intr)
  828. {
  829. mhldbg("[INT] req_3d_intr\n");
  830. pDrvCbus->statusFlags |= CBUS_3D_REQ_RECEIVED_FM_PEER;
  831. HDMI_RegisterWrite(HDMIRX_CBUS_r_req_3d_intr, 1);//Clear HW interrupt flag
  832. }
  833. /***********************************************
  834. * Interrupts of sending command to Src
  835. ************************************************/
  836. //TX
  837. if(CbusTransIntStatus & rcp_cmd_intr)
  838. {
  839. mhldbg("[INT] rcp_cmd_intr code:0x%x\n", HDMI_RegisterRead(HDMIRX_CBUS_r_rcp_cmd_code));
  840. pDrvCbus->MscFailReason = HDMI_RegisterRead(HDMIRX_CBUS_r_rcp_cmd_fail_reg);
  841. if(pDrvCbus->MscFailReason & 0x01)// [0]rcp_cmd_fail
  842. {
  843. mhldbg("[INT] rcp_cmd_intr FAIL\n");
  844. }
  845. if(pDrvCbus->MscFailReason & 0x02)//[1] rcp_cmd_ineffect_code
  846. {
  847. mhldbg("[INT] rcp_cmd_intr INEFFECT CODE\n");
  848. pDrvCbus->statusFlags |= CBUS_INEFFECT_CODE_RECEIVED_FM_PEER;
  849. }
  850. if(pDrvCbus->MscFailReason & 0x04)//[2] msc_s_nack_event
  851. {
  852. mhldbg("[INT] rcp_cmd_intr ABORT\n");
  853. pDrvCbus->statusFlags |= CBUS_ABORT_RECEIVED_FM_PEER;
  854. }
  855. if(pDrvCbus->MscFailReason & 0x08)//[3] msc_s_nack_event
  856. {
  857. mhldbg("[INT] rcp_cmd_intr NACK\n");
  858. pDrvCbus->statusFlags |= CBUS_NACK_RECEIVED_FM_PEER;
  859. }
  860. if(pDrvCbus->MscFailReason!=0)
  861. {
  862. pDrvCbus->RCPE_STATUS_CODE = HDMI_RegisterRead(HDMIRX_CBUS_r_rcp_cmd_rcpe_statuscode_from_src);
  863. mhldbg("[INT] rcp_cmd_intr RCPE status:0x%x\n", pDrvCbus->RCPE_STATUS_CODE);
  864. }
  865. pDrvCbus->RCPK_CMD_CODE = HDMI_RegisterRead(HDMIRX_CBUS_r_rcp_cmd_rcpk_code_from_src);
  866. mhldbg("[INT] rcp_cmd_intr RCPK:0x%x\n", pDrvCbus->RCPK_CMD_CODE);
  867. HDMI_RegisterWrite(HDMIRX_CBUS_r_rcp_cmd_intr, 1);
  868. }
  869. if(CbusTransIntStatus & ucp_cmd_intr)
  870. {
  871. mhldbg("[INT] ucp_cmd_intr code:0x%x\n", HDMI_RegisterRead(HDMIRX_CBUS_r_ucp_cmd_code));
  872. pDrvCbus->MscFailReason = HDMI_RegisterRead(HDMIRX_CBUS_r_ucp_cmd_fail_reg);
  873. if(pDrvCbus->MscFailReason & 0x01)// [0]ucp_cmd_fail
  874. {
  875. mhldbg("[INT] ucp_cmd_intr FAIL\n");
  876. }
  877. if(pDrvCbus->MscFailReason & 0x02)// [1]ucp_cmd_ineffect_code
  878. {
  879. mhldbg("[INT] ucp_cmd_intr INEFFECT CODE\n");
  880. pDrvCbus->statusFlags |= CBUS_INEFFECT_CODE_RECEIVED_FM_PEER;
  881. }
  882. if(pDrvCbus->MscFailReason & 0x04)// [2]msc_s_abort_event
  883. {
  884. mhldbg("[INT] ucp_cmd_intr ABORT\n");
  885. pDrvCbus->statusFlags |= CBUS_ABORT_RECEIVED_FM_PEER;
  886. }
  887. if(pDrvCbus->MscFailReason & 0x08)// [3]msc_s_nack_event
  888. {
  889. mhldbg("[INT] ucp_cmd_intr NACK\n");
  890. pDrvCbus->statusFlags |= CBUS_NACK_RECEIVED_FM_PEER;
  891. }
  892. if(pDrvCbus->MscFailReason!=0)
  893. {
  894. pDrvCbus->UCPE_STATUS_CODE = HDMI_RegisterRead(HDMIRX_CBUS_r_ucp_cmd_ucpe_statuscode_from_src);
  895. }
  896. pDrvCbus->UCPK_CMD_CODE = HDMI_RegisterRead(HDMIRX_CBUS_r_ucp_cmd_ucpk_code_from_src);
  897. mhldbg("[INT] ucp_cmd_intr UCPK:0x%x\n", pDrvCbus->UCPK_CMD_CODE);
  898. HDMI_RegisterWrite(HDMIRX_CBUS_r_ucp_cmd_intr, 1);//Clear HW interrupt flag
  899. }
  900. if(CbusTransIntStatus & rap_cmd_intr)
  901. {
  902. mhldbg("[INT] rap_cmd_intr code:0x%x\n", HDMI_RegisterRead(HDMIRX_CBUS_r_rap_cmd_code));
  903. pDrvCbus->MscFailReason = HDMI_RegisterRead(HDMIRX_CBUS_r_rap_cmd_fail_reg);
  904. if(pDrvCbus->MscFailReason & 0x01)// [0]rap_cmd_fail: no rapk, command fail
  905. {
  906. mhldbg("[INT] rap_cmd_intr no rapk, command fail\n");
  907. }
  908. if(pDrvCbus->MscFailReason & 0x02)// [1]msc_s_abort_event
  909. {
  910. mhldbg("[INT] rap_cmd_intr ABORT\n");
  911. pDrvCbus->statusFlags |= CBUS_ABORT_RECEIVED_FM_PEER;
  912. }
  913. if(pDrvCbus->MscFailReason & 0x04)// [2]msc_s_nack_event
  914. {
  915. mhldbg("[INT] rap_cmd_intr NACK\n");
  916. pDrvCbus->statusFlags |= CBUS_NACK_RECEIVED_FM_PEER;
  917. }
  918. pDrvCbus->RAPK_CMD_CODE = HDMI_RegisterRead(HDMIRX_CBUS_r_rap_cmd_rapk);
  919. HDMI_RegisterWrite(HDMIRX_CBUS_r_rap_cmd_intr, 1);//Clear HW interrupt flag
  920. }
  921. if(CbusTransIntStatus & rap_act_ack_intr)
  922. {
  923. mhldbg("[INT] rap_act_ack_intr code:0x%x\n", HDMI_RegisterRead(HDMIRX_CBUS_r_rap_act_code));
  924. pDrvCbus->MscFailReason = HDMI_RegisterRead(HDMIRX_CBUS_r_rap_act_ack_fail_reg);
  925. if(pDrvCbus->MscFailReason & 0x01)// [0]rap_act_ack_fail
  926. {
  927. mhldbg("[INT] rap_act_ack_intr FAIL\n");
  928. }
  929. if(pDrvCbus->MscFailReason & 0x02)// [1]msc_s_abort_event
  930. {
  931. mhldbg("[INT] rap_act_ack_intr ABORT\n");
  932. pDrvCbus->statusFlags |= CBUS_ABORT_RECEIVED_FM_PEER;
  933. }
  934. if(pDrvCbus->MscFailReason & 0x04)// [2]msc_s_nack_event
  935. {
  936. mhldbg("[INT] rap_act_ack_intr NACK\n");
  937. pDrvCbus->statusFlags |= CBUS_NACK_RECEIVED_FM_PEER;
  938. }
  939. HDMI_RegisterWrite(HDMIRX_CBUS_r_rap_act_ack_intr, 1);//Clear HW interrupt flag
  940. }
  941. if(CbusTransIntStatus & wrt_burst_intr)
  942. {
  943. mhldbg("[INT] wrt_burst_intr\n");
  944. pDrvCbus->MscFailReason = HDMI_RegisterRead(HDMIRX_CBUS_r_wrt_burst_fail_reg);
  945. if(pDrvCbus->MscFailReason & 0x01)// [0]wrt_burst_fail
  946. {
  947. mhldbg("[INT] wrt_burst_intr FAIL\n");
  948. }
  949. if(pDrvCbus->MscFailReason & 0x02)// [1]wrt_burst_offset_invalid
  950. {
  951. mhldbg("[INT] wrt_burst_intr OFFSET INVALID\n");
  952. }
  953. if(pDrvCbus->MscFailReason & 0x04)// [2]msc_s_abort_event
  954. {
  955. mhldbg("[INT] wrt_burst_intr ABORT\n");
  956. pDrvCbus->statusFlags |= CBUS_ABORT_RECEIVED_FM_PEER;
  957. }
  958. if(pDrvCbus->MscFailReason & 0x08)// [3]msc_s_nack_event
  959. {
  960. mhldbg("[INT] wrt_burst_intr NACK\n");
  961. pDrvCbus->statusFlags |= CBUS_NACK_RECEIVED_FM_PEER;
  962. }
  963. if(pDrvCbus->MscFailReason == 0)
  964. pDrvCbus->statusFlags |= CBUS_WRT_BURST_ACK_RECEIVED_FM_PEER;
  965. HDMI_RegisterWrite(HDMIRX_CBUS_r_wrt_burst_intr, 1);//Clear HW interrupt flag
  966. }
  967. if(CbusTransIntStatus & set_hpd_intr)
  968. {
  969. mhldbg("[INT] set_hpd_intr\n");
  970. pDrvCbus->MscFailReason = HDMI_RegisterRead(HDMIRX_CBUS_r_set_hpd_fail_reg);
  971. if(pDrvCbus->MscFailReason & 0x01)// [0]set_hpd_fail
  972. {
  973. mhldbg("[INT] set_hpd_intr FAIL\n");
  974. }
  975. if(pDrvCbus->MscFailReason & 0x02)// [1]msc_s_abort_event
  976. {
  977. mhldbg("[INT] set_hpd_intr ABORT\n");
  978. }
  979. if(pDrvCbus->MscFailReason & 0x04)// [2]msc_s_nack_event
  980. {
  981. mhldbg("[INT] set_hpd_intr NACK\n");
  982. pDrvCbus->statusFlags |= CBUS_NACK_RECEIVED_FM_PEER;
  983. }
  984. HDMI_RegisterWrite(HDMIRX_CBUS_r_set_hpd_intr, 1);//Clear HW interrupt flag
  985. }
  986. if(CbusTransIntStatus & clr_hpd_intr)
  987. {
  988. mhldbg("[INT] clr_hpd_intr\n");
  989. pDrvCbus->MscFailReason = HDMI_RegisterRead(HDMIRX_CBUS_r_clr_hpd_fail_reg);
  990. if(pDrvCbus->MscFailReason & 0x01)// [0]clr_hpd_fail
  991. {
  992. mhldbg("[INT] clr_hpd_intr FAIL\n");
  993. }
  994. if(pDrvCbus->MscFailReason & 0x02)// [1]msc_s_abort_event
  995. {
  996. mhldbg("[INT] clr_hpd_intr ABORT\n");
  997. pDrvCbus->statusFlags |= CBUS_ABORT_RECEIVED_FM_PEER;
  998. }
  999. if(pDrvCbus->MscFailReason & 0x04)// [2]msc_s_nack_event
  1000. {
  1001. mhldbg("[INT] clr_hpd_intr NACK\n");
  1002. pDrvCbus->statusFlags |= CBUS_NACK_RECEIVED_FM_PEER;
  1003. }
  1004. HDMI_RegisterWrite(HDMIRX_CBUS_r_clr_hpd_intr, 1);//Clear HW interrupt flag
  1005. }
  1006. if(CbusTransIntStatus & wrt_stat_intr)
  1007. {
  1008. pDrvCbus->AckWrtStatOffset = HDMI_RegisterRead(HDMIRX_CBUS_r_wrt_stat_offset_i);
  1009. pDrvCbus->AckWrtStatData = HDMI_RegisterRead(HDMIRX_CBUS_r_wrt_stat_din);
  1010. mhldbg("[INT] wrt_stat_intr offset:0x%x data:0x%x\n", pDrvCbus->AckWrtStatOffset, pDrvCbus->AckWrtStatData);
  1011. pDrvCbus->MscFailReason = HDMI_RegisterRead(HDMIRX_CBUS_r_wrt_stat_fail_reg);
  1012. if(pDrvCbus->MscFailReason & 0x01)// [0]wrt_stat_fail
  1013. {
  1014. mhldbg("[INT] wrt_stat_intr FAIL\n");
  1015. }
  1016. if(pDrvCbus->MscFailReason & 0x02)// [1]wrt_stat_offset_invalid
  1017. {
  1018. mhldbg("[INT] wrt_stat_intr OFFSET INVALID\n");
  1019. }
  1020. if(pDrvCbus->MscFailReason & 0x04)// [2]msc_s_abort_event
  1021. {
  1022. mhldbg("[INT] wrt_stat_intr ABORT\n");
  1023. pDrvCbus->statusFlags |= CBUS_ABORT_RECEIVED_FM_PEER;
  1024. }
  1025. if(pDrvCbus->MscFailReason & 0x08)// [3]msc_s_nack_event
  1026. {
  1027. mhldbg("[INT] wrt_stat_intr NACK\n");
  1028. pDrvCbus->statusFlags |= CBUS_NACK_RECEIVED_FM_PEER;
  1029. }
  1030. if(pDrvCbus->MscFailReason == 0x0)
  1031. {
  1032. pDrvCbus->statusFlags |= CBUS_WRT_STATE_ACK_RECEIVED_FM_PEER;
  1033. }
  1034. HDMI_RegisterWrite(HDMIRX_CBUS_r_wrt_stat_intr, 1);//Clear HW interrupt flag
  1035. }
  1036. if(CbusTransIntStatus & get_state_intr)
  1037. {
  1038. mhldbg("[INT] get_state_intr data:0x%x\n", HDMI_RegisterRead(HDMIRX_CBUS_r_get_state_data));
  1039. pDrvCbus->MscFailReason= HDMI_RegisterRead(HDMIRX_CBUS_r_get_state_fail_reg);
  1040. if(pDrvCbus->MscFailReason & 0x01)// [0]get_state_fail
  1041. {
  1042. mhldbg("[INT] get_state_intr FAIL\n");
  1043. }
  1044. if(pDrvCbus->MscFailReason & 0x02)// [1]msc_s_abort_event
  1045. {
  1046. mhldbg("[INT] get_state_intr ABORT\n");
  1047. pDrvCbus->statusFlags |= CBUS_ABORT_RECEIVED_FM_PEER;
  1048. }
  1049. if(pDrvCbus->MscFailReason & 0x04)// [2]msc_s_nack_event
  1050. {
  1051. mhldbg("[INT] get_state_intr NACK\n");
  1052. pDrvCbus->statusFlags |= CBUS_NACK_RECEIVED_FM_PEER;
  1053. }
  1054. HDMI_RegisterWrite(HDMIRX_CBUS_r_get_state_intr, 1);
  1055. }
  1056. if(CbusTransIntStatus & get_ven_id_intr)
  1057. {
  1058. mhldbg("[INT] get_ven_id_intr data:0x%x\n", HDMI_RegisterRead(HDMIRX_CBUS_r_get_ven_id_data));
  1059. pDrvCbus->MscFailReason= HDMI_RegisterRead(HDMIRX_CBUS_r_get_ven_id_fail_reg);
  1060. if(pDrvCbus->MscFailReason & 0x01)// [0]get_ven_id_fail
  1061. {
  1062. mhldbg("[INT] get_state_intr FAIL\n");
  1063. }
  1064. if(pDrvCbus->MscFailReason & 0x02)// [1]msc_s_abort_event
  1065. {
  1066. mhldbg("[INT] get_state_intr ABORT\n");
  1067. pDrvCbus->statusFlags |= CBUS_ABORT_RECEIVED_FM_PEER;
  1068. }
  1069. if(pDrvCbus->MscFailReason & 0x04)// [2]msc_s_nack_event
  1070. {
  1071. mhldbg("[INT] get_state_intr NACK\n");
  1072. pDrvCbus->statusFlags |= CBUS_NACK_RECEIVED_FM_PEER;
  1073. }
  1074. HDMI_RegisterWrite(HDMIRX_CBUS_r_get_ven_id_intr, 1);//Clear HW interrupt flag
  1075. }
  1076. if(CbusTransIntStatus & get_src1_err_intr)
  1077. {
  1078. mhldbg("[INT] get_src1_err_intr data:0x%x\n", HDMI_RegisterRead(HDMIRX_CBUS_r_get_src1_err_data));
  1079. pDrvCbus->MscFailReason = HDMI_RegisterRead(HDMIRX_CBUS_r_get_src1_err_fail_reg);
  1080. if(pDrvCbus->MscFailReason & 0x01)// [0]get_src1_err_fail
  1081. {
  1082. mhldbg("[INT] get_src1_err_intr FAIL\n");
  1083. }
  1084. if(pDrvCbus->MscFailReason & 0x02)// [1]msc_s_abort_event
  1085. {
  1086. mhldbg("[INT] get_src1_err_intr ABORT\n");
  1087. pDrvCbus->statusFlags |= CBUS_ABORT_RECEIVED_FM_PEER;
  1088. }
  1089. if(pDrvCbus->MscFailReason & 0x04)// [2]msc_s_nack_event
  1090. {
  1091. mhldbg("[INT] get_src1_err_intr NACK\n");
  1092. pDrvCbus->statusFlags |= CBUS_NACK_RECEIVED_FM_PEER;
  1093. }
  1094. HDMI_RegisterWrite(HDMIRX_CBUS_r_get_src1_err_intr, 1);//Clear HW interrupt flag
  1095. }
  1096. if(CbusTransIntStatus & get_src3_err_intr)
  1097. {
  1098. mhldbg("[INT] get_src3_err_intr data:0x%x\n", HDMI_RegisterRead(HDMIRX_CBUS_r_get_src3_err_data));
  1099. pDrvCbus->MscFailReason = HDMI_RegisterRead(HDMIRX_CBUS_r_get_src3_err_fail_reg);
  1100. if(pDrvCbus->MscFailReason & 0x01)// [0]get_src3_err_fail
  1101. {
  1102. mhldbg("[INT] get_src3_err_intr FAIL\n");
  1103. }
  1104. if(pDrvCbus->MscFailReason & 0x02)// [1]msc_s_abort_event
  1105. {
  1106. mhldbg("[INT] get_src3_err_intr ABORT\n");
  1107. pDrvCbus->statusFlags |= CBUS_ABORT_RECEIVED_FM_PEER;
  1108. }
  1109. if(pDrvCbus->MscFailReason & 0x04)// [2]msc_s_nack_event
  1110. {
  1111. mhldbg("[INT] get_src3_err_intr NACK\n");
  1112. pDrvCbus->statusFlags |= CBUS_NACK_RECEIVED_FM_PEER;
  1113. }
  1114. HDMI_RegisterWrite(HDMIRX_CBUS_r_get_src3_err_intr, 1);//Clear HW interrupt flag
  1115. }
  1116. if(CbusTransIntStatus & red_devc_intr)
  1117. {
  1118. pDrvCbus->bReadDevCap_Data = HDMI_RegisterRead(HDMIRX_CBUS_r_red_devc_data_reg);
  1119. pDrvCbus->bReadDevCap_Offset = HDMI_RegisterRead(HDMIRX_CBUS_r_red_devc_offset);
  1120. mhldbg("[INT] red_devc_intr offset:0x%x data:0x%x\n", pDrvCbus->bReadDevCap_Offset, pDrvCbus->bReadDevCap_Data);
  1121. pDrvCbus->MscFailReason = HDMI_RegisterRead(HDMIRX_CBUS_r_red_devc_fail_reg);
  1122. if(pDrvCbus->MscFailReason & 0x01)// [0]red_devc_fail
  1123. {
  1124. mhldbg("[INT] red_devc_intr FAIL\n");
  1125. }
  1126. if(pDrvCbus->MscFailReason & 0x02)// [1]red_devc_offset_invalid
  1127. {
  1128. mhldbg("[INT] red_devc_intr OFFSET INVALID\n");
  1129. }
  1130. if(pDrvCbus->MscFailReason & 0x04)// [2]msc_s_abort_event
  1131. {
  1132. mhldbg("[INT] red_devc_intr ABORT\n");
  1133. pDrvCbus->statusFlags |= CBUS_ABORT_RECEIVED_FM_PEER;
  1134. }
  1135. if(pDrvCbus->MscFailReason & 0x08)// [3]msc_s_nack_event
  1136. {
  1137. mhldbg("[INT] red_devc_intr NACK\n");
  1138. pDrvCbus->statusFlags |= CBUS_NACK_RECEIVED_FM_PEER;
  1139. }
  1140. HDMI_RegisterWrite(HDMIRX_CBUS_r_red_devc_intr, 1); //Clear HW interrupt flag
  1141. }
  1142. // Check for failure interrupts.
  1143. if(CbusTransIntStatus & get_ddc_err_intr)
  1144. {
  1145. mhldbg("[INT] get_ddc_err_intr data:0x%x\n", HDMI_RegisterRead(HDMIRX_CBUS_r_get_ddc_err_data));
  1146. pDrvCbus->MscFailReason = HDMI_RegisterRead(HDMIRX_CBUS_r_get_ddc_err_fail_reg);
  1147. if(pDrvCbus->MscFailReason & 0x01)// [0]get_ddc_err_fail
  1148. {
  1149. mhldbg("[INT] get_ddc_err_intr FAIL\n");
  1150. }
  1151. if(pDrvCbus->MscFailReason & 0x02)// [1]msc_s_abort_event
  1152. {
  1153. mhldbg("[INT] get_ddc_err_intr ABORT\n");
  1154. pDrvCbus->statusFlags |= CBUS_ABORT_RECEIVED_FM_PEER;
  1155. }
  1156. if(pDrvCbus->MscFailReason & 0x04)// [2]msc_s_nack_event
  1157. {
  1158. mhldbg("[INT] get_ddc_err_intr NACK\n");
  1159. pDrvCbus->statusFlags |= CBUS_NACK_RECEIVED_FM_PEER;
  1160. }
  1161. pDrvCbus->ddcAbortReason = HDMI_RegisterRead(HDMIRX_CBUS_r_get_ddc_err_data);
  1162. mhldbg("[INT] get_ddc_err_intr data:0x%x\n", pDrvCbus->ddcAbortReason);
  1163. HDMI_RegisterWrite(HDMIRX_CBUS_r_get_ddc_err_intr, 1);//Clear HW interrupt flag
  1164. }
  1165. if(CbusTransIntStatus & get_msc_err_intr)
  1166. {
  1167. mhldbg("[INT] get_msc_err_intr data:0x%x\n", HDMI_RegisterRead(HDMIRX_CBUS_r_get_msc_err_data));
  1168. pDrvCbus->MscFailReason = HDMI_RegisterRead(HDMIRX_CBUS_r_get_msc_err_fail_reg);
  1169. if(pDrvCbus->MscFailReason & 0x01)// [0]get_msc_err_fail
  1170. {
  1171. mhldbg("[INT] get_msc_err_intr FAIL\n");
  1172. }
  1173. if(pDrvCbus->MscFailReason & 0x02)// [1]msc_s_abort_event
  1174. {
  1175. mhldbg("[INT] get_msc_err_intr ABORT\n");
  1176. pDrvCbus->statusFlags |= CBUS_ABORT_RECEIVED_FM_PEER;
  1177. }
  1178. if(pDrvCbus->MscFailReason & 0x04)// [2]msc_s_nack_event
  1179. {
  1180. mhldbg("[INT] get_msc_err_intr NACK\n");
  1181. pDrvCbus->statusFlags |= CBUS_NACK_RECEIVED_FM_PEER;
  1182. }
  1183. pDrvCbus->MscAbortReason = HDMI_RegisterRead(HDMIRX_CBUS_r_get_msc_err_data);
  1184. HDMI_RegisterWrite(HDMIRX_CBUS_r_get_msc_err_intr, 1);//Clear HW interrupt flag
  1185. }
  1186. }
  1187. if(CbusLinkIntStatus)
  1188. {
  1189. pDrvCbus->statusFlags |= CBUS_LINK_INT;
  1190. if(CbusLinkIntStatus & src_discon_intr)
  1191. {
  1192. #ifdef CONFIG_HDMI_MHL_PORT
  1193. //mhldbg("[INT] src_discon_intr (CTRLI_303_272__DW_001C) = %x\n", HDMI_RegisterRead(CTRLI_303_272__DW_001C));
  1194. HDMI_RegisterWrite(CTRLI_303_272__DW_001C,HDMI_RegisterRead(CTRLI_303_272__DW_001C)&0xffffc0ff);// disable rx sense
  1195. //mhldbg("[INT] src_discon_intr (CTRLI_303_272__DW_001C) = %x\n", HDMI_RegisterRead(CTRLI_303_272__DW_001C));
  1196. #endif
  1197. mhldbg("[INT] src_discon_intr\n");
  1198. pDrvCbus->Connected = FALSE;
  1199. pDrvCbus->statusFlags |= CBUS_SRC_DISCONT_INT;
  1200. HDMI_RegisterWrite(HDMIRX_CBUS_cfg_src_disconnected_int_p, 1);//Clear HW interrupt flag
  1201. }
  1202. // CBUS_attach status changed?
  1203. if(CbusLinkIntStatus & attach_intr)//[3]HDMIRX_CBUS_attach_int__p
  1204. {
  1205. mhldbg("[INT] attach_intr\n");
  1206. pDrvCbus->Connected = FALSE;
  1207. pDrvCbus->CableAttach = TRUE;
  1208. pDrvCbus->statusFlags |= CBUS_ATTACH_INT;
  1209. HDMI_RegisterWrite(HDMIRX_CBUS_attach_int__p, 1);//Clear HW interrupt flag
  1210. }
  1211. if(CbusLinkIntStatus & wake_int)//[0]HDMIRX_CBUS_wake_int_p
  1212. {
  1213. mhldbg("[INT] wake_int\n");
  1214. pDrvCbus->statusFlags |= CBUS_WAKE_INT;
  1215. HDMI_RegisterWrite(HDMIRX_CBUS_wake_int_p, 1);//Clear HW interrupt flag
  1216. }
  1217. if(CbusLinkIntStatus & discv_intr)//[1]HDMIRX_CBUS_discv_int__p
  1218. {
  1219. mhldbg("[INT] discv_intr\n");
  1220. pDrvCbus->Connected = TRUE;
  1221. pDrvCbus->statusFlags |= CBUS_DISCV_INT;
  1222. HDMI_RegisterWrite(HDMIRX_CBUS_discv_int__p, 1);//Clear HW interrupt flag
  1223. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_0_reg_ctl, 0x0);
  1224. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_1_reg_ctl, 0x0);
  1225. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_2_reg_ctl, 0x0);
  1226. HDMI_RegisterWrite(HDMIRX_RTT_CMCTL_3_reg_ctl, 0x1);
  1227. }
  1228. // Bus status changed?
  1229. if(CbusLinkIntStatus & connt_intr)//[2]HDMIRX_CBUS_connt_int__p
  1230. {
  1231. mhldbg("[INT] connt_intr\n");
  1232. pDrvCbus->Connected = TRUE;
  1233. pDrvCbus->statusFlags |= CBUS_CONNT_INT;
  1234. HDMI_RegisterWrite(HDMIRX_CBUS_connt_int__p, 1);//Clear HW interrupt flag
  1235. }
  1236. if(CbusLinkIntStatus & detach_intr)//[4]HDMIRX_CBUS_detach_int__p
  1237. {
  1238. mhldbg("[INT] detach_intr\n");
  1239. pDrvCbus->Connected = FALSE;
  1240. pDrvCbus->CableAttach = FALSE;
  1241. pDrvCbus->statusFlags |= CBUS_DEATCH_INT;
  1242. HDMI_RegisterWrite(HDMIRX_CBUS_detach_int__p, 1);//Clear HW interrupt flag
  1243. }
  1244. }
  1245. }
  1246. //------------------------------------------------------------------------------
  1247. // Function: CbusDrvSetSupportRcpKey
  1248. // Description: Set supported RCP key
  1249. //------------------------------------------------------------------------------
  1250. void CbusDrvSetSupportRcpKey(void)
  1251. {
  1252. HDMI_RegisterWrite(HDMIRX_CBUS_r_rcp_vd_key_mapa, 0x2207);//MHL_RCP_CMD_SELECT(0x00),MHL_RCP_CMD_UP(0x01),MHL_RCP_CMD_DOWN(0x02),MHL_RCP_CMD_ROOT_MENU(0x9),MHL_RCP_CMD_EXIT(0x0D)
  1253. HDMI_RegisterWrite(HDMIRX_CBUS_r_rcp_vd_key_mapb, 0x0);
  1254. HDMI_RegisterWrite(HDMIRX_CBUS_r_rcp_vd_key_mapc, 0x0);
  1255. HDMI_RegisterWrite(HDMIRX_CBUS_r_rcp_vd_key_mapd, 0x0);
  1256. }