xref: /utopia/UTPA2-700.0.x/modules/hdmi/drv/mhl/drvMHL.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 //    Software and any modification/derivatives thereof.
18 //    No right, ownership, or interest to MStar Software and any
19 //    modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 //    supplied together with third party`s software and the use of MStar
23 //    Software may require additional licenses from third parties.
24 //    Therefore, you hereby agree it is your sole responsibility to separately
25 //    obtain any and all third party right and license necessary for your use of
26 //    such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 //    MStar`s confidential information and you agree to keep MStar`s
30 //    confidential information in strictest confidence and not disclose to any
31 //    third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35 //    without limitation, any warranties of merchantability, non-infringement of
36 //    intellectual property rights, fitness for a particular purpose, error free
37 //    and in conformity with any international standard.  You agree to waive any
38 //    claim against MStar for any loss, damage, cost or expense that you may
39 //    incur related to your use of MStar Software.
40 //    In no event shall MStar be liable for any direct, indirect, incidental or
41 //    consequential damages, including without limitation, lost of profit or
42 //    revenues, lost or damage of data, and unauthorized system use.
43 //    You agree that this Section 4 shall still apply without being affected
44 //    even if MStar Software has been modified by MStar in accordance with your
45 //    request or instruction for your use, except otherwise agreed by both
46 //    parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 //    services in relation with MStar Software to you for your use of
50 //    MStar Software in conjunction with your or your customer`s product
51 //    ("Services").
52 //    You understand and agree that, except otherwise agreed by both parties in
53 //    writing, Services are provided on an "AS IS" basis and the warranty
54 //    disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 //    or otherwise:
58 //    (a) conferring any license or right to use MStar name, trademark, service
59 //        mark, symbol or any other identification;
60 //    (b) obligating MStar or any of its affiliates to furnish any person,
61 //        including without limitation, you and your customers, any assistance
62 //        of any kind whatsoever, or any information; or
63 //    (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 //    of Taiwan, R.O.C., excluding its conflict of law rules.
67 //    Any and all dispute arising out hereof or related hereto shall be finally
68 //    settled by arbitration referred to the Chinese Arbitration Association,
69 //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 //    Rules of the Association by three (3) arbitrators appointed in accordance
71 //    with the said Rules.
72 //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73 //    be English.
74 //    The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 ///////////////////////////////////////////////////////////////////////////////////////////////////
79 ///
80 /// file    mdrv_mhl.c
81 /// @author MStar Semiconductor Inc.
82 /// @brief  MHL driver Function
83 ///////////////////////////////////////////////////////////////////////////////////////////////////
84 
85 #ifndef _DRV_MHL_C_
86 #define _DRV_MHL_C_
87 
88 //-------------------------------------------------------------------------------------------------
89 //  Include Files
90 //-------------------------------------------------------------------------------------------------
91 // Common Definition
92 #include "MsCommon.h"
93 #include "MsVersion.h"
94 #include "MsIRQ.h"
95 #include "MsOS.h"
96 #ifdef MSOS_TYPE_LINUX_KERNEL
97 #include <linux/string.h>
98 #else
99 #include <string.h>
100 #endif
101 
102 #include "utopia.h"
103 #include "utopia_dapi.h"
104 
105 #include "mdrv_mhl_st.h"
106 #include "apiMHL_private.h"
107 #include "apiMHL.h"
108 #include "halMHL.h"
109 #include "drvMHL.h"
110 
111 #include "drvSYS.h"
112 #include "drvMMIO.h"
113 
114 //-------------------------------------------------------------------------------------------------
115 //  Local Defines
116 //-------------------------------------------------------------------------------------------------
117 #if(defined(CONFIG_MLOG))
118 #include "ULog.h"
119 
120 #define MDRV_MHL_MSG_INFO(format, args...)      ULOGI("MHL", format, ##args)
121 #define MDRV_MHL_MSG_WARNING(format, args...)   ULOGW("MHL", format, ##args)
122 #define MDRV_MHL_MSG_DEBUG(format, args...)     ULOGD("MHL", format, ##args)
123 #define MDRV_MHL_MSG_ERROR(format, args...)     ULOGE("MHL", format, ##args)
124 #define MDRV_MHL_MSG_FATAL(format, args...)     ULOGF("MHL", format, ##args)
125 
126 #else
127 #define MDRV_MHL_MSG_INFO(format, args...)      printf(format, ##args)
128 #define MDRV_MHL_MSG_WARNING(format, args...)   printf(format, ##args)
129 #define MDRV_MHL_MSG_DEBUG(format, args...)     printf(format, ##args)
130 #define MDRV_MHL_MSG_ERROR(format, args...)     printf(format, ##args)
131 #define MDRV_MHL_MSG_FATAL(format, args...)     printf(format, ##args)
132 
133 #endif
134 
135 #define MHL_DEBUG_RECEIVE_MSC       0
136 #define MHL_DEBUG_TIMER_EVENT       0
137 #define MHL_DEBUG_SOURCE_INFO       0
138 #define MHL_DEBUG_BIST_MODE         0
139 #define MHL3_AUTO_EQ_ENABLE         1
140 
141 //-------------------------------------------------------------------------------------------------
142 //  Local Structures
143 //-------------------------------------------------------------------------------------------------
144 
145 //-------------------------------------------------------------------------------------------------
146 //  Global Variables
147 //-------------------------------------------------------------------------------------------------
148 
149 //-------------------------------------------------------------------------------------------------
150 //  Local Variables
151 //-------------------------------------------------------------------------------------------------
152 #if(MHL_USE_UTOPIA_VERSION == MHL_UTOPIA_VERSION_10)
153 MHL_RESOURCE_PRIVATE stMHLResourcePrivate;
154 
155 #endif
156 
157 //-------------------------------------------------------------------------------------------------
158 //  Local Functions
159 //-------------------------------------------------------------------------------------------------
160 
161 //**************************************************************************
162 //  [Function Name]:
163 //                   _mdrv_mhl_InitRiuBase()
164 //  [Description]
165 //
166 //  [Arguments]:
167 //
168 //  [Return]:
169 //
170 //**************************************************************************
_mdrv_mhl_InitRiuBase(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)171 MS_BOOL _mdrv_mhl_InitRiuBase(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
172 {
173     MS_BOOL bGetBaseFlag = FALSE;
174     MS_VIRT ulRiuBaseAddress = 0;
175     MS_VIRT ulPMRiuBaseAddress = 0;
176     MS_PHY ulNonPMBankSize = 0;
177     MS_PHY ulPMBankSize = 0;
178 
179     // get MMIO base
180     if(!MDrv_MMIO_GetBASE(&ulRiuBaseAddress, &ulNonPMBankSize, MS_MODULE_XC))
181     {
182         MDRV_MHL_MSG_ERROR("** MHL get XC base failed\n");
183     }
184     else if(!MDrv_MMIO_GetBASE(&ulPMRiuBaseAddress, &ulPMBankSize, MS_MODULE_PM))
185     {
186         MDRV_MHL_MSG_ERROR("** MHL get PM base failed\n");
187     }
188     else
189     {
190         pMHLResourcePrivate->ulRiuBaseAddress = ulRiuBaseAddress;
191         pMHLResourcePrivate->ulPMRiuBaseAddress = ulPMRiuBaseAddress;
192 
193         mhal_mhl_SetRegisterBaseAddress(pMHLResourcePrivate->ulRiuBaseAddress, pMHLResourcePrivate->ulPMRiuBaseAddress);
194 
195         bGetBaseFlag = TRUE;
196     }
197 
198     return bGetBaseFlag;
199 }
200 
201 //**************************************************************************
202 //  [Function Name]:
203 //                  _mdrv_mhl_ClearCbusFlag
204 //  [Description]
205 //
206 //  [Arguments]:
207 //
208 //  [Return]:
209 //
210 //**************************************************************************
_mdrv_mhl_ClearCbusFlag(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 ucSelect)211 void _mdrv_mhl_ClearCbusFlag(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 ucSelect)
212 {
213     MS_U8 uctemp = 0;
214 
215     switch(ucSelect)
216     {
217         case MHL_CLEAR_INITIAL_FLAG:
218             pMHLResourcePrivate->ulSystemIndex = 0;
219             pMHLResourcePrivate->ulCurrentTimerTick = (MsOS_GetSystemTime()) %CBUS_TIMER_CONTROL_MASK;
220             pMHLResourcePrivate->uc3DTotalEntryDTD = 0;
221             pMHLResourcePrivate->uc3DTotalEntryVIC = 0;
222             pMHLResourcePrivate->ucBISTModeState = MHL_CBUS_BIST_NONE;
223             pMHLResourcePrivate->ucCallBackFunctionIndex = 0;
224             pMHLResourcePrivate->slMHLPollingTaskID = -1;
225             pMHLResourcePrivate->usPrePowerState = 0;
226             pMHLResourcePrivate->ucHighEndVICTotalEntry = 0;
227             pMHLResourcePrivate->stSignalStatusInfo.ucImpedanceValue = MHL_IMPEDANCE_VALUE;
228             pMHLResourcePrivate->stSignalStatusInfo.ucImpedanceOffset = MHL_IMPEDANCE_VALUE;
229             pMHLResourcePrivate->stSignalStatusInfo.ucIControlValue = 0;
230 
231             for(uctemp = 0; uctemp <MHL_3D_VIC_INFORMATION_LENGTH; uctemp++)
232             {
233                 if(uctemp < MHL_3D_DTD_INFORMATION_LENGTH)
234                 {
235                     pMHLResourcePrivate->uc3DInformationDTD[uctemp] = 0;
236                 }
237 
238                 if(uctemp < MHL_3D_VIC_INFORMATION_LENGTH)
239                 {
240                     pMHLResourcePrivate->uc3DInformationVIC[uctemp] = 0;
241                 }
242 
243                 if(uctemp < MHL_HEV_VIC_INFORMATION_LENGTH)
244                 {
245                     pMHLResourcePrivate->usHighEndVICTable[uctemp] = 0;
246                 }
247 
248                 if(uctemp < MHL_AUDIO_TUNNEL_INFORMATION_LENGTH)
249                 {
250                     pMHLResourcePrivate->ulAudioTunnelTable[uctemp] = 0;
251                 }
252 
253                 if(uctemp < MHL_EMSC_SUPPORT_INFORMATION_LENGTH)
254                 {
255                     pMHLResourcePrivate->usEMSCSupportTable[uctemp] = 0;
256                 }
257             }
258 
259             //pMHLResourcePrivate->usHighEndVICTable[0] = MHL_HEV_VIC_INDEX0;
260             //pMHLResourcePrivate->usHighEndVICTable[1] = MHL_HEV_VIC_INDEX1;
261             //pMHLResourcePrivate->usHighEndVICTable[2] = MHL_HEV_VIC_INDEX2;
262             //pMHLResourcePrivate->usHighEndVICTable[3] = MHL_HEV_VIC_INDEX3;
263             //pMHLResourcePrivate->usHighEndVICTable[4] = MHL_HEV_VIC_INDEX4;
264             //pMHLResourcePrivate->usHighEndVICTable[5] = MHL_HEV_VIC_INDEX5;
265 
266             pMHLResourcePrivate->ulAudioTunnelTable[0] = MHL_AUDIO_TUNNEL_INDEX0;
267             pMHLResourcePrivate->ulAudioTunnelTable[1] = MHL_AUDIO_TUNNEL_INDEX1;
268             pMHLResourcePrivate->ulAudioTunnelTable[2] = MHL_AUDIO_TUNNEL_INDEX2;
269             pMHLResourcePrivate->ulAudioTunnelTable[3] = MHL_AUDIO_TUNNEL_INDEX3;
270             pMHLResourcePrivate->ulAudioTunnelTable[4] = MHL_AUDIO_TUNNEL_INDEX4;
271             pMHLResourcePrivate->ulAudioTunnelTable[5] = MHL_AUDIO_TUNNEL_INDEX5;
272 
273             pMHLResourcePrivate->usEMSCSupportTable[0] = MHL_EMSC_SUPPORT_BURST_ID0;
274             pMHLResourcePrivate->usEMSCSupportTable[1] = MHL_EMSC_SUPPORT_BURST_ID1;
275             pMHLResourcePrivate->usEMSCSupportTable[2] = MHL_EMSC_SUPPORT_BURST_ID2;
276             pMHLResourcePrivate->usEMSCSupportTable[3] = MHL_EMSC_SUPPORT_BURST_ID3;
277             pMHLResourcePrivate->usEMSCSupportTable[4] = MHL_EMSC_SUPPORT_BURST_ID4;
278             pMHLResourcePrivate->usEMSCSupportTable[5] = MHL_EMSC_SUPPORT_BURST_ID5;
279 
280             break;
281 
282         case MHL_CLEAR_CABLE_LOSS_FLAG:
283         case MHL_CLEAR_CONNECT_LOSS_FLAG:
284             pMHLResourcePrivate->ucProcDoneIndex = 0;
285             pMHLResourcePrivate->usDisplayIndex = 0;
286             pMHLResourcePrivate->ulCbusReceiveIndex = 0;
287             pMHLResourcePrivate->ulCbusSendIndex = 0;
288             pMHLResourcePrivate->ucPreRCPKeyCode = 0;
289             pMHLResourcePrivate->ulEnableIndex = 0;
290             pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_NONE;
291             pMHLResourcePrivate->ucFeatureRequestState = MHL_CBUS_FEATURE_NONE;
292             pMHLResourcePrivate->ucECbusState = MHL_ECBUS_STATE_NONE;
293             pMHLResourcePrivate->ucECbusTrainState = MHL_ECBUS_STATE_DISABLE;
294             pMHLResourcePrivate->ucWriteBurstSequence = 0;
295             pMHLResourcePrivate->usEMSCTxBufferSize = MHL_EMSC_DATA_SIZE;
296             pMHLResourcePrivate->usEMSCRxBufferSize = MHL_EMSC_DATA_SIZE;
297             pMHLResourcePrivate->ucEMSCSendStatus = MHL_EMSC_SEND_NONE;
298 
299             for(uctemp = 0; uctemp <MHL_CBUS_TOTAL_QUEUE_NUM; uctemp++)
300             {
301                 pMHLResourcePrivate->stCbusQueueInfo[uctemp].ucQueueState = MHL_QUEUE_STATE_IDLE;
302             }
303 
304             pMHLResourcePrivate->stSignalStatusInfo.bECbusEnableFlag = FALSE;
305             pMHLResourcePrivate->stSignalStatusInfo.bBISTEnableFlag = FALSE;
306             pMHLResourcePrivate->stSignalStatusInfo.bClockStableFlag = FALSE;
307             pMHLResourcePrivate->stSignalStatusInfo.bAutoEnableFlag = FALSE;
308             pMHLResourcePrivate->stSignalStatusInfo.bSignalStableFlag = FALSE;
309             pMHLResourcePrivate->stSignalStatusInfo.ucAutoEQState = MHL_AUTO_EQ_START;
310             pMHLResourcePrivate->stSignalStatusInfo.ucStableCount = 0;
311             pMHLResourcePrivate->stSignalStatusInfo.ucECbusTrainState = MHL_EMSC_SEND_NONE;
312 
313             break;
314 
315         case MHL_CLEAR_CBUS_TIME_OUT_FLAG:
316             break;
317 
318         case MHL_CLEAR_MSG_RESPONSE_FLAG:
319             break;
320 
321         default:
322 
323             break;
324     };
325 }
326 
327 //**************************************************************************
328 //  [Function Name]:
329 //                  _mdrv_mhl_CbusGetLeastFlag()
330 //  [Description]:
331 //                  MHL Cbus get the least True flag in index
332 //  [Arguments]:
333 //
334 //  [Return]:
335 //
336 //**************************************************************************
_mdrv_mhl_CbusGetLeastFlag(MS_U8 unindex)337 MS_U8 _mdrv_mhl_CbusGetLeastFlag(MS_U8 unindex)
338 {
339     MS_U8 uctemp = BIT(0);
340 
341     if(unindex == 0)
342     {
343         return unindex;
344     }
345 
346     while(!(unindex &uctemp))
347     {
348         uctemp = uctemp <<1;
349     }
350 
351     return uctemp;
352 }
353 
354 //**************************************************************************
355 //  [Function Name]:
356 //                  _mdrv_mhl_GetLeastBitNum()
357 //  [Description]:
358 //
359 //  [Arguments]:
360 //
361 //  [Return]:
362 //
363 //**************************************************************************
_mdrv_mhl_GetLeastBitNum(MS_U16 usData)364 MS_U8 _mdrv_mhl_GetLeastBitNum(MS_U16 usData)
365 {
366     MS_U8 uctemp = 0;
367 
368     while(!(usData &BIT(0)))
369     {
370         usData = usData >>1;
371         uctemp++;
372     }
373 
374     return uctemp;
375 }
376 
377 //**************************************************************************
378 //  [Function Name]:
379 //                  mdrv_mhl_CbusSetPacket(BYTE ucHeader, Bool bControl, BYTE ucContent)
380 //  [Description]
381 //                  MHL Cbus Packet setting
382 //  [Arguments]:
383 //                  ucHeader: Packet header type
384 //                  bControl: Packet control bit type
385 //                  ucContent: Packet payload
386 //  [Return]:
387 //                  Packet word for register write
388 //**************************************************************************
_mdrv_mhl_CbusSetPacket(MS_U8 ucHeader,MS_BOOL bControl,MS_U8 ucContent)389 MS_U16 _mdrv_mhl_CbusSetPacket(MS_U8 ucHeader, MS_BOOL bControl, MS_U8 ucContent)
390 {
391     MS_BOOL bParity = 0;
392     MS_U16 usPacket = (ucHeader <<9) |(bControl <<8) |ucContent;
393 
394     do
395     {
396         bParity ^= (usPacket & BIT(0));
397         usPacket = usPacket >>1;
398     }
399     while(usPacket);
400 
401     usPacket = (bParity <<11) |(ucHeader <<9) |(bControl <<8) |ucContent;
402 
403     return (usPacket |BIT(15));
404 }
405 //**************************************************************************
406 //  [Function Name]:
407 //                  _mdrv_mhl_CbusTxWriteCommand()
408 //  [Description]:
409 //                  MHL Cbus send command
410 //  [Arguments]:
411 //
412 //  [Return]:
413 //                  TRUE: Cbus command send successfully
414 //                  FALSE: Cbus command send fail
415 //**************************************************************************
_mdrv_mhl_CbusTxWriteCommand(MS_BOOL bECbusEnableFlag,stMHL_QUEUE_INFO * stCbusQueueInfo)416 MS_BOOL _mdrv_mhl_CbusTxWriteCommand(MS_BOOL bECbusEnableFlag, stMHL_QUEUE_INFO *stCbusQueueInfo)
417 {
418     MS_BOOL bIndex = TRUE;
419     MS_U8 uctemp = 0;
420     mhalCbusFifo_S pCbusFifo;
421 
422     pCbusFifo.databuf[0] = _mdrv_mhl_CbusSetPacket(MSC_HEADER, CBUS_CONTROL, stCbusQueueInfo->ucCommand);
423 
424     switch(stCbusQueueInfo->ucCommand)
425     {
426         case MSC_ACK:
427             pCbusFifo.lens = stCbusQueueInfo->ucLength;
428             //pCbusFifo.databuf[0] = _mdrv_mhl_CbusSetPacket(MSC_HEADER, CBUS_CONTROL, MSC_ACK);
429 
430             if(stCbusQueueInfo->ucLength == 2)
431             {
432                 // payload 2
433                 pCbusFifo.databuf[1] = _mdrv_mhl_CbusSetPacket(MSC_HEADER, CBUS_DATA, stCbusQueueInfo->ucData[0]);
434             }
435             break;
436 
437         case MSC_NACK:
438             pCbusFifo.lens = 1;
439             //pCbusFifo.databuf[0] = _mdrv_mhl_CbusSetPacket(MSC_HEADER, CBUS_CONTROL, MSC_NACK);
440             break;
441 
442         case MSC_ABORT:
443             pCbusFifo.lens = 1;
444             //pCbusFifo.databuf[0] = _mdrv_mhl_CbusSetPacket(MSC_HEADER, CBUS_CONTROL, MSC_ABORT);
445             break;
446 
447         case MSC_WRITE_STAT_OR_SET_INT: // 0x60
448         case MSC_WRITE_XSTAT: // 0x70
449             // payload 1
450             //pCbusFifo.databuf[0] = _mdrv_mhl_CbusSetPacket(MSC_HEADER, CBUS_CONTROL, MSC_WRITE_STAT_OR_SET_INT);
451             // payload 2
452             pCbusFifo.databuf[1] = _mdrv_mhl_CbusSetPacket(MSC_HEADER, CBUS_DATA, stCbusQueueInfo->ucData[0]);
453             // payload 3
454             pCbusFifo.databuf[2] = _mdrv_mhl_CbusSetPacket(MSC_HEADER, CBUS_DATA, stCbusQueueInfo->ucData[1]);
455             // message length
456             pCbusFifo.lens = 3;
457             break;
458 
459         case MSC_READ_DEVCAP: // 0x61
460         case MSC_READ_XDEVCAP: // 0x71
461             // payload 1
462             //pCbusFifo.databuf[0] = _mdrv_mhl_CbusSetPacket(MSC_HEADER, CBUS_CONTROL, MSC_READ_DEVCAP);
463             // payload 2
464             pCbusFifo.databuf[1] = _mdrv_mhl_CbusSetPacket(MSC_HEADER, CBUS_DATA, stCbusQueueInfo->ucData[0]);
465             // message length
466             pCbusFifo.lens = 2;
467             break;
468 
469         case MSC_GET_STATE: // 0x62
470         case MSC_GET_VENDOR_ID: // 0x63
471         case MSC_SET_HPD: // 0x64
472         case MSC_CLR_HPD: // 0x65
473         case MSC_GET_SC1_ERRORCODE: // 0x69 - Get channel 1 command error code
474         case MSC_GET_DDC_ERRORCODE: // 0x6A - Get DDC channel command error code.
475         case MSC_GET_MSC_ERRORCODE: // 0x6B - Get MSC command error code.
476         case MSC_GET_SC3_ERRORCODE: // 0x6D - Get channel 3 command error code.
477             // payload 1
478             //pCbusFifo.databuf[0] = _mdrv_mhl_CbusSetPacket(MSC_HEADER, CBUS_CONTROL, pReq->cmd);
479             // message length
480             pCbusFifo.lens = 1;
481             break;
482 
483         case MSC_MSC_MSG: // 0x68
484             // payload 1
485             //pCbusFifo.databuf[0] = _mdrv_mhl_CbusSetPacket(MSC_HEADER, CBUS_CONTROL, MSC_MSC_MSG);
486             // payload 2
487             pCbusFifo.databuf[1] = _mdrv_mhl_CbusSetPacket(MSC_HEADER, CBUS_DATA, stCbusQueueInfo->ucData[0]);
488             // payload 3
489             pCbusFifo.databuf[2] = _mdrv_mhl_CbusSetPacket(MSC_HEADER, CBUS_DATA, stCbusQueueInfo->ucData[1]);
490             // message length
491             pCbusFifo.lens = 3;
492             break;
493 
494         case MSC_WRITE_BURST: // 0x6C
495             // payload 1
496             //pCbusFifo.databuf[0] = _mdrv_mhl_CbusSetPacket(MSC_HEADER, CBUS_CONTROL, MSC_WRITE_BURST);
497             // payload 2 ~ 17
498             for(uctemp =0; uctemp <stCbusQueueInfo->ucLength; uctemp++) // offset packet + the maxi 16 packets
499             {
500                 pCbusFifo.databuf[uctemp +1] = _mdrv_mhl_CbusSetPacket(MSC_HEADER, CBUS_DATA, stCbusQueueInfo->ucData[uctemp]);
501             }
502             // EOF
503             pCbusFifo.databuf[stCbusQueueInfo->ucLength +1] = _mdrv_mhl_CbusSetPacket(MSC_HEADER, CBUS_CONTROL, MSC_EOF);
504             // message length
505             pCbusFifo.lens = stCbusQueueInfo->ucLength +2;
506             break;
507 
508         default:
509             bIndex = FALSE;
510             break;
511     }
512 
513     if(bIndex)
514     {
515         if(!mhal_mhl_CBusWrite(bECbusEnableFlag, &pCbusFifo))
516         {
517             return FALSE;
518         }
519     }
520 
521     return bIndex;
522 }
523 
524 //**************************************************************************
525 //  [Function Name]:
526 //                  _mdrv_mhl_GetFreeQueueIndex()
527 //  [Description]
528 //
529 //  [Arguments]:
530 //
531 //  [Return]:
532 //
533 //**************************************************************************
_mdrv_mhl_GetFreeQueueIndex(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)534 MS_U8 _mdrv_mhl_GetFreeQueueIndex(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
535 {
536     MS_U8 uctemp = 0;
537     MS_U8 ucQueueIndex = 0;
538 
539     for(uctemp = 0; uctemp <(MHL_CBUS_TOTAL_QUEUE_NUM -1); uctemp++)
540     {
541         ucQueueIndex = (pMHLResourcePrivate->ucCurrentQueueIndex +uctemp +1) %(MHL_CBUS_TOTAL_QUEUE_NUM -1);
542 
543         if(pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucQueueState == MHL_QUEUE_STATE_IDLE)
544         {
545             break;
546         }
547         else
548         {
549             ucQueueIndex = MHL_CBUS_TOTAL_QUEUE_NUM;
550         }
551     }
552 
553     if(ucQueueIndex < MHL_CBUS_TOTAL_QUEUE_NUM) // Have free queue
554     {
555         uctemp = (ucQueueIndex +MHL_CBUS_TOTAL_QUEUE_NUM -2) %(MHL_CBUS_TOTAL_QUEUE_NUM -1);
556 
557         if(pMHLResourcePrivate->stCbusQueueInfo[uctemp].ucQueueState == MHL_QUEUE_STATE_IDLE)
558         {
559             ucQueueIndex = uctemp;
560         }
561     }
562 
563     return ucQueueIndex;
564 }
565 
566 //**************************************************************************
567 //  [Function Name]:
568 //                  _mdrv_mhl_GetCbusQueueIndex()
569 //  [Description]:
570 //                  MHL Cbus get transmitting queue index
571 //  [Arguments]:
572 //
573 //  [Return]:
574 //
575 //**************************************************************************
_mdrv_mhl_GetCbusQueueIndex(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)576 MS_U8 _mdrv_mhl_GetCbusQueueIndex(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
577 {
578     MS_U8 uctemp = 0;
579     MS_U8 ucQueueIndex = 0;
580 
581     // Check Rx queue have packet transmit success or not
582     if(pMHLResourcePrivate->stCbusQueueInfo[MHL_CBUS_RX_QUEUE_INDEX].ucQueueState != MHL_QUEUE_STATE_IDLE)
583     {
584         ucQueueIndex = MHL_CBUS_RX_QUEUE_INDEX;
585     }
586     else // Check Tx queue have packet transmit success or not, search start  from current index
587     {
588         for(uctemp = 0; uctemp <(MHL_CBUS_TOTAL_QUEUE_NUM -1); uctemp++)
589         {
590             ucQueueIndex = (pMHLResourcePrivate->ucCurrentQueueIndex +uctemp) %(MHL_CBUS_TOTAL_QUEUE_NUM -1);
591 
592             if(pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucQueueState != MHL_QUEUE_STATE_IDLE)
593             {
594                 break;
595             }
596             else
597             {
598                 ucQueueIndex = MHL_CBUS_TOTAL_QUEUE_NUM;
599             }
600         }
601     }
602 
603     return ucQueueIndex;
604 }
605 
606 //**************************************************************************
607 //  [Function Name]:
608 //                  _mdrv_mhl_SetCbusTimerEvent()
609 //  [Description]:
610 //
611 //  [Arguments]:
612 //
613 //  [Return]:
614 //
615 //**************************************************************************
_mdrv_mhl_SetCbusTimerEvent(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 ucTimerEvent,MS_U16 usTimerTick)616 void _mdrv_mhl_SetCbusTimerEvent(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 ucTimerEvent, MS_U16 usTimerTick)
617 {
618     if(usTimerTick > 0)
619     {
620         pMHLResourcePrivate->stTimerEventInfo[ucTimerEvent].bEnableFlag = TRUE;
621 
622 #if(MHL_DEBUG_TIMER_EVENT)
623         MDRV_MHL_MSG_INFO("** MHL set timer event %d tick %d\r\n", ucTimerEvent, usTimerTick);
624 #endif
625     }
626 
627     pMHLResourcePrivate->stTimerEventInfo[ucTimerEvent].usTimerTick = usTimerTick;
628 }
629 
630 //**************************************************************************
631 //  [Function Name]:
632 //                  _mdrv_mhl_CbusRxQueueInsertMSG(BYTE subCmd, BYTE databuf)
633 //  [Description]
634 //                  MHL Cbus Reply MSC RCP or RAP into Queue
635 //  [Arguments]:
636 //                  subCmd: MSC subcommands
637 //                  databuf: command code
638 //  [Return]:
639 //                  TRUE: success
640 //                  FALSE: fail
641 //**************************************************************************
_mdrv_mhl_CbusRxQueueInsertMSG(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 ucSubCommand,MS_U8 ucKeyCode)642 void _mdrv_mhl_CbusRxQueueInsertMSG(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 ucSubCommand, MS_U8 ucKeyCode)
643 {
644     pMHLResourcePrivate->stCbusQueueInfo[MHL_CBUS_RX_QUEUE_INDEX].ucQueueState = MHL_QUEUE_STATE_PENDING;
645     pMHLResourcePrivate->stCbusQueueInfo[MHL_CBUS_RX_QUEUE_INDEX].ucLength = 2;
646     pMHLResourcePrivate->stCbusQueueInfo[MHL_CBUS_RX_QUEUE_INDEX].ucCommand = MSC_MSC_MSG;
647     pMHLResourcePrivate->stCbusQueueInfo[MHL_CBUS_RX_QUEUE_INDEX].ucData[0] = ucSubCommand;
648     pMHLResourcePrivate->stCbusQueueInfo[MHL_CBUS_RX_QUEUE_INDEX].ucData[1] = ucKeyCode;
649 }
650 
651 //**************************************************************************
652 //  [Function Name]:
653 //                  _mdrv_mhl_WriteBurstCheckSum()
654 //  [Description]
655 //
656 //  [Arguments]:
657 //
658 //  [Return]:
659 //
660 //**************************************************************************
_mdrv_mhl_WriteBurstCheckSum(MS_U8 * pData)661 MS_U8 _mdrv_mhl_WriteBurstCheckSum(MS_U8 *pData)
662 {
663     MS_U8 uctemp = 0;
664     MS_U8 ucCheckSum = 0;
665 
666     for(uctemp = 0; uctemp <MHL_MSC_SCRATCHPAD_SIZE; uctemp++)
667     {
668         ucCheckSum = ucCheckSum +pData[uctemp];
669     }
670 
671     ucCheckSum = (ucCheckSum ^0xFF) +1;
672 
673     return ucCheckSum;
674 }
675 
676 //**************************************************************************
677 //  [Function Name]:
678 //                  _mdrv_mhl_CheckSendCommand()
679 //  [Description]
680 //
681 //  [Arguments]:
682 //
683 //  [Return]:
684 //
685 //**************************************************************************
_mdrv_mhl_CheckSendCommand(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)686 MS_BOOL _mdrv_mhl_CheckSendCommand(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
687 {
688     MS_BOOL bSendCommand = FALSE;
689     MS_BOOL bMHLPort = mhal_mhl_CheckInputPort(pMHLResourcePrivate->ucMHLSupportPath);
690 
691     if(bMHLPort && mhal_mhl_CheckPIPWindow()) // MHL port and scaler mux on
692     {
693         bSendCommand = TRUE;
694     }
695     else if(GET_MHL_CHIP_FLAG(pMHLResourcePrivate->ucChipCapability, MHL_CHIP_FORCE_SEND_COMMAND_FLAG) && GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_FORCE_SEND_COMMAND_FLAG))
696     {
697         bSendCommand = TRUE;
698     }
699 
700     return bSendCommand;
701 }
702 
703 //**************************************************************************
704 //  [Function Name]:
705 //                  _mdrv_mhl_GetRAPEnableFlag()
706 //  [Description]
707 //
708 //  [Arguments]:
709 //
710 //  [Return]:
711 //
712 //**************************************************************************
_mdrv_mhl_GetRAPEnableFlag(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)713 MS_BOOL _mdrv_mhl_GetRAPEnableFlag(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
714 {
715     MS_BOOL bRAPEnable = FALSE;
716 
717     if(!mhal_mhl_CheckInputPort(pMHLResourcePrivate->ucMHLSupportPath))
718     {
719         bRAPEnable = TRUE;
720     }
721     else if(!mhal_mhl_CheckPIPWindow())
722     {
723         bRAPEnable = TRUE;
724     }
725     else if(pMHLResourcePrivate->stSignalStatusInfo.bSignalStableFlag)
726     {
727         bRAPEnable = TRUE;
728     }
729 
730     return bRAPEnable;
731 }
732 
733 //**************************************************************************
734 //  [Function Name]:
735 //                  _mdrv_mhl_CheckCbusModeChange()
736 //  [Description]
737 //
738 //  [Arguments]:
739 //
740 //  [Return]:
741 //
742 //**************************************************************************
_mdrv_mhl_CheckCbusModeChange(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)743 MS_BOOL _mdrv_mhl_CheckCbusModeChange(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
744 {
745     MS_BOOL bNotCbusChange = TRUE;
746 
747     if(pMHLResourcePrivate->ucMSGData[1] == MHL_RAP_KEY_CBUS_MODE_UP)
748     {
749         bNotCbusChange = FALSE;
750 
751         pMHLResourcePrivate->ucECbusState = MHL_ECBUS_STATE_RECEIVE_MODE_UP;
752     }
753     else if(pMHLResourcePrivate->ucMSGData[1] == MHL_RAP_KEY_CBUS_MODE_DOWN)
754     {
755         bNotCbusChange = FALSE;
756 
757         pMHLResourcePrivate->ucECbusState = MHL_ECBUS_STATE_RECEIVE_MODE_DOWN;
758     }
759 
760     return bNotCbusChange;
761 }
762 
763 //**************************************************************************
764 //  [Function Name]:
765 //                  _mdrv_mhl_DTDPresentinEDID()
766 //  [Description]
767 //
768 //  [Arguments]:
769 //
770 //  [Return]:
771 //
772 //**************************************************************************
_mdrv_mhl_DTDPresentinEDID(MS_U8 * pData)773 MS_BOOL _mdrv_mhl_DTDPresentinEDID(MS_U8 *pData)
774 {
775     MS_BOOL bPresent = FALSE;
776     MS_U8 uctemp = 0;
777 
778     for(uctemp = 0; uctemp < 3; uctemp++)
779     {
780         if(pData[uctemp] > 0)
781         {
782             bPresent = TRUE;
783 
784             break;
785         }
786     }
787 
788     return bPresent;
789 }
790 
791 //**************************************************************************
792 //  [Function Name]:
793 //                  _mdrv_mhl_GetDTD3DTimingInformation()
794 //  [Description]
795 //
796 //  [Arguments]:
797 //
798 //  [Return]:
799 //
800 //**************************************************************************
_mdrv_mhl_GetDTD3DTimingInformation(MS_U8 * pData)801 MS_U8 _mdrv_mhl_GetDTD3DTimingInformation(MS_U8 *pData)
802 {
803     MS_BOOL bInterlace = ((pData[17] &BIT(7)) ?TRUE :FALSE);
804     MS_U8 ucIndex = 0;
805     MS_U16 usHActive = ((pData[4] &BMASK(7:4)) <<4) |pData[2];
806     MS_U16 usHBlank = ((pData[4] &BMASK(3:0)) <<8) |pData[3];
807     MS_U16 usVActive = ((pData[7] &BMASK(7:4)) <<4) |pData[5];
808     MS_U16 usVBlank = ((pData[7] &BMASK(3:0)) <<8) |pData[6];
809     MS_U16 usHTotal = usHActive +usHBlank;
810     MS_U16 usVTotal = usVActive +usVBlank;
811     MS_U16 usPixelClk = (pData[1] <<8) |pData[0];
812     MS_U32 ulFrequenct = 0;
813 
814     if((usHTotal > 0) && (usVTotal > 0))
815     {
816         ulFrequenct = (usPixelClk *100 /usHTotal) *1000 /usVTotal;
817 
818         if((usHActive == 1920) && (usVActive == 1080)) // 1920x1080p
819         {
820             if((ulFrequenct > 230) && (ulFrequenct < 245)) // 24Hz
821             {
822                 ucIndex = MHL_3D_PRESENT_VIC_1920x1080p24Hz;
823             }
824         }
825         else if((usHActive == 1920) && (usVActive == 540) && bInterlace) // 1920x1080i
826         {
827             if((ulFrequenct > 590) && (ulFrequenct < 610)) // 60Hz
828             {
829                 ucIndex = MHL_3D_PRESENT_VIC_1920x1080i60Hz;
830             }
831             else if((ulFrequenct > 490) && (ulFrequenct < 510)) // 50Hz
832             {
833                 ucIndex = MHL_3D_PRESENT_VIC_1920x1080i50Hz;
834             }
835         }
836         else if((usHActive == 1280) && (usVActive == 720)) // 1280x720p
837         {
838             if((ulFrequenct > 590) && (ulFrequenct < 610)) // 60Hz
839             {
840                 ucIndex = MHL_3D_PRESENT_VIC_1280x720p60Hz;
841             }
842             else if((ulFrequenct > 490) && (ulFrequenct < 510)) // 50Hz
843             {
844                 ucIndex = MHL_3D_PRESENT_VIC_1280x720p50Hz;
845             }
846         }
847     }
848 
849     return ucIndex;
850 }
851 
852 //**************************************************************************
853 //  [Function Name]:
854 //                  _mdrv_mhl_InsertDTD3DInformation()
855 //  [Description]
856 //
857 //  [Arguments]:
858 //
859 //  [Return]:
860 //
861 //**************************************************************************
_mdrv_mhl_InsertDTD3DInformation(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 ucIndex,MS_U8 ucData)862 MS_U8 _mdrv_mhl_InsertDTD3DInformation(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 ucIndex, MS_U8 ucData)
863 {
864     MS_U8 uctemp = 0;
865 
866     ucData = ((ucData &BMASK(6:5)) >> 4) |(ucData &BIT(0));
867 
868     switch(ucData)
869     {
870         case MHL_3D_DTD_STEREO_FIELD_SEQUENTIAL_RIGHT:
871             uctemp = MASKSET(uctemp, MHL_3D_FS_SUPPORT, MHL_3D_SUPPORT_MASK);
872             break;
873 
874         case MHL_3D_DTD_STEREO_FIELD_SEQUENTIAL_LEFT:
875             uctemp = MASKSET(uctemp, MHL_3D_FS_SUPPORT, MHL_3D_SUPPORT_MASK);
876             break;
877 
878         case MHL_3D_DTD_STEREO_2WAY_INTERLEAVED_RIGHT:
879             // No setting
880             break;
881 
882         case MHL_3D_DTD_STEREO_2WAY_INTERLEAVED_LEFT:
883             // No setting
884             break;
885 
886         case MHL_3D_DTD_STEREO_4WAY_INTERLEAVED:
887             // No setting
888             break;
889 
890         case MHL_3D_DTD_STEREO_SIDE_BY_SIDE_INTERLEAVED:
891             uctemp = MASKSET(uctemp, MHL_3D_LR_SUPPORT, MHL_3D_SUPPORT_MASK);
892             break;
893 
894         default: // MHL_3D_DTD_STEREO_NORMAL_DISPLAY
895 
896             break;
897     };
898 
899     pMHLResourcePrivate->uc3DInformationDTD[ucIndex] = uctemp;
900 
901     for(uctemp = 0, ucData = 0; uctemp < (ucIndex +1); uctemp++)
902     {
903         if(pMHLResourcePrivate->uc3DInformationDTD[uctemp] > 0)
904         {
905             ucData = uctemp +1;
906         }
907     }
908 
909     return ucData;
910 }
911 
912 //**************************************************************************
913 //  [Function Name]:
914 //                  _mdrv_mhl_CheckVIC3DStructureAll()
915 //  [Description]
916 //
917 //  [Arguments]:
918 //
919 //  [Return]:
920 //
921 //**************************************************************************
_mdrv_mhl_CheckVIC3DStructureAll(MS_U16 usData)922 MS_U8 _mdrv_mhl_CheckVIC3DStructureAll(MS_U16 usData)
923 {
924     MS_U8 uctemp = 0;
925 
926     if((usData &BIT(0)) == BIT(0)) // Support frame packing 3D formats
927     {
928         uctemp = MASKSET(uctemp, MHL_3D_FS_SUPPORT, MHL_3D_FS_SUPPORT);
929     }
930 
931     if((usData &BIT(6)) == BIT(6)) // Support top and bottom 3D formats
932     {
933         uctemp = MASKSET(uctemp, MHL_3D_TB_SUPPORT, MHL_3D_TB_SUPPORT);
934     }
935 
936     if((usData &BIT(8)) == BIT(8)) // Support side by side 3D formats
937     {
938         uctemp = MASKSET(uctemp, MHL_3D_LR_SUPPORT, MHL_3D_LR_SUPPORT);
939     }
940 
941     return uctemp;
942 }
943 
944 //**************************************************************************
945 //  [Function Name]:
946 //                  _mdrv_mhl_CheckVIC3DStructure()
947 //  [Description]
948 //
949 //  [Arguments]:
950 //
951 //  [Return]:
952 //
953 //**************************************************************************
_mdrv_mhl_CheckVIC3DStructure(MS_U8 ucData)954 MS_U8 _mdrv_mhl_CheckVIC3DStructure(MS_U8 ucData)
955 {
956     MS_U8 uctemp = 0;
957 
958     if(ucData == 0) // Support frame packing
959     {
960         uctemp = MASKSET(uctemp, MHL_3D_FS_SUPPORT, MHL_3D_FS_SUPPORT);
961     }
962     else if(ucData == 6) // Support top and bottom
963     {
964         uctemp = MASKSET(uctemp, MHL_3D_TB_SUPPORT, MHL_3D_TB_SUPPORT);
965     }
966     else if(ucData == 8) // Support side by side
967     {
968         uctemp = MASKSET(uctemp, MHL_3D_LR_SUPPORT, MHL_3D_LR_SUPPORT);
969     }
970 
971     return uctemp;
972 }
973 
974 //**************************************************************************
975 //  [Function Name]:
976 //                  _mdrv_mhl_InsertHighEndVICTable()
977 //  [Description]
978 //
979 //  [Arguments]:
980 //
981 //  [Return]:
982 //
983 //**************************************************************************
_mdrv_mhl_InsertHighEndVICTable(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 ucVICCode)984 void _mdrv_mhl_InsertHighEndVICTable(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 ucVICCode)
985 {
986     switch(ucVICCode)
987     {
988         case MHL_HEV_VIC_INDEX0:
989         case MHL_HEV_VIC_INDEX1:
990         case MHL_HEV_VIC_INDEX2:
991         case MHL_HEV_VIC_INDEX3:
992         case MHL_HEV_VIC_INDEX4:
993         case MHL_HEV_VIC_INDEX5:
994             pMHLResourcePrivate->usHighEndVICTable[pMHLResourcePrivate->ucHighEndVICTotalEntry] = ucVICCode;
995             pMHLResourcePrivate->ucHighEndVICTotalEntry++;
996             break;
997 
998         default:
999 
1000             break;
1001     };
1002 }
1003 
1004 //**************************************************************************
1005 //  [Function Name]:
1006 //                  _mdrv_mhl_ParsingVIC3DInformation()
1007 //  [Description]
1008 //
1009 //  [Arguments]:
1010 //
1011 //  [Return]:
1012 //
1013 //**************************************************************************
_mdrv_mhl_ParsingVIC3DInformation(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 ucExtendLength,MS_U8 * pData)1014 MS_BOOL _mdrv_mhl_ParsingVIC3DInformation(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 ucExtendLength, MS_U8 *pData)
1015 {
1016     MS_BOOL bVICParseFinish = TRUE;
1017     MS_BOOL b3DPresent = FALSE;
1018     MS_U8 uctemp = 0;
1019     MS_U8 ucIndex = 0;
1020     MS_U8 ucValue = 0;
1021     MS_U8 ucLength = 0;
1022     MS_U8 ucVSDBAddr = 0;
1023     MS_U8 ucVSDBLength = 0;
1024     MS_U8 uc3DMultiPresent = 0;
1025     MS_U8 ucVICTimingNum = 0;
1026     MS_U8 ucVICTiming[MHL_3D_VIC_INFORMATION_LENGTH] = {0};
1027     MS_U16 usMaskValue = 0;
1028 
1029     for(uctemp = 0; uctemp < MHL_3D_VIC_INFORMATION_LENGTH; uctemp++)
1030     {
1031         ucVICTiming[uctemp] = 0;
1032 
1033         pMHLResourcePrivate->uc3DInformationVIC[uctemp] = 0;
1034     }
1035 
1036     for(uctemp = 0; uctemp < ucExtendLength; uctemp++)
1037     {
1038         ucValue = (pData[uctemp] &BMASK(7:5)) >>5;
1039         ucLength = pData[uctemp] &BMASK(4:0);
1040 
1041         switch(ucValue)
1042         {
1043             case MHL_EDID_AUDIO_DATA_BLOCK_CODE:
1044                 MDRV_MHL_MSG_INFO("** MHL get audio data block length %d in port %c\r\n", ucLength, MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
1045                 break;
1046 
1047             case MHL_EDID_VIDEO_DATA_BLOCK_CODE:
1048                 MDRV_MHL_MSG_INFO("** MHL get video data block length %d in port %c\r\n", ucLength, MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
1049 
1050                 if(ucLength > MHL_3D_VIC_INFORMATION_LENGTH)
1051                 {
1052                     ucVICTimingNum = MHL_3D_VIC_INFORMATION_LENGTH;
1053                 }
1054                 else
1055                 {
1056                     ucVICTimingNum = ucLength;
1057                 }
1058 
1059                 for(ucIndex = 0; ucIndex <ucLength; ucIndex++)
1060                 {
1061                     if(ucIndex <ucVICTimingNum)
1062                     {
1063                         ucVICTiming[ucIndex] = pData[uctemp +ucIndex +1];
1064                     }
1065 
1066                     _mdrv_mhl_InsertHighEndVICTable(pMHLResourcePrivate, pData[uctemp +ucIndex +1]);
1067                 }
1068 
1069                 break;
1070 
1071             case MHL_EDID_VENDER_SPECIFIC_DATA_BLOCK_CODE:
1072                 MDRV_MHL_MSG_INFO("** MHL get vender specific data block length %d in port %c\r\n", ucLength, MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
1073 
1074                 ucVSDBAddr = uctemp;
1075 
1076                 bVICParseFinish = FALSE;
1077 
1078                 break;
1079 
1080             case MHL_EDID_SPEAKER_ALLOCATION_DATA_BLOCK_CODE:
1081                 MDRV_MHL_MSG_INFO("** MHL get speaker allocation data block length %d in port %c\r\n", ucLength, MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
1082                 break;
1083 
1084             case MHL_EDID_VESA_DTC_DATA_BLOCK_CODE:
1085                 MDRV_MHL_MSG_INFO("** MHL get VESA DTC data block length %d in port %c\r\n", ucLength, MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
1086                 break;
1087 
1088             case MHL_EDID_USE_EXTENDED_TAG_BLOCK_CODE:
1089                 MDRV_MHL_MSG_INFO("** MHL get use extended tag length %d in port %c\r\n", ucLength, MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
1090                 break;
1091 
1092             default:
1093 
1094                 break;
1095         };
1096 
1097         uctemp = uctemp +ucLength;
1098     }
1099 
1100     ucIndex = MHL_VIC_PARSING_START;
1101     ucVSDBLength = ucVSDBAddr +1;
1102 
1103     while(!bVICParseFinish)
1104     {
1105         ucValue = pData[ucVSDBAddr];
1106 
1107         if(ucVSDBAddr > ucVSDBLength) // Check total length
1108         {
1109             ucIndex = MHL_VIC_PARSING_FINISH;
1110         }
1111 
1112         switch(ucIndex)
1113         {
1114             case MHL_VIC_PARSING_START:
1115                 ucVSDBLength = pData[ucVSDBAddr] &BMASK(4:0);
1116 
1117                 if(ucVSDBLength < 8) // HDMI_Video_Present absent, no 3D information
1118                 {
1119                     ucIndex = MHL_VIC_PARSING_FINISH;
1120                 }
1121                 else
1122                 {
1123                     ucVSDBAddr = ucVSDBAddr +8;
1124 
1125                     ucIndex = MHL_VIC_PARSING_CHECK_HDMI_VIDEO_PRESENT;
1126                 }
1127 
1128                 ucVSDBLength = ucVSDBAddr +ucVSDBLength;
1129 
1130                 break;
1131 
1132             case MHL_VIC_PARSING_CHECK_HDMI_VIDEO_PRESENT:
1133                 if((ucValue &BIT(5)) != BIT(5)) // HDMI_Video_Present absent, no 3D information
1134                 {
1135                     ucIndex = MHL_VIC_PARSING_FINISH;
1136                 }
1137                 else
1138                 {
1139                     ucIndex = MHL_VIC_PARSING_CHECK_3D_PRESENT;
1140 
1141                     if((ucValue &BIT(7)) != BIT(7)) // Latency_Fields_Present absent, no video and audio latency and no interlaced video and audio latency
1142                     {
1143                         ucVSDBAddr++;
1144                     }
1145                     else
1146                     {
1147                         if((ucValue &BIT(6)) != BIT(6)) // I_Latency_Fields_Present absent, no video and audio latency
1148                         {
1149                             ucVSDBAddr = ucVSDBAddr +3;
1150                         }
1151                         else
1152                         {
1153                             ucVSDBAddr = ucVSDBAddr +5;
1154                         }
1155                     }
1156                 }
1157 
1158                 break;
1159 
1160             case MHL_VIC_PARSING_CHECK_3D_PRESENT:
1161                 if((ucValue &BIT(7)) != BIT(7)) // 3D_Present absent, no 3D information
1162                 {
1163                     ucIndex = MHL_VIC_PARSING_FINISH;
1164                 }
1165                 else
1166                 {
1167                     b3DPresent = TRUE;
1168                     uc3DMultiPresent = (ucValue &BMASK(6:5)) >> 5;
1169 
1170                     if(uc3DMultiPresent == 0)
1171                     {
1172                         ucIndex = MHL_VIC_PARSING_3D_MULTI_PRESENT_00;
1173                     }
1174                     else if(uc3DMultiPresent == 3) // Reserved for future use
1175                     {
1176                         ucIndex = MHL_VIC_PARSING_FINISH;
1177                     }
1178                     else
1179                     {
1180                         ucIndex = MHL_VIC_PARSING_CHECK_HDMI_VIC;
1181 
1182                         ucVSDBAddr++;
1183                     }
1184                 }
1185 
1186                 break;
1187 
1188             case MHL_VIC_PARSING_CHECK_HDMI_VIC:
1189                 ucLength = (ucValue &BMASK(7:5)) >> 5;
1190 
1191                 ucVSDBAddr = ucVSDBAddr +ucLength +1;
1192 
1193                 if(uc3DMultiPresent == 1)
1194                 {
1195                     ucIndex = MHL_VIC_PARSING_3D_MULTI_PRESENT_01;
1196                 }
1197                 else // uc3DMultiPresent = 2
1198                 {
1199                     ucIndex = MHL_VIC_PARSING_3D_MULTI_PRESENT_10;
1200                 }
1201 
1202                 ucLength = ucVSDBAddr +(ucValue &BMASK(4:0)) -1; // HDMI_3D_LEN
1203 
1204                 break;
1205 
1206             case MHL_VIC_PARSING_3D_MULTI_PRESENT_00:
1207                 ucIndex = MHL_VIC_PARSING_CHECK_3D_PRESENT_TIMING;
1208 
1209                 break;
1210 
1211             case MHL_VIC_PARSING_3D_MULTI_PRESENT_01:
1212                 ucValue = _mdrv_mhl_CheckVIC3DStructureAll((pData[ucVSDBAddr +1] |(pData[ucVSDBAddr] << 8)));
1213 
1214                 for(uctemp = 0; uctemp <ucVICTimingNum; uctemp++)
1215                 {
1216                     pMHLResourcePrivate->uc3DInformationVIC[uctemp] = ucValue;
1217                 }
1218 
1219                 ucIndex = MHL_VIC_PARSING_CHECK_3D_PRESENT_TIMING;
1220 
1221                 break;
1222 
1223             case MHL_VIC_PARSING_3D_MULTI_PRESENT_10:
1224                 ucValue = _mdrv_mhl_CheckVIC3DStructureAll((pData[ucVSDBAddr +1] |(pData[ucVSDBAddr] << 8)));
1225 
1226                 usMaskValue = pData[ucVSDBAddr +3] |(pData[ucVSDBAddr +2] << 8);
1227 
1228                 for(uctemp = 0; uctemp <ucVICTimingNum; uctemp++)
1229                 {
1230                     if((usMaskValue &BIT(uctemp)) == BIT(uctemp))
1231                     {
1232                         pMHLResourcePrivate->uc3DInformationVIC[uctemp] = ucValue;
1233                     }
1234                 }
1235 
1236                 ucVSDBAddr = ucVSDBAddr +4;
1237 
1238                 ucIndex = MHL_VIC_PARSING_CHECK_3D_STRUCTURE;
1239 
1240                 break;
1241 
1242             case MHL_VIC_PARSING_CHECK_3D_STRUCTURE:
1243                 if(ucVSDBAddr > ucLength) // No 3D sturcture
1244                 {
1245                     ucIndex = MHL_VIC_PARSING_CHECK_3D_PRESENT_TIMING;
1246                 }
1247                 else
1248                 {
1249                     uctemp = (ucValue &BMASK(7:4)) >> 4;
1250                     ucValue = ucValue &BMASK(3:0);
1251 
1252                     pMHLResourcePrivate->uc3DInformationVIC[uctemp] = _mdrv_mhl_CheckVIC3DStructure(ucValue);
1253 
1254                     if(ucValue < 8) // Only 2D_VIC_Order and 3D_Structure, 1 byte
1255                     {
1256                         ucVSDBAddr++;
1257                     }
1258                     else // Add 3D_Detail, 2 byte
1259                     {
1260                         ucVSDBAddr = ucVSDBAddr +2;
1261                     }
1262                 }
1263 
1264                 break;
1265 
1266             case MHL_VIC_PARSING_CHECK_3D_PRESENT_TIMING:
1267                 for(uctemp = 0; uctemp <ucVICTimingNum; uctemp++)
1268                 {
1269                     ucValue = pMHLResourcePrivate->uc3DInformationVIC[uctemp];
1270 
1271                     switch(ucVICTiming[uctemp])
1272                     {
1273                         case MHL_3D_PRESENT_VIC_1920x1080p24Hz: // Support frame packing with top and bottom
1274                         case MHL_3D_PRESENT_VIC_1280x720p60Hz: // Support frame packing with top and bottom
1275                         case MHL_3D_PRESENT_VIC_1280x720p50Hz: // Support frame packing with top and bottom
1276                             ucValue = MASKSET(ucValue, (MHL_3D_FS_SUPPORT |MHL_3D_TB_SUPPORT), (MHL_3D_FS_SUPPORT |MHL_3D_TB_SUPPORT));
1277                             pMHLResourcePrivate->uc3DInformationVIC[uctemp] = ucValue;
1278 
1279                             break;
1280 
1281                         case MHL_3D_PRESENT_VIC_1920x1080i60Hz: // Support side by side
1282                         case MHL_3D_PRESENT_VIC_1920x1080i50Hz: // Support side by side
1283                             ucValue = MASKSET(ucValue, MHL_3D_LR_SUPPORT, MHL_3D_LR_SUPPORT);
1284                             pMHLResourcePrivate->uc3DInformationVIC[uctemp] = ucValue;
1285 
1286                             break;
1287 
1288                         default:
1289 
1290                             break;
1291                     };
1292                 }
1293 
1294                 ucIndex = MHL_VIC_PARSING_FINISH;
1295 
1296                 break;
1297 
1298             case MHL_VIC_PARSING_FINISH:
1299                 bVICParseFinish = TRUE;
1300 
1301                 break;
1302 
1303             default:
1304 
1305                 break;
1306         };
1307     }
1308 
1309     for(uctemp = 0, ucValue = 0; uctemp < MHL_3D_VIC_INFORMATION_LENGTH; uctemp++)
1310     {
1311         if(pMHLResourcePrivate->uc3DInformationVIC[uctemp] > 0)
1312         {
1313             ucValue = uctemp +1;
1314         }
1315     }
1316 
1317     pMHLResourcePrivate->uc3DTotalEntryVIC = ucValue;
1318 
1319     return b3DPresent;
1320 }
1321 
1322 //**************************************************************************
1323 //  [Function Name]:
1324 //                  _mdrv_mhl_InsertVCInformation()
1325 //  [Description]:
1326 //
1327 //  [Arguments]:
1328 //
1329 //  [Return]:
1330 //
1331 //**************************************************************************
_mdrv_mhl_InsertVCInformation(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_BOOL bReceiveVC,MS_U8 ucVCNumber,MS_U8 ucVCFeatureID,MS_U8 ucVCSlotSize)1332 void _mdrv_mhl_InsertVCInformation(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_BOOL bReceiveVC, MS_U8 ucVCNumber, MS_U8 ucVCFeatureID, MS_U8 ucVCSlotSize)
1333 {
1334     MS_BOOL bFindVC = FALSE;
1335     MS_U8 uctemp = 0;
1336     MS_U8 ucTargetVC = MHL_VIRTUAL_CHANNEL_LENGTH;
1337     MS_U8 ucTotalTimeSlot = 0;
1338     MS_U8 ucResponseCode = MHL_VC_RESPONSE_ACCEPT;
1339 
1340     if(ucVCFeatureID >= MHL_VC_FEATURE_ID_END) // Invalid feature ID
1341     {
1342         ucResponseCode = MHL_VC_RESPONSE_REJECT_FEATURE_ID;
1343     }
1344     else if((ucVCFeatureID == MHL_VC_FEATURE_ID_EMSC) && (ucVCSlotSize != MHL_EMSC_TIME_SLOT_DEFAULT))
1345     {
1346         ucResponseCode = MHL_VC_RESPONSE_REJECT_CHANNEL_SIZE;
1347     }
1348 
1349     for(uctemp = 0; uctemp <MHL_VIRTUAL_CHANNEL_LENGTH; uctemp++)
1350     {
1351         if(!bFindVC)
1352         {
1353             if(pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCNumber == ucVCNumber) // VC present, information change
1354             {
1355                 ucTargetVC = uctemp;
1356 
1357                 bFindVC = TRUE;
1358             }
1359             else if(pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCNumber == 0) // VC absent, insert new information
1360             {
1361                 ucTargetVC = uctemp;
1362 
1363                 pMHLResourcePrivate->stVirtualChannelInfo[ucTargetVC].ucVCNumber = ucVCNumber;
1364                 pMHLResourcePrivate->stVirtualChannelInfo[ucTargetVC].ucVCFeatureID = ucVCFeatureID;
1365 
1366                 break;
1367             }
1368         }
1369 
1370         ucTotalTimeSlot = ucTotalTimeSlot +pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCSlotSize;
1371     }
1372 
1373     if(ucTargetVC < MHL_VIRTUAL_CHANNEL_LENGTH) // Can insert new VC information
1374     {
1375         pMHLResourcePrivate->stVirtualChannelInfo[ucTargetVC].bVCConfirm = TRUE;
1376 
1377         if(pMHLResourcePrivate->stVirtualChannelInfo[ucTargetVC].ucVCFeatureID != ucVCFeatureID) // Same VC number, but different feature ID
1378         {
1379             ucResponseCode = MHL_VC_RESPONSE_REJECT_NUMBER;
1380         }
1381         else if(ucTotalTimeSlot +ucVCSlotSize > MHL_ECBUS_S_TIME_SLOT_TOTAL -1) // Time slot not enough
1382         {
1383             ucResponseCode = MHL_VC_RESPONSE_REJECT_CHANNEL_SIZE;
1384         }
1385         else
1386         {
1387             if(bFindVC)
1388             {
1389                 pMHLResourcePrivate->stVirtualChannelInfo[ucTargetVC].ucVCResponseCode = pMHLResourcePrivate->stVirtualChannelInfo[ucTargetVC].ucVCSlotSize;
1390             }
1391 
1392             pMHLResourcePrivate->stVirtualChannelInfo[ucTargetVC].ucVCSlotSize = ucVCSlotSize;
1393         }
1394 
1395         if(bReceiveVC)
1396         {
1397             pMHLResourcePrivate->stVirtualChannelInfo[ucTargetVC].ucVCResponseCode = ucResponseCode;
1398         }
1399     }
1400     else // Virtual channel length is too small
1401     {
1402         MDRV_MHL_MSG_INFO("** MHL virtual channel length too small port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
1403     }
1404 }
1405 
1406 //**************************************************************************
1407 //  [Function Name]:
1408 //                  _mdrv_mhl_CheckVCInformation()
1409 //  [Description]:
1410 //
1411 //  [Arguments]:
1412 //
1413 //  [Return]:
1414 //
1415 //**************************************************************************
_mdrv_mhl_CheckVCInformation(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 ucVCNumber,MS_U8 ucVCFeatureID,MS_U8 ucResponseCode)1416 void _mdrv_mhl_CheckVCInformation(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 ucVCNumber, MS_U8 ucVCFeatureID, MS_U8 ucResponseCode)
1417 {
1418     MS_U8 uctemp = 0;
1419     MS_U8 ucTargetVC = MHL_VIRTUAL_CHANNEL_LENGTH;
1420 
1421     for(uctemp = 0; uctemp <MHL_VIRTUAL_CHANNEL_LENGTH; uctemp++)
1422     {
1423         if(pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCNumber == ucVCNumber) // VC present, information change
1424         {
1425             ucTargetVC = uctemp;
1426 
1427             if(pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCFeatureID != ucVCFeatureID)
1428             {
1429 
1430             }
1431 
1432             break;
1433         }
1434     }
1435 
1436     if(ucTargetVC < MHL_VIRTUAL_CHANNEL_LENGTH) // Can insert new VC information
1437     {
1438         if(ucResponseCode == MHL_VC_RESPONSE_REJECT_CHANNEL_SIZE)
1439         {
1440             pMHLResourcePrivate->stVirtualChannelInfo[ucTargetVC].ucVCSlotSize = pMHLResourcePrivate->stVirtualChannelInfo[ucTargetVC].ucVCResponseCode;
1441         }
1442         else if(ucResponseCode == MHL_VC_RESPONSE_REJECT_NUMBER)
1443         {
1444             pMHLResourcePrivate->stVirtualChannelInfo[ucTargetVC].ucVCSlotSize = 0;
1445         }
1446         else if(ucResponseCode == MHL_VC_RESPONSE_REJECT_FEATURE_ID)
1447         {
1448             pMHLResourcePrivate->stVirtualChannelInfo[ucTargetVC].ucVCSlotSize = 0;
1449         }
1450 
1451         pMHLResourcePrivate->stVirtualChannelInfo[ucTargetVC].ucVCResponseCode = MHL_VC_RESPONSE_ACCEPT;
1452     }
1453 }
1454 
1455 //**************************************************************************
1456 //  [Function Name]:
1457 //                  _mdrv_mhl_ParsingEDIDfor3D()
1458 //  [Description]
1459 //
1460 //  [Arguments]:
1461 //
1462 //  [Return]:
1463 //
1464 //**************************************************************************
_mdrv_mhl_ParsingEDIDfor3D(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 * pEdid)1465 void _mdrv_mhl_ParsingEDIDfor3D(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 *pEdid)
1466 {
1467     MS_BOOL bDTDParseFinish = FALSE;
1468     MS_U8 uctemp = 0;
1469     MS_U8 ucValue = 0;
1470     MS_U8 ucIndex = 0;
1471     MS_U8 ucDTDTimingNum = 0;
1472     MS_U8 ucThirdDTDStart = 0;
1473     MS_U8 ucDTDTiming[MHL_3D_DTD_INFORMATION_LENGTH] = {0};
1474 
1475     if(pEdid != NULL)
1476     {
1477         // Parsing 3D DTD information Start
1478         if(_mdrv_mhl_DTDPresentinEDID(&pEdid[MHL_EDID_FIRST_DTD_START])) // Check first DTD
1479         {
1480             ucValue = _mdrv_mhl_InsertDTD3DInformation(pMHLResourcePrivate, MHL_3D_FIRST_DTD, pEdid[MHL_EDID_FIRST_DTD_START +MHL_EDID_DTD_LENGTH -1]);
1481 
1482             ucDTDTiming[MHL_3D_FIRST_DTD] = _mdrv_mhl_GetDTD3DTimingInformation(&pEdid[MHL_EDID_FIRST_DTD_START]);
1483         }
1484         else // First DTD absent
1485         {
1486             bDTDParseFinish = TRUE;
1487 
1488             ucDTDTimingNum = 0;
1489 
1490             MDRV_MHL_MSG_INFO("** MHL first DTD absent in port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
1491         }
1492 
1493         if(!bDTDParseFinish)
1494         {
1495             if(_mdrv_mhl_DTDPresentinEDID(&pEdid[MHL_EDID_SECOND_DTD_START])) // Check second DTD
1496             {
1497                 ucValue = _mdrv_mhl_InsertDTD3DInformation(pMHLResourcePrivate, MHL_3D_SECOND_DTD, pEdid[MHL_EDID_SECOND_DTD_START +MHL_EDID_DTD_LENGTH -1]);
1498 
1499                 ucDTDTiming[MHL_3D_SECOND_DTD] = _mdrv_mhl_GetDTD3DTimingInformation(&pEdid[MHL_EDID_SECOND_DTD_START]);
1500             }
1501             else    // Second DTD absent
1502             {
1503                 bDTDParseFinish = TRUE;
1504 
1505                 ucDTDTimingNum = 1;
1506 
1507                 MDRV_MHL_MSG_INFO("** MHL second DTD absent in port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
1508             }
1509         }
1510 
1511         if(pEdid[MHL_EDID_EXTENSION_FLAG] > 0) // Have extend EDID
1512         {
1513             ucThirdDTDStart = MHL_EDID_BLOCK_LENGTH +pEdid[MHL_EDID_RESERVED_DATA_BLOCK];
1514 
1515             MDRV_MHL_MSG_INFO("** MHL third DTD start at %x in port %c\r\n", ucThirdDTDStart, MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
1516 
1517             if(!bDTDParseFinish)
1518             {
1519                 for(uctemp = 0; uctemp <(MHL_3D_DTD_INFORMATION_LENGTH -2); uctemp++)
1520                 {
1521                     if(_mdrv_mhl_DTDPresentinEDID(&pEdid[ucThirdDTDStart +MHL_EDID_DTD_LENGTH *uctemp])) // Check others DTD
1522                     {
1523                         ucValue = _mdrv_mhl_InsertDTD3DInformation(pMHLResourcePrivate, MHL_3D_THIRD_DTD +uctemp, pEdid[ucThirdDTDStart +MHL_EDID_DTD_LENGTH *(uctemp +1) -1]);
1524 
1525                         ucDTDTiming[MHL_3D_THIRD_DTD +uctemp] = _mdrv_mhl_GetDTD3DTimingInformation(&pEdid[ucThirdDTDStart +MHL_EDID_DTD_LENGTH *uctemp]);
1526                     }
1527                     else    // Last DTD find
1528                     {
1529                         bDTDParseFinish = TRUE;
1530 
1531                         ucDTDTimingNum = uctemp +2;
1532 
1533                         MDRV_MHL_MSG_INFO("** MHL total have %d DTD in port %c\r\n", ucDTDTimingNum, MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
1534 
1535                         break;
1536                     }
1537                 }
1538             }
1539 
1540             // Parsing 3D VIC information Start
1541             if(ucThirdDTDStart > (MHL_EDID_RESERVED_DATA_BLOCK +2))
1542             {
1543                 if(_mdrv_mhl_ParsingVIC3DInformation(pMHLResourcePrivate, pEdid[MHL_EDID_RESERVED_DATA_BLOCK] -4, &pEdid[MHL_EDID_RESERVED_DATA_BLOCK +2]))
1544                 {
1545                     // 3D Present
1546                     for(uctemp = 0; uctemp <ucDTDTimingNum; uctemp++)
1547                     {
1548                         ucIndex = pMHLResourcePrivate->uc3DInformationDTD[uctemp];
1549 
1550                         switch(ucDTDTiming[uctemp])
1551                         {
1552                             case MHL_3D_PRESENT_VIC_1920x1080p24Hz: // Support frame packing with top and bottom
1553                             case MHL_3D_PRESENT_VIC_1280x720p60Hz: // Support frame packing with top and bottom
1554                             case MHL_3D_PRESENT_VIC_1280x720p50Hz: // Support frame packing with top and bottom
1555                                 ucIndex = MASKSET(ucIndex, (MHL_3D_FS_SUPPORT |MHL_3D_TB_SUPPORT), (MHL_3D_FS_SUPPORT |MHL_3D_TB_SUPPORT));
1556                                 pMHLResourcePrivate->uc3DInformationDTD[uctemp] = ucIndex;
1557 
1558                                 break;
1559 
1560                             case MHL_3D_PRESENT_VIC_1920x1080i60Hz: // Support side by side
1561                             case MHL_3D_PRESENT_VIC_1920x1080i50Hz: // Support side by side
1562                                 ucIndex = MASKSET(ucIndex, MHL_3D_LR_SUPPORT, MHL_3D_LR_SUPPORT);
1563                                 pMHLResourcePrivate->uc3DInformationDTD[uctemp] = ucIndex;
1564 
1565                                 break;
1566 
1567                             default:
1568 
1569                                 break;
1570                         };
1571 
1572                         if(ucIndex > 0)
1573                         {
1574                             ucValue = uctemp +1;
1575                         }
1576                     }
1577                 }
1578             }
1579         }
1580 
1581         // Parsing 3D DTD information End
1582         pMHLResourcePrivate->uc3DTotalEntryDTD = ucValue;
1583     }
1584 }
1585 
1586 //**************************************************************************
1587 //  [Function Name]:
1588 //                  _mdrv_mhl_SlotAllocationAlgorithm()
1589 //  [Description]
1590 //
1591 //  [Arguments]:
1592 //
1593 //  [Return]:
1594 //
1595 //**************************************************************************
_mdrv_mhl_SlotAllocationAlgorithm(MS_U8 ucChannelIndex,MS_U8 ucNValue,MS_U8 ucMValue,MS_U8 * pSlotAllocation)1596 void _mdrv_mhl_SlotAllocationAlgorithm(MS_U8 ucChannelIndex, MS_U8 ucNValue, MS_U8 ucMValue, MS_U8 *pSlotAllocation)
1597 {
1598     MS_U8 uctemp = 0;
1599     MS_U8 ucCounter = 0;
1600 
1601     for(uctemp = 0; uctemp <MHL_ECBUS_S_TIME_SLOT_TOTAL; uctemp++)
1602     {
1603         if(pSlotAllocation[uctemp] == MHL_CBUS_SLOT_NOT_ALLOCATE)
1604         {
1605             if(ucCounter >= ucNValue)
1606             {
1607                 pSlotAllocation[uctemp] = ucChannelIndex;
1608             }
1609 
1610             ucCounter = (ucCounter +ucNValue) %(ucNValue +ucMValue);
1611         }
1612     }
1613 }
1614 
1615 //**************************************************************************
1616 //  [Function Name]:
1617 //                  _mdrv_mhl_eCbusTimeSlotAllocation()
1618 //  [Description]
1619 //
1620 //  [Arguments]:
1621 //
1622 //  [Return]:
1623 //
1624 //**************************************************************************
_mdrv_mhl_eCbusTimeSlotAllocation(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)1625 void _mdrv_mhl_eCbusTimeSlotAllocation(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
1626 {
1627     MS_U8 uctemp = 0;
1628     MS_U8 ucTimeSlotNumber = MHL_ECBUS_S_TIME_SLOT_TOTAL -1;
1629     MS_U8 ucSlotAllocation[MHL_ECBUS_S_TIME_SLOT_TOTAL];
1630     MS_U8 ucVirtualChannel[MHL_VIRTUAL_CHANNEL_LENGTH +2];
1631 
1632     for(uctemp = 0; uctemp <(MHL_VIRTUAL_CHANNEL_LENGTH +2); uctemp++)
1633     {
1634         ucVirtualChannel[uctemp] = 0;
1635     }
1636 
1637     for(uctemp = 0; uctemp <MHL_ECBUS_S_TIME_SLOT_TOTAL; uctemp++)
1638     {
1639         if(uctemp == 0)
1640         {
1641             ucSlotAllocation[uctemp] = 0;
1642         }
1643         else
1644         {
1645             ucSlotAllocation[uctemp] = MHL_CBUS_SLOT_NOT_ALLOCATE;
1646         }
1647     }
1648 
1649     ucVirtualChannel[0] = MHL_CBUS1_TIME_SLOT_DEFAULT;
1650 
1651     for(uctemp = 0; uctemp <MHL_VIRTUAL_CHANNEL_LENGTH; uctemp++)
1652     {
1653         if(pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCSlotSize == 0)
1654         {
1655             break;
1656         }
1657         else
1658         {
1659             ucVirtualChannel[uctemp +1] = pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCSlotSize;
1660             ucTimeSlotNumber = ucTimeSlotNumber -pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCSlotSize;
1661         }
1662     }
1663 
1664     ucVirtualChannel[uctemp +1] = ucTimeSlotNumber;
1665 
1666     for(uctemp = 0; uctemp <(MHL_VIRTUAL_CHANNEL_LENGTH +2); uctemp++)
1667     {
1668         MDRV_MHL_MSG_INFO("** MHL time slot assign %d\r\n", ucVirtualChannel[uctemp]);
1669     }
1670 
1671     ucTimeSlotNumber = MHL_ECBUS_S_TIME_SLOT_TOTAL -1;
1672 
1673     for(uctemp = MHL_VIRTUAL_CHANNEL_LENGTH +1; ucTimeSlotNumber > 0; uctemp--)
1674     {
1675         if(ucVirtualChannel[uctemp] > 0)
1676         {
1677             ucTimeSlotNumber = ucTimeSlotNumber -ucVirtualChannel[uctemp];
1678 
1679             _mdrv_mhl_SlotAllocationAlgorithm(uctemp, ucTimeSlotNumber, ucVirtualChannel[uctemp], ucSlotAllocation);
1680         }
1681     }
1682 
1683     for(uctemp = 0; uctemp <MHL_ECBUS_S_TIME_SLOT_TOTAL; uctemp++)
1684     {
1685         MDRV_MHL_MSG_INFO("** MHL time slot allocation %d\r\n", ucSlotAllocation[uctemp]);
1686     }
1687 }
1688 
1689 //**************************************************************************
1690 //  [Function Name]:
1691 //                  _mdrv_mhl_SortingVCInformation()
1692 //  [Description]:
1693 //
1694 //  [Arguments]:
1695 //
1696 //  [Return]:
1697 //
1698 //**************************************************************************
_mdrv_mhl_SortingVCInformation(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_BOOL bClearFlag)1699 void _mdrv_mhl_SortingVCInformation(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_BOOL bClearFlag)
1700 {
1701     MS_U8 uctemp = 0;
1702     MS_U8 ucIndex = 0;
1703     MS_U8 ucTargetVC = MHL_VIRTUAL_CHANNEL_LENGTH;
1704     stMHL_VIRTUAL_CHANNEL_INFO stVirtualChannelTemp = {FALSE, 0, 0, 0, 0};
1705 
1706     for(ucIndex = 0; ucIndex <(ucTargetVC -1); ucIndex++)
1707     {
1708         for(uctemp = 0; uctemp <(ucTargetVC -ucIndex -1); uctemp++)
1709         {
1710             if(pMHLResourcePrivate->stVirtualChannelInfo[uctemp +1].ucVCNumber == 0)
1711             {
1712                 ucTargetVC = uctemp +1;
1713 
1714                 break;
1715             }
1716             else
1717             {
1718                 if(pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCSlotSize == 0)
1719                 {
1720                     pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCNumber = 0xFF;
1721                 }
1722 
1723                 if(pMHLResourcePrivate->stVirtualChannelInfo[uctemp +1].ucVCNumber < pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCNumber)
1724                 {
1725                     // temp = n +1
1726                     stVirtualChannelTemp.bVCConfirm = pMHLResourcePrivate->stVirtualChannelInfo[uctemp +1].bVCConfirm;
1727                     stVirtualChannelTemp.ucVCFeatureID = pMHLResourcePrivate->stVirtualChannelInfo[uctemp +1].ucVCFeatureID;
1728                     stVirtualChannelTemp.ucVCNumber = pMHLResourcePrivate->stVirtualChannelInfo[uctemp +1].ucVCNumber;
1729                     stVirtualChannelTemp.ucVCResponseCode = pMHLResourcePrivate->stVirtualChannelInfo[uctemp +1].ucVCResponseCode;
1730                     stVirtualChannelTemp.ucVCSlotSize = pMHLResourcePrivate->stVirtualChannelInfo[uctemp +1].ucVCSlotSize;
1731                     // n +1 = n
1732                     pMHLResourcePrivate->stVirtualChannelInfo[uctemp +1].bVCConfirm = pMHLResourcePrivate->stVirtualChannelInfo[uctemp].bVCConfirm;
1733                     pMHLResourcePrivate->stVirtualChannelInfo[uctemp +1].ucVCFeatureID = pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCFeatureID;
1734                     pMHLResourcePrivate->stVirtualChannelInfo[uctemp +1].ucVCNumber = pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCNumber;
1735                     pMHLResourcePrivate->stVirtualChannelInfo[uctemp +1].ucVCResponseCode = pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCResponseCode;
1736                     pMHLResourcePrivate->stVirtualChannelInfo[uctemp +1].ucVCSlotSize = pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCSlotSize;
1737                     // n = temp
1738                     pMHLResourcePrivate->stVirtualChannelInfo[uctemp].bVCConfirm = stVirtualChannelTemp.bVCConfirm;
1739                     pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCFeatureID = stVirtualChannelTemp.ucVCFeatureID;
1740                     pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCNumber = stVirtualChannelTemp.ucVCNumber;
1741                     pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCResponseCode = stVirtualChannelTemp.ucVCResponseCode;
1742                     pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCSlotSize = stVirtualChannelTemp.ucVCSlotSize;
1743                 }
1744             }
1745         }
1746     }
1747 
1748     for(uctemp = 0; uctemp <MHL_VIRTUAL_CHANNEL_LENGTH; uctemp++)
1749     {
1750         if(pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCSlotSize == 0)
1751         {
1752             pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCNumber = 0;
1753         }
1754 
1755         if(bClearFlag)
1756         {
1757             pMHLResourcePrivate->stVirtualChannelInfo[uctemp].bVCConfirm = FALSE;
1758         }
1759 
1760         MDRV_MHL_MSG_INFO("** MHL VC sorting number %d\r\n", pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCNumber);
1761         MDRV_MHL_MSG_INFO("** MHL VC sorting slot %d\r\n", pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCSlotSize);
1762     }
1763 }
1764 
1765 //**************************************************************************
1766 //  [Function Name]:
1767 //                  _mdrv_mhl_CbusSendSetHPD()
1768 //  [Description]:
1769 //                  MHL Cbus set HPD state
1770 //  [Arguments]:
1771 //                  TRUE: SET_HPD
1772 //                  FALSE: CLR_HPD
1773 //  [Return]:
1774 //
1775 //**************************************************************************
_mdrv_mhl_CbusSendSetHPD(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_BOOL bSetHPDFlag)1776 void _mdrv_mhl_CbusSendSetHPD(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_BOOL bSetHPDFlag)
1777 {
1778     MS_U8 ucQueueIndex = _mdrv_mhl_GetFreeQueueIndex(pMHLResourcePrivate);
1779 
1780     if(ucQueueIndex < MHL_CBUS_TOTAL_QUEUE_NUM)
1781     {
1782         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucQueueState = MHL_QUEUE_STATE_PENDING;
1783         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucLength = 0;
1784         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucCommand = (bSetHPDFlag? MSC_SET_HPD : MSC_CLR_HPD);
1785 
1786         if(bSetHPDFlag)
1787         {
1788             SET_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_HPD_SET_FLAG);
1789             SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_COMMUNICATE_BUSY_FLAG);
1790         }
1791         else
1792         {
1793             CLR_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_HPD_SET_FLAG);
1794             CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_COMMUNICATE_BUSY_FLAG);
1795         }
1796     }
1797 }
1798 
1799 //**************************************************************************
1800 //  [Function Name]:
1801 //                  _mdrv_mhl_CbusWriteStatusOrSetInt(BYTE addr, BYTE val)
1802 //  [Description]:
1803 //                  MHL Cbus write status or set interrupt
1804 //  [Arguments]:
1805 //
1806 //  [Return]:
1807 //                  TRUE: Cbus message send successfully
1808 //                  FALSE: Cbus message send fail
1809 //**************************************************************************
_mdrv_mhl_CbusWriteStatusOrSetInt(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 ucAddress,MS_U8 ucValue,MS_BOOL bExtended)1810 MS_BOOL _mdrv_mhl_CbusWriteStatusOrSetInt(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 ucAddress, MS_U8 ucValue, MS_BOOL bExtended)
1811 {
1812     MS_BOOL bInsertFlag = FALSE;
1813     MS_U8 ucQueueIndex = _mdrv_mhl_GetFreeQueueIndex(pMHLResourcePrivate);
1814 
1815     if(ucQueueIndex < MHL_CBUS_TOTAL_QUEUE_NUM)
1816     {
1817         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucQueueState = MHL_QUEUE_STATE_PENDING;
1818         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucLength = 2;
1819         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucCommand = (bExtended? MSC_WRITE_XSTAT : MSC_WRITE_STAT_OR_SET_INT);
1820         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucData[0] = ucAddress;
1821         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucData[1] = ucValue;
1822 
1823         bInsertFlag = TRUE;
1824     }
1825 
1826     return bInsertFlag;
1827 }
1828 
1829 //**************************************************************************
1830 //  [Function Name]:
1831 //                  _mdrv_mhl_CbusSendSubMessage
1832 //  [Description]
1833 //                  MHL Cbus MSC Send RCP or RAP
1834 //  [Arguments]:
1835 //                  subCmd: MSC subcommands
1836 //                  databuf: command code
1837 //  [Return]:
1838 //                  TRUE: success
1839 //                  FALSE: fail
1840 //**************************************************************************
_mdrv_mhl_CbusSendSubMessage(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 ucSubCommand,MS_U8 ucKeyCode,MS_BOOL bWaitReply)1841 MS_BOOL _mdrv_mhl_CbusSendSubMessage(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 ucSubCommand, MS_U8 ucKeyCode, MS_BOOL bWaitReply)
1842 {
1843     MS_BOOL bInsertFlag = FALSE;
1844     MS_U8 ucQueueIndex = MHL_CBUS_TOTAL_QUEUE_NUM;
1845 
1846     if(!GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_MSG_COMMAND_FLAG))
1847     {
1848         ucQueueIndex = _mdrv_mhl_GetFreeQueueIndex(pMHLResourcePrivate);
1849 
1850         if(ucQueueIndex < MHL_CBUS_TOTAL_QUEUE_NUM)
1851         {
1852             pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucQueueState = MHL_QUEUE_STATE_PENDING;
1853             pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucLength = 2;
1854             pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucCommand = MSC_MSC_MSG;
1855             pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucData[0] = ucSubCommand;
1856             pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucData[1] = ucKeyCode;
1857 
1858             bInsertFlag = TRUE;
1859         }
1860 
1861         if(bWaitReply && bInsertFlag)
1862         {
1863             _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_WAIT_MSG_RESPONSE, MHL_MSG_WAIT_RESPONSE_TIME);
1864 
1865             SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_MSG_COMMAND_FLAG);
1866         }
1867     }
1868 
1869     return bInsertFlag;
1870 }
1871 
1872 //**************************************************************************
1873 //  [Function Name]:
1874 //                  _mdrv_mhl_CbusSendGetVenderID()
1875 //  [Description]:
1876 //
1877 //  [Arguments]:
1878 //
1879 //  [Return]:
1880 //                  TRUE: Cbus message send successfully
1881 //                  FALSE: Cbus message send fail
1882 //**************************************************************************
_mdrv_mhl_CbusSendGetVenderID(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)1883 MS_BOOL _mdrv_mhl_CbusSendGetVenderID(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
1884 {
1885     MS_BOOL bInsertFlag = FALSE;
1886     MS_U8 ucQueueIndex = _mdrv_mhl_GetFreeQueueIndex(pMHLResourcePrivate);
1887 
1888     if(ucQueueIndex < MHL_CBUS_TOTAL_QUEUE_NUM)
1889     {
1890         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucQueueState = MHL_QUEUE_STATE_PENDING;
1891         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucLength = 0;
1892         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucCommand = MSC_GET_VENDOR_ID;
1893 
1894         bInsertFlag = TRUE;
1895     }
1896 
1897     return bInsertFlag;
1898 }
1899 
1900 //**************************************************************************
1901 //  [Function Name]:
1902 //                  _mdrv_mhl_CbusReadDeviceCapability()
1903 //  [Description]:
1904 //
1905 //  [Arguments]:
1906 //
1907 //  [Return]:
1908 //                  TRUE: Cbus message send successfully
1909 //                  FALSE: Cbus message send fail
1910 //**************************************************************************
_mdrv_mhl_CbusReadDeviceCapability(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 ucBitNumber,MS_BOOL bExtended)1911 MS_BOOL _mdrv_mhl_CbusReadDeviceCapability(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 ucBitNumber, MS_BOOL bExtended)
1912 {
1913     MS_BOOL bInsertFlag = FALSE;
1914     MS_U8 ucQueueIndex = _mdrv_mhl_GetFreeQueueIndex(pMHLResourcePrivate);
1915 
1916     if(ucQueueIndex < MHL_CBUS_TOTAL_QUEUE_NUM)
1917     {
1918         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucQueueState = MHL_QUEUE_STATE_PENDING;
1919         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucLength = 1;
1920         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucCommand = (bExtended? MSC_READ_XDEVCAP : MSC_READ_DEVCAP);
1921         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucData[0] = (bExtended? (0x80 +ucBitNumber) : ucBitNumber);
1922 
1923         bInsertFlag = TRUE;
1924     }
1925 
1926     return bInsertFlag;
1927 }
1928 
1929 //**************************************************************************
1930 //  [Function Name]:
1931 //                  _mdrv_mhl_CbusSendWriteBurst()
1932 //  [Description]:
1933 //
1934 //  [Arguments]:
1935 //
1936 //  [Return]:
1937 //                  TRUE: Cbus message send successfully
1938 //                  FALSE: Cbus message send fail
1939 //**************************************************************************
_mdrv_mhl_CbusSendWriteBurst(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 ucAddress,MS_U8 ucLength,MS_U8 * ucData)1940 MS_BOOL _mdrv_mhl_CbusSendWriteBurst(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 ucAddress, MS_U8 ucLength, MS_U8 *ucData)
1941 {
1942     MS_BOOL bInsertFlag = FALSE;
1943     MS_U8 uctemp = 0;
1944     MS_U8 ucQueueIndex = _mdrv_mhl_GetFreeQueueIndex(pMHLResourcePrivate);
1945 
1946     if(ucQueueIndex < MHL_CBUS_TOTAL_QUEUE_NUM)
1947     {
1948         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucQueueState = MHL_QUEUE_STATE_PENDING;
1949         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucLength = ucLength +1;
1950         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucCommand = MSC_WRITE_BURST;
1951         pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucData[0] = ucAddress;
1952 
1953         for(uctemp = 0; uctemp < ucLength; uctemp++)
1954         {
1955             pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucData[uctemp +1] = ucData[uctemp];
1956         }
1957 
1958         bInsertFlag = TRUE;
1959     }
1960 
1961     return bInsertFlag;
1962 }
1963 
1964 //**************************************************************************
1965 //  [Function Name]:
1966 //                  _mdrv_mhl_CbusSendPathEnable()
1967 //  [Description]:
1968 //                  MHL Cbus set path enable
1969 //  [Arguments]:
1970 //                  TRUE: Enable
1971 //                  FALSE: Disable
1972 //  [Return]:
1973 //
1974 //**************************************************************************
_mdrv_mhl_CbusSendPathEnable(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_BOOL bEnableFlag)1975 void _mdrv_mhl_CbusSendPathEnable(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_BOOL bEnableFlag)
1976 {
1977     MS_BOOL bInsertFlag = _mdrv_mhl_CbusWriteStatusOrSetInt(pMHLResourcePrivate, 0x31, (bEnableFlag ? BIT(3) : 0), FALSE);
1978 
1979     if(bInsertFlag)
1980     {
1981         mhal_mhl_Cbus_SetPathEn(bEnableFlag);
1982 
1983         if(bEnableFlag)
1984         {
1985             SET_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_PATH_EN_FLAG);
1986         }
1987         else
1988         {
1989             CLR_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_PATH_EN_FLAG);
1990         }
1991     }
1992 }
1993 
1994 //**************************************************************************
1995 //  [Function Name]:
1996 //                  _mdrv_mhl_CbusSendDevcapReady()
1997 //  [Description]:
1998 //                  MHL Cbus set capbility ready
1999 //  [Arguments]:
2000 //                  TRUE: Enable
2001 //                  FALSE: Disable
2002 //  [Return]:
2003 //
2004 //**************************************************************************
_mdrv_mhl_CbusSendDevcapReady(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)2005 void _mdrv_mhl_CbusSendDevcapReady(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
2006 {
2007     MS_BOOL bInsertFlag = FALSE;
2008     MS_U8 ucDevcapValue = BIT(0);
2009 
2010     if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_ENHANCE_FLAG))
2011     {
2012         ucDevcapValue = ucDevcapValue| BIT(1);
2013     }
2014 
2015     bInsertFlag = _mdrv_mhl_CbusWriteStatusOrSetInt(pMHLResourcePrivate, 0x30, ucDevcapValue, FALSE);
2016 
2017     if(bInsertFlag)
2018     {
2019         SET_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_DEVCAP_READY_FLAG);
2020     }
2021     else
2022     {
2023         CLR_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_DEVCAP_READY_FLAG);
2024     }
2025 }
2026 
2027 //**************************************************************************
2028 //  [Function Name]:
2029 //                  _mdrv_mhl_CbusSendDevcapChange()
2030 //  [Description]:
2031 //                  MHL Cbus set capbility change
2032 //  [Arguments]:
2033 //                  TRUE: Enable
2034 //                  FALSE: Disable
2035 //  [Return]:
2036 //
2037 //**************************************************************************
_mdrv_mhl_CbusSendDevcapChange(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)2038 void _mdrv_mhl_CbusSendDevcapChange(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
2039 {
2040     MS_BOOL bInsertFlag = _mdrv_mhl_CbusWriteStatusOrSetInt(pMHLResourcePrivate, 0x20, BIT(0), FALSE);
2041 
2042     if(bInsertFlag)
2043     {
2044         SET_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_DEVCAP_CHANGE_FLAG);
2045     }
2046     else
2047     {
2048         CLR_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_DEVCAP_CHANGE_FLAG);
2049     }
2050 }
2051 
2052 //**************************************************************************
2053 //  [Function Name]:
2054 //                  _mdrv_mhl_CbusSendVersionCode()
2055 //  [Description]:
2056 //
2057 //  [Arguments]:
2058 //
2059 //  [Return]:
2060 //
2061 //**************************************************************************
_mdrv_mhl_CbusSendVersionCode(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)2062 void _mdrv_mhl_CbusSendVersionCode(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
2063 {
2064     MS_BOOL bInsertFlag = _mdrv_mhl_CbusWriteStatusOrSetInt(pMHLResourcePrivate, 0x32, pMHLResourcePrivate->ucDeviceCapabilityTable[MHL_CBUS_VERSION], FALSE);
2065 
2066     if(bInsertFlag)
2067     {
2068         SET_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_VERSION_CODE_FLAG);
2069     }
2070     else
2071     {
2072         CLR_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_VERSION_CODE_FLAG);
2073     }
2074 }
2075 
2076 //**************************************************************************
2077 //  [Function Name]:
2078 //                  _mdrv_mhl_CbusSendLinkStatusNormal()
2079 //  [Description]:
2080 //
2081 //  [Arguments]:
2082 //
2083 //  [Return]:
2084 //
2085 //**************************************************************************
_mdrv_mhl_CbusSendLinkStatusNormal(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)2086 void _mdrv_mhl_CbusSendLinkStatusNormal(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
2087 {
2088     MS_BOOL bInsertFlag = FALSE;
2089 
2090     if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_LINK_STATUS_NORMAL_FLAG))
2091     {
2092         bInsertFlag = _mdrv_mhl_CbusWriteStatusOrSetInt(pMHLResourcePrivate, 0x91, 0x02, TRUE);
2093 
2094         if(bInsertFlag)
2095         {
2096             SET_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_LINK_STATUS_NORMAL_FLAG);
2097         }
2098         else
2099         {
2100             CLR_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_LINK_STATUS_NORMAL_FLAG);
2101         }
2102     }
2103 }
2104 
2105 //**************************************************************************
2106 //  [Function Name]:
2107 //                  _mdrv_mhl_GetEnhanceCbusFlag()
2108 //  [Description]
2109 //
2110 //  [Arguments]:
2111 //
2112 //  [Return]:
2113 //
2114 //**************************************************************************
_mdrv_mhl_GetEnhanceCbusFlag(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)2115 MS_BOOL _mdrv_mhl_GetEnhanceCbusFlag(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
2116 {
2117     MS_BOOL bECbusSupport = GET_MHL_CHIP_FLAG(pMHLResourcePrivate->ucChipCapability, MHL_CHIP_ECBUS_ENGINE_SUPPORT_FLAG);
2118 
2119     if(pMHLResourcePrivate->ucDeviceCapabilityTable[MHL_CBUS_VERSION] < 0x30)
2120     {
2121         bECbusSupport = FALSE;
2122     }
2123 
2124     return bECbusSupport;
2125 }
2126 
2127 //**************************************************************************
2128 //  [Function Name]:
2129 //                  _mdrv_mhl_CbusTimerEventProc()
2130 //  [Description]:
2131 //
2132 //  [Arguments]:
2133 //
2134 //  [Return]:
2135 //
2136 //**************************************************************************
_mdrv_mhl_CbusTimerEventProc(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)2137 void _mdrv_mhl_CbusTimerEventProc(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
2138 {
2139     if(GET_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_CBUS_SILENCE_FLAG))
2140     {
2141         CLR_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_CBUS_SILENCE_FLAG);
2142         SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CBUS_SEND_FLAG);
2143 
2144 #if(MHL_DEBUG_TIMER_EVENT)
2145         MDRV_MHL_MSG_INFO("** MHL timer event %d timeout\r\n", MHL_TIMER_EVENT_CBUS_SILENCE);
2146 #endif
2147     }
2148 
2149     if(GET_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_DISPLAY_COMMAND_FLAG))
2150     {
2151         CLR_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_DISPLAY_COMMAND_FLAG);
2152         SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_DISPLAY_COMMAND_ENABLE_FLAG);
2153 
2154 #if(MHL_DEBUG_TIMER_EVENT)
2155         MDRV_MHL_MSG_INFO("** MHL timer event %d timeout\r\n", MHL_TIMER_EVENT_DISPLAY_COMMAND);
2156 #endif
2157     }
2158 
2159     if(GET_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_WAIT_MSG_RESPONSE_FLAG))
2160     {
2161         CLR_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_WAIT_MSG_RESPONSE_FLAG);
2162         CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_MSG_COMMAND_FLAG);
2163 
2164 #if(MHL_DEBUG_TIMER_EVENT)
2165         MDRV_MHL_MSG_INFO("** MHL timer event %d timeout\r\n", MHL_TIMER_EVENT_WAIT_MSG_RESPONSE);
2166 #endif
2167     }
2168 
2169     if(GET_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_RCP_AUTO_RELEASE_FLAG))
2170     {
2171         if(_mdrv_mhl_CbusSendSubMessage(pMHLResourcePrivate, MSC_MSG_RCP, (pMHLResourcePrivate->ucPreRCPKeyCode |BIT(7)), TRUE))
2172         {
2173             CLR_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_RCP_AUTO_RELEASE_FLAG);
2174             CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_RCP_RELEASE_ENABLE_FLAG);
2175 
2176 #if(MHL_DEBUG_TIMER_EVENT)
2177             MDRV_MHL_MSG_INFO("** MHL timer event %d timeout\r\n", MHL_TIMER_EVENT_RCP_AUTO_RELEASE);
2178 #endif
2179         }
2180     }
2181 
2182     if(GET_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_WAIT_WRITE_GRANT_FLAG))
2183     {
2184         CLR_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_WAIT_WRITE_GRANT_FLAG);
2185 
2186         if(pMHLResourcePrivate->ucWriteBurstState == MHL_CBUS_WRITE_BURST_SEND_REQUEST)
2187         {
2188             pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_START;
2189         }
2190 
2191 #if(MHL_DEBUG_TIMER_EVENT)
2192         MDRV_MHL_MSG_INFO("** MHL timer event %d timeout\r\n", MHL_TIMER_EVENT_WAIT_WRITE_GRANT);
2193 #endif
2194     }
2195 
2196     if(GET_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_CHECK_RECEIVE_LOSE_FLAG))
2197     {
2198         CLR_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_CHECK_RECEIVE_LOSE_FLAG);
2199 
2200         if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_RECEIVE_LOSE_FLAG))
2201         {
2202             CLR_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_RECEIVE_LOSE_FLAG);
2203 
2204             if(pMHLResourcePrivate->ucReceiveCounter == 0)
2205             {
2206                 pMHLResourcePrivate->ucReceiveCounter++;
2207             }
2208         }
2209 
2210 #if(MHL_DEBUG_TIMER_EVENT)
2211         MDRV_MHL_MSG_INFO("** MHL timer event %d timeout\r\n", MHL_TIMER_EVENT_CHECK_RECEIVE_LOSE);
2212 #endif
2213     }
2214 
2215     if(GET_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_SEND_MSG_RESPONSE_FLAG))
2216     {
2217         if(_mdrv_mhl_CbusSendSubMessage(pMHLResourcePrivate, pMHLResourcePrivate->ucMSGData[0], pMHLResourcePrivate->ucMSGData[1], FALSE))
2218         {
2219             CLR_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_SEND_MSG_RESPONSE_FLAG);
2220 
2221 #if(MHL_DEBUG_TIMER_EVENT)
2222             MDRV_MHL_MSG_INFO("** MHL timer event %d timeout\r\n", MHL_TIMER_EVENT_SEND_MSG_RESPONSE);
2223 #endif
2224         }
2225     }
2226 
2227     if(GET_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_CHECK_CONTENT_ON_FLAG))
2228     {
2229         CLR_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_CHECK_CONTENT_ON_FLAG);
2230         CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CHECK_CONTENT_ON_FLAG);
2231 
2232 #if(MHL_DEBUG_TIMER_EVENT)
2233         MDRV_MHL_MSG_INFO("** MHL timer event %d timeout\r\n", MHL_TIMER_EVENT_CHECK_CONTENT_ON);
2234 #endif
2235     }
2236 
2237     if(GET_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_AUTO_SWITCH_STOP_FLAG))
2238     {
2239         CLR_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_AUTO_SWITCH_STOP_FLAG);
2240         CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_SWITCH_STOP_FLAG);
2241 
2242 #if(MHL_DEBUG_TIMER_EVENT)
2243         MDRV_MHL_MSG_INFO("** MHL timer event %d timeout\r\n", MHL_TIMER_EVENT_AUTO_SWITCH_STOP);
2244 #endif
2245     }
2246 
2247     if(GET_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_WAIT_ECBUS_LOCK_FLAG))
2248     {
2249         CLR_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_WAIT_ECBUS_LOCK_FLAG);
2250 
2251         if(pMHLResourcePrivate->ucECbusState != MHL_ECBUS_STATE_STABLE_POLLING)
2252         {
2253             if(!(pMHLResourcePrivate->ucBISTModeState == MHL_CBUS_BIST_ECBUS_SWITCH)) // Not BIST mode
2254             {
2255                 pMHLResourcePrivate->ucECbusState = MHL_ECBUS_STATE_UNLOCK_RESET;
2256             }
2257         }
2258 
2259 #if(MHL_DEBUG_TIMER_EVENT)
2260         MDRV_MHL_MSG_INFO("** MHL timer event %d timeout\r\n", MHL_TIMER_EVENT_WAIT_ECBUS_LOCK);
2261 #endif
2262     }
2263 
2264     if(GET_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_AUTO_EQ_PROCESS_FLAG))
2265     {
2266         CLR_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_AUTO_EQ_PROCESS_FLAG);
2267         SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_EQ_FUNCTION_FLAG);
2268 
2269 #if(MHL_DEBUG_TIMER_EVENT)
2270         MDRV_MHL_MSG_INFO("** MHL timer event %d timeout\r\n", MHL_TIMER_EVENT_AUTO_EQ_PROCESS);
2271 #endif
2272     }
2273 
2274     if(GET_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_BIST_PROCESS_FLAG))
2275     {
2276         CLR_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_BIST_PROCESS_FLAG);
2277 
2278         if(pMHLResourcePrivate->ucBISTModeState == MHL_CBUS_BIST_ECBUS_SWITCH)
2279         {
2280             pMHLResourcePrivate->ucBISTModeState = MHL_CBUS_BIST_EVENT_FINISH;
2281         }
2282 
2283 #if(MHL_DEBUG_TIMER_EVENT)
2284         MDRV_MHL_MSG_INFO("** MHL timer event %d timeout\r\n", MHL_TIMER_EVENT_BIST_PROCESS);
2285 #endif
2286     }
2287 
2288     if(GET_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_TX_QUEUE_FREEZE_FLAG))
2289     {
2290         CLR_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_TX_QUEUE_FREEZE_FLAG);
2291         CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CBUS_TX_QUEUE_FREEZE_FLAG);
2292 
2293 #if(MHL_DEBUG_TIMER_EVENT)
2294         MDRV_MHL_MSG_INFO("** MHL timer event %d timeout\r\n", MHL_TIMER_EVENT_TX_QUQUE_FREEZE);
2295 #endif
2296     }
2297 
2298     if(GET_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_POWER_ON_PATCH_FLAG))
2299     {
2300         CLR_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, MHL_TIMER_POWER_ON_PATCH_FLAG);
2301 
2302         if(pMHLResourcePrivate->ucPowerOnPatchState == MHL_POWER_ON_PATCH_STATE_WAIT_PATCH_ON)
2303         {
2304             pMHLResourcePrivate->ucPowerOnPatchState = MHL_POWER_ON_PATCH_STATE_PATCH_ON;
2305         }
2306         else if(pMHLResourcePrivate->ucPowerOnPatchState == MHL_POWER_ON_PATCH_STATE_WAIT_PATCH_OFF)
2307         {
2308             pMHLResourcePrivate->ucPowerOnPatchState = MHL_POWER_ON_PATCH_STATE_PATCH_OFF;
2309         }
2310 
2311 #if(MHL_DEBUG_TIMER_EVENT)
2312         MDRV_MHL_MSG_INFO("** MHL timer event %d timeout\r\n", MHL_TIMER_EVENT_POWER_ON_PATCH);
2313 #endif
2314     }
2315 }
2316 
2317 //**************************************************************************
2318 //  [Function Name]:
2319 //                  _mdrv_mhl_TimerHandler()
2320 //  [Description]
2321 //
2322 //  [Arguments]:
2323 //
2324 //  [Return]:
2325 //
2326 //**************************************************************************
_mdrv_mhl_TimerHandler(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)2327 void _mdrv_mhl_TimerHandler(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
2328 {
2329     MS_U8 ucTimerEvent = 0;
2330     MS_U32 ulTimerInterval = 0;
2331     MS_U32 ulTimerTick = (MsOS_GetSystemTime()) %CBUS_TIMER_CONTROL_MASK;
2332 
2333     if(ulTimerTick != pMHLResourcePrivate->ulCurrentTimerTick)
2334     {
2335         ulTimerInterval = (ulTimerTick +CBUS_TIMER_CONTROL_MASK -pMHLResourcePrivate->ulCurrentTimerTick) %CBUS_TIMER_CONTROL_MASK;
2336 
2337         if(ulTimerInterval < 50)
2338         {
2339             for(ucTimerEvent = 0; ucTimerEvent < MHL_TIMER_EVENT_MASK; ucTimerEvent++)
2340             {
2341                 if(pMHLResourcePrivate->stTimerEventInfo[ucTimerEvent].bEnableFlag)
2342                 {
2343                     if(pMHLResourcePrivate->stTimerEventInfo[ucTimerEvent].usTimerTick > ulTimerInterval)
2344                     {
2345                         pMHLResourcePrivate->stTimerEventInfo[ucTimerEvent].usTimerTick = pMHLResourcePrivate->stTimerEventInfo[ucTimerEvent].usTimerTick -ulTimerInterval;
2346                     }
2347                     else
2348                     {
2349                         pMHLResourcePrivate->stTimerEventInfo[ucTimerEvent].usTimerTick = 0;
2350 
2351                         SET_MHL_TIMER_FLAG(pMHLResourcePrivate->ulTimerIndex, BIT(ucTimerEvent));
2352 
2353                         pMHLResourcePrivate->stTimerEventInfo[ucTimerEvent].bEnableFlag = FALSE;
2354                     }
2355                 }
2356             }
2357         }
2358 
2359         pMHLResourcePrivate->ulCurrentTimerTick = ulTimerTick;
2360     }
2361 
2362     if(pMHLResourcePrivate->ulTimerIndex > 0)
2363     {
2364         _mdrv_mhl_CbusTimerEventProc(pMHLResourcePrivate);
2365     }
2366 }
2367 
2368 //**************************************************************************
2369 //  [Function Name]:
2370 //                  _mdrv_mhl_ECbusStateHandler()
2371 //  [Description]
2372 //
2373 //  [Arguments]:
2374 //
2375 //  [Return]:
2376 //
2377 //**************************************************************************
_mdrv_mhl_ECbusStateHandler(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)2378 void _mdrv_mhl_ECbusStateHandler(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
2379 {
2380     MS_U8 ucECbusEvent = MHL_ECBUS_EVENT_NONE;
2381     MS_U8 ucECbusStatusFlag = mhal_mhl_GetECbusStatusFlag();
2382 
2383     if((pMHLResourcePrivate->stSignalStatusInfo.ucECbusTrainState < MHL_ECBUS_STATE_FAIL) && (pMHLResourcePrivate->stSignalStatusInfo.ucECbusTrainState >= MHL_ECBUS_STATE_SOURCE_ACTIVE))
2384     {
2385         ucECbusStatusFlag |= MHL_ECBUS_STATUS_TRAINING_PASS;
2386     }
2387 
2388     switch(pMHLResourcePrivate->ucECbusState)
2389     {
2390         case MHL_ECBUS_STATE_RECEIVE_MODE_UP:
2391             if(_mdrv_mhl_CbusSendSubMessage(pMHLResourcePrivate, MSC_MSG_RAPK, 0x00, FALSE))
2392             {
2393                 // Freeze Tx queue, not allow any Cbus command insert Tx queue
2394                 SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CBUS_TX_QUEUE_FREEZE_FLAG);
2395 
2396                 pMHLResourcePrivate->ucECbusState = MHL_ECBUS_STATE_TRIGGER_MODE_UP;
2397 
2398                 ucECbusEvent = MHL_ECBUS_EVENT_PREPARE_MODE_UP;
2399 
2400                 MDRV_MHL_MSG_INFO("** MHL receive mode up !! port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
2401             }
2402 
2403             break;
2404 
2405         case MHL_ECBUS_STATE_BIST_MODE_UP:
2406             // Freeze Tx queue, not allow any Cbus command insert Tx queue
2407             SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CBUS_TX_QUEUE_FREEZE_FLAG);
2408 
2409             pMHLResourcePrivate->ucECbusState = MHL_ECBUS_STATE_TRIGGER_MODE_UP;
2410 
2411             ucECbusEvent = MHL_ECBUS_EVENT_PREPARE_MODE_UP;
2412 
2413             MDRV_MHL_MSG_INFO("** MHL BIST trigger mode up !! port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
2414 
2415             break;
2416 
2417         case MHL_ECBUS_STATE_TRIGGER_MODE_UP:
2418             // Wait Tx queue empty, then trigger eCbus mode up
2419             if(_mdrv_mhl_GetCbusQueueIndex(pMHLResourcePrivate) == MHL_CBUS_TOTAL_QUEUE_NUM)
2420             {
2421                 pMHLResourcePrivate->ucECbusState = MHL_ECBUS_STATE_PROCESS_MODE_UP;
2422                 pMHLResourcePrivate->stSignalStatusInfo.bECbusEnableFlag = TRUE;
2423 
2424                 ucECbusEvent = MHL_ECBUS_EVENT_MODE_UP_PROCESS;
2425 
2426                 _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_WAIT_ECBUS_LOCK, MHL_WAIT_ECBUS_LOCK_TIME);
2427 
2428                 MDRV_MHL_MSG_INFO("** MHL Tx queue empty trigger mode up !! port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
2429             }
2430 
2431             break;
2432 
2433         case MHL_ECBUS_STATE_PROCESS_MODE_UP:
2434             if(ucECbusStatusFlag &MHL_ECBUS_STATUS_SLOT_SYNC_DONE)
2435             {
2436                 CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CBUS_TX_QUEUE_FREEZE_FLAG);
2437                 SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_EQ_FUNCTION_FLAG);
2438                 SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CBUS1_FUNCTION_FLAG);
2439 
2440                 pMHLResourcePrivate->ucECbusState = MHL_ECBUS_STATE_MODE_UP_CLOCK_LOCK;
2441 
2442                 MDRV_MHL_MSG_INFO("** MHL Cbus1 command enable !! port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
2443             }
2444 
2445             break;
2446 
2447         case MHL_ECBUS_STATE_MODE_UP_CLOCK_LOCK:
2448             if(ucECbusStatusFlag &MHL_ECBUS_STATUS_EMSC_SYNC_DONE)
2449             {
2450                 SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_EMSC_FUNCTION_FLAG);
2451 
2452                 pMHLResourcePrivate->ucECbusState = MHL_ECBUS_STATE_STABLE_POLLING;
2453 
2454                 MDRV_MHL_MSG_INFO("** MHL eMSC command enable !! port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
2455 
2456                 if(GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_COMMUNICATE_BUSY_FLAG))
2457                 {
2458                     CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_COMMUNICATE_BUSY_FLAG);
2459                 }
2460             }
2461 
2462             break;
2463 
2464         case MHL_ECBUS_STATE_STABLE_POLLING:
2465             if((ucECbusStatusFlag &(MHL_ECBUS_STATUS_TRAINING_PASS)) == 0)
2466             {
2467                 pMHLResourcePrivate->ucECbusState = MHL_ECBUS_STATE_NONE;
2468 
2469                 ucECbusEvent = MHL_ECBUS_EVENT_STUCK_TO_LOW;
2470 
2471                 MDRV_MHL_MSG_INFO("** MHL eCbus lose lock to reset !! port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
2472             }
2473             else if(ucECbusStatusFlag &MHL_ECBUS_STATUS_RETRY_TIMEOUT)
2474             {
2475                 pMHLResourcePrivate->ucECbusState = MHL_ECBUS_STATE_NONE;
2476 
2477                 ucECbusEvent = MHL_ECBUS_EVENT_STUCK_TO_LOW;
2478             }
2479             else
2480             {
2481                 ucECbusEvent = MHL_ECBUS_EVENT_ECBUS_COMMAND_PARSING;
2482             }
2483 
2484             break;
2485 
2486         case MHL_ECBUS_STATE_UNLOCK_RESET:
2487             pMHLResourcePrivate->ucECbusState = MHL_ECBUS_STATE_NONE;
2488 
2489             ucECbusEvent = MHL_ECBUS_EVENT_STUCK_TO_LOW;
2490 
2491             MDRV_MHL_MSG_INFO("** MHL eCbus training timeout to reset !! port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
2492 
2493             break;
2494 
2495         case MHL_ECBUS_STATE_RECEIVE_MODE_DOWN:
2496             if(_mdrv_mhl_CbusSendSubMessage(pMHLResourcePrivate, MSC_MSG_RAPK, 0x00, FALSE))
2497             {
2498                 // Freeze Tx queue, not allow any Cbus command insert Tx queue
2499                 SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CBUS_TX_QUEUE_FREEZE_FLAG);
2500 
2501                 pMHLResourcePrivate->ucECbusState = MHL_ECBUS_STATE_TRIGGER_MODE_DOWN;
2502 
2503                 MDRV_MHL_MSG_INFO("** MHL receive mode down !! port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
2504             }
2505 
2506             break;
2507 
2508         case MHL_ECBUS_STATE_BIST_MODE_DOWN:
2509             // Freeze Tx queue, not allow any Cbus command insert Tx queue
2510             SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CBUS_TX_QUEUE_FREEZE_FLAG);
2511 
2512             pMHLResourcePrivate->ucECbusState = MHL_ECBUS_STATE_TRIGGER_MODE_DOWN;
2513 
2514             MDRV_MHL_MSG_INFO("** MHL BIST trigger mode down !! port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
2515 
2516             break;
2517 
2518         case MHL_ECBUS_STATE_TRIGGER_MODE_DOWN:
2519             // Wait Tx queue empty, then trigger eCbus mode up
2520             if(_mdrv_mhl_GetCbusQueueIndex(pMHLResourcePrivate) == MHL_CBUS_TOTAL_QUEUE_NUM)
2521             {
2522                 pMHLResourcePrivate->ucECbusState = MHL_ECBUS_STATE_PROCESS_MODE_DOWN;
2523                 pMHLResourcePrivate->stSignalStatusInfo.bECbusEnableFlag = FALSE;
2524 
2525                 ucECbusEvent = MHL_ECBUS_EVENT_MODE_DOWN_PROCESS;
2526 
2527                 MDRV_MHL_MSG_INFO("** MHL Tx queue empty trigger mode down !! port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
2528             }
2529 
2530             break;
2531 
2532         default:
2533 
2534             break;
2535     };
2536 
2537     if(pMHLResourcePrivate->ucECbusTrainState != pMHLResourcePrivate->stSignalStatusInfo.ucECbusTrainState)
2538     {
2539         pMHLResourcePrivate->ucECbusTrainState = pMHLResourcePrivate->stSignalStatusInfo.ucECbusTrainState;
2540 
2541         MDRV_MHL_MSG_INFO("** MHL eCbus state %x\r\n", pMHLResourcePrivate->ucECbusTrainState);
2542     }
2543 
2544     mhal_mhl_ECbusEventProc(pMHLResourcePrivate->ucMHLSupportPath, ucECbusEvent, pMHLResourcePrivate->stSignalStatusInfo.bBISTEnableFlag, &(pMHLResourcePrivate->stBISTParameterInfo));
2545 }
2546 
2547 //**************************************************************************
2548 //  [Function Name]:
2549 //                  _mdrv_mhl_DisplayCommandCheckFlag()
2550 //  [Description]
2551 //
2552 //  [Arguments]:
2553 //
2554 //  [Return]:
2555 //
2556 //**************************************************************************
_mdrv_mhl_DisplayCommandCheckFlag(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)2557 MS_BOOL _mdrv_mhl_DisplayCommandCheckFlag(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
2558 {
2559     MS_BOOL bCheckFlag = TRUE;
2560     MS_U16 usDisplayCheck = (pMHLResourcePrivate->usDisplayIndex) >> MHL_CBUS_DISPLAY_MASK_SHIFT;
2561 
2562     if(((usDisplayCheck &MHL_CBUS_DISPLAY_MASK) ^MHL_CBUS_DISPLAY_MASK) > 0)
2563     {
2564         bCheckFlag = FALSE;
2565     }
2566 
2567     return bCheckFlag;
2568 }
2569 
2570 //**************************************************************************
2571 //  [Function Name]:
2572 //                  _mdrv_mhl_PowerOnPatchProc()
2573 //  [Description]
2574 //
2575 //  [Arguments]:
2576 //
2577 //  [Return]:
2578 //
2579 //**************************************************************************
_mdrv_mhl_PowerOnPatchProc(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)2580 void _mdrv_mhl_PowerOnPatchProc(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
2581 {
2582     switch(pMHLResourcePrivate->ucPowerOnPatchState)
2583     {
2584         case MHL_POWER_ON_PATCH_STATE_START:
2585             _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_POWER_ON_PATCH, MHL_WAIT_PATCH_ON_TIME);
2586 
2587             pMHLResourcePrivate->ucPowerOnPatchState = MHL_POWER_ON_PATCH_STATE_WAIT_PATCH_ON;
2588 
2589             break;
2590 
2591         case MHL_POWER_ON_PATCH_STATE_PATCH_ON:
2592             _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_POWER_ON_PATCH, MHL_WAIT_PATCH_OFF_TIME);
2593 
2594             pMHLResourcePrivate->ucPowerOnPatchState = MHL_POWER_ON_PATCH_STATE_WAIT_PATCH_OFF;
2595 
2596             mhal_mhl_ECbusEventProc(pMHLResourcePrivate->ucMHLSupportPath, MHL_ECBUS_EVENT_POWER_ON_PATCH_ON, pMHLResourcePrivate->stSignalStatusInfo.bBISTEnableFlag, &(pMHLResourcePrivate->stBISTParameterInfo));
2597 
2598             MDRV_MHL_MSG_INFO("** MHL power on patch on !! port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
2599 
2600             break;
2601 
2602         case MHL_POWER_ON_PATCH_STATE_PATCH_OFF:
2603             pMHLResourcePrivate->ucPowerOnPatchState = MHL_POWER_ON_PATCH_STATE_DONE;
2604 
2605             mhal_mhl_ECbusEventProc(pMHLResourcePrivate->ucMHLSupportPath, MHL_ECBUS_EVENT_POWER_ON_PATCH_OFF, pMHLResourcePrivate->stSignalStatusInfo.bBISTEnableFlag, &(pMHLResourcePrivate->stBISTParameterInfo));
2606 
2607             MDRV_MHL_MSG_INFO("** MHL power on patch off !! port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
2608 
2609             break;
2610 
2611         case MHL_POWER_ON_PATCH_STATE_DONE:
2612             pMHLResourcePrivate->ucPowerOnPatchState = MHL_POWER_ON_PATCH_STATE_NONE;
2613             break;
2614 
2615         default:
2616 
2617             break;
2618     };
2619 }
2620 
2621 //**************************************************************************
2622 //  [Function Name]:
2623 //                  _mdrv_mhl_CheckStatusPolling()
2624 //  [Description]
2625 //
2626 //  [Arguments]:
2627 //
2628 //  [Return]:
2629 //
2630 //**************************************************************************
_mdrv_mhl_CheckStatusPolling(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)2631 void _mdrv_mhl_CheckStatusPolling(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
2632 {
2633     MS_BOOL bSourceChangeFlag = FALSE;
2634     MS_U8 ucCurrentHDMIPort = mhal_mhl_GetInputPort();
2635 
2636     // For cable detect
2637     if(mhal_mhl_CableDetect(pMHLResourcePrivate->ucMHLSupportPath)) // Cable plugged
2638     {
2639         if(!GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CABLE_PLUG_FLAG))
2640         {
2641             mhal_mhl_CablePlugProc(pMHLResourcePrivate->ucMHLSupportPath, &(pMHLResourcePrivate->stSignalStatusInfo));
2642 
2643             MDRV_MHL_MSG_INFO("** MHL Cable plugged!! port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
2644 
2645             SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CABLE_PLUG_FLAG);
2646         }
2647 
2648         if(!GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_SOURCE_CHANGE_FLAG))
2649         {
2650             SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_SOURCE_CHANGE_FLAG);
2651         }
2652 
2653         // For Cbus
2654         if(mhal_mhl_CbusStatus() == 0x03) // Cbus connect
2655         {
2656             if(!GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_CONNECT_FLAG))
2657             {
2658                 mhal_mhl_CbusConnectProc(pMHLResourcePrivate->ucMHLSupportPath);
2659 
2660                 pMHLResourcePrivate->ucTMDSClockMode = MHL_PHY_CLOCK_NORMAL_24BIT;
2661 
2662                 _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_DISPLAY_COMMAND, MHL_CBUS_CONNECT_HOLD_TIME);
2663 
2664                 CLR_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_DISPLAY_COMMAND_ENABLE_FLAG);
2665 
2666                 _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_CBUS_SILENCE, MHL_CBUS_CONNECT_SILENCE_TIME);
2667 
2668                 CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CBUS_SEND_FLAG);
2669 
2670                 if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CHECK_CONTENT_ENABLE_FLAG))
2671                 {
2672                     _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_CHECK_CONTENT_ON, MHL_CHECK_CONTENT_ON_TIME);
2673 
2674                     SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CHECK_CONTENT_ON_FLAG);
2675                     SET_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_PATH_EN_FLAG);
2676                 }
2677 
2678                 MDRV_MHL_MSG_INFO("** MHL Cbus connected~~ ^Q^ port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
2679 
2680                 SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_CONNECT_FLAG);
2681             }
2682 
2683             if(GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_ECBUS_FUNCTION_FLAG))
2684             {
2685                 _mdrv_mhl_ECbusStateHandler(pMHLResourcePrivate);
2686 
2687 #if(MHL3_AUTO_EQ_ENABLE)
2688                 if(GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_EQ_FUNCTION_FLAG))
2689                 {
2690                     CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_EQ_FUNCTION_FLAG);
2691 
2692                     mhal_mhl_AutoEQEventProc(pMHLResourcePrivate->ucMHLSupportPath, &(pMHLResourcePrivate->stSignalStatusInfo));
2693 
2694                     _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_AUTO_EQ_PROCESS, MHL_AUTO_EQ_PROCESS_TIME);
2695                 }
2696 #endif
2697             }
2698             else if(GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_COMMUNICATE_BUSY_FLAG))
2699             {
2700                 CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_COMMUNICATE_BUSY_FLAG);
2701             }
2702 
2703             mhal_mhl_CDRModeMonitor(pMHLResourcePrivate->ucMHLSupportPath, _mdrv_mhl_DisplayCommandCheckFlag(pMHLResourcePrivate), &(pMHLResourcePrivate->stSignalStatusInfo));
2704         }
2705         else // Cbus disconnection
2706         {
2707             if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_CONNECT_FLAG))
2708             {
2709                 mhal_mhl_CbusStucktoLowProc(pMHLResourcePrivate->ucMHLSupportPath);
2710 
2711                 mhal_mhl_CDRModeMonitor(pMHLResourcePrivate->ucMHLSupportPath, FALSE, &(pMHLResourcePrivate->stSignalStatusInfo));
2712 
2713                 _mdrv_mhl_ClearCbusFlag(pMHLResourcePrivate, MHL_CLEAR_CONNECT_LOSS_FLAG);
2714 
2715                 if(pMHLResourcePrivate->ucTMDSClockMode == MHL_PHY_CLOCK_PACKET_PIXEL)
2716                 {
2717                     mhal_mhl_ClockModeSwitchProc(pMHLResourcePrivate->ucMHLSupportPath, FALSE, &(pMHLResourcePrivate->stSignalStatusInfo));
2718 
2719                     pMHLResourcePrivate->ucTMDSClockMode = MHL_PHY_CLOCK_NORMAL_24BIT;
2720                 }
2721 
2722                 MDRV_MHL_MSG_INFO("** MHL Cbus stuck to low @@ port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
2723 
2724                 CLR_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_CONNECT_FLAG);
2725             }
2726         }
2727     }
2728     else // Cable unplugged
2729     {
2730         if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CABLE_PLUG_FLAG))
2731         {
2732             mhal_mhl_CableRemoveProc(pMHLResourcePrivate->ucMHLSupportPath, &(pMHLResourcePrivate->stSignalStatusInfo));
2733 
2734             mhal_mhl_ECbusEventProc(pMHLResourcePrivate->ucMHLSupportPath, MHL_ECBUS_EVENT_STUCK_TO_LOW, pMHLResourcePrivate->stSignalStatusInfo.bBISTEnableFlag, &(pMHLResourcePrivate->stBISTParameterInfo));
2735 
2736             _mdrv_mhl_ClearCbusFlag(pMHLResourcePrivate, MHL_CLEAR_CABLE_LOSS_FLAG);
2737 
2738             MDRV_MHL_MSG_INFO("** MHL Cable remove~~~ port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
2739 
2740             CLR_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CABLE_PLUG_FLAG);
2741 
2742             if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_CONNECT_FLAG))
2743             {
2744                 CLR_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_CONNECT_FLAG);
2745             }
2746         }
2747 
2748         mhal_mhl_Accumulator_Clr(pMHLResourcePrivate->ucMHLSupportPath);
2749     }
2750 
2751     // For source change
2752     if(pMHLResourcePrivate->ucCurrentHDMIPort != ucCurrentHDMIPort)
2753     {
2754         if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_SOURCE_CHANGE_FLAG))
2755         {
2756             if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CABLE_PLUG_FLAG))
2757             {
2758                 bSourceChangeFlag = TRUE;
2759             }
2760             else if(!mhal_mhl_CheckInputPort(pMHLResourcePrivate->ucMHLSupportPath))
2761             {
2762                 bSourceChangeFlag = TRUE;
2763             }
2764 
2765             if(bSourceChangeFlag)
2766             {
2767                 mhal_mhl_SourceChangeProc(pMHLResourcePrivate->ucMHLSupportPath, pMHLResourcePrivate->stSignalStatusInfo.ucMainLinkRate);
2768 
2769                 if(pMHLResourcePrivate->ucTMDSClockMode == MHL_PHY_CLOCK_PACKET_PIXEL)
2770                 {
2771                     mhal_mhl_ClockModeSwitchProc(pMHLResourcePrivate->ucMHLSupportPath, TRUE, &(pMHLResourcePrivate->stSignalStatusInfo));
2772                 }
2773             }
2774 
2775             CLR_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_SOURCE_CHANGE_FLAG);
2776         }
2777 
2778         pMHLResourcePrivate->ucCurrentHDMIPort = ucCurrentHDMIPort;
2779     }
2780 
2781     // Normal Cbus engine
2782     if(!GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_NORMAL_FLAG))
2783     {
2784         mhal_mhl_CbusIsolate(pMHLResourcePrivate->ucMHLSupportPath, FALSE);
2785         mhal_mhl_VbusCharge(pMHLResourcePrivate->ucMHLSupportPath, VBUS_HW_DETECT);
2786         mhal_mhl_CbusFloating(FALSE);
2787 
2788         _mdrv_mhl_ClearCbusFlag(pMHLResourcePrivate, MHL_CLEAR_CABLE_LOSS_FLAG);
2789 
2790         SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_NORMAL_FLAG);
2791 
2792         pMHLResourcePrivate->ucPowerOnPatchState = MHL_POWER_ON_PATCH_STATE_START;
2793     }
2794 
2795     _mdrv_mhl_PowerOnPatchProc(pMHLResourcePrivate);
2796 }
2797 
2798 //**************************************************************************
2799 //  [Function Name]:
2800 //                  _mdrv_mhl_GetCbusReceiveMSC()
2801 //  [Description]:
2802 //
2803 //  [Arguments]:
2804 //
2805 //  [Return]:
2806 //
2807 //**************************************************************************
_mdrv_mhl_GetCbusReceiveMSC(MS_U8 * ucReceiveMSC)2808 MS_BOOL _mdrv_mhl_GetCbusReceiveMSC(MS_U8 *ucReceiveMSC)
2809 {
2810     MS_BOOL bGetMSCFlag = FALSE;
2811     MS_U8 uctemp = 0;
2812     MS_U16 usLength = 0;
2813     MS_U16 usValue = 0;
2814 
2815     usLength = (mhal_mhl_GetSRAMReceiveData()) &BMASK(6:0); // Get MSC command length
2816 
2817     if(usLength > 0)
2818     {
2819         ucReceiveMSC[0] = usLength -1;
2820 
2821 #if(MHL_DEBUG_RECEIVE_MSC)
2822         MDRV_MHL_MSG_DEBUG(" MHL receive MSG length = %x\r\n", (usLength &BMASK(7:0)));
2823 #endif
2824 
2825         usValue = mhal_mhl_GetSRAMReceiveData(); // Get MSC command
2826 
2827         if(usValue &BIT(8))
2828         {
2829             ucReceiveMSC[1] = usValue &BMASK(7:0);
2830 
2831 #if(MHL_DEBUG_RECEIVE_MSC)
2832             MDRV_MHL_MSG_DEBUG(" MHL receive MSG command = %x\r\n", (usValue &BMASK(7:0)));
2833 #endif
2834         }
2835         else
2836         {
2837             ucReceiveMSC[0] = 2;
2838             ucReceiveMSC[1] = MSC_ACK;
2839             ucReceiveMSC[2] = usValue &BMASK(7:0);
2840 
2841 #if(MHL_DEBUG_RECEIVE_MSC)
2842             MDRV_MHL_MSG_DEBUG(" MHL receive MSG data = %x\r\n", (usValue &BMASK(7:0)));
2843 #endif
2844         }
2845 
2846         for(uctemp = 0; uctemp < (usLength -2); uctemp++)
2847         {
2848             usValue = mhal_mhl_GetSRAMReceiveData(); // Get MSC data
2849 
2850             if((usValue &BIT(8)) == BIT(8)) // Command in data error happen
2851             {
2852                 // For CTS 6.3.6.5 entry 4
2853                 if((usValue &BMASK(7:0)) == MSC_ABORT)
2854                 {
2855                     ucReceiveMSC[1] = usValue &BMASK(7:0);
2856                 }
2857                 else if((usValue &BMASK(7:0)) == MSC_EOF)
2858                 {
2859                     // EOF is command but it is not error
2860                     ucReceiveMSC[uctemp +2] = usValue &BMASK(7:0);
2861                 }
2862                 else // Ignort command
2863                 {
2864                     ucReceiveMSC[1] = MSC_NONE;
2865                 }
2866 
2867 #if(MHL_DEBUG_RECEIVE_MSC)
2868                 MDRV_MHL_MSG_DEBUG(" MHL receive MSG command = %x\r\n", (usValue &BMASK(7:0)));
2869 #endif
2870             }
2871             else
2872             {
2873                 ucReceiveMSC[uctemp +2] = usValue &BMASK(7:0);
2874 
2875 #if(MHL_DEBUG_RECEIVE_MSC)
2876                 MDRV_MHL_MSG_DEBUG(" MHL receive MSG data = %x\r\n", (usValue &BMASK(7:0)));
2877 #endif
2878             }
2879         }
2880 
2881         bGetMSCFlag = TRUE;
2882     }
2883 
2884     return bGetMSCFlag;
2885 }
2886 
2887 //**************************************************************************
2888 //  [Function Name]:
2889 //                  _mdrv_mhl_SetReceiveCaseFlag()
2890 //  [Description]:
2891 //
2892 //  [Arguments]:
2893 //
2894 //  [Return]:
2895 //
2896 //**************************************************************************
_mdrv_mhl_SetReceiveCaseFlag(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 * ucReceiveMSC)2897 void _mdrv_mhl_SetReceiveCaseFlag(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 *ucReceiveMSC)
2898 {
2899     MS_U8 uctemp = 0;
2900 
2901     switch(ucReceiveMSC[1])
2902     {
2903         case MSC_ACK:
2904             SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_ACK_FLAG);
2905 
2906             if(ucReceiveMSC[0] == 2) // Command length = 2
2907             {
2908                 if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_ASK_DATA_FLAG))
2909                 {
2910                     CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_ASK_DATA_FLAG);
2911                     SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_ASK_FINISH_FLAG);
2912 
2913                     pMHLResourcePrivate->ucAskData = ucReceiveMSC[2];
2914                 }
2915             }
2916 
2917             break;
2918 
2919         case MSC_ABORT:
2920             SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_ABORT_FLAG);
2921             break;
2922 
2923         case MSC_MSC_MSG:
2924             SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_MSG_FLAG);
2925 
2926             pMHLResourcePrivate->ucMSGData[0] = ucReceiveMSC[2];
2927             pMHLResourcePrivate->ucMSGData[1] = ucReceiveMSC[3];
2928             pMHLResourcePrivate->usMSGKeyInfo = (MS_U16)(ucReceiveMSC[2] << 8)| ucReceiveMSC[3];
2929 
2930             break;
2931 
2932         case MSC_WRITE_STAT_OR_SET_INT:
2933             if(ucReceiveMSC[2] == 0x31) // Switch to PP mode or 24 bit mode
2934             {
2935                 if((ucReceiveMSC[3] & BIT(3)) == BIT(3))
2936                 {
2937                     //SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_PATH_EN_FLAG);
2938                 }
2939 
2940                 if((ucReceiveMSC[3] & BIT(4)) == BIT(4))
2941                 {
2942                     //SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_MUTED_FLAG);
2943                 }
2944 
2945                 ucReceiveMSC[3] &= BMASK(2:0);
2946 
2947                 if(ucReceiveMSC[3] == MHL_PHY_CLOCK_PACKET_PIXEL)
2948                 {
2949                     SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_PP_MODE_FLAG);
2950                     CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_24BIT_MODE_FLAG);
2951                 }
2952                 else if(ucReceiveMSC[3] == MHL_PHY_CLOCK_NORMAL_24BIT)
2953                 {
2954                     SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_24BIT_MODE_FLAG);
2955                     CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_PP_MODE_FLAG);
2956                 }
2957             }
2958 
2959             if(ucReceiveMSC[2] == 0x30)
2960             {
2961                 if((ucReceiveMSC[3] & BIT(0)) == BIT(0)) // Devcap ready
2962                 {
2963                     SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_DEVCAP_FLAG);
2964                 }
2965 
2966                 if((ucReceiveMSC[3] & BIT(1)) == BIT(1)) // Extended device capability support
2967                 {
2968                     if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_ENHANCE_FLAG))
2969                     {
2970                         SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_XDEVCAP_SUPPORT_FLAG);
2971                     }
2972                 }
2973             }
2974 
2975             if((ucReceiveMSC[2] == 0x32) && (ucReceiveMSC[3] >= 0x30)) // Source support MHL3
2976             {
2977                 SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_MHL3_VERSION_FLAG);
2978             }
2979 
2980             if(ucReceiveMSC[2] == 0x20)
2981             {
2982                 if((ucReceiveMSC[3] & BIT(0)) == BIT(0)) // Devcap change
2983                 {
2984                     SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_DEVCAP_FLAG);
2985 
2986                     if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_ENHANCE_FLAG))
2987                     {
2988                         SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_XDEVCAP_SUPPORT_FLAG);
2989                     }
2990                 }
2991 
2992                 if((ucReceiveMSC[3] & BIT(1)) == BIT(1)) // Scratchpad register change
2993                 {
2994                     SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_DSCR_CHANGE_FLAG);
2995                 }
2996 
2997                 if((ucReceiveMSC[3] & BIT(2)) == BIT(2)) // Burst write request
2998                 {
2999                     //SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_WRITE_REQUEST_FLAG);
3000                 }
3001 
3002                 if((ucReceiveMSC[3] & BIT(3)) == BIT(3)) // Burst write grant
3003                 {
3004                     SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_WRITE_GRANT_FLAG);
3005                 }
3006 
3007                 if((ucReceiveMSC[3] & BIT(4)) == BIT(4)) // 3D request
3008                 {
3009                     SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_3D_REQ_FLAG);
3010                 }
3011 
3012                 if((ucReceiveMSC[3] & BIT(5)) == BIT(5)) // Feature request
3013                 {
3014                     SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_FEATURE_REQUEST_FLAG);
3015                 }
3016 
3017                 if((ucReceiveMSC[3] & BIT(6)) == BIT(6)) // Feature complete
3018                 {
3019                     SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_FEATURE_COMPLETE_FLAG);
3020                 }
3021             }
3022 
3023             break;
3024 
3025         case MSC_WRITE_XSTAT:
3026             if(ucReceiveMSC[2] == 0x90) // eCbus mode
3027             {
3028                 SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_ECBUS_MODE_FLAG);
3029             }
3030 
3031             if(ucReceiveMSC[2] == 0x92) // Link rate
3032             {
3033                 SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_LINK_RATE_FLAG);
3034 
3035                 pMHLResourcePrivate->stSignalStatusInfo.ucMainLinkRate = ucReceiveMSC[3];
3036             }
3037 
3038             break;
3039 
3040         case MSC_WRITE_BURST:
3041             SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_WRITE_BURST_FLAG);
3042 
3043             pMHLResourcePrivate->ucWriteBurstAddress = ucReceiveMSC[2];
3044             pMHLResourcePrivate->ucWriteBurstLength = MHL_MSC_SCRATCHPAD_SIZE +1;
3045 
3046             for(uctemp = 0; uctemp < (MHL_MSC_SCRATCHPAD_SIZE +1); uctemp++)
3047             {
3048                 if(uctemp < pMHLResourcePrivate->ucWriteBurstLength)
3049                 {
3050                     if((ucReceiveMSC[uctemp +3] == MSC_EOF) && (uctemp >= (ucReceiveMSC[0] -3)))
3051                     {
3052                         pMHLResourcePrivate->ucWriteBurstInformation[uctemp] = 0;
3053                         pMHLResourcePrivate->ucWriteBurstLength = uctemp;
3054                     }
3055                     else
3056                     {
3057                         pMHLResourcePrivate->ucWriteBurstInformation[uctemp] = ucReceiveMSC[uctemp +3];
3058                     }
3059                 }
3060                 else if(uctemp < MHL_MSC_SCRATCHPAD_SIZE)
3061                 {
3062                     pMHLResourcePrivate->ucWriteBurstInformation[uctemp] = 0;
3063                 }
3064             }
3065 
3066             break;
3067 
3068         default:
3069 
3070             break;
3071     };
3072 }
3073 
3074 //**************************************************************************
3075 //  [Function Name]:
3076 //                  _mdrv_mhl_CbusDisplayLinkCheck()
3077 //  [Description]
3078 //
3079 //  [Arguments]:
3080 //
3081 //  [Return]:
3082 //
3083 //**************************************************************************
_mdrv_mhl_CbusDisplayLinkCheck(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)3084 void _mdrv_mhl_CbusDisplayLinkCheck(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
3085 {
3086     MS_U8 ucDisplayIndex = (pMHLResourcePrivate->usDisplayIndex) &BMASK(7:0);
3087     MS_U8 ucDisplayMask = MHL_CBUS_DISPLAY_MASK;
3088     MS_U16 usDisplayCheck = (pMHLResourcePrivate->usDisplayIndex) >> MHL_CBUS_DISPLAY_MASK_SHIFT;
3089 
3090     if(GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_ECBUS_FUNCTION_FLAG))
3091     {
3092         ucDisplayMask = ucDisplayMask |MHL_ECBUS_DISPLAY_MASK;
3093     }
3094 
3095     if((ucDisplayIndex ^ usDisplayCheck) > 0)
3096     {
3097         usDisplayCheck = usDisplayCheck ^ ucDisplayMask;
3098 
3099         if(usDisplayCheck > 0)
3100         {
3101             pMHLResourcePrivate->usDisplayIndex |= (_mdrv_mhl_CbusGetLeastFlag(usDisplayCheck) << MHL_CBUS_DISPLAY_MASK_SHIFT);
3102 
3103             MDRV_MHL_MSG_INFO("** MHL Cbus Receive ACK for Link\r\n");
3104         }
3105     }
3106 }
3107 
3108 //**************************************************************************
3109 //  [Function Name]:
3110 //                  _mdrv_mhl_ParsingWriteBurstVCAssign()
3111 //  [Description]:
3112 //
3113 //  [Arguments]:
3114 //
3115 //  [Return]:
3116 //
3117 //**************************************************************************
_mdrv_mhl_ParsingWriteBurstVCAssign(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)3118 MS_BOOL _mdrv_mhl_ParsingWriteBurstVCAssign(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
3119 {
3120     MS_BOOL bParsingFinish = FALSE;
3121     MS_U8 uctemp = 0;
3122     MS_U8 ucSequence = pMHLResourcePrivate->ucWriteBurstInformation[4];
3123     MS_U8 ucNumberEntry = pMHLResourcePrivate->ucWriteBurstInformation[5];
3124 
3125     if(ucNumberEntry +(ucSequence -1) *MHL_VC_SEQUENCE_LENGTH == pMHLResourcePrivate->ucWriteBurstInformation[3]) // Number entry + (sequece -1) x length = total entry
3126     {
3127         bParsingFinish = TRUE;
3128     }
3129 
3130     for(uctemp = 0; uctemp <ucNumberEntry; uctemp++)
3131     {
3132         _mdrv_mhl_InsertVCInformation(pMHLResourcePrivate, TRUE, pMHLResourcePrivate->ucWriteBurstInformation[uctemp *MHL_VC_SEQUENCE_LENGTH +3], pMHLResourcePrivate->ucWriteBurstInformation[uctemp *MHL_VC_SEQUENCE_LENGTH +4], pMHLResourcePrivate->ucWriteBurstInformation[uctemp *MHL_VC_SEQUENCE_LENGTH +5]);
3133     }
3134 
3135     return bParsingFinish;
3136 }
3137 
3138 //**************************************************************************
3139 //  [Function Name]:
3140 //                  _mdrv_mhl_ParsingWriteBurstVCConfirm()
3141 //  [Description]:
3142 //
3143 //  [Arguments]:
3144 //
3145 //  [Return]:
3146 //
3147 //**************************************************************************
_mdrv_mhl_ParsingWriteBurstVCConfirm(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)3148 void _mdrv_mhl_ParsingWriteBurstVCConfirm(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
3149 {
3150     MS_BOOL bParsingFinish = FALSE;
3151     MS_U8 uctemp = 0;
3152     MS_U8 ucSequence = pMHLResourcePrivate->ucWriteBurstInformation[4];
3153     MS_U8 ucNumberEntry = pMHLResourcePrivate->ucWriteBurstInformation[5];
3154 
3155     if(ucNumberEntry +(ucSequence -1) *MHL_VC_SEQUENCE_LENGTH == pMHLResourcePrivate->ucWriteBurstInformation[3]) // Number entry + (sequece -1) x length = total entry
3156     {
3157         bParsingFinish = TRUE;
3158     }
3159 
3160     for(uctemp = 0; uctemp <ucNumberEntry; uctemp++)
3161     {
3162         _mdrv_mhl_CheckVCInformation(pMHLResourcePrivate, pMHLResourcePrivate->ucWriteBurstInformation[uctemp *MHL_VC_SEQUENCE_LENGTH +3], pMHLResourcePrivate->ucWriteBurstInformation[uctemp *MHL_VC_SEQUENCE_LENGTH +4], pMHLResourcePrivate->ucWriteBurstInformation[uctemp *MHL_VC_SEQUENCE_LENGTH +5]);
3163     }
3164 
3165     if(bParsingFinish)
3166     {
3167         _mdrv_mhl_SortingVCInformation(pMHLResourcePrivate, TRUE);
3168 
3169         _mdrv_mhl_eCbusTimeSlotAllocation(pMHLResourcePrivate);
3170     }
3171 }
3172 
3173 //**************************************************************************
3174 //  [Function Name]:
3175 //                  _mdrv_mhl_CheckAVLineVideoMode()
3176 //  [Description]:
3177 //
3178 //  [Arguments]:
3179 //
3180 //  [Return]:
3181 //
3182 //**************************************************************************
_mdrv_mhl_CheckAVLineVideoMode(MS_U8 ucAVLinkVideoMode)3183 MS_U8 _mdrv_mhl_CheckAVLineVideoMode(MS_U8 ucAVLinkVideoMode)
3184 {
3185     MS_U8 ucFrameRate = 1;
3186 
3187     switch(ucAVLinkVideoMode)
3188     {
3189         case MHL_VIC_INDEX1:
3190         case MHL_VIC_INDEX2:
3191         case MHL_VIC_INDEX3:
3192         case MHL_VIC_INDEX4:
3193         case MHL_VIC_INDEX5:
3194         case MHL_VIC_INDEX6:
3195         case MHL_VIC_INDEX7:
3196         case MHL_VIC_INDEX16:
3197             ucFrameRate = 60;
3198             break;
3199 
3200         case MHL_VIC_INDEX17:
3201         case MHL_VIC_INDEX18:
3202         case MHL_VIC_INDEX19:
3203         case MHL_VIC_INDEX20:
3204         case MHL_VIC_INDEX21:
3205         case MHL_VIC_INDEX22:
3206         case MHL_VIC_INDEX31:
3207             ucFrameRate = 50;
3208             break;
3209 
3210         case MHL_VIC_INDEX34:
3211         case MHL_VIC_INDEX95:
3212         case MHL_VIC_INDEX100:
3213             ucFrameRate = 30;
3214             break;
3215 
3216         case MHL_VIC_INDEX63:
3217             ucFrameRate = 120;
3218             break;
3219 
3220         case MHL_VIC_INDEX64:
3221             ucFrameRate = 100;
3222             break;
3223 
3224         case MHL_VIC_INDEX93:
3225         case MHL_VIC_INDEX98:
3226             ucFrameRate = 24;
3227             break;
3228 
3229         case MHL_VIC_INDEX94:
3230         case MHL_VIC_INDEX99:
3231             ucFrameRate = 25;
3232             break;
3233 
3234         default:
3235 
3236             break;
3237     };
3238 
3239     return ucFrameRate;
3240 }
3241 
3242 //**************************************************************************
3243 //  [Function Name]:
3244 //                  _mdrv_mhl_ParsingWriteBurstBISTSetup()
3245 //  [Description]:
3246 //
3247 //  [Arguments]:
3248 //
3249 //  [Return]:
3250 //
3251 //**************************************************************************
_mdrv_mhl_ParsingWriteBurstBISTSetup(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)3252 void _mdrv_mhl_ParsingWriteBurstBISTSetup(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
3253 {
3254     MS_U8 ucReadyIndex = 0x70;
3255     MS_U8 ucBISTeCbusPattern = pMHLResourcePrivate->ucDeviceCapabilityTable[MHL_CBUS_ECBUS_SPEEDS];
3256     MS_U8 ucBISTAVLinkRate = pMHLResourcePrivate->ucDeviceCapabilityTable[MHL_CBUS_TMDS_SPEEDS];
3257     MS_U16 usBISTeCbusPatternFixed = 0;
3258     MS_U16 usBISTAVLinkFixed = 0;
3259     MS_U16 usBISTeCbusDuration = 0;
3260     MS_U16 usBISTAVLinkDuration = 0;
3261 
3262     // ucWriteBurstInformation[0]: BIST_SETUP_H
3263     // ucWriteBurstInformation[1]: BIST_SETUP_L
3264     // ucWriteBurstInformation[2]: CHECK_SUM
3265     // ucWriteBurstInformation[3]: eCBUS_DURATION
3266     // ucWriteBurstInformation[4]: eCBUS_PATTERN
3267     // ucWriteBurstInformation[5]: eCBUS_FIXED_H
3268     // ucWriteBurstInformation[6]: eCBUS_FIXED_L
3269     // ucWriteBurstInformation[7]: Reserved
3270     // ucWriteBurstInformation[8]: AV LINK_DATA_RATE
3271     // ucWriteBurstInformation[9]: AV LINK_PATTERN
3272     // ucWriteBurstInformation[10]: AV LINK_VIDEO_MODE
3273     // ucWriteBurstInformation[11]: AV LINK_DURATION
3274     // ucWriteBurstInformation[12]: AV LINK_FIXED_H
3275     // ucWriteBurstInformation[13]: AV LINK_FIXED_L
3276     // ucWriteBurstInformation[14]: AV LINK_RANDOMIZER
3277     // ucWriteBurstInformation[15]: IMPEDANCE_MODE
3278 
3279     if((ucBISTeCbusPattern &BIT(4)) == BIT(4)) // MHL_ECBUS_D_150
3280     {
3281         ucBISTeCbusPattern = MHL_BIST_ECBUS_PATTERN_FIXED10;
3282     }
3283     else if((ucBISTeCbusPattern &BIT(0)) == BIT(0)) // MHL_ECBUS_S_075
3284     {
3285         ucBISTeCbusPattern = MHL_BIST_ECBUS_PATTERN_FIXED8;
3286     }
3287     else
3288     {
3289         ucBISTeCbusPattern = MHL_BIST_ECBUS_PATTERN_PRBS;
3290     }
3291 
3292     if((ucBISTAVLinkRate & BIT(2)) == BIT(2)) // MHL_TMDS_600
3293     {
3294         ucBISTAVLinkRate = MHL_BIST_AV_LINK_600;
3295     }
3296     else if((ucBISTAVLinkRate & BIT(1)) == BIT(1)) // MHL_TMDS_300
3297     {
3298         ucBISTAVLinkRate = MHL_BIST_AV_LINK_300;
3299     }
3300     else if((ucBISTAVLinkRate & BIT(0)) == BIT(0)) // MHL_TMDS_150
3301     {
3302         ucBISTAVLinkRate = MHL_BIST_AV_LINK_150;
3303     }
3304     else
3305     {
3306         ucBISTAVLinkRate = MHL_BIST_AV_LINK_RESERVED;
3307     }
3308 
3309     if(pMHLResourcePrivate->ucWriteBurstInformation[4] <= ucBISTeCbusPattern) // Check eCbus pattern
3310     {
3311        ucReadyIndex = MASKSET(ucReadyIndex, BIT(0), (BIT(0) |BIT(4)));
3312 
3313        ucBISTeCbusPattern = pMHLResourcePrivate->ucWriteBurstInformation[4];
3314        usBISTeCbusPatternFixed = ((MS_U16)pMHLResourcePrivate->ucWriteBurstInformation[5] <<8) |pMHLResourcePrivate->ucWriteBurstInformation[6];
3315     }
3316 
3317     if(pMHLResourcePrivate->ucWriteBurstInformation[8] <= ucBISTAVLinkRate) // Check AV link rate
3318     {
3319         ucReadyIndex = MASKSET(ucReadyIndex, BIT(1), (BIT(1) |BIT(5)));
3320 
3321         ucBISTAVLinkRate = pMHLResourcePrivate->ucWriteBurstInformation[8];
3322         usBISTAVLinkFixed = ((MS_U16)pMHLResourcePrivate->ucWriteBurstInformation[12] <<8) |pMHLResourcePrivate->ucWriteBurstInformation[13];
3323     }
3324 
3325     //if() // Unknow condition
3326     {
3327         ucReadyIndex = MASKSET(ucReadyIndex, BIT(2), (BIT(2) |BIT(6)));
3328     }
3329 
3330     if(pMHLResourcePrivate->ucWriteBurstInformation[3] == 0) // Check eCbus duration
3331     {
3332         // Can't allow
3333     }
3334     else
3335     {
3336         usBISTeCbusDuration = (MS_U16)pMHLResourcePrivate->ucWriteBurstInformation[3] *1010ul;
3337     }
3338 
3339     if(pMHLResourcePrivate->ucWriteBurstInformation[9] <= MHL_BIST_LINK_PATTERN_FIXED8)
3340     {
3341         usBISTAVLinkDuration = ((MS_U16)pMHLResourcePrivate->ucWriteBurstInformation[11] *32 /_mdrv_mhl_CheckAVLineVideoMode(pMHLResourcePrivate->ucWriteBurstInformation[10]) +1) *1000;
3342     }
3343     else if(pMHLResourcePrivate->ucWriteBurstInformation[9] == MHL_BIST_LINK_PATTERN_FIXED10)
3344     {
3345         usBISTAVLinkDuration = (MS_U16)pMHLResourcePrivate->ucWriteBurstInformation[11] *1010ul;
3346     }
3347 
3348     pMHLResourcePrivate->stBISTParameterInfo.ucBISTReadyIndex = ucReadyIndex;
3349     pMHLResourcePrivate->stBISTParameterInfo.ucBISTeCbusPattern = ucBISTeCbusPattern;
3350     pMHLResourcePrivate->stBISTParameterInfo.usBISTeCbusPatternFixed = usBISTeCbusPatternFixed;
3351     pMHLResourcePrivate->stBISTParameterInfo.usBISTeCbusDuration = usBISTeCbusDuration;
3352     pMHLResourcePrivate->stBISTParameterInfo.ucBISTAVLinkRate = ucBISTAVLinkRate;
3353     pMHLResourcePrivate->stBISTParameterInfo.ucBISTAVLinkPattern = pMHLResourcePrivate->ucWriteBurstInformation[9];
3354     pMHLResourcePrivate->stBISTParameterInfo.usBISTAVLinkFixed = usBISTAVLinkFixed;
3355     pMHLResourcePrivate->stBISTParameterInfo.usBISTAVLinkDuration = usBISTAVLinkDuration;
3356     pMHLResourcePrivate->stBISTParameterInfo.ucBISTAVLinkRateRandomizer = pMHLResourcePrivate->ucWriteBurstInformation[14];
3357     pMHLResourcePrivate->stBISTParameterInfo.ucBISTImpedanceMode = pMHLResourcePrivate->ucWriteBurstInformation[15];
3358 
3359 #if(MHL_DEBUG_BIST_MODE)
3360     MDRV_MHL_MSG_INFO("** MHL BIST eCbus pattern = %d\r\n", pMHLResourcePrivate->stBISTParameterInfo.ucBISTeCbusPattern);
3361     MDRV_MHL_MSG_INFO("** MHL BIST eCbus fixed = %x\r\n", pMHLResourcePrivate->stBISTParameterInfo.usBISTeCbusPatternFixed);
3362     MDRV_MHL_MSG_INFO("** MHL BIST eCbus duration = %d\r\n", pMHLResourcePrivate->stBISTParameterInfo.usBISTeCbusDuration);
3363     MDRV_MHL_MSG_INFO("** MHL BIST AV link rate = %d\r\n", pMHLResourcePrivate->stBISTParameterInfo.ucBISTAVLinkRate);
3364     MDRV_MHL_MSG_INFO("** MHL BIST AV link pattern = %d\r\n", pMHLResourcePrivate->stBISTParameterInfo.ucBISTAVLinkPattern);
3365     MDRV_MHL_MSG_INFO("** MHL BIST AV link fixed = %x\r\n", pMHLResourcePrivate->stBISTParameterInfo.usBISTAVLinkFixed);
3366     MDRV_MHL_MSG_INFO("** MHL BIST AV link duration = %d\r\n", pMHLResourcePrivate->stBISTParameterInfo.usBISTAVLinkDuration);
3367     MDRV_MHL_MSG_INFO("** MHL BIST AV link random = %d\r\n", pMHLResourcePrivate->stBISTParameterInfo.ucBISTAVLinkRateRandomizer);
3368     MDRV_MHL_MSG_INFO("** MHL BIST Impedance mode = %d\r\n", pMHLResourcePrivate->stBISTParameterInfo.ucBISTImpedanceMode);
3369 #endif
3370 }
3371 
3372 //**************************************************************************
3373 //  [Function Name]:
3374 //                  _mdrv_mhl_ParsingWriteBurstInformation()
3375 //  [Description]:
3376 //
3377 //  [Arguments]:
3378 //
3379 //  [Return]:
3380 //
3381 //**************************************************************************
_mdrv_mhl_ParsingWriteBurstInformation(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)3382 void _mdrv_mhl_ParsingWriteBurstInformation(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
3383 {
3384     MS_U8 uctemp = 0;
3385     MS_U8 ucCheckSum = 0;
3386     MS_U16 usWriteBurstID = ((MS_U16)pMHLResourcePrivate->ucWriteBurstInformation[0] <<8) |pMHLResourcePrivate->ucWriteBurstInformation[1];
3387 
3388     for(uctemp = 0; uctemp <MHL_MSC_SCRATCHPAD_SIZE; uctemp++)
3389     {
3390         ucCheckSum = ucCheckSum +pMHLResourcePrivate->ucWriteBurstInformation[uctemp];
3391     }
3392 
3393     if(ucCheckSum == 0)
3394     {
3395         switch(usWriteBurstID)
3396         {
3397             case MHL_BURST_ID_VC_ASSIGN:
3398                 if(_mdrv_mhl_ParsingWriteBurstVCAssign(pMHLResourcePrivate))
3399                 {
3400                     SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_VC_ASSIGN_FLAG);
3401                 }
3402                 break;
3403 
3404             case MHL_BURST_ID_VC_CONFIRM:
3405                 _mdrv_mhl_ParsingWriteBurstVCConfirm(pMHLResourcePrivate);
3406                 break;
3407 
3408             case MHL_BURST_ID_BIST_SETUP:
3409                 pMHLResourcePrivate->ucBISTModeState = MHL_CBUS_BIST_RECEIVE_SETUP;
3410 
3411                 _mdrv_mhl_ParsingWriteBurstBISTSetup(pMHLResourcePrivate);
3412 
3413                 break;
3414 
3415             default:
3416 
3417                 break;
3418         };
3419     }
3420     else
3421     {
3422         MDRV_MHL_MSG_INFO("** MHL write burst check sum error port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
3423     }
3424 }
3425 
3426 //**************************************************************************
3427 //  [Function Name]:
3428 //                  _mdrv_mhl_CbusBISTTriggerProc()
3429 //  [Description]
3430 //
3431 //  [Arguments]:
3432 //
3433 //  [Return]:
3434 //
3435 //**************************************************************************
_mdrv_mhl_CbusBISTTriggerProc(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 ucKeyCode)3436 void _mdrv_mhl_CbusBISTTriggerProc(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 ucKeyCode)
3437 {
3438     MS_BOOL bGeteCbusDuration = FALSE;
3439     MS_BOOL bGetAVLinkDuration = FALSE;
3440     MS_U8 ucBISTDeviceType = pMHLResourcePrivate->ucDeviceCapabilityTable[MHL_CBUS_DEV_CAT] &BMASK(3:0);
3441     MS_U8 ucBISTeCbusSelect = pMHLResourcePrivate->ucDeviceCapabilityTable[MHL_CBUS_ECBUS_SPEEDS];
3442     MS_U16 usTimerCount = 0;
3443 
3444     if(((ucKeyCode &BIT(3)) == BIT(3)) && ((ucBISTeCbusSelect &BIT(4)) != BIT(4))) // Not support eCbus-D
3445     {
3446         // Chip only support eCbus-S
3447     }
3448 
3449     if((ucKeyCode &BIT(0)) == BIT(0)) // Source device and eCbus Tx
3450     {
3451         bGeteCbusDuration = TRUE;
3452 
3453         pMHLResourcePrivate->stBISTParameterInfo.bBISTeCbusTxFlag = TRUE;
3454     }
3455     else
3456     {
3457         pMHLResourcePrivate->stBISTParameterInfo.bBISTeCbusTxFlag = FALSE;
3458     }
3459 
3460     if((ucKeyCode &BIT(1)) == BIT(1)) // Sink device and eCbus link Rx
3461     {
3462         bGeteCbusDuration = TRUE;
3463 
3464         pMHLResourcePrivate->stBISTParameterInfo.bBISTeCbusRxFlag = TRUE;
3465     }
3466     else
3467     {
3468         pMHLResourcePrivate->stBISTParameterInfo.bBISTeCbusRxFlag = FALSE;
3469     }
3470 
3471     if((ucBISTDeviceType == MHL_DEVICE_SOURCE) || (ucBISTDeviceType == MHL_DEVICE_DIRECT_ATTACH_SOURCE))
3472     {
3473         if((ucKeyCode &BIT(4)) == BIT(4)) // Source device and AV link Tx
3474         {
3475 
3476         }
3477     }
3478     else if((ucBISTDeviceType == MHL_DEVICE_SINK) || (ucBISTDeviceType == MHL_DEVICE_DIRECT_ATTACH_SINK))
3479     {
3480         if((ucKeyCode &BIT(6)) == BIT(6)) // Impedance test
3481         {
3482             bGeteCbusDuration = TRUE;
3483         }
3484 
3485         if((ucKeyCode &BIT(5)) == BIT(5)) // Sink device and AV link Rx
3486         {
3487             bGetAVLinkDuration = TRUE;
3488         }
3489     }
3490 
3491     if(pMHLResourcePrivate->ucBISTModeState == MHL_CBUS_BIST_WAIT_TRIGGER)
3492     {
3493         if(bGeteCbusDuration)
3494         {
3495             usTimerCount = pMHLResourcePrivate->stBISTParameterInfo.usBISTeCbusDuration;
3496         }
3497 
3498         if(bGetAVLinkDuration)
3499         {
3500             if(usTimerCount < pMHLResourcePrivate->stBISTParameterInfo.usBISTAVLinkDuration)
3501             {
3502                 usTimerCount = pMHLResourcePrivate->stBISTParameterInfo.usBISTAVLinkDuration;
3503             }
3504         }
3505 
3506         if(bGeteCbusDuration || bGetAVLinkDuration)
3507         {
3508             pMHLResourcePrivate->ucBISTModeState = MHL_CBUS_BIST_RECEIVE_TRIGGER;
3509             pMHLResourcePrivate->stBISTParameterInfo.usBISTeCbusDuration = usTimerCount;
3510         }
3511     }
3512 
3513     MDRV_MHL_MSG_INFO("** MHL receive BIST trigger in port %c keycode %x\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath), ucKeyCode);
3514 }
3515 
3516 //**************************************************************************
3517 //  [Function Name]:
3518 //                  _mdrv_mhl_CbusBISTRequestStatusProc()
3519 //  [Description]
3520 //
3521 //  [Arguments]:
3522 //
3523 //  [Return]:
3524 //
3525 //**************************************************************************
_mdrv_mhl_CbusBISTRequestStatusProc(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 ucKeyCode)3526 void _mdrv_mhl_CbusBISTRequestStatusProc(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 ucKeyCode)
3527 {
3528     //if(ucKeyCode == MHL_BIST_REQ_RETURN_STATUS)
3529     {
3530         pMHLResourcePrivate->ucBISTModeState = MHL_CBUS_BIST_REQUEST_STATUS;
3531     }
3532 
3533     MDRV_MHL_MSG_INFO("** MHL receive BIST request status in port %c keycode %x\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath), ucKeyCode);
3534 }
3535 
3536 //**************************************************************************
3537 //  [Function Name]:
3538 //                  _mdrv_mhl_CbusBISTStopProc()
3539 //  [Description]
3540 //                  Disable AV LINK_BIST when currently running
3541 //  [Arguments]:
3542 //
3543 //  [Return]:
3544 //
3545 //**************************************************************************
_mdrv_mhl_CbusBISTStopProc(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 ucKeyCode)3546 void _mdrv_mhl_CbusBISTStopProc(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 ucKeyCode)
3547 {
3548     if(ucKeyCode == 0) // Key code must be set to 0
3549     {
3550         if(pMHLResourcePrivate->ucBISTModeState == MHL_CBUS_BIST_ECBUS_SWITCH)
3551         {
3552             pMHLResourcePrivate->ucBISTModeState = MHL_CBUS_BIST_EVENT_FINISH;
3553         }
3554     }
3555 
3556     MDRV_MHL_MSG_INFO("** MHL receive BIST stop in port %c keycode %x\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath), ucKeyCode);
3557 }
3558 
3559 //**************************************************************************
3560 //  [Function Name]:
3561 //                  _mdrv_mhl_CbusReceiveEventProc()
3562 //  [Description]:
3563 //
3564 //  [Arguments]:
3565 //
3566 //  [Return]:
3567 //
3568 //**************************************************************************
_mdrv_mhl_CbusReceiveEventProc(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)3569 void _mdrv_mhl_CbusReceiveEventProc(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
3570 {
3571     MS_U8 ucQueueIndex = 0;
3572     MS_U16 usTimeTick = MHL_CBUS_IDEL_FREE_TIME;
3573 
3574     if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_MSC_FLAG))
3575     {
3576         CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_MSC_FLAG);
3577 
3578         if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_ABORT_FLAG))
3579         {
3580             CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_ABORT_FLAG);
3581 
3582             usTimeTick = MHL_CBUS_ABORT_HOLD_TIME;
3583         }
3584 
3585         _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_CBUS_SILENCE, usTimeTick);
3586     }
3587 
3588     if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_ACK_FLAG))
3589     {
3590         CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_ACK_FLAG);
3591 
3592         if(pMHLResourcePrivate->stCbusQueueInfo[MHL_CBUS_RX_QUEUE_INDEX].ucQueueState != MHL_QUEUE_STATE_IDLE)
3593         {
3594             pMHLResourcePrivate->stCbusQueueInfo[MHL_CBUS_RX_QUEUE_INDEX].ucQueueState = MHL_QUEUE_STATE_IDLE;
3595         }
3596         else if(pMHLResourcePrivate->stCbusQueueInfo[pMHLResourcePrivate->ucCurrentQueueIndex].ucQueueState != MHL_QUEUE_STATE_PENDING)
3597         {
3598             pMHLResourcePrivate->stCbusQueueInfo[pMHLResourcePrivate->ucCurrentQueueIndex].ucQueueState = MHL_QUEUE_STATE_IDLE;
3599         }
3600 
3601         ucQueueIndex = _mdrv_mhl_GetCbusQueueIndex(pMHLResourcePrivate);
3602 
3603         // Update current index to search index, but not Rx queue index
3604         if(ucQueueIndex < MHL_CBUS_RX_QUEUE_INDEX)
3605         {
3606             pMHLResourcePrivate->ucCurrentQueueIndex = ucQueueIndex;
3607         }
3608 
3609         _mdrv_mhl_CbusDisplayLinkCheck(pMHLResourcePrivate);
3610     }
3611 
3612     if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_24BIT_MODE_FLAG))
3613     {
3614         CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_24BIT_MODE_FLAG);
3615 
3616         if(pMHLResourcePrivate->ucTMDSClockMode == MHL_PHY_CLOCK_PACKET_PIXEL)
3617         {
3618             mhal_mhl_ClockModeSwitchProc(pMHLResourcePrivate->ucMHLSupportPath, FALSE, &(pMHLResourcePrivate->stSignalStatusInfo));
3619 
3620             MDRV_MHL_MSG_INFO("** MHL switch back to 24 bits mode port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
3621 
3622             pMHLResourcePrivate->ucTMDSClockMode = MHL_PHY_CLOCK_NORMAL_24BIT;
3623         }
3624     }
3625 
3626     if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_PP_MODE_FLAG))
3627     {
3628         CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_PP_MODE_FLAG);
3629 
3630         if(pMHLResourcePrivate->ucTMDSClockMode == MHL_PHY_CLOCK_NORMAL_24BIT)
3631         {
3632             mhal_mhl_ClockModeSwitchProc(pMHLResourcePrivate->ucMHLSupportPath, TRUE, &(pMHLResourcePrivate->stSignalStatusInfo));
3633 
3634             MDRV_MHL_MSG_INFO("** MHL switch to packet pixel mode port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
3635 
3636             pMHLResourcePrivate->ucTMDSClockMode = MHL_PHY_CLOCK_PACKET_PIXEL;
3637         }
3638     }
3639 
3640     if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_MHL3_VERSION_FLAG))
3641     {
3642         CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_MHL3_VERSION_FLAG);
3643 
3644         if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_ENHANCE_FLAG))
3645         {
3646             SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_ECBUS_FUNCTION_FLAG);
3647         }
3648     }
3649 
3650     if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_WRITE_GRANT_FLAG))
3651     {
3652         CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_WRITE_GRANT_FLAG);
3653 
3654         if(pMHLResourcePrivate->ucWriteBurstState == MHL_CBUS_WRITE_BURST_SEND_REQUEST)
3655         {
3656             pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_REVEIVE_GRANT;
3657         }
3658     }
3659 
3660     if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_3D_REQ_FLAG))
3661     {
3662         if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_3D_INFORMATION_FLAG))
3663         {
3664             CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_3D_REQ_FLAG);
3665         }
3666         else if(pMHLResourcePrivate->ucWriteBurstState == MHL_CBUS_WRITE_BURST_NONE)
3667         {
3668             CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_3D_REQ_FLAG);
3669             SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_3D_INFORMATION_FLAG);
3670             SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_3D_DTD_FLAG);
3671             SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_3D_VIC_FLAG);
3672         }
3673     }
3674 
3675     if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_DSCR_CHANGE_FLAG))
3676     {
3677         CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_DSCR_CHANGE_FLAG);
3678 
3679         pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_END;
3680     }
3681 
3682     if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_FEATURE_REQUEST_FLAG))
3683     {
3684         CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_FEATURE_REQUEST_FLAG);
3685 
3686         if(pMHLResourcePrivate->ucFeatureRequestState == MHL_CBUS_FEATURE_NONE)
3687         {
3688             pMHLResourcePrivate->ucFeatureRequestState = MHL_CBUS_FEATURE_START;
3689         }
3690     }
3691 
3692     if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_FEATURE_COMPLETE_FLAG))
3693     {
3694         CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_FEATURE_COMPLETE_FLAG);
3695 
3696         if(pMHLResourcePrivate->ucFeatureRequestState == MHL_CBUS_FEATURE_SEND_FEATURE_REQUEST)
3697         {
3698             pMHLResourcePrivate->ucFeatureRequestState = MHL_CBUS_FEATURE_END;
3699         }
3700     }
3701 
3702     if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_LINK_RATE_FLAG))
3703     {
3704         CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_LINK_RATE_FLAG);
3705         SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_LINK_STATUS_NORMAL_FLAG);
3706 
3707         if(pMHLResourcePrivate->stSignalStatusInfo.ucMainLinkRate < MHL_AV_LINK_NONE)
3708         {
3709             mhal_mhl_SetMainLinkRate(pMHLResourcePrivate->ucMHLSupportPath, pMHLResourcePrivate->stSignalStatusInfo.ucMainLinkRate);
3710 
3711             mhal_mhl_CDRModeMonitor(pMHLResourcePrivate->ucMHLSupportPath, FALSE, &(pMHLResourcePrivate->stSignalStatusInfo));
3712 
3713             MDRV_MHL_MSG_INFO("** MHL set AV link rate mode %d port %c\r\n", pMHLResourcePrivate->stSignalStatusInfo.ucMainLinkRate, MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
3714         }
3715     }
3716 
3717     if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_WRITE_BURST_FLAG))
3718     {
3719         CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_WRITE_BURST_FLAG);
3720 
3721         _mdrv_mhl_ParsingWriteBurstInformation(pMHLResourcePrivate);
3722     }
3723 
3724     if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_VC_ASSIGN_FLAG))
3725     {
3726         CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_VC_ASSIGN_FLAG);
3727         SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_VC_INFORMATION_FLAG);
3728         SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_VC_CONFIRM_FLAG);
3729     }
3730 
3731     if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_ECBUS_MODE_FLAG))
3732     {
3733         CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_ECBUS_MODE_FLAG);
3734 
3735         if(!GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CBUS1_FUNCTION_FLAG))
3736         {
3737             SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CBUS_TX_QUEUE_FREEZE_FLAG);
3738 
3739             _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_TX_QUQUE_FREEZE, MHL_CBUS_1_SECOND_TIME);
3740 
3741             MDRV_MHL_MSG_INFO("** MHL CTS 6.3.9.1 patch port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
3742         }
3743     }
3744 }
3745 
3746 //**************************************************************************
3747 //  [Function Name]:
3748 //                  _mdrv_mhl_CbusMSGEventProc()
3749 //  [Description]:
3750 //
3751 //  [Arguments]:
3752 //
3753 //  [Return]:
3754 //
3755 //**************************************************************************
_mdrv_mhl_CbusMSGEventProc(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)3756 void _mdrv_mhl_CbusMSGEventProc(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
3757 {
3758     MS_BOOL bReceiveResponse = FALSE;
3759     MS_BOOL bResponseErrorFlag = FALSE;
3760     MS_U8 ucStatus = MHL_RCP_NO_ERROR;
3761     MS_U8 ucSubCommand = 0;
3762     MS_U8 ucKeyCode = MHL_RCP_NO_ERROR;
3763 
3764     if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_MSG_FLAG))
3765     {
3766         CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_MSG_FLAG);
3767 
3768         switch(pMHLResourcePrivate->ucMSGData[0])
3769         {
3770             case MSC_MSG_MSGE:
3771 
3772                 break;
3773 
3774             case MSC_MSG_RCP:
3775                 if(!GET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_RCP_FUNCTION_FLAG))
3776                 {
3777                     ucStatus = MHL_RCP_NO_ERROR;
3778 
3779                     MDRV_MHL_MSG_WARNING("** MHL RCP call back NULL port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
3780                 }
3781                 else if(!(pMHLResourcePrivate->ucMSGData[1] &BIT(7))) // Ignore release key
3782                 {
3783                     SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CALLBACK_FUNCTION_FLAG);
3784                 }
3785 
3786                 if(ucStatus == MHL_RCP_NO_ERROR)
3787                 {
3788                     ucSubCommand = MSC_MSG_RCPK;
3789                     ucKeyCode = pMHLResourcePrivate->ucMSGData[1];
3790                 }
3791                 else
3792                 {
3793                     ucSubCommand = MSC_MSG_RCPE;
3794                     ucKeyCode = ucStatus;
3795 
3796                     pMHLResourcePrivate->ucMSGData[0] = MSC_MSG_RCPK;
3797                     bResponseErrorFlag = TRUE;
3798                 }
3799 
3800                 _mdrv_mhl_CbusRxQueueInsertMSG(pMHLResourcePrivate, ucSubCommand, ucKeyCode);
3801 
3802                 break;
3803 
3804             case MSC_MSG_RCPK:
3805             case MSC_MSG_RCPE:
3806                 bReceiveResponse = TRUE;
3807                 break;
3808 
3809             case MSC_MSG_RAP:
3810                 if(!GET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_RAP_FUNCTION_FLAG))
3811                 {
3812                     ucStatus = MHL_RAP_NO_ERROR;
3813 
3814                     MDRV_MHL_MSG_WARNING("** MHL RAP call back NULL port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
3815                 }
3816                 else if(_mdrv_mhl_CheckCbusModeChange(pMHLResourcePrivate))
3817                 {
3818                     if(_mdrv_mhl_GetRAPEnableFlag(pMHLResourcePrivate))
3819                     {
3820                         SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CALLBACK_FUNCTION_FLAG);
3821                     }
3822 
3823                     ucSubCommand = MSC_MSG_RAPK;
3824                     ucKeyCode = ucStatus;
3825 
3826                     _mdrv_mhl_CbusRxQueueInsertMSG(pMHLResourcePrivate, ucSubCommand, ucKeyCode);
3827                 }
3828                 else if(GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CBUS_TX_QUEUE_FREEZE_FLAG))
3829                 {
3830                     CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CBUS_TX_QUEUE_FREEZE_FLAG);
3831                 }
3832 
3833                 break;
3834 
3835             case MSC_MSG_RAPK:
3836                 bReceiveResponse = TRUE;
3837                 break;
3838 
3839             case MSC_MSG_UCP:
3840                 if(!GET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_UCP_FUNCTION_FLAG))
3841                 {
3842                     ucStatus = MHL_UCP_NO_ERROR;
3843 
3844                     MDRV_MHL_MSG_WARNING("** MHL UCP call back NULL port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
3845                 }
3846                 else
3847                 {
3848                     SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CALLBACK_FUNCTION_FLAG);
3849                 }
3850 
3851                 if(ucStatus == MHL_UCP_NO_ERROR)
3852                 {
3853                     ucSubCommand = MSC_MSG_UCPK;
3854                     ucKeyCode = pMHLResourcePrivate->ucMSGData[1];
3855                 }
3856                 else
3857                 {
3858                     ucSubCommand = MSC_MSG_UCPE;
3859                     ucKeyCode = ucStatus;
3860 
3861                     pMHLResourcePrivate->ucMSGData[0] = MSC_MSG_UCPK;
3862                     bResponseErrorFlag = TRUE;
3863                 }
3864 
3865                 _mdrv_mhl_CbusRxQueueInsertMSG(pMHLResourcePrivate, ucSubCommand, ucKeyCode);
3866 
3867                 break;
3868 
3869             case MSC_MSG_UCPK:
3870             case MSC_MSG_UCPE:
3871                 bReceiveResponse = TRUE;
3872                 break;
3873 
3874             case MSC_MSG_ATT:
3875                 if(!GET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_ATT_FUNCTION_FLAG))
3876                 {
3877                     ucStatus = MHL_ATT_NO_ERROR;
3878 
3879                     MDRV_MHL_MSG_WARNING("** MHL ATT call back NULL port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
3880                 }
3881                 else
3882                 {
3883                     SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CALLBACK_FUNCTION_FLAG);
3884                 }
3885 
3886                 ucSubCommand = MSC_MSG_ATTK;
3887                 ucKeyCode = ucStatus;
3888 
3889                 _mdrv_mhl_CbusRxQueueInsertMSG(pMHLResourcePrivate, ucSubCommand, ucKeyCode);
3890 
3891                 break;
3892 
3893             case MSC_MSG_ATTK:
3894                 bReceiveResponse = TRUE;
3895                 break;
3896 
3897             case MSC_MSG_RBP:
3898                 if(!GET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_RBP_FUNCTION_FLAG))
3899                 {
3900                     ucStatus = MHL_RBP_NO_ERROR;
3901 
3902                     MDRV_MHL_MSG_WARNING("** MHL RBP call back NULL port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
3903                 }
3904                 else
3905                 {
3906                     SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CALLBACK_FUNCTION_FLAG);
3907                 }
3908 
3909                 if(ucStatus == MHL_RBP_NO_ERROR)
3910                 {
3911                     ucSubCommand = MSC_MSG_RBPK;
3912                     ucKeyCode = pMHLResourcePrivate->ucMSGData[1];
3913                 }
3914                 else
3915                 {
3916                     ucSubCommand = MSC_MSG_RBPE;
3917                     ucKeyCode = ucStatus;
3918 
3919                     pMHLResourcePrivate->ucMSGData[0] = MSC_MSG_RBPK;
3920                     bResponseErrorFlag = TRUE;
3921                 }
3922 
3923                 _mdrv_mhl_CbusRxQueueInsertMSG(pMHLResourcePrivate, ucSubCommand, ucKeyCode);
3924 
3925                 break;
3926 
3927             case MSC_MSG_RBPK:
3928             case MSC_MSG_RBPE:
3929                 bReceiveResponse = TRUE;
3930                 break;
3931 
3932             case MSC_MSG_RUSB:
3933 
3934                 break;
3935 
3936             case MSC_MSG_RUSBK:
3937                 bReceiveResponse = TRUE;
3938                 break;
3939 
3940             case MSC_MSG_RHID:
3941 
3942                 break;
3943 
3944             case MSC_MSG_RHIDK:
3945                 bReceiveResponse = TRUE;
3946                 break;
3947 
3948             case MSC_MSG_BIST_TRIGGRT:
3949                 _mdrv_mhl_CbusBISTTriggerProc(pMHLResourcePrivate, pMHLResourcePrivate->ucMSGData[1]);
3950                 break;
3951 
3952             case MSC_MSG_BIST_REQUEST_STAT:
3953                 _mdrv_mhl_CbusBISTRequestStatusProc(pMHLResourcePrivate, pMHLResourcePrivate->ucMSGData[1]);
3954                 break;
3955 
3956             case MSC_MSG_BIST_STOP:
3957                 _mdrv_mhl_CbusBISTStopProc(pMHLResourcePrivate, pMHLResourcePrivate->ucMSGData[1]);
3958                 break;
3959 
3960             case MSC_MSG_SI_UNKNOWN:
3961                 _mdrv_mhl_CbusSendSubMessage(pMHLResourcePrivate, MSC_MSG_SI_UNKNOWNK, 0, FALSE);
3962                 break;
3963 
3964             default:
3965                 if(pMHLResourcePrivate->ucMSGData[0] < 0x20) // For CTS 6.3.11.23
3966                 {
3967                     _mdrv_mhl_CbusSendSubMessage(pMHLResourcePrivate, MSC_MSG_MSGE, MHL_MSGE_INVALID_SUB_COMMAND_CODE, FALSE);
3968                 }
3969 
3970                 break;
3971         };
3972 
3973         if(bReceiveResponse)
3974         {
3975             CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_MSG_COMMAND_FLAG);
3976         }
3977 
3978         if(bResponseErrorFlag)
3979         {
3980             _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_SEND_MSG_RESPONSE, MHL_MSG_SEND_RESPONSE_TIME);
3981         }
3982     }
3983 }
3984 
3985 //**************************************************************************
3986 //  [Function Name]:
3987 //                  _mdrv_mhl_EMSCParsingEMSCSupport()
3988 //  [Description]:
3989 //
3990 //  [Arguments]:
3991 //
3992 //  [Return]:
3993 //
3994 //**************************************************************************
_mdrv_mhl_EMSCParsingEMSCSupport(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 * bReveiceEMSC)3995 MS_U8 _mdrv_mhl_EMSCParsingEMSCSupport(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 *bReveiceEMSC)
3996 {
3997     MS_U8 ucLength = bReveiceEMSC[3] *MHL_EMSC_SUPPORT_ITEM_LENGTH +6;
3998 
3999     if(pMHLResourcePrivate != NULL)
4000     {
4001 
4002     }
4003 
4004     return ucLength;
4005 }
4006 
4007 //**************************************************************************
4008 //  [Function Name]:
4009 //                  _mdrv_mhl_ParsingEMSCReceiveData()
4010 //  [Description]:
4011 //
4012 //  [Arguments]:
4013 //
4014 //  [Return]:
4015 //
4016 //**************************************************************************
_mdrv_mhl_ParsingEMSCReceiveData(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)4017 void _mdrv_mhl_ParsingEMSCReceiveData(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
4018 {
4019     MS_U8 uctemp = 3;
4020     MS_U8 ucReceiveEMSC[MHL_EMSC_DATA_SIZE +1] = {0};
4021     MS_U16 usEMSCRxBufferSize = 0;
4022     MS_U16 usEMSCTxBufferSize = 0;
4023     MS_U16 usWriteBurstID = 0;
4024 
4025     mhal_mhl_GetEMSCReceiveData(ucReceiveEMSC);
4026 
4027     usEMSCTxBufferSize = ucReceiveEMSC[1]; // Rx unload ACK
4028 
4029     if(ucReceiveEMSC[2] > 0) // Check length remaining
4030     {
4031         while((ucReceiveEMSC[2] +3) > uctemp)
4032         {
4033             usWriteBurstID = (ucReceiveEMSC[uctemp] << 8) |ucReceiveEMSC[uctemp +1];
4034 
4035             switch(usWriteBurstID)
4036             {
4037                 case MHL_BURST_ID_BLK_RCV_BUFFER_INFO:
4038                     usEMSCTxBufferSize = usEMSCTxBufferSize +((ucReceiveEMSC[uctemp +3] << 8) |ucReceiveEMSC[uctemp +2]) -MHL_EMSC_DATA_SIZE;
4039 
4040                     uctemp = uctemp +4;
4041 
4042                     MDRV_MHL_MSG_INFO("** MHL eMSC parsing buffer info in port %c !!\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
4043 
4044                     break;
4045 
4046                 case MHL_BURST_ID_BITS_PER_PIXEL_FMT:
4047                     if(ucReceiveEMSC[uctemp +7] == MHL_VIEW_PIXEL_FORMATE_16BPP)
4048                     {
4049                         SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_PP_MODE_FLAG);
4050                         CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_24BIT_MODE_FLAG);
4051                     }
4052                     else if(ucReceiveEMSC[uctemp +7] == MHL_VIEW_PIXEL_FORMATE_24BPP)
4053                     {
4054                         SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_24BIT_MODE_FLAG);
4055                         CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_PP_MODE_FLAG);
4056                     }
4057 
4058                     uctemp = uctemp +8;
4059 
4060                     MDRV_MHL_MSG_INFO("** MHL eMSC parsing pexel FMT in port %c !!\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
4061 
4062                     break;
4063 
4064                 case MHL_BURST_ID_EMSC_SUPPORT:
4065                     uctemp = uctemp +_mdrv_mhl_EMSCParsingEMSCSupport(pMHLResourcePrivate, &ucReceiveEMSC[uctemp +3]);
4066 
4067                     MDRV_MHL_MSG_INFO("** MHL eMSC parsing eMSC support in port %c !!\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
4068 
4069                     break;
4070 
4071                 default:
4072                     MDRV_MHL_MSG_INFO("** MHL eMSC parsing unknow burst ID in port %c !!\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
4073 
4074                     uctemp = ucReceiveEMSC[2] +3;
4075 
4076                     break;
4077             };
4078         }
4079     }
4080 
4081     pMHLResourcePrivate->usEMSCRxBufferSize = pMHLResourcePrivate->usEMSCRxBufferSize - ucReceiveEMSC[0];
4082     pMHLResourcePrivate->usEMSCTxBufferSize = usEMSCTxBufferSize + pMHLResourcePrivate->usEMSCTxBufferSize;
4083     usEMSCRxBufferSize = pMHLResourcePrivate->usEMSCRxBufferSize;
4084     usEMSCTxBufferSize = pMHLResourcePrivate->usEMSCTxBufferSize;
4085 
4086     MDRV_MHL_MSG_INFO("** MHL eMSC receive Rx buffer size %d in port %c !!\r\n", usEMSCRxBufferSize, MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
4087     MDRV_MHL_MSG_INFO("** MHL eMSC receive Tx buffer size %d in port %c !!\r\n", usEMSCTxBufferSize, MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
4088 }
4089 
4090 //**************************************************************************
4091 //  [Function Name]:
4092 //                  _mdrv_mhl_CbusRxHandler()
4093 //  [Description]
4094 //
4095 //  [Arguments]:
4096 //
4097 //  [Return]:
4098 //
4099 //**************************************************************************
_mdrv_mhl_CbusRxHandler(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)4100 void _mdrv_mhl_CbusRxHandler(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
4101 {
4102     MS_U8 ucReceiveCount = 0;
4103     MS_U8 ucReceiveMSC[MHL_CBUS_DATA_SIZE +4];
4104 
4105     if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_CONNECT_FLAG))
4106     {
4107         // Check receive MSC
4108         if(mhal_mhl_CheckSRAMReceiveBuffer())
4109         {
4110             ucReceiveCount = pMHLResourcePrivate->ucReceiveCounter;
4111 
4112             if(ucReceiveCount > 0)
4113             {
4114                 for( ; ucReceiveCount > 0; ucReceiveCount--)
4115                 {
4116                     if(_mdrv_mhl_GetCbusReceiveMSC(ucReceiveMSC))
4117                     {
4118                         _mdrv_mhl_SetReceiveCaseFlag(pMHLResourcePrivate, ucReceiveMSC);
4119 
4120                         pMHLResourcePrivate->ucReceiveCounter--;
4121                     }
4122                 }
4123             }
4124             else if(!GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_RECEIVE_LOSE_FLAG))
4125             {
4126                 SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_RECEIVE_LOSE_FLAG);
4127 
4128                 _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_CHECK_RECEIVE_LOSE, MHL_CHECK_RECEIVE_LOSE_TIME);
4129             }
4130         }
4131 
4132         // Check receive EMSC
4133         if(pMHLResourcePrivate->ucEMSCReceiveCounter > 0)
4134         {
4135             _mdrv_mhl_ParsingEMSCReceiveData(pMHLResourcePrivate);
4136 
4137             pMHLResourcePrivate->ucEMSCReceiveCounter--;
4138         }
4139 
4140         if(pMHLResourcePrivate->ulCbusReceiveIndex > 0)
4141         {
4142             _mdrv_mhl_CbusReceiveEventProc(pMHLResourcePrivate);
4143 
4144             _mdrv_mhl_CbusMSGEventProc(pMHLResourcePrivate);
4145         }
4146     }
4147 }
4148 
4149 //**************************************************************************
4150 //  [Function Name]:
4151 //                  _mdrv_mhl_TxQueueHandler()
4152 //  [Description]
4153 //
4154 //  [Arguments]:
4155 //
4156 //  [Return]:
4157 //
4158 //**************************************************************************
_mdrv_mhl_TxQueueHandler(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)4159 void _mdrv_mhl_TxQueueHandler(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
4160 {
4161     MS_U8 ucQueueIndex = 0;
4162 
4163     if(GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CBUS_SEND_FLAG))
4164     {
4165         ucQueueIndex = _mdrv_mhl_GetCbusQueueIndex(pMHLResourcePrivate);
4166 
4167         if(ucQueueIndex < MHL_CBUS_TOTAL_QUEUE_NUM)
4168         {
4169             if(_mdrv_mhl_CbusTxWriteCommand(pMHLResourcePrivate->stSignalStatusInfo.bECbusEnableFlag, &(pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex])))
4170             {
4171                 // Retry send packet twice
4172                 if(pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucQueueState == MHL_QUEUE_STATE_SEND)
4173                 {
4174                     pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucQueueState = MHL_QUEUE_STATE_IDLE;
4175                 }
4176                 else if(pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucQueueState > MHL_QUEUE_STATE_SEND)
4177                 {
4178                     pMHLResourcePrivate->stCbusQueueInfo[ucQueueIndex].ucQueueState = MHL_QUEUE_STATE_SEND;
4179                 }
4180 
4181                 // Update current index to search index, but not Rx queue index
4182                 if(ucQueueIndex < MHL_CBUS_RX_QUEUE_INDEX)
4183                 {
4184                     pMHLResourcePrivate->ucCurrentQueueIndex = ucQueueIndex;
4185                 }
4186 
4187                 _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_CBUS_SILENCE, MHL_CBUS_SEND_SILENCE_TIME);
4188 
4189                 CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CBUS_SEND_FLAG);
4190             }
4191         }
4192     }
4193 }
4194 
4195 //**************************************************************************
4196 //  [Function Name]:
4197 //                  _mdrv_mhl_SendDisplayCommand()
4198 //  [Description]
4199 //
4200 //  [Arguments]:
4201 //
4202 //  [Return]:
4203 //
4204 //**************************************************************************
_mdrv_mhl_SendDisplayCommand(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)4205 void _mdrv_mhl_SendDisplayCommand(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
4206 {
4207     MS_U8 ucDisplayIndex = (pMHLResourcePrivate->usDisplayIndex) &BMASK(7:0);
4208     MS_U8 ucDisplayMask = MHL_CBUS_DISPLAY_MASK;
4209 
4210     if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_DISPLAY_COMMAND_ENABLE_FLAG))
4211     {
4212         if(_mdrv_mhl_CheckSendCommand(pMHLResourcePrivate))
4213         {
4214             if(GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_ECBUS_FUNCTION_FLAG))
4215             {
4216                 ucDisplayMask = ucDisplayMask |MHL_ECBUS_DISPLAY_MASK;
4217             }
4218 
4219             ucDisplayIndex = ucDisplayIndex ^ucDisplayMask;
4220 
4221             if(ucDisplayIndex > 0)
4222             {
4223                 switch(_mdrv_mhl_CbusGetLeastFlag(ucDisplayIndex))
4224                 {
4225                     case MHL_CBUS_HPD_SET_FLAG:
4226                         _mdrv_mhl_CbusSendSetHPD(pMHLResourcePrivate, TRUE);
4227                         break;
4228 
4229                     case MHL_CBUS_DEVCAP_READY_FLAG:
4230                         _mdrv_mhl_CbusSendDevcapReady(pMHLResourcePrivate);
4231                         break;
4232 
4233                     case MHL_CBUS_PATH_EN_FLAG:
4234                         _mdrv_mhl_CbusSendPathEnable(pMHLResourcePrivate, TRUE);
4235                         break;
4236 
4237                     case MHL_CBUS_DEVCAP_CHANGE_FLAG:
4238                         _mdrv_mhl_CbusSendDevcapChange(pMHLResourcePrivate);
4239                         break;
4240 
4241                     case MHL_CBUS_VERSION_CODE_FLAG:
4242                         _mdrv_mhl_CbusSendVersionCode(pMHLResourcePrivate);
4243                         break;
4244 
4245                     case MHL_CBUS_LINK_STATUS_NORMAL_FLAG:
4246                         _mdrv_mhl_CbusSendLinkStatusNormal(pMHLResourcePrivate);
4247                         break;
4248 
4249                     default:
4250 
4251                         break;
4252                 };
4253             }
4254         }
4255         else if(GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CHECK_CONTENT_ON_FLAG))
4256         {
4257             if(!GET_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_HPD_SET_FLAG))
4258             {
4259                 _mdrv_mhl_CbusSendSetHPD(pMHLResourcePrivate, TRUE);
4260             }
4261             else if(GET_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_PATH_EN_FLAG))
4262             {
4263                 _mdrv_mhl_CbusSendPathEnable(pMHLResourcePrivate, FALSE);
4264             }
4265             else if(!GET_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_DEVCAP_READY_FLAG))
4266             {
4267                 _mdrv_mhl_CbusSendDevcapReady(pMHLResourcePrivate);
4268             }
4269         }
4270         else
4271         {
4272             if(GET_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_HPD_SET_FLAG))
4273             {
4274                 _mdrv_mhl_CbusSendSetHPD(pMHLResourcePrivate, FALSE);
4275 
4276                 CLR_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_PATH_EN_FLAG);
4277 
4278                 if(GET_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_LINK_STATUS_NORMAL_FLAG))
4279                 {
4280                     CLR_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_LINK_STATUS_NORMAL_FLAG);
4281                 }
4282             }
4283 
4284             if(GET_MHL_DEVICE_FLAG(pMHLResourcePrivate->usDeviceIndex, MHL_DEVICE_ROKU_DONGLE_FLAG))
4285             {
4286                 if(GET_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_DEVCAP_READY_FLAG))
4287                 {
4288                     _mdrv_mhl_CbusSendDevcapReady(pMHLResourcePrivate);
4289                 }
4290                 else if(GET_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_PATH_EN_FLAG))
4291                 {
4292                     _mdrv_mhl_CbusSendPathEnable(pMHLResourcePrivate, TRUE);
4293                 }
4294             }
4295 
4296             if(GET_MHL_DEVICE_FLAG(pMHLResourcePrivate->usDeviceIndex, MHL_DEVICE_PHONE_HTC_FLAG))
4297             {
4298                 if(GET_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_DEVCAP_READY_FLAG))
4299                 {
4300                     _mdrv_mhl_CbusSendDevcapReady(pMHLResourcePrivate);
4301                 }
4302             }
4303             else if(GET_MHL_DEVICE_FLAG(pMHLResourcePrivate->usDeviceIndex, MHL_DEVICE_PHONE_SONY_FLAG))
4304             {
4305                 if(GET_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_DEVCAP_READY_FLAG))
4306                 {
4307                     _mdrv_mhl_CbusSendDevcapReady(pMHLResourcePrivate);
4308                 }
4309             }
4310         }
4311     }
4312 }
4313 
4314 //**************************************************************************
4315 //  [Function Name]:
4316 //                  _mdrv_mhl_GetVenderIDProc()
4317 //  [Description]
4318 //
4319 //  [Arguments]:
4320 //
4321 //  [Return]:
4322 //
4323 //**************************************************************************
_mdrv_mhl_GetVenderIDProc(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)4324 void _mdrv_mhl_GetVenderIDProc(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
4325 {
4326     if(GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_GET_VENDER_ID_FLAG))
4327     {
4328         if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_GET_VENDER_ID_FLAG))
4329         {
4330             if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_ASK_FINISH_FLAG))
4331             {
4332                 CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_ASK_FINISH_FLAG);
4333                 CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_GET_VENDER_ID_FLAG);
4334                 CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_GET_VENDER_ID_FLAG);
4335                 SET_MHL_DONE_FLAG(pMHLResourcePrivate->ucProcDoneIndex, MHL_GET_VENDER_ID_DONE_FLAG);
4336 
4337                 pMHLResourcePrivate->ucSourceVenderID = pMHLResourcePrivate->ucAskData;
4338 
4339 #if(MHL_DEBUG_SOURCE_INFO)
4340                 MDRV_MHL_MSG_INFO("** MHL get vender ID %d\r\n", pMHLResourcePrivate->ucSourceVenderID);
4341 #endif
4342             }
4343         }
4344         else if((!GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_ASK_DATA_FLAG)) && (!GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_ASK_FINISH_FLAG)))
4345         {
4346             if(_mdrv_mhl_CbusSendGetVenderID(pMHLResourcePrivate))
4347             {
4348                 SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_GET_VENDER_ID_FLAG);
4349                 SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_ASK_DATA_FLAG);
4350             }
4351         }
4352     }
4353 }
4354 
4355 //**************************************************************************
4356 //  [Function Name]:
4357 //                  _mdrv_mhl_CheckDeviceCapability()
4358 //  [Description]
4359 //
4360 //  [Arguments]:
4361 //
4362 //  [Return]:
4363 //
4364 //**************************************************************************
_mdrv_mhl_CheckDeviceCapability(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)4365 void _mdrv_mhl_CheckDeviceCapability(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
4366 {
4367     MS_U16 usAdopterID = 0;
4368     MS_U16 usDeviceID = 0;
4369 
4370     usAdopterID = pMHLResourcePrivate->ucSourceDevcapTable[4] |(pMHLResourcePrivate->ucSourceDevcapTable[3] << 8);
4371     usDeviceID = pMHLResourcePrivate->ucSourceDevcapTable[12] |(pMHLResourcePrivate->ucSourceDevcapTable[11] << 8);
4372 
4373     pMHLResourcePrivate->usDeviceIndex = 0;
4374 
4375     if(usAdopterID == MHL_ADOPTER_ID_ROKU)
4376     {
4377         SET_MHL_DEVICE_FLAG(pMHLResourcePrivate->usDeviceIndex, MHL_DEVICE_ROKU_DONGLE_FLAG);
4378     }
4379 
4380     if(usAdopterID == MHL_ADOPTER_ID_HTC)
4381     {
4382         SET_MHL_DEVICE_FLAG(pMHLResourcePrivate->usDeviceIndex, MHL_DEVICE_PHONE_HTC_FLAG);
4383     }
4384 
4385     if(usAdopterID == MHL_ADOPTER_ID_SONY)
4386     {
4387         SET_MHL_DEVICE_FLAG(pMHLResourcePrivate->usDeviceIndex, MHL_DEVICE_PHONE_SONY_FLAG);
4388     }
4389 
4390     if(usDeviceID == MHL_DEVICE_ID_HTC)
4391     {
4392         // Do nothing
4393     }
4394 
4395     if(pMHLResourcePrivate->ucSourceDevcapTable[MHL_CBUS_FEATURE_FLAG] &BIT(0))
4396     {
4397         SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_RCP_FUNCTION_FLAG);
4398     }
4399 
4400     if(pMHLResourcePrivate->ucSourceDevcapTable[MHL_CBUS_FEATURE_FLAG] &BIT(1))
4401     {
4402         SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_RAP_FUNCTION_FLAG);
4403     }
4404 
4405     if(pMHLResourcePrivate->ucSourceDevcapTable[MHL_CBUS_VERSION] >= 0x30)
4406     {
4407         SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_MHL3_VERSION_FLAG);
4408     }
4409 }
4410 
4411 //**************************************************************************
4412 //  [Function Name]:
4413 //                  _mdrv_mhl_ReadDeviceCapabilityProc()
4414 //  [Description]
4415 //
4416 //  [Arguments]:
4417 //
4418 //  [Return]:
4419 //
4420 //**************************************************************************
_mdrv_mhl_ReadDeviceCapabilityProc(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)4421 void _mdrv_mhl_ReadDeviceCapabilityProc(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
4422 {
4423     MS_BOOL bReDoFlag = FALSE;
4424     MS_U8 ucBitNumber = 0;
4425 
4426     if(GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_READ_DEVCAP_FLAG))
4427     {
4428         do
4429         {
4430             bReDoFlag = FALSE;
4431 
4432             if(pMHLResourcePrivate->usReadDevcapMask > 0)
4433             {
4434                 ucBitNumber = _mdrv_mhl_GetLeastBitNum(pMHLResourcePrivate->usReadDevcapMask);
4435 
4436                 if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_READ_DEVCAP_FLAG))
4437                 {
4438                     if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_ASK_FINISH_FLAG))
4439                     {
4440                         CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_ASK_FINISH_FLAG);
4441                         CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_READ_DEVCAP_FLAG);
4442 
4443                         pMHLResourcePrivate->ucSourceDevcapTable[ucBitNumber] = pMHLResourcePrivate->ucAskData;
4444 
4445 #if(MHL_DEBUG_SOURCE_INFO)
4446                         MDRV_MHL_MSG_INFO("** MHL read devcap[%d] = %x\r\n", ucBitNumber, pMHLResourcePrivate->ucSourceDevcapTable[ucBitNumber]);
4447 #endif
4448 
4449                         bReDoFlag = TRUE;
4450                     }
4451                 }
4452                 else if((!GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_ASK_DATA_FLAG)) && (!GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_ASK_FINISH_FLAG)))
4453                 {
4454                     if(_mdrv_mhl_CbusReadDeviceCapability(pMHLResourcePrivate, ucBitNumber, FALSE))
4455                     {
4456                         SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_READ_DEVCAP_FLAG);
4457                         SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_ASK_DATA_FLAG);
4458                     }
4459                 }
4460 
4461                 if(bReDoFlag)
4462                 {
4463                     pMHLResourcePrivate->usReadDevcapMask = MASKSET(pMHLResourcePrivate->usReadDevcapMask, 0, BIT(ucBitNumber));
4464 
4465                     if(pMHLResourcePrivate->usReadDevcapMask == 0)
4466                     {
4467                         SET_MHL_DONE_FLAG(pMHLResourcePrivate->ucProcDoneIndex, MHL_READ_DEVCAP_DONE_FLAG);
4468 
4469                         _mdrv_mhl_CheckDeviceCapability(pMHLResourcePrivate);
4470                     }
4471                 }
4472             }
4473             else
4474             {
4475                 CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_READ_DEVCAP_FLAG);
4476             }
4477         }while(bReDoFlag);
4478 
4479         if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_DEVCAP_FLAG))
4480         {
4481             CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_DEVCAP_FLAG);
4482         }
4483     }
4484     else
4485     {
4486         if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_DEVCAP_FLAG))
4487         {
4488             if(!GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_READ_XDEVCAP_FLAG))
4489             {
4490                 CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_DEVCAP_FLAG);
4491                 SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_READ_DEVCAP_FLAG);
4492             }
4493         }
4494     }
4495 }
4496 
4497 //**************************************************************************
4498 //  [Function Name]:
4499 //                  _mdrv_mhl_ReadExtendDeviceCapabilityProc()
4500 //  [Description]
4501 //
4502 //  [Arguments]:
4503 //
4504 //  [Return]:
4505 //
4506 //**************************************************************************
_mdrv_mhl_ReadExtendDeviceCapabilityProc(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)4507 void _mdrv_mhl_ReadExtendDeviceCapabilityProc(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
4508 {
4509     MS_BOOL bReDoFlag = FALSE;
4510     MS_U8 ucBitNumber = 0;
4511 
4512     if(GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_READ_XDEVCAP_FLAG))
4513     {
4514         do
4515         {
4516             bReDoFlag = FALSE;
4517 
4518             if(pMHLResourcePrivate->usReadExtendDevcapMask > 0)
4519             {
4520                 ucBitNumber = _mdrv_mhl_GetLeastBitNum(pMHLResourcePrivate->usReadExtendDevcapMask);
4521 
4522                 if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_READ_DEVCAP_FLAG))
4523                 {
4524                     if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_ASK_FINISH_FLAG))
4525                     {
4526                         CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_ASK_FINISH_FLAG);
4527                         CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_READ_DEVCAP_FLAG);
4528 
4529                         pMHLResourcePrivate->ucSourceDevcapTable[MHL_DEVICE_CAPABILITY_SIZE +ucBitNumber] = pMHLResourcePrivate->ucAskData;
4530 
4531 #if(MHL_DEBUG_SOURCE_INFO)
4532                         MDRV_MHL_MSG_INFO("** MHL read extend devcap[%d] = %x\r\n", ucBitNumber, pMHLResourcePrivate->ucSourceDevcapTable[MHL_DEVICE_CAPABILITY_SIZE +ucBitNumber]);
4533 #endif
4534 
4535                         bReDoFlag = TRUE;
4536                     }
4537                 }
4538                 else if((!GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_ASK_DATA_FLAG)) && (!GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_ASK_FINISH_FLAG)))
4539                 {
4540                     if(_mdrv_mhl_CbusReadDeviceCapability(pMHLResourcePrivate, ucBitNumber, TRUE))
4541                     {
4542                         SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_READ_DEVCAP_FLAG);
4543                         SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_ASK_DATA_FLAG);
4544                     }
4545                 }
4546 
4547                 if(bReDoFlag)
4548                 {
4549                     pMHLResourcePrivate->usReadExtendDevcapMask = MASKSET(pMHLResourcePrivate->usReadExtendDevcapMask, 0, BIT(ucBitNumber));
4550 
4551                     if(pMHLResourcePrivate->usReadExtendDevcapMask == 0)
4552                     {
4553                         SET_MHL_DONE_FLAG(pMHLResourcePrivate->ucProcDoneIndex, MHL_READ_XDEVCAP_DONE_FLAG);
4554 
4555                         _mdrv_mhl_CheckDeviceCapability(pMHLResourcePrivate);
4556                     }
4557                 }
4558             }
4559             else
4560             {
4561                 CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_READ_XDEVCAP_FLAG);
4562             }
4563         }while(bReDoFlag);
4564 
4565         if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_XDEVCAP_SUPPORT_FLAG))
4566         {
4567             CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_XDEVCAP_SUPPORT_FLAG);
4568         }
4569     }
4570     else
4571     {
4572         if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_XDEVCAP_SUPPORT_FLAG))
4573         {
4574             if(!GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_READ_DEVCAP_FLAG))
4575             {
4576                 CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_XDEVCAP_SUPPORT_FLAG);
4577                 SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_READ_XDEVCAP_FLAG);
4578             }
4579         }
4580     }
4581 }
4582 
4583 //**************************************************************************
4584 //  [Function Name]:
4585 //                  _mdrv_mhl_WriteBurstEventProc()
4586 //  [Description]
4587 //
4588 //  [Arguments]:
4589 //
4590 //  [Return]:
4591 //
4592 //**************************************************************************
_mdrv_mhl_WriteBurstEventProc(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)4593 void _mdrv_mhl_WriteBurstEventProc(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
4594 {
4595     switch(pMHLResourcePrivate->ucWriteBurstState)
4596     {
4597         case MHL_CBUS_WRITE_BURST_START:
4598             if(_mdrv_mhl_CbusWriteStatusOrSetInt(pMHLResourcePrivate, 0x20, BIT(2), FALSE))
4599             {
4600                 pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_SEND_REQUEST;
4601 
4602                 _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_WAIT_WRITE_GRANT, MHL_WAIT_WRITE_GRANT_TIME);
4603             }
4604 
4605             break;
4606 
4607         case MHL_CBUS_WRITE_BURST_SEND_DATA:
4608             if(_mdrv_mhl_CbusWriteStatusOrSetInt(pMHLResourcePrivate, 0x20, BIT(1), FALSE))
4609             {
4610                 pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_END;
4611             }
4612             break;
4613 
4614         case MHL_CBUS_WRITE_BURST_END:
4615             pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_NONE;
4616             break;
4617 
4618         default:
4619 
4620             break;
4621     };
4622 }
4623 
4624 //**************************************************************************
4625 //  [Function Name]:
4626 //                  _mdrv_mhl_GetDTDBurstfor3D()
4627 //  [Description]
4628 //
4629 //  [Arguments]:
4630 //
4631 //  [Return]:
4632 //
4633 //**************************************************************************
_mdrv_mhl_GetDTDBurstfor3D(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 * pData)4634 MS_BOOL _mdrv_mhl_GetDTDBurstfor3D(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 *pData)
4635 {
4636     MS_BOOL bFinish = FALSE;
4637     MS_U8 uctemp = 0;
4638     MS_U8 ucDTDCount = 0;
4639     MS_U8 ucSequence = pMHLResourcePrivate->ucWriteBurstSequence;
4640 
4641     ucDTDCount = ucSequence *MHL_3D_SEQUENCE_LENGTH;
4642 
4643     pData[0] = (MHL_BURST_ID_3D_DTD >> 8);
4644     pData[1] = (MHL_BURST_ID_3D_DTD &BMASK(7:0));
4645     pData[3] = pMHLResourcePrivate->uc3DTotalEntryDTD;
4646 
4647     if(pMHLResourcePrivate->uc3DTotalEntryDTD == 0)
4648     {
4649         bFinish = TRUE;
4650     }
4651 
4652     for(uctemp = 0; uctemp < MHL_3D_SEQUENCE_LENGTH; uctemp++)
4653     {
4654         if((!bFinish) && ((ucDTDCount +uctemp) == (pMHLResourcePrivate->uc3DTotalEntryDTD -1)))
4655         {
4656             bFinish = TRUE;
4657         }
4658 
4659         if((ucDTDCount +uctemp) < pMHLResourcePrivate->uc3DTotalEntryDTD)
4660         {
4661             pData[6 +uctemp *MHL_3D_ITEM_LENGTH] = 0;
4662             pData[6 +uctemp *MHL_3D_ITEM_LENGTH +1] = pMHLResourcePrivate->uc3DInformationDTD[ucDTDCount +uctemp] &BMASK(3:0);
4663         }
4664         else
4665         {
4666             pData[6 +uctemp *MHL_3D_ITEM_LENGTH] = 0;
4667             pData[6 +uctemp *MHL_3D_ITEM_LENGTH +1] = 0;
4668         }
4669     }
4670 
4671     ucSequence++;
4672 
4673     pData[4] = ucSequence;
4674 
4675     if(bFinish)
4676     {
4677         pData[5] = pMHLResourcePrivate->uc3DTotalEntryDTD -ucDTDCount;
4678         ucSequence = 0;
4679     }
4680     else
4681     {
4682         pData[5] = MHL_3D_SEQUENCE_LENGTH;
4683     }
4684 
4685     pData[2] = _mdrv_mhl_WriteBurstCheckSum(pData);
4686 
4687     pMHLResourcePrivate->ucWriteBurstSequence = ucSequence;
4688 
4689     return bFinish;
4690 }
4691 
4692 //**************************************************************************
4693 //  [Function Name]:
4694 //                  _mdrv_mhl_GetVICBurstfor3D()
4695 //  [Description]
4696 //
4697 //  [Arguments]:
4698 //
4699 //  [Return]:
4700 //
4701 //**************************************************************************
_mdrv_mhl_GetVICBurstfor3D(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 * pData)4702 MS_BOOL _mdrv_mhl_GetVICBurstfor3D(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 *pData)
4703 {
4704     MS_BOOL bFinish = FALSE;
4705     MS_U8 uctemp = 0;
4706     MS_U8 ucVICCount = 0;
4707     MS_U8 ucSequence = pMHLResourcePrivate->ucWriteBurstSequence;
4708 
4709     ucVICCount = ucSequence *MHL_3D_SEQUENCE_LENGTH;
4710 
4711     pData[0] = (MHL_BURST_ID_3D_VIC >> 8);
4712     pData[1] = (MHL_BURST_ID_3D_VIC &BMASK(7:0));
4713     pData[3] = pMHLResourcePrivate->uc3DTotalEntryVIC;
4714 
4715     if(pMHLResourcePrivate->uc3DTotalEntryVIC == 0)
4716     {
4717         bFinish = TRUE;
4718     }
4719 
4720     for(uctemp = 0; uctemp < MHL_3D_SEQUENCE_LENGTH; uctemp++)
4721     {
4722         if((!bFinish) && ((ucVICCount +uctemp) == (pMHLResourcePrivate->uc3DTotalEntryVIC -1)))
4723         {
4724             bFinish = TRUE;
4725         }
4726 
4727         if((ucVICCount +uctemp) < pMHLResourcePrivate->uc3DTotalEntryVIC)
4728         {
4729             pData[6 +uctemp *MHL_3D_ITEM_LENGTH] = 0;
4730             pData[6 +uctemp *MHL_3D_ITEM_LENGTH +1] = pMHLResourcePrivate->uc3DInformationVIC[ucVICCount +uctemp] &BMASK(3:0);
4731         }
4732         else
4733         {
4734             pData[6 +uctemp *MHL_3D_ITEM_LENGTH] = 0;
4735             pData[6 +uctemp *MHL_3D_ITEM_LENGTH +1] = 0;
4736         }
4737     }
4738 
4739     ucSequence++;
4740 
4741     pData[4] = ucSequence;
4742 
4743     if(bFinish)
4744     {
4745         pData[5] = pMHLResourcePrivate->uc3DTotalEntryVIC -ucVICCount;
4746         ucSequence = 0;
4747     }
4748     else
4749     {
4750         pData[5] = MHL_3D_SEQUENCE_LENGTH;
4751     }
4752 
4753     pData[2] = _mdrv_mhl_WriteBurstCheckSum(pData);
4754 
4755     pMHLResourcePrivate->ucWriteBurstSequence = ucSequence;
4756 
4757     return bFinish;
4758 }
4759 
4760 //**************************************************************************
4761 //  [Function Name]:
4762 //                  _mdrv_mhl_Send3DTimingInformation()
4763 //  [Description]
4764 //
4765 //  [Arguments]:
4766 //
4767 //  [Return]:
4768 //
4769 //**************************************************************************
_mdrv_mhl_Send3DTimingInformation(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)4770 void _mdrv_mhl_Send3DTimingInformation(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
4771 {
4772     MS_BOOL bFinish = FALSE;
4773     MS_U8 ucData[MHL_MSC_SCRATCHPAD_SIZE] = {0};
4774 
4775     if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_3D_DTD_FLAG))
4776     {
4777         if(_mdrv_mhl_GetDTDBurstfor3D(pMHLResourcePrivate, ucData))
4778         {
4779             bFinish = TRUE;
4780         }
4781 
4782         if(_mdrv_mhl_CbusSendWriteBurst(pMHLResourcePrivate, 0x40, MHL_MSC_SCRATCHPAD_SIZE, ucData))
4783         {
4784             if(bFinish)
4785             {
4786                 CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_3D_DTD_FLAG);
4787             }
4788 
4789             pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_SEND_DATA;
4790 
4791             MDRV_MHL_MSG_INFO("** MHL sent 3D DTD port %c in %d\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath), ucData[4]);
4792         }
4793     }
4794     else if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_3D_VIC_FLAG))
4795     {
4796         if(_mdrv_mhl_GetVICBurstfor3D(pMHLResourcePrivate, ucData))
4797         {
4798             bFinish= TRUE;
4799         }
4800 
4801         if(_mdrv_mhl_CbusSendWriteBurst(pMHLResourcePrivate, 0x40, MHL_MSC_SCRATCHPAD_SIZE, ucData))
4802         {
4803             if(bFinish)
4804             {
4805                 CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_3D_VIC_FLAG);
4806                 CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_3D_INFORMATION_FLAG);
4807             }
4808 
4809             pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_SEND_DATA;
4810 
4811             MDRV_MHL_MSG_INFO("** MHL sent 3D VIC port %c in %d\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath), ucData[4]);
4812         }
4813     }
4814 }
4815 
4816 //**************************************************************************
4817 //  [Function Name]:
4818 //                  _mdrv_mhl_GetBurstforVirtualChannel()
4819 //  [Description]
4820 //
4821 //  [Arguments]:
4822 //
4823 //  [Return]:
4824 //
4825 //**************************************************************************
_mdrv_mhl_GetBurstforVirtualChannel(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_BOOL bVCConfirm,MS_U8 * pData)4826 MS_BOOL _mdrv_mhl_GetBurstforVirtualChannel(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_BOOL bVCConfirm, MS_U8 *pData)
4827 {
4828     MS_BOOL bFinish = FALSE;
4829     MS_U8 uctemp = 0;
4830     MS_U8 ucVCCount = 0;
4831     MS_U8 ucSequence = pMHLResourcePrivate->ucWriteBurstSequence;
4832     MS_U8 ucVCTotalEntry = 0;
4833     MS_U8 ucVCFinishEntry = 0;
4834     MS_U16 usWriteBurstID = MHL_BURST_ID_VC_ASSIGN;
4835 
4836     if(bVCConfirm)
4837     {
4838         usWriteBurstID = MHL_BURST_ID_VC_CONFIRM;
4839     }
4840 
4841     ucVCFinishEntry = ucSequence *MHL_VC_SEQUENCE_LENGTH;
4842 
4843     pData[0] = (usWriteBurstID >> 8);
4844     pData[1] = (usWriteBurstID &BMASK(7:0));
4845     pData[15] = 0;
4846 
4847     for(uctemp = 0; uctemp < MHL_VIRTUAL_CHANNEL_LENGTH; uctemp++)
4848     {
4849         if(pMHLResourcePrivate->stVirtualChannelInfo[uctemp].bVCConfirm)
4850         {
4851             ucVCTotalEntry++;
4852 
4853             if(ucVCFinishEntry > 0)
4854             {
4855                 ucVCFinishEntry--;
4856             }
4857             else if(ucVCCount < MHL_VC_SEQUENCE_LENGTH)
4858             {
4859                 pData[6 +ucVCCount *MHL_VC_ITEM_LENGTH] = pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCNumber;
4860                 pData[6 +ucVCCount *MHL_VC_ITEM_LENGTH +1] = pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCFeatureID;
4861 
4862                 if(bVCConfirm)
4863                 {
4864                     pData[6 +ucVCCount *MHL_VC_ITEM_LENGTH +2] = pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCResponseCode;
4865                 }
4866                 else
4867                 {
4868                     pData[6 +ucVCCount *MHL_VC_ITEM_LENGTH +2] = pMHLResourcePrivate->stVirtualChannelInfo[uctemp].ucVCSlotSize;
4869                 }
4870 
4871                 ucVCCount++;
4872             }
4873         }
4874     }
4875 
4876     ucSequence++;
4877 
4878     pData[3] = ucVCTotalEntry;
4879     pData[4] = ucSequence;
4880     pData[5] = ucVCCount;
4881     pData[2] = _mdrv_mhl_WriteBurstCheckSum(pData);
4882 
4883     if(((ucSequence -1) *MHL_VC_SEQUENCE_LENGTH +ucVCCount) == ucVCTotalEntry)
4884     {
4885         bFinish = TRUE;
4886         ucSequence = 0;
4887     }
4888 
4889     pMHLResourcePrivate->ucWriteBurstSequence = ucSequence;
4890 
4891     return bFinish;
4892 }
4893 
4894 //**************************************************************************
4895 //  [Function Name]:
4896 //                  _mdrv_mhl_SendVirtualChannelInformation()
4897 //  [Description]
4898 //
4899 //  [Arguments]:
4900 //
4901 //  [Return]:
4902 //
4903 //**************************************************************************
_mdrv_mhl_SendVirtualChannelInformation(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)4904 void _mdrv_mhl_SendVirtualChannelInformation(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
4905 {
4906     MS_BOOL bFinish = FALSE;
4907     MS_BOOL bSendVCConfirm = FALSE;
4908     MS_U8 ucData[MHL_MSC_SCRATCHPAD_SIZE] = {0};
4909 
4910     if(_mdrv_mhl_GetBurstforVirtualChannel(pMHLResourcePrivate, GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_VC_CONFIRM_FLAG), ucData))
4911     {
4912         bFinish = TRUE;
4913     }
4914 
4915     if(_mdrv_mhl_CbusSendWriteBurst(pMHLResourcePrivate, 0x40, MHL_MSC_SCRATCHPAD_SIZE, ucData))
4916     {
4917         if(bFinish)
4918         {
4919             if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_VC_CONFIRM_FLAG))
4920             {
4921                 CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_VC_CONFIRM_FLAG);
4922 
4923                 bSendVCConfirm = TRUE;
4924             }
4925 
4926             CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_VC_INFORMATION_FLAG);
4927         }
4928 
4929         pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_SEND_DATA;
4930 
4931         MDRV_MHL_MSG_INFO("** MHL sent VC information port %c in %d\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath), ucData[4]);
4932     }
4933 
4934     if(bSendVCConfirm)
4935     {
4936         _mdrv_mhl_SortingVCInformation(pMHLResourcePrivate, TRUE);
4937 
4938         _mdrv_mhl_eCbusTimeSlotAllocation(pMHLResourcePrivate);
4939     }
4940 }
4941 
4942 //**************************************************************************
4943 //  [Function Name]:
4944 //                  mdrv_mhl_GetHighEndVideoVIC()
4945 //  [Description]
4946 //
4947 //  [Arguments]:
4948 //
4949 //  [Return]:
4950 //
4951 //**************************************************************************
_mdrv_mhl_GetHighEndVideoVIC(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 * pData)4952 MS_BOOL _mdrv_mhl_GetHighEndVideoVIC(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 *pData)
4953 {
4954     MS_BOOL bFinish = FALSE;
4955     MS_U8 uctemp = 0;
4956     MS_U8 ucEntryCount = 0;
4957     MS_U8 ucSequence = pMHLResourcePrivate->ucWriteBurstSequence;
4958     MS_U8 ucFinishEntry = 0;
4959     MS_U8 ucTotalEntry = pMHLResourcePrivate->ucHighEndVICTotalEntry;
4960 
4961     ucFinishEntry = ucSequence *MHL_HEV_VIC_SEQUENCE_LENGTH;
4962 
4963     pData[0] = (MHL_BURST_ID_HEV_VIC >> 8);
4964     pData[1] = (MHL_BURST_ID_HEV_VIC &BMASK(7:0));
4965     pData[3] = ucTotalEntry;
4966 
4967     for(uctemp = 0; uctemp < MHL_HEV_VIC_SEQUENCE_LENGTH; uctemp++)
4968     {
4969         if((uctemp +ucFinishEntry) == ucTotalEntry)
4970         {
4971             break;
4972         }
4973 
4974         pData[6 +(uctemp *2)] = pMHLResourcePrivate->usHighEndVICTable[uctemp +ucFinishEntry] >> 8;
4975         pData[7 +(uctemp *2)] = pMHLResourcePrivate->usHighEndVICTable[uctemp +ucFinishEntry] &BMASK(7:0);
4976 
4977         ucEntryCount++;
4978     }
4979 
4980     ucSequence++;
4981 
4982     pData[4] = ucSequence;
4983     pData[5] = ucEntryCount;
4984     pData[2] = _mdrv_mhl_WriteBurstCheckSum(pData);
4985 
4986     if(((ucSequence -1) *MHL_HEV_VIC_SEQUENCE_LENGTH +ucEntryCount) == ucTotalEntry)
4987     {
4988         bFinish = TRUE;
4989         ucSequence = 0;
4990     }
4991 
4992     pMHLResourcePrivate->ucWriteBurstSequence = ucSequence;
4993 
4994     return bFinish;
4995 }
4996 
4997 //**************************************************************************
4998 //  [Function Name]:
4999 //                  _mdrv_mhl_GetHighEndVideoDTDA()
5000 //  [Description]
5001 //
5002 //  [Arguments]:
5003 //
5004 //  [Return]:
5005 //
5006 //**************************************************************************
_mdrv_mhl_GetHighEndVideoDTDA(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 * pData)5007 MS_BOOL _mdrv_mhl_GetHighEndVideoDTDA(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 *pData)
5008 {
5009     MS_BOOL bFinish = FALSE;
5010     MS_U8 uctemp = 0;
5011     MS_U8 ucEntryCount = 0;
5012     MS_U8 ucSequence = pMHLResourcePrivate->ucWriteBurstSequence;
5013     MS_U8 ucFinishEntry = 0;
5014     MS_U8 ucTotalEntry = MHL_HEV_DTD_TOTAL_ENTRY;
5015 
5016     ucFinishEntry = ucSequence *MHL_HEV_DTD_SEQUENCE_LENGTH;
5017 
5018     pData[0] = (MHL_BURST_ID_HEV_DTDA >> 8);
5019     pData[1] = (MHL_BURST_ID_HEV_DTDA &BMASK(7:0));
5020     pData[3] = MHL_HEV_DTD_TOTAL_ENTRY;
5021 
5022     for(uctemp = 0; uctemp < ucTotalEntry; uctemp++)
5023     {
5024         if(ucFinishEntry > 0)
5025         {
5026             ucFinishEntry--;
5027         }
5028         else if(ucEntryCount < MHL_HEV_DTD_SEQUENCE_LENGTH)
5029         {
5030             ucEntryCount++;
5031         }
5032     }
5033 
5034     ucSequence++;
5035 
5036     pData[4] = ucSequence;
5037     pData[2] = _mdrv_mhl_WriteBurstCheckSum(pData);
5038 
5039     if(((ucSequence -1) *MHL_HEV_DTD_SEQUENCE_LENGTH +ucEntryCount) == MHL_HEV_DTD_TOTAL_ENTRY)
5040     {
5041         bFinish = TRUE;
5042         ucSequence = 0;
5043     }
5044 
5045     pMHLResourcePrivate->ucWriteBurstSequence = ucSequence;
5046 
5047     return bFinish;
5048 }
5049 
5050 //**************************************************************************
5051 //  [Function Name]:
5052 //                  _mdrv_mhl_GetHighEndVideoDTDB()
5053 //  [Description]
5054 //
5055 //  [Arguments]:
5056 //
5057 //  [Return]:
5058 //
5059 //**************************************************************************
_mdrv_mhl_GetHighEndVideoDTDB(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 * pData)5060 MS_BOOL _mdrv_mhl_GetHighEndVideoDTDB(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 *pData)
5061 {
5062     MS_BOOL bFinish = FALSE;
5063     MS_U8 uctemp = 0;
5064     MS_U8 ucEntryCount = 0;
5065     MS_U8 ucSequence = pMHLResourcePrivate->ucWriteBurstSequence;
5066     MS_U8 ucFinishEntry = 0;
5067     MS_U8 ucTotalEntry = MHL_HEV_DTD_TOTAL_ENTRY;
5068 
5069     ucFinishEntry = ucSequence *MHL_HEV_DTD_SEQUENCE_LENGTH;
5070 
5071     pData[0] = (MHL_BURST_ID_HEV_DTDB >> 8);
5072     pData[1] = (MHL_BURST_ID_HEV_DTDB &BMASK(7:0));
5073     pData[3] = MHL_HEV_DTD_TOTAL_ENTRY;
5074 
5075     for(uctemp = 0; uctemp < ucTotalEntry; uctemp++)
5076     {
5077         if(ucFinishEntry > 0)
5078         {
5079             ucFinishEntry--;
5080         }
5081         else if(ucEntryCount < MHL_HEV_DTD_SEQUENCE_LENGTH)
5082         {
5083             ucEntryCount++;
5084         }
5085     }
5086 
5087     ucSequence++;
5088 
5089     pData[4] = ucSequence;
5090     pData[2] = _mdrv_mhl_WriteBurstCheckSum(pData);
5091 
5092     if(((ucSequence -1) *MHL_HEV_DTD_SEQUENCE_LENGTH +ucEntryCount) == MHL_HEV_DTD_TOTAL_ENTRY)
5093     {
5094         bFinish = TRUE;
5095         ucSequence = 0;
5096     }
5097 
5098     pMHLResourcePrivate->ucWriteBurstSequence = ucSequence;
5099 
5100     return bFinish;
5101 }
5102 
5103 //**************************************************************************
5104 //  [Function Name]:
5105 //                  _mdrv_mhl_SendHighEndVideoSupport()
5106 //  [Description]
5107 //
5108 //  [Arguments]:
5109 //
5110 //  [Return]:
5111 //
5112 //**************************************************************************
_mdrv_mhl_SendHighEndVideoSupport(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)5113 void _mdrv_mhl_SendHighEndVideoSupport(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
5114 {
5115     MS_BOOL bFinish = FALSE;
5116     MS_U8 ucData[MHL_MSC_SCRATCHPAD_SIZE] = {0};
5117 
5118     if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_HEV_VIC_FLAG))
5119     {
5120         if(_mdrv_mhl_GetHighEndVideoVIC(pMHLResourcePrivate, ucData))
5121         {
5122             bFinish = TRUE;
5123         }
5124 
5125         if(_mdrv_mhl_CbusSendWriteBurst(pMHLResourcePrivate, 0x40, MHL_MSC_SCRATCHPAD_SIZE, ucData))
5126         {
5127             if(bFinish)
5128             {
5129                 CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_HEV_VIC_FLAG);
5130             }
5131 
5132             pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_SEND_DATA;
5133 
5134             MDRV_MHL_MSG_INFO("** MHL sent HEV VIC port %c in %d\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath), ucData[4]);
5135         }
5136     }
5137     else if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_HEV_DTDA_FLAG))
5138     {
5139         if(_mdrv_mhl_GetHighEndVideoDTDA(pMHLResourcePrivate, ucData))
5140         {
5141             bFinish = TRUE;
5142         }
5143 
5144         if(_mdrv_mhl_CbusSendWriteBurst(pMHLResourcePrivate, 0x40, MHL_MSC_SCRATCHPAD_SIZE, ucData))
5145         {
5146             if(bFinish)
5147             {
5148                 CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_HEV_DTDA_FLAG);
5149             }
5150 
5151             pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_SEND_DATA;
5152 
5153             MDRV_MHL_MSG_INFO("** MHL sent HEV DTDA port %c in %d\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath), ucData[4]);
5154         }
5155     }
5156     else if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_HEV_DTDB_FLAG))
5157     {
5158         if(_mdrv_mhl_GetHighEndVideoDTDB(pMHLResourcePrivate, ucData))
5159         {
5160             bFinish = TRUE;
5161         }
5162 
5163         if(_mdrv_mhl_CbusSendWriteBurst(pMHLResourcePrivate, 0x40, MHL_MSC_SCRATCHPAD_SIZE, ucData))
5164         {
5165             if(bFinish)
5166             {
5167                 CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_HEV_DTDB_FLAG);
5168                 CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_HIGH_END_VIDEO_FLAG);
5169             }
5170 
5171             pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_SEND_DATA;
5172 
5173             MDRV_MHL_MSG_INFO("** MHL sent HEV DTDB port %c in %d\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath), ucData[4]);
5174         }
5175     }
5176 }
5177 
5178 //**************************************************************************
5179 //  [Function Name]:
5180 //                  mdrv_mhl_GetAudioDataTunnel()
5181 //  [Description]
5182 //
5183 //  [Arguments]:
5184 //
5185 //  [Return]:
5186 //
5187 //**************************************************************************
_mdrv_mhl_GetAudioDataTunnel(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 * pData)5188 MS_BOOL _mdrv_mhl_GetAudioDataTunnel(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 *pData)
5189 {
5190     MS_BOOL bFinish = FALSE;
5191     MS_U8 uctemp = 0;
5192     MS_U8 ucEntryCount = 0;
5193     MS_U8 ucSequence = pMHLResourcePrivate->ucWriteBurstSequence;
5194     MS_U8 ucFinishEntry = 0;
5195     MS_U8 ucTotalEntry = MHL_AUDIO_TUNNEL_TOTAL_ENTRY;
5196 
5197     ucFinishEntry = ucSequence *MHL_AUDIO_TUNNEL_SEQUENCE_LENGTH;
5198 
5199     pData[0] = (MHL_BURST_ID_ADT_BURSTID >> 8);
5200     pData[1] = (MHL_BURST_ID_ADT_BURSTID &BMASK(7:0));
5201     pData[3] = ucTotalEntry;
5202 
5203     if((ucSequence == 0) && (MHL_AUDIO_TUNNEL_SADB_RNTRY > 0)) // Support speaker allocation data block
5204     {
5205         pData[5] = 1;
5206     }
5207 
5208     for(uctemp = 0; uctemp < MHL_AUDIO_TUNNEL_SEQUENCE_LENGTH; uctemp++)
5209     {
5210         if((uctemp +ucFinishEntry) == ucTotalEntry)
5211         {
5212             break;
5213         }
5214 
5215         pData[7 +(uctemp *3)] = pMHLResourcePrivate->ulAudioTunnelTable[uctemp +ucFinishEntry] >> 16;
5216         pData[8 +(uctemp *3)] = pMHLResourcePrivate->ulAudioTunnelTable[uctemp +ucFinishEntry] >> 8;
5217         pData[9 +(uctemp *3)] = pMHLResourcePrivate->ulAudioTunnelTable[uctemp +ucFinishEntry] &BMASK(7:0);
5218 
5219         ucEntryCount++;
5220     }
5221 
5222     ucSequence++;
5223 
5224     pData[4] = ucSequence;
5225     pData[6] = ucEntryCount;
5226     pData[2] = _mdrv_mhl_WriteBurstCheckSum(pData);
5227 
5228     if(((ucSequence -1) *MHL_AUDIO_TUNNEL_SEQUENCE_LENGTH +ucEntryCount) == ucTotalEntry)
5229     {
5230         bFinish = TRUE;
5231         ucSequence = 0;
5232     }
5233 
5234     pMHLResourcePrivate->ucWriteBurstSequence = ucSequence;
5235 
5236     return bFinish;
5237 }
5238 
5239 //**************************************************************************
5240 //  [Function Name]:
5241 //                  _mdrv_mhl_SendAudioDataTunnelSupport()
5242 //  [Description]
5243 //
5244 //  [Arguments]:
5245 //
5246 //  [Return]:
5247 //
5248 //**************************************************************************
_mdrv_mhl_SendAudioDataTunnelSupport(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)5249 void _mdrv_mhl_SendAudioDataTunnelSupport(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
5250 {
5251     MS_BOOL bFinish = FALSE;
5252     MS_U8 ucData[MHL_MSC_SCRATCHPAD_SIZE] = {0};
5253 
5254     if(_mdrv_mhl_GetAudioDataTunnel(pMHLResourcePrivate, ucData))
5255     {
5256         bFinish = TRUE;
5257     }
5258 
5259     if(_mdrv_mhl_CbusSendWriteBurst(pMHLResourcePrivate, 0x40, MHL_MSC_SCRATCHPAD_SIZE, ucData))
5260     {
5261         if(bFinish)
5262         {
5263             CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_AUDIO_DATA_TUNNEL_FLAG);
5264         }
5265 
5266         pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_SEND_DATA;
5267 
5268         MDRV_MHL_MSG_INFO("** MHL sent audio tunnel port %c in %d\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath), ucData[4]);
5269     }
5270 }
5271 
5272 //**************************************************************************
5273 //  [Function Name]:
5274 //                  mdrv_mhl_GeteMSCSupportInformation()
5275 //  [Description]
5276 //
5277 //  [Arguments]:
5278 //
5279 //  [Return]:
5280 //
5281 //**************************************************************************
_mdrv_mhl_GeteMSCSupportInformation(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 * pData)5282 MS_BOOL _mdrv_mhl_GeteMSCSupportInformation(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 *pData)
5283 {
5284     MS_BOOL bFinish = FALSE;
5285     MS_U8 uctemp = 0;
5286     MS_U8 ucEntryCount = 0;
5287     MS_U8 ucSequence = pMHLResourcePrivate->ucWriteBurstSequence;
5288     MS_U8 ucFinishEntry = 0;
5289     MS_U8 ucTotalEntry = MHL_EMSC_SUPPORT_TOTAL_ENTRY;
5290 
5291     ucFinishEntry = ucSequence *MHL_EMSC_SUPPORT_SEQUENCE_LENGTH;
5292 
5293     pData[0] = (MHL_BURST_ID_EMSC_SUPPORT >> 8);
5294     pData[1] = (MHL_BURST_ID_EMSC_SUPPORT &BMASK(7:0));
5295     pData[3] = ucTotalEntry;
5296 
5297     for(uctemp = 0; uctemp < MHL_EMSC_SUPPORT_SEQUENCE_LENGTH; uctemp++)
5298     {
5299         if((uctemp +ucFinishEntry) == ucTotalEntry)
5300         {
5301             break;
5302         }
5303 
5304         pData[6 +(uctemp *2)] = pMHLResourcePrivate->usEMSCSupportTable[uctemp +ucFinishEntry] >> 8;
5305         pData[7 +(uctemp *2)] = pMHLResourcePrivate->usEMSCSupportTable[uctemp +ucFinishEntry] &BMASK(7:0);
5306 
5307         ucEntryCount++;
5308     }
5309 
5310     ucSequence++;
5311 
5312     pData[4] = ucSequence;
5313     pData[5] = ucEntryCount;
5314     pData[2] = _mdrv_mhl_WriteBurstCheckSum(pData);
5315 
5316     if(((ucSequence -1) *MHL_EMSC_SUPPORT_SEQUENCE_LENGTH +ucEntryCount) == ucTotalEntry)
5317     {
5318         bFinish = TRUE;
5319         ucSequence = 0;
5320     }
5321 
5322     pMHLResourcePrivate->ucWriteBurstSequence = ucSequence;
5323 
5324     return bFinish;
5325 }
5326 
5327 //**************************************************************************
5328 //  [Function Name]:
5329 //                  _mdrv_mhl_SendeMSCSupportInformation()
5330 //  [Description]
5331 //
5332 //  [Arguments]:
5333 //
5334 //  [Return]:
5335 //
5336 //**************************************************************************
_mdrv_mhl_SendeMSCSupportInformation(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)5337 void _mdrv_mhl_SendeMSCSupportInformation(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
5338 {
5339     MS_BOOL bFinish = FALSE;
5340     MS_U8 ucData[MHL_MSC_SCRATCHPAD_SIZE] = {0};
5341 
5342     if(_mdrv_mhl_GeteMSCSupportInformation(pMHLResourcePrivate, ucData))
5343     {
5344         bFinish = TRUE;
5345     }
5346 
5347     if(_mdrv_mhl_CbusSendWriteBurst(pMHLResourcePrivate, 0x40, MHL_MSC_SCRATCHPAD_SIZE, ucData))
5348     {
5349         if(bFinish)
5350         {
5351             CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_EMSC_DATA_TUNNEL_FLAG);
5352         }
5353 
5354         pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_SEND_DATA;
5355 
5356         MDRV_MHL_MSG_INFO("** MHL sent eMSC support port %c in %d\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath), ucData[4]);
5357     }
5358 }
5359 
5360 //**************************************************************************
5361 //  [Function Name]:
5362 //                  _mdrv_mhl_SendBISTReturnStatus()
5363 //  [Description]
5364 //
5365 //  [Arguments]:
5366 //
5367 //  [Return]:
5368 //
5369 //**************************************************************************
_mdrv_mhl_SendBISTReturnStatus(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)5370 void _mdrv_mhl_SendBISTReturnStatus(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
5371 {
5372     MS_U8 ucData[MHL_MSC_SCRATCHPAD_SIZE] = {0};
5373 
5374     ucData[0] = (MHL_BURST_ID_BIST_RETURN_STAT >> 8);
5375     ucData[1] = (MHL_BURST_ID_BIST_RETURN_STAT &BMASK(7:0));
5376     ucData[12] = (pMHLResourcePrivate->stBISTParameterInfo.usBISTeCbusErrorCount >> 8);
5377     ucData[13] = (pMHLResourcePrivate->stBISTParameterInfo.usBISTeCbusErrorCount &BMASK(7:0));
5378     ucData[14] = (pMHLResourcePrivate->stBISTParameterInfo.usBISTAVLinkErrorCount >> 8);
5379     ucData[15] = (pMHLResourcePrivate->stBISTParameterInfo.usBISTAVLinkErrorCount &BMASK(7:0));
5380     ucData[2] = _mdrv_mhl_WriteBurstCheckSum(ucData);
5381 
5382     if(_mdrv_mhl_CbusSendWriteBurst(pMHLResourcePrivate, 0x40, MHL_MSC_SCRATCHPAD_SIZE, ucData))
5383     {
5384         CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_BIST_RETURN_STATUS_FLAG);
5385 
5386         pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_SEND_DATA;
5387 
5388         MDRV_MHL_MSG_INFO("** MHL send BIST eCbus port %c error count %d\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath), pMHLResourcePrivate->stBISTParameterInfo.usBISTeCbusErrorCount);
5389         MDRV_MHL_MSG_INFO("** MHL send BIST AV link port %c error count %d\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath), pMHLResourcePrivate->stBISTParameterInfo.usBISTAVLinkErrorCount);
5390     }
5391 }
5392 
5393 //**************************************************************************
5394 //  [Function Name]:
5395 //                  _mdrv_mhl_SendWriteBurstInformation()
5396 //  [Description]
5397 //
5398 //  [Arguments]:
5399 //
5400 //  [Return]:
5401 //
5402 //**************************************************************************
_mdrv_mhl_SendWriteBurstInformation(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)5403 void _mdrv_mhl_SendWriteBurstInformation(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
5404 {
5405     MS_BOOL bSendWriteBurst = FALSE;
5406     MS_U8 ucWriteBurstType = MHL_CBUS_SEND_WRITE_BURST_NONE;
5407 
5408     if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_USER_WRITE_BURST_FLAG))
5409     {
5410         ucWriteBurstType = MHL_CBUS_SEND_WRITE_BURST_USER_DATA;
5411     }
5412     else if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_3D_INFORMATION_FLAG))
5413     {
5414         ucWriteBurstType = MHL_CBUS_SEND_WRITE_BURST_3D_INFORMATION;
5415     }
5416     else if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_VC_INFORMATION_FLAG))
5417     {
5418         ucWriteBurstType = MHL_CBUS_SEND_WRITE_BURST_VIRTUAL_CHANNEL;
5419     }
5420     else if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_HIGH_END_VIDEO_FLAG))
5421     {
5422         ucWriteBurstType = MHL_CBUS_SEND_WRITE_BURST_HIGH_END_VIDEO;
5423     }
5424     else if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_AUDIO_DATA_TUNNEL_FLAG))
5425     {
5426         ucWriteBurstType = MHL_CBUS_SEND_WRITE_BURST_AUDIO_DATA_TUNNEL;
5427     }
5428     else if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_EMSC_DATA_TUNNEL_FLAG))
5429     {
5430         ucWriteBurstType = MHL_CBUS_SEND_WRITE_BURST_EMSC_DATA_TUNNEL;
5431     }
5432     else if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_BIST_RETURN_STATUS_FLAG))
5433     {
5434         ucWriteBurstType = MHL_CBUS_SEND_WRITE_BURST_BIST_RETURN_STATUS;
5435     }
5436 
5437     if(ucWriteBurstType != MHL_CBUS_SEND_WRITE_BURST_NONE)
5438     {
5439         if(pMHLResourcePrivate->ucWriteBurstState == MHL_CBUS_WRITE_BURST_NONE)
5440         {
5441             pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_START;
5442         }
5443         else if(pMHLResourcePrivate->ucWriteBurstState == MHL_CBUS_WRITE_BURST_REVEIVE_GRANT)
5444         {
5445             bSendWriteBurst = TRUE;
5446         }
5447     }
5448 
5449     if(bSendWriteBurst)
5450     {
5451         switch(ucWriteBurstType)
5452         {
5453             case MHL_CBUS_SEND_WRITE_BURST_3D_INFORMATION:
5454                 _mdrv_mhl_Send3DTimingInformation(pMHLResourcePrivate);
5455                 break;
5456 
5457             case MHL_CBUS_SEND_WRITE_BURST_VIRTUAL_CHANNEL:
5458                 _mdrv_mhl_SendVirtualChannelInformation(pMHLResourcePrivate);
5459                 break;
5460 
5461             case MHL_CBUS_SEND_WRITE_BURST_HIGH_END_VIDEO:
5462                 _mdrv_mhl_SendHighEndVideoSupport(pMHLResourcePrivate);
5463                 break;
5464 
5465             case MHL_CBUS_SEND_WRITE_BURST_AUDIO_DATA_TUNNEL:
5466                 _mdrv_mhl_SendAudioDataTunnelSupport(pMHLResourcePrivate);
5467                 break;
5468 
5469             case MHL_CBUS_SEND_WRITE_BURST_EMSC_DATA_TUNNEL:
5470                 _mdrv_mhl_SendeMSCSupportInformation(pMHLResourcePrivate);
5471                 break;
5472 
5473             case MHL_CBUS_SEND_WRITE_BURST_BIST_RETURN_STATUS:
5474                 _mdrv_mhl_SendBISTReturnStatus(pMHLResourcePrivate);
5475                 break;
5476 
5477             default:
5478 
5479                 break;
5480         };
5481     }
5482 }
5483 
5484 //**************************************************************************
5485 //  [Function Name]:
5486 //                  _mdrv_mhl_FeatureRequestStateProc()
5487 //  [Description]
5488 //
5489 //  [Arguments]:
5490 //
5491 //  [Return]:
5492 //
5493 //**************************************************************************
_mdrv_mhl_FeatureRequestStateProc(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)5494 void _mdrv_mhl_FeatureRequestStateProc(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
5495 {
5496     switch(pMHLResourcePrivate->ucFeatureRequestState)
5497     {
5498         case MHL_CBUS_FEATURE_START:
5499             pMHLResourcePrivate->ucFeatureRequestState = MHL_CBUS_FEATURE_SEND_3D_INFORMATION;
5500             SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_3D_INFORMATION_FLAG);
5501             SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_3D_DTD_FLAG);
5502             SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_3D_VIC_FLAG);
5503 
5504             break;
5505 
5506         case MHL_CBUS_FEATURE_SEND_3D_INFORMATION:
5507             if(!GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_3D_INFORMATION_FLAG))
5508             {
5509                 pMHLResourcePrivate->ucFeatureRequestState = MHL_CBUS_FEATURE_SEND_HIGH_END_VIDEO;
5510                 SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_HIGH_END_VIDEO_FLAG);
5511                 SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_HEV_VIC_FLAG);
5512                 SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_HEV_DTDA_FLAG);
5513                 SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_HEV_DTDB_FLAG);
5514             }
5515 
5516             break;
5517 
5518         case MHL_CBUS_FEATURE_SEND_HIGH_END_VIDEO:
5519             if(!GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_HIGH_END_VIDEO_FLAG))
5520             {
5521                 pMHLResourcePrivate->ucFeatureRequestState = MHL_CBUS_FEATURE_SEND_AUDIO_DATA_TUNNEL;
5522                 SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_AUDIO_DATA_TUNNEL_FLAG);
5523             }
5524 
5525             break;
5526 
5527         case MHL_CBUS_FEATURE_SEND_AUDIO_DATA_TUNNEL:
5528             if(!GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_AUDIO_DATA_TUNNEL_FLAG))
5529             {
5530                 pMHLResourcePrivate->ucFeatureRequestState = MHL_CBUS_FEATURE_SEND_EMSC_DATA_TUNNEL;
5531                 SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_EMSC_DATA_TUNNEL_FLAG);
5532             }
5533 
5534             break;
5535 
5536         case MHL_CBUS_FEATURE_SEND_EMSC_DATA_TUNNEL:
5537             if(!GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_EMSC_DATA_TUNNEL_FLAG))
5538             {
5539                 if(pMHLResourcePrivate->ucWriteBurstState == MHL_CBUS_WRITE_BURST_NONE)
5540                 {
5541                     pMHLResourcePrivate->ucFeatureRequestState = MHL_CBUS_FEATURE_SEND_FEATURE_COMPLETE;
5542                 }
5543             }
5544 
5545             break;
5546 
5547         case MHL_CBUS_FEATURE_SEND_FEATURE_COMPLETE:
5548             if(_mdrv_mhl_CbusWriteStatusOrSetInt(pMHLResourcePrivate, 0x20, BIT(6), FALSE))
5549             {
5550                 pMHLResourcePrivate->ucFeatureRequestState = MHL_CBUS_FEATURE_END;
5551             }
5552 
5553             break;
5554 
5555         case MHL_CBUS_FEATURE_END:
5556             pMHLResourcePrivate->ucFeatureRequestState = MHL_CBUS_FEATURE_NONE;
5557             break;
5558 
5559         default:
5560 
5561             break;
5562     };
5563 }
5564 
5565 //**************************************************************************
5566 //  [Function Name]:
5567 //                  _mapi_mhl_CbusBISTStateProc()
5568 //  [Description]
5569 //
5570 //  [Arguments]:
5571 //
5572 //  [Return]:
5573 //
5574 //**************************************************************************
_mdrv_mhl_CbusBISTStateProc(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)5575 void _mdrv_mhl_CbusBISTStateProc(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
5576 {
5577     MS_U8 ucBISTECbusMode = 0;
5578 
5579     switch(pMHLResourcePrivate->ucBISTModeState)
5580     {
5581         case MHL_CBUS_BIST_RECEIVE_SETUP:
5582             if(_mdrv_mhl_CbusSendSubMessage(pMHLResourcePrivate, MSC_MSG_BIST_READY, pMHLResourcePrivate->stBISTParameterInfo.ucBISTReadyIndex, FALSE)) // Send BIST ready
5583             {
5584                 pMHLResourcePrivate->ucBISTModeState = MHL_CBUS_BIST_WAIT_TRIGGER;
5585 
5586                 mhal_mhl_SetBISTParameterInfo(pMHLResourcePrivate->ucMHLSupportPath, &(pMHLResourcePrivate->stBISTParameterInfo));
5587             }
5588 
5589             break;
5590 
5591         case MHL_CBUS_BIST_RECEIVE_TRIGGER:
5592             pMHLResourcePrivate->ucBISTModeState = MHL_CBUS_BIST_ECBUS_SWITCH;
5593             ucBISTECbusMode = MHL_RAP_KEY_CBUS_MODE_UP;
5594 
5595             MDRV_MHL_MSG_INFO("** MHL BIST receive trigger in port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
5596 
5597             if(pMHLResourcePrivate->stBISTParameterInfo.usBISTeCbusDuration > 0)
5598             {
5599                 MDRV_MHL_MSG_INFO("** MHL set BIST trigger timer in port %c timer %d\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath), pMHLResourcePrivate->stBISTParameterInfo.usBISTeCbusDuration);
5600 
5601                 _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_BIST_PROCESS, pMHLResourcePrivate->stBISTParameterInfo.usBISTeCbusDuration);
5602             }
5603 
5604             break;
5605 
5606         case MHL_CBUS_BIST_ECBUS_SWITCH:
5607             //mhal_mhl_GetBISTErrorCount(pMHLResourcePrivate->ucMHLSupportPath, &(pMHLResourcePrivate->stBISTParameterInfo));
5608             break;
5609 
5610         case MHL_CBUS_BIST_EVENT_FINISH:
5611             pMHLResourcePrivate->ucBISTModeState = MHL_CBUS_BIST_WAIT_TRIGGER;
5612             ucBISTECbusMode = MHL_RAP_KEY_CBUS_MODE_DOWN;
5613 
5614             MDRV_MHL_MSG_INFO("** MHL BIST run finish in port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
5615 
5616             break;
5617 
5618         case MHL_CBUS_BIST_REQUEST_STATUS:
5619             SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_BIST_RETURN_STATUS_FLAG);
5620             pMHLResourcePrivate->ucBISTModeState = MHL_CBUS_BIST_RETURN_STATUS;
5621             break;
5622 
5623         case MHL_CBUS_BIST_RETURN_STATUS:
5624             if(!GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_BIST_RETURN_STATUS_FLAG))
5625             {
5626                 pMHLResourcePrivate->ucBISTModeState = MHL_CBUS_BIST_WAIT_TRIGGER;
5627             }
5628             break;
5629 
5630         case MHL_CBUS_BIST_END:
5631             pMHLResourcePrivate->ucBISTModeState = MHL_CBUS_BIST_NONE;
5632             pMHLResourcePrivate->stSignalStatusInfo.bBISTEnableFlag = FALSE;
5633             break;
5634 
5635         default:
5636 
5637             break;
5638     };
5639 
5640     if(ucBISTECbusMode > 0)
5641     {
5642         if(ucBISTECbusMode == MHL_RAP_KEY_CBUS_MODE_UP)
5643         {
5644             pMHLResourcePrivate->stBISTParameterInfo.usBISTeCbusErrorCount = 0;
5645             pMHLResourcePrivate->stBISTParameterInfo.usBISTAVLinkErrorCount = 0;
5646             pMHLResourcePrivate->stSignalStatusInfo.bBISTEnableFlag = TRUE;
5647             pMHLResourcePrivate->ucECbusState = MHL_ECBUS_STATE_BIST_MODE_UP;
5648         }
5649         else if(ucBISTECbusMode == MHL_RAP_KEY_CBUS_MODE_DOWN)
5650         {
5651             pMHLResourcePrivate->ucECbusState = MHL_ECBUS_STATE_BIST_MODE_DOWN;
5652 
5653             mhal_mhl_GetBISTErrorCount(pMHLResourcePrivate->ucMHLSupportPath, &(pMHLResourcePrivate->stBISTParameterInfo));
5654         }
5655     }
5656 }
5657 
5658 //**************************************************************************
5659 //  [Function Name]:
5660 //                  _mdrv_mhl_SendEMSCDataString()
5661 //  [Description]
5662 //
5663 //  [Arguments]:
5664 //
5665 //  [Return]:
5666 //
5667 //**************************************************************************
_mdrv_mhl_SendEMSCDataString(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_U8 ucLength,MS_U8 * ucSendData)5668 MS_U8 _mdrv_mhl_SendEMSCDataString(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_U8 ucLength, MS_U8 *ucSendData)
5669 {
5670     MS_BOOL bDoAgainFlag = FALSE;
5671     MS_U8 uctemp = 0;
5672     MS_U8 ucSendStatus = 0;
5673     MS_U8 ucSendEMSC[MHL_EMSC_DATA_SIZE] = {0};
5674 
5675     do
5676     {
5677         bDoAgainFlag = FALSE;
5678 
5679         switch(pMHLResourcePrivate->ucEMSCSendStatus)
5680         {
5681             case MHL_EMSC_SEND_NONE:
5682                 if((ucLength +2) <= pMHLResourcePrivate->usEMSCTxBufferSize) // eMSC data length must small than Tx buffer +2
5683                 {
5684                     ucSendEMSC[0] = MHL_EMSC_DATA_SIZE - pMHLResourcePrivate->usEMSCRxBufferSize;
5685                     ucSendEMSC[1] = ucLength;
5686 
5687                     if(ucSendData != 0)
5688                     {
5689                         for(uctemp = 0; uctemp < ucLength; uctemp++)
5690                         {
5691                             ucSendEMSC[uctemp +2] = ucSendData[uctemp];
5692                         }
5693                     }
5694 
5695                     pMHLResourcePrivate->ucEMSCSendStatus = MHL_EMSC_SEND_DATA;
5696                     bDoAgainFlag = TRUE;
5697                 }
5698 
5699                 break;
5700 
5701             case MHL_EMSC_SEND_DATA:
5702                 ucSendStatus = mhal_mhl_GetEMSCSendStatus();
5703                 mhal_mhl_InsertEMSCSendData(ucLength +2, ucSendEMSC);
5704 
5705                 pMHLResourcePrivate->ucEMSCSendStatus = MHL_EMSC_SEND_CHECK;
5706 
5707                 break;
5708 
5709             case MHL_EMSC_SEND_CHECK:
5710                 ucSendStatus = mhal_mhl_GetEMSCSendStatus();
5711 
5712                 if(ucSendStatus != MHL_EMSC_SEND_NONE)
5713                 {
5714                     pMHLResourcePrivate->ucEMSCSendStatus = ucSendStatus;
5715                 }
5716 
5717                 break;
5718 
5719             case MHL_EMSC_SEND_PASS:
5720                 pMHLResourcePrivate->ucEMSCSendStatus = MHL_EMSC_SEND_NONE;
5721                 break;
5722 
5723             case MHL_EMSC_SEND_FAIL:
5724                 pMHLResourcePrivate->ucEMSCSendStatus = MHL_EMSC_SEND_NONE;
5725                 break;
5726 
5727             default:
5728                 pMHLResourcePrivate->ucEMSCSendStatus = MHL_EMSC_SEND_NONE;
5729                 break;
5730         };
5731     }while(bDoAgainFlag);
5732 
5733     if(pMHLResourcePrivate->ucEMSCSendStatus == MHL_EMSC_SEND_PASS)
5734     {
5735         MDRV_MHL_MSG_INFO("** MHL eMSC send pass !! port %c\r\n", MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
5736 
5737         pMHLResourcePrivate->usEMSCRxBufferSize = MHL_EMSC_DATA_SIZE;
5738         pMHLResourcePrivate->usEMSCTxBufferSize = pMHLResourcePrivate->usEMSCTxBufferSize -ucLength -2;
5739 
5740         MDRV_MHL_MSG_INFO("** MHL eMSC send Rx buffer size %d in port %c !!\r\n", pMHLResourcePrivate->usEMSCRxBufferSize, MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
5741         MDRV_MHL_MSG_INFO("** MHL eMSC send Tx buffer size %d in port %c !!\r\n", pMHLResourcePrivate->usEMSCTxBufferSize, MHL_INPUT_PORT(pMHLResourcePrivate->ucMHLSupportPath));
5742     }
5743 
5744     return pMHLResourcePrivate->ucEMSCSendStatus;
5745 }
5746 
5747 //**************************************************************************
5748 //  [Function Name]:
5749 //                  _mdrv_mhl_CheckEMSCRxBufferSize()
5750 //  [Description]
5751 //
5752 //  [Arguments]:
5753 //
5754 //  [Return]:
5755 //
5756 //**************************************************************************
_mdrv_mhl_CheckEMSCRxBufferSize(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)5757 void _mdrv_mhl_CheckEMSCRxBufferSize(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
5758 {
5759     MS_U8 ucSendStatus = 0;
5760 
5761     if(pMHLResourcePrivate->usEMSCRxBufferSize < MHL_EMSC_DATA_SIZE_THRESHOLD)
5762     {
5763         ucSendStatus = _mdrv_mhl_SendEMSCDataString(pMHLResourcePrivate, 0, NULL);
5764     }
5765 }
5766 
5767 //**************************************************************************
5768 //  [Function Name]:
5769 //                  _mdrv_mhl_CbusTxHandler()
5770 //  [Description]
5771 //
5772 //  [Arguments]:
5773 //
5774 //  [Return]:
5775 //
5776 //**************************************************************************
_mdrv_mhl_CbusTxHandler(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)5777 void _mdrv_mhl_CbusTxHandler(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
5778 {
5779     if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_CONNECT_FLAG))
5780     {
5781         _mdrv_mhl_TxQueueHandler(pMHLResourcePrivate);
5782 
5783         if(!GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CBUS_TX_QUEUE_FREEZE_FLAG))
5784         {
5785             _mdrv_mhl_SendDisplayCommand(pMHLResourcePrivate);
5786 
5787             _mdrv_mhl_WriteBurstEventProc(pMHLResourcePrivate);
5788 
5789             _mdrv_mhl_SendWriteBurstInformation(pMHLResourcePrivate);
5790 
5791             if(GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_ECBUS_FUNCTION_FLAG))
5792             {
5793                 _mdrv_mhl_ReadExtendDeviceCapabilityProc(pMHLResourcePrivate);
5794 
5795                 _mdrv_mhl_FeatureRequestStateProc(pMHLResourcePrivate);
5796 
5797                 _mdrv_mhl_CheckEMSCRxBufferSize(pMHLResourcePrivate);
5798             }
5799 
5800             _mdrv_mhl_GetVenderIDProc(pMHLResourcePrivate);
5801 
5802             _mdrv_mhl_ReadDeviceCapabilityProc(pMHLResourcePrivate);
5803         }
5804 
5805         if(GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_ECBUS_FUNCTION_FLAG))
5806         {
5807             _mdrv_mhl_CbusBISTStateProc(pMHLResourcePrivate);
5808         }
5809     }
5810 }
5811 
5812 //**************************************************************************
5813 //  [Function Name]:
5814 //                  _mdrv_mhl_AutoSwitchProc()
5815 //  [Description]
5816 //
5817 //  [Arguments]:
5818 //
5819 //  [Return]:
5820 //
5821 //**************************************************************************
_mdrv_mhl_AutoSwitchProc(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)5822 void _mdrv_mhl_AutoSwitchProc(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
5823 {
5824     MS_BOOL bOnLinePortFlag = FALSE;
5825 
5826     if(GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_SWITCH_FLAG))
5827     {
5828         if(mhal_mhl_CheckInputPort(pMHLResourcePrivate->ucMHLSupportPath) && mhal_mhl_CheckPIPWindow())
5829         {
5830             bOnLinePortFlag = TRUE;
5831         }
5832 
5833         if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_AUTO_SWITCH_SETTING_FLAG))
5834         {
5835             if(GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_WAKE_FLAG))
5836             {
5837                 CLR_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_WAKE_FLAG);
5838                 CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_SWITCH_FLAG);
5839                 CLR_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_AUTO_SWITCH_SETTING_FLAG);
5840                 SET_MHL_DONE_FLAG(pMHLResourcePrivate->ucProcDoneIndex, MHL_AUTO_SWITCH_DONE_FLAG);
5841             }
5842             else // Setting but not wake up
5843             {
5844                 if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CABLE_PLUG_FLAG))
5845                 {
5846                     mhal_mhl_VbusCharge(pMHLResourcePrivate->ucMHLSupportPath, MHL_VBUS_CHARGE_ON);
5847                 }
5848                 else
5849                 {
5850                     mhal_mhl_VbusCharge(pMHLResourcePrivate->ucMHLSupportPath, MHL_VBUS_HW_DETCET);
5851                 }
5852 
5853                 if(bOnLinePortFlag)
5854                 {
5855                     mhal_mhl_CbusWakeupIntSetting(pMHLResourcePrivate->ucMHLSupportPath, FALSE);
5856 
5857                     CLR_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_AUTO_SWITCH_SETTING_FLAG);
5858                     CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_SWITCH_FLAG);
5859                 }
5860             }
5861         }
5862         else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_CONNECT_FLAG))
5863         {
5864             CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_SWITCH_FLAG);
5865         }
5866         else // Not setting
5867         {
5868             if(!bOnLinePortFlag)
5869             {
5870                 mhal_mhl_CbusWakeupIntSetting(pMHLResourcePrivate->ucMHLSupportPath, TRUE);
5871 
5872                 SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_AUTO_SWITCH_SETTING_FLAG);
5873             }
5874         }
5875     }
5876 }
5877 
5878 //**************************************************************************
5879 //  [Function Name]:
5880 //                  _mdrv_mhl_ForceSendClearHPD()
5881 //  [Description]
5882 //
5883 //  [Arguments]:
5884 //
5885 //  [Return]:
5886 //
5887 //**************************************************************************
_mdrv_mhl_ForceSendClearHPD(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)5888 void _mdrv_mhl_ForceSendClearHPD(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
5889 {
5890     stMHL_QUEUE_INFO stCbusQueueInfo = {0};
5891 
5892     stCbusQueueInfo.ucQueueState = MHL_QUEUE_STATE_PENDING;
5893     stCbusQueueInfo.ucLength = 0;
5894     stCbusQueueInfo.ucCommand = MSC_CLR_HPD;
5895 
5896     if(_mdrv_mhl_CbusTxWriteCommand(pMHLResourcePrivate->stSignalStatusInfo.bECbusEnableFlag, &stCbusQueueInfo))
5897     {
5898         CLR_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_HPD_SET_FLAG);
5899     }
5900 }
5901 
5902 //**************************************************************************
5903 //  [Function Name]:
5904 //                  _mdrv_mhl_RtermControlHWMode()
5905 //  [Description]
5906 //
5907 //  [Arguments]:
5908 //
5909 //  [Return]:
5910 //
5911 //**************************************************************************
_mdrv_mhl_RtermControlHWMode(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate,MS_BOOL bEnableFlag)5912 void _mdrv_mhl_RtermControlHWMode(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate, MS_BOOL bEnableFlag)
5913 {
5914     if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CABLE_PLUG_FLAG))
5915     {
5916         mhal_mhl_RtermControlHWMode(pMHLResourcePrivate->ucMHLSupportPath, bEnableFlag);
5917     }
5918 }
5919 
5920 //**************************************************************************
5921 //  [Function Name]:
5922 //                  _mdrv_mhl_PollingEventProc
5923 //  [Description]:
5924 //
5925 //  [Arguments]:
5926 //
5927 //  [Return]:
5928 //
5929 //**************************************************************************
_mdrv_mhl_PollingEventProc(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)5930 void _mdrv_mhl_PollingEventProc(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
5931 {
5932     _mdrv_mhl_TimerHandler(pMHLResourcePrivate);
5933 
5934     _mdrv_mhl_RtermControlHWMode(pMHLResourcePrivate, FALSE);
5935 
5936     _mdrv_mhl_CheckStatusPolling(pMHLResourcePrivate);
5937 
5938     _mdrv_mhl_RtermControlHWMode(pMHLResourcePrivate, TRUE);
5939 
5940     _mdrv_mhl_CbusRxHandler(pMHLResourcePrivate);
5941 
5942     _mdrv_mhl_CbusTxHandler(pMHLResourcePrivate);
5943 
5944     _mdrv_mhl_AutoSwitchProc(pMHLResourcePrivate);
5945 }
5946 
5947 #if(MHL_USE_UTOPIA_VERSION == MHL_UTOPIA_VERSION_10)
5948 //**************************************************************************
5949 //  [Function Name]:
5950 //                  _mdrv_mhl_ResourceGetPrivate
5951 //  [Description]:
5952 //
5953 //  [Arguments]:
5954 //
5955 //  [Return]:
5956 //
5957 //**************************************************************************
_mdrv_mhl_ResourceGetPrivate(void ** ppPrivate)5958 MS_BOOL _mdrv_mhl_ResourceGetPrivate(void** ppPrivate)
5959 {
5960     MS_BOOL bGetPrivateFlag = FALSE;
5961 
5962     *ppPrivate = &stMHLResourcePrivate;
5963 
5964     if(*ppPrivate != NULL)
5965     {
5966         bGetPrivateFlag = TRUE;
5967     }
5968 
5969     return bGetPrivateFlag;
5970 }
5971 
5972 #elif(MHL_USE_UTOPIA_VERSION == MHL_UTOPIA_VERSION_20)
5973 //**************************************************************************
5974 //  [Function Name]:
5975 //                  _mdrv_mhl_PollingTask
5976 //  [Description]:
5977 //
5978 //  [Arguments]:
5979 //
5980 //  [Return]:
5981 //
5982 //**************************************************************************
_mdrv_mhl_PollingTask(void)5983 void _mdrv_mhl_PollingTask(void)
5984 {
5985     void* pModule = NULL;
5986     void* pMHLResource = NULL;
5987     MS_BOOL bMHLTaskProcFlag = TRUE;
5988     MS_U32 usPollingTaskInterval = 0;
5989     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
5990 
5991     UtopiaModuleGetPtr(MODULE_MHL, &pModule);
5992 
5993     while(bMHLTaskProcFlag)
5994     {
5995         if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
5996         {
5997             MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
5998         }
5999         else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
6000         {
6001             MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6002         }
6003         else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6004         {
6005             _mdrv_mhl_PollingEventProc(pMHLResourcePrivate);
6006 
6007             if(GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_COMMUNICATE_BUSY_FLAG))
6008             {
6009                 usPollingTaskInterval = MHL_POLLING_INTERVAL_BUSY;
6010             }
6011             else
6012             {
6013                 usPollingTaskInterval = MHL_POLLING_INTERVAL_NORMAL;
6014             }
6015 
6016             bMHLTaskProcFlag = GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_TASK_PROCESS_FLAG);
6017         }
6018 
6019         UtopiaResourceRelease(pMHLResource);
6020 
6021         MsOS_DelayTask(usPollingTaskInterval);
6022     }
6023 }
6024 
6025 //**************************************************************************
6026 //  [Function Name]:
6027 //                  _mdrv_mhl_CreateTask
6028 //  [Description]:
6029 //
6030 //  [Arguments]:
6031 //
6032 //  [Return]:
6033 //
6034 //**************************************************************************
_mdrv_mhl_CreateTask(MHL_RESOURCE_PRIVATE * pMHLResourcePrivate)6035 MS_BOOL _mdrv_mhl_CreateTask(MHL_RESOURCE_PRIVATE *pMHLResourcePrivate)
6036 {
6037     MS_BOOL bCreateSuccess = TRUE;
6038 
6039     if(pMHLResourcePrivate->slMHLPollingTaskID < 0)
6040     {
6041         pMHLResourcePrivate->slMHLPollingTaskID = MsOS_CreateTask((TaskEntry) _mdrv_mhl_PollingTask,
6042                                      (MS_VIRT) NULL,
6043                                      E_TASK_PRI_MEDIUM,
6044                                      TRUE,
6045                                      (void *)pMHLResourcePrivate->ucMHLPollingStack,
6046                                      MHL_POLLING_STACK_SIZE,
6047                                      "MHL task");
6048 
6049         SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_TASK_PROCESS_FLAG);
6050     }
6051 
6052     if(pMHLResourcePrivate->slMHLPollingTaskID < 0)
6053     {
6054         MDRV_MHL_MSG_ERROR("MsOS_CreateTask failed!!\n");
6055 
6056         MsOS_DeleteEventGroup(pMHLResourcePrivate->slMHLPollingTaskID);
6057 
6058         bCreateSuccess = FALSE;
6059     }
6060 
6061     return bCreateSuccess;
6062 }
6063 
6064 #endif
6065 
6066 //**************************************************************************
6067 //  [Function Name]:
6068 //                  _mdrv_mhl_IsrHandler()
6069 //  [Description]
6070 //
6071 //  [Arguments]:
6072 //
6073 //  [Return]:
6074 //
6075 //**************************************************************************
_mdrv_mhl_IsrHandler(InterruptNum eIntNum)6076 static void _mdrv_mhl_IsrHandler(InterruptNum eIntNum)
6077 {
6078 #if(MHL_USE_UTOPIA_VERSION == MHL_UTOPIA_VERSION_10)
6079     MS_BOOL bGetResourceFlag = FALSE;
6080     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6081 
6082     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
6083     {
6084         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6085     }
6086     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6087     {
6088         bGetResourceFlag = TRUE;
6089     }
6090 
6091     UNUSED(eIntNum);
6092 
6093     //MsOS_DisableInterrupt(E_INT_IRQ_MHL_CBUS_PM);
6094 
6095     if(mhal_mhl_CbusIsMscMsgReceived() && bGetResourceFlag)
6096     {
6097         SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_MSC_FLAG);
6098         CLR_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_RECEIVE_LOSE_FLAG);
6099 
6100         pMHLResourcePrivate->ucReceiveCounter++;
6101     }
6102 
6103     if(mhal_mhl_CbusStucktoLowFlag())
6104     {
6105         mhal_mhl_CbusStucktoLow(FALSE);
6106 
6107         if(bGetResourceFlag)
6108         {
6109             mhal_mhl_CbusStucktoLowProc(pMHLResourcePrivate->ucMHLSupportPath);
6110 
6111             mhal_mhl_CDRModeMonitor(pMHLResourcePrivate->ucMHLSupportPath, FALSE, &(pMHLResourcePrivate->stSignalStatusInfo));
6112         }
6113     }
6114 
6115     if(mhal_mhl_CbusWakeupIntFlag())
6116     {
6117         mhal_mhl_CbusWakeupInterrupt(FALSE);
6118 
6119         if(bGetResourceFlag)
6120         {
6121             SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_WAKE_FLAG);
6122         }
6123     }
6124 
6125     if(bGetResourceFlag)
6126     {
6127         if(GET_MHL_CHIP_FLAG(pMHLResourcePrivate->ucChipCapability, MHL_CHIP_INTERRUPT_USE_PM_IRQ_FLAG))
6128         {
6129             MsOS_EnableInterrupt(E_INT_IRQ_PM);
6130         }
6131         else
6132         {
6133             MsOS_EnableInterrupt(E_INT_IRQ_MHL_CBUS_PM);
6134         }
6135     }
6136 
6137 #elif(MHL_USE_UTOPIA_VERSION == MHL_UTOPIA_VERSION_20)
6138     void* pModule = NULL;
6139     void* pMHLResource = NULL;
6140     MS_BOOL bGetResourceFlag = FALSE;
6141     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6142 
6143     UtopiaModuleGetPtr(MODULE_MHL, &pModule);
6144 
6145     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
6146     {
6147         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
6148     }
6149     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
6150     {
6151         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6152     }
6153     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6154     {
6155         bGetResourceFlag = TRUE;
6156     }
6157 
6158     UNUSED(eIntNum);
6159 
6160     //MsOS_DisableInterrupt(E_INT_IRQ_MHL_CBUS_PM);
6161 
6162     if(mhal_mhl_CbusIsMscMsgReceived() && bGetResourceFlag)
6163     {
6164         SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_MSC_FLAG);
6165         CLR_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_RECEIVE_LOSE_FLAG);
6166 
6167         pMHLResourcePrivate->ucReceiveCounter++;
6168     }
6169 
6170     if(mhal_mhl_CbusStucktoLowFlag())
6171     {
6172         mhal_mhl_CbusStucktoLow(FALSE);
6173 
6174         if(bGetResourceFlag)
6175         {
6176             mhal_mhl_CbusStucktoLowProc(pMHLResourcePrivate->ucMHLSupportPath);
6177 
6178             mhal_mhl_CDRModeMonitor(pMHLResourcePrivate->ucMHLSupportPath, FALSE, &(pMHLResourcePrivate->stSignalStatusInfo));
6179         }
6180     }
6181 
6182     if(mhal_mhl_CbusWakeupIntFlag())
6183     {
6184         mhal_mhl_CbusWakeupInterrupt(FALSE);
6185 
6186         if(bGetResourceFlag)
6187         {
6188             SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_WAKE_FLAG);
6189         }
6190     }
6191 
6192     if(bGetResourceFlag)
6193     {
6194         if(GET_MHL_CHIP_FLAG(pMHLResourcePrivate->ucChipCapability, MHL_CHIP_INTERRUPT_USE_PM_IRQ_FLAG))
6195         {
6196             MsOS_EnableInterrupt(E_INT_IRQ_PM);
6197         }
6198         else
6199         {
6200             MsOS_EnableInterrupt(E_INT_IRQ_MHL_CBUS_PM);
6201         }
6202     }
6203 
6204     UtopiaResourceRelease(pMHLResource);
6205 
6206 #endif
6207 }
6208 
6209 //**************************************************************************
6210 //  [Function Name]:
6211 //                  _mdrv_mhl_ECbusIsrHandler()
6212 //  [Description]
6213 //
6214 //  [Arguments]:
6215 //
6216 //  [Return]:
6217 //
6218 //**************************************************************************
_mdrv_mhl_ECbusIsrHandler(InterruptNum eIntNum)6219 static void _mdrv_mhl_ECbusIsrHandler(InterruptNum eIntNum)
6220 {
6221 #if(MHL_USE_UTOPIA_VERSION == MHL_UTOPIA_VERSION_10)
6222     MS_BOOL bGetResourceFlag = FALSE;
6223     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6224 
6225     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
6226     {
6227         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6228     }
6229     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6230     {
6231         bGetResourceFlag = TRUE;
6232     }
6233 
6234     UNUSED(eIntNum);
6235 
6236     if(bGetResourceFlag)
6237     {
6238         if(mhal_mhl_GetECbusStateChangeFlag(&(pMHLResourcePrivate->stSignalStatusInfo), &(pMHLResourcePrivate->stBISTParameterInfo)))
6239         {
6240 
6241         }
6242     }
6243     else
6244     {
6245         if(mhal_mhl_GetECbusStateChangeFlag(NULL, NULL))
6246         {
6247 
6248         }
6249     }
6250 
6251     if(mhal_mhl_GetEMSCReceiveFlag() && bGetResourceFlag)
6252     {
6253         pMHLResourcePrivate->ucEMSCReceiveCounter++;
6254     }
6255 
6256 #elif(MHL_USE_UTOPIA_VERSION == MHL_UTOPIA_VERSION_20)
6257     void* pModule = NULL;
6258     void* pMHLResource = NULL;
6259     MS_BOOL bGetResourceFlag = FALSE;
6260     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6261 
6262     UtopiaModuleGetPtr(MODULE_MHL, &pModule);
6263 
6264     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
6265     {
6266         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
6267     }
6268     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
6269     {
6270         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6271     }
6272     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6273     {
6274         bGetResourceFlag = TRUE;
6275     }
6276 
6277     UNUSED(eIntNum);
6278 
6279     if(bGetResourceFlag)
6280     {
6281         if(mhal_mhl_GetECbusStateChangeFlag(&(pMHLResourcePrivate->stSignalStatusInfo), &(pMHLResourcePrivate->stBISTParameterInfo)))
6282         {
6283 
6284         }
6285     }
6286     else
6287     {
6288         if(mhal_mhl_GetECbusStateChangeFlag(NULL, NULL))
6289         {
6290 
6291         }
6292     }
6293 
6294     if(mhal_mhl_GetEMSCReceiveFlag() && bGetResourceFlag)
6295     {
6296         pMHLResourcePrivate->ucEMSCReceiveCounter++;
6297     }
6298 
6299     UtopiaResourceRelease(pMHLResource);
6300 
6301 #endif
6302 
6303     MsOS_EnableInterrupt(E_INT_IRQ_MHL_ECBUS_INT);
6304 }
6305 
6306 //-------------------------------------------------------------------------------------------------
6307 //  Global Functions
6308 //-------------------------------------------------------------------------------------------------
6309 #if(MHL_USE_UTOPIA_VERSION == MHL_UTOPIA_VERSION_10)
6310 //**************************************************************************
6311 //  [Function Name]:
6312 //                  mdrv_mhl_STREventProc()
6313 //  [Description]
6314 //
6315 //  [Arguments]:
6316 //
6317 //  [Return]:
6318 //
6319 //**************************************************************************
mdrv_mhl_STREventProc(EN_POWER_MODE usPowerState)6320 MS_U32 mdrv_mhl_STREventProc(EN_POWER_MODE usPowerState)
6321 {
6322     MS_U32 ulReturnValue = UTOPIA_STATUS_FAIL;
6323     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6324 
6325     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
6326     {
6327         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6328     }
6329     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6330     {
6331         if(pMHLResourcePrivate->usPrePowerState != usPowerState)
6332         {
6333             if(usPowerState == E_POWER_SUSPEND)
6334             {
6335                 if(GET_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_HPD_SET_FLAG))
6336                 {
6337                     _mdrv_mhl_ForceSendClearHPD(pMHLResourcePrivate);
6338                 }
6339 
6340                 ulReturnValue = UTOPIA_STATUS_SUCCESS;
6341             }
6342             else if(usPowerState == E_POWER_RESUME)
6343             {
6344                 pMHLResourcePrivate->ucChipCapability = mhal_mhl_initial(pMHLResourcePrivate->ucMHLSupportPath, NULL, NULL, pMHLResourcePrivate->ucDeviceVenderID);
6345 
6346                 CLR_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_NORMAL_FLAG);
6347 
6348                 if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CABLE_PLUG_FLAG))
6349                 {
6350                     if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_CONNECT_FLAG))
6351                     {
6352                         mhal_mhl_ClockModeSwitchProc(pMHLResourcePrivate->ucMHLSupportPath, FALSE, &(pMHLResourcePrivate->stSignalStatusInfo));
6353 
6354                         mhal_mhl_CbusConnectProc(pMHLResourcePrivate->ucMHLSupportPath);
6355 
6356                         if(pMHLResourcePrivate->ucTMDSClockMode == MHL_PHY_CLOCK_PACKET_PIXEL)
6357                         {
6358                             mhal_mhl_ClockModeSwitchProc(pMHLResourcePrivate->ucMHLSupportPath, TRUE, &(pMHLResourcePrivate->stSignalStatusInfo));
6359                         }
6360                     }
6361                     else
6362                     {
6363                         mhal_mhl_CablePlugProc(pMHLResourcePrivate->ucMHLSupportPath, &(pMHLResourcePrivate->stSignalStatusInfo));
6364                     }
6365                 }
6366 
6367                 ulReturnValue = UTOPIA_STATUS_SUCCESS;
6368             }
6369 
6370             pMHLResourcePrivate->usPrePowerState = usPowerState;
6371         }
6372     }
6373 
6374     return ulReturnValue;
6375 }
6376 
6377 //**************************************************************************
6378 //  [Function Name]:
6379 //                  mdrv_mhl_MHLSupportPath()
6380 //  [Description]
6381 //                  MHL support path
6382 //  [Arguments]:
6383 //
6384 //  [Return]:
6385 //
6386 //**************************************************************************
mdrv_mhl_MHLSupportPath(MS_U8 ucSelect)6387 void mdrv_mhl_MHLSupportPath(MS_U8 ucSelect)
6388 {
6389     MS_BOOL bMHLEfuseFlag = TRUE;
6390     MS_U8 uctemp = 0;
6391     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6392 
6393     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
6394     {
6395         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6396     }
6397     else
6398     {
6399         // Clear flag
6400         if(pMHLResourcePrivate->ucInitialIndex != 0xA5)
6401         {
6402             _mdrv_mhl_ClearCbusFlag(pMHLResourcePrivate, MHL_CLEAR_INITIAL_FLAG);
6403 
6404             pMHLResourcePrivate->ucInitialIndex = 0xA5;
6405 
6406             if(_mdrv_mhl_InitRiuBase(pMHLResourcePrivate)) // Get base success
6407             {
6408                 MDRV_MHL_MSG_INFO("** MHL get XC and PM base success \n");
6409 
6410                 SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG);
6411             }
6412         }
6413         else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6414         {
6415             mhal_mhl_SetRegisterBaseAddress(pMHLResourcePrivate->ulRiuBaseAddress, pMHLResourcePrivate->ulPMRiuBaseAddress);
6416         }
6417 
6418         mhal_mhl_MHLSupportPath(ucSelect);
6419 
6420         bMHLEfuseFlag = MDrv_SYS_Query(E_SYS_QUERY_MHL_SUPPORTED);
6421 
6422         if(mhal_mhl_CheckEfuseControlFlag(bMHLEfuseFlag))
6423         {
6424             MDRV_MHL_MSG_INFO("** MHL function not support in this chip ###\r\n");
6425         }
6426         else
6427         {
6428             for(uctemp = 0; uctemp < MHL_CBUS_SELECT_MASK ;uctemp++)
6429             {
6430                 if(ucSelect &BIT(uctemp))
6431                 {
6432                     pMHLResourcePrivate->ucMHLSupportPath = uctemp;
6433 
6434                     MDRV_MHL_MSG_INFO("** MHL function support in port %c\r\n", MHL_INPUT_PORT(uctemp));
6435                 }
6436             }
6437         }
6438     }
6439 }
6440 
6441 //**************************************************************************
6442 //  [Function Name]:
6443 //                  mdrv_mhl_Initial()
6444 //  [Description]
6445 //                  MHL init
6446 //  [Arguments]:
6447 //                  *edid: MHL EDID data
6448 //                  *devcap: MHL device capability
6449 //  [Return]:
6450 //
6451 //**************************************************************************
mdrv_mhl_Initial(MS_U8 * edid,MS_U8 * DevCap)6452 void mdrv_mhl_Initial(MS_U8 *edid, MS_U8 *DevCap)
6453 {
6454     MS_U8 uctemp = 0;
6455     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6456 
6457     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
6458     {
6459         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6460     }
6461     else
6462     {
6463         // Clear flag
6464         if(pMHLResourcePrivate->ucInitialIndex != 0xA5)
6465         {
6466             _mdrv_mhl_ClearCbusFlag(pMHLResourcePrivate, MHL_CLEAR_INITIAL_FLAG);
6467 
6468             pMHLResourcePrivate->ucInitialIndex = 0xA5;
6469         }
6470 
6471         if(_mdrv_mhl_InitRiuBase(pMHLResourcePrivate)) // Get base success
6472         {
6473             MDRV_MHL_MSG_INFO("** MHL get XC and PM base success \n");
6474 
6475             SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG);
6476         }
6477 
6478         if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6479         {
6480             if(!GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_PREVENT_REINITIAL_FLAG))
6481             {
6482                 // Chip initial
6483                 pMHLResourcePrivate->ucChipCapability = mhal_mhl_initial(pMHLResourcePrivate->ucMHLSupportPath, edid, DevCap, pMHLResourcePrivate->ucDeviceVenderID);
6484 
6485                 SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_PREVENT_REINITIAL_FLAG);
6486             }
6487             else
6488             {
6489                 // Load EDID
6490                 mhal_mhl_LoadEDID(edid);
6491 
6492                 // Load vendor ID
6493                 mhal_mhl_SetVenderID(pMHLResourcePrivate->ucDeviceVenderID);
6494 
6495                 // Load DevCap
6496                 mhal_mhl_LoadDeviceCapability(DevCap);
6497             }
6498 
6499             // Parsing EDID
6500             _mdrv_mhl_ParsingEDIDfor3D(pMHLResourcePrivate, edid);
6501 
6502             // Check and insert device capability
6503             if(DevCap != NULL)
6504             {
6505                 for(uctemp = 0; uctemp < MHL_DEVICE_CAPABILITY_SIZE; uctemp++)
6506                 {
6507                     pMHLResourcePrivate->ucDeviceCapabilityTable[uctemp] = DevCap[uctemp];
6508                 }
6509 
6510                 if(_mdrv_mhl_GetEnhanceCbusFlag(pMHLResourcePrivate)) // Chip support MHL 3.0
6511                 {
6512                     SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_ENHANCE_FLAG);
6513 
6514                     for(uctemp = 0; uctemp < MHL_XDEVICE_CAPABILITY_SIZE; uctemp++)
6515                     {
6516                         pMHLResourcePrivate->ucDeviceCapabilityTable[MHL_DEVICE_CAPABILITY_SIZE +uctemp] = DevCap[MHL_DEVICE_CAPABILITY_SIZE +uctemp];
6517                     }
6518                 }
6519                 else if(DevCap[MHL_CBUS_VERSION] >= 0x30) // Change MHL version to 2.1
6520                 {
6521                     pMHLResourcePrivate->ucDeviceCapabilityTable[MHL_CBUS_VERSION] = 0x21;
6522 
6523                     mhal_mhl_LoadDeviceCapability(pMHLResourcePrivate->ucDeviceCapabilityTable);
6524 
6525                     MDRV_MHL_MSG_INFO("** MHL this chip not supprt MHL 3.0 \r\n");
6526                 }
6527             }
6528 
6529             // Attach Cbus ISR
6530             if(!GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_ISR_ATTACH_FLAG))
6531             {
6532                 if(GET_MHL_CHIP_FLAG(pMHLResourcePrivate->ucChipCapability, MHL_CHIP_INTERRUPT_USE_PM_IRQ_FLAG))
6533                 {
6534                     MsOS_AttachInterrupt(E_INT_IRQ_PM, _mdrv_mhl_IsrHandler);
6535                     MsOS_EnableInterrupt(E_INT_IRQ_PM);
6536                 }
6537                 else
6538                 {
6539                     MsOS_AttachInterrupt(E_INT_IRQ_MHL_CBUS_PM, _mdrv_mhl_IsrHandler);
6540                     MsOS_EnableInterrupt(E_INT_IRQ_MHL_CBUS_PM);
6541                 }
6542 
6543                 SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_ISR_ATTACH_FLAG);
6544             }
6545 
6546             // Attach eCbus ISR
6547             if(!GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_ECBUS_ISR_ATTACH_FLAG))
6548             {
6549                 if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_ENHANCE_FLAG))
6550                 {
6551                     MsOS_AttachInterrupt(E_INT_IRQ_MHL_ECBUS_INT, _mdrv_mhl_ECbusIsrHandler);
6552                     MsOS_EnableInterrupt(E_INT_IRQ_MHL_ECBUS_INT);
6553 
6554                     SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_ECBUS_ISR_ATTACH_FLAG);
6555                 }
6556             }
6557         }
6558     }
6559 }
6560 
6561 //**************************************************************************
6562 //  [Function Name]:
6563 //                  mdrv_mhl_Handler()
6564 //  [Description]
6565 //                  MHL handler
6566 //  [Arguments]:
6567 //
6568 //  [Return]:
6569 //
6570 //**************************************************************************
mdrv_mhl_Handler(void)6571 MS_U16 mdrv_mhl_Handler(void)
6572 {
6573     MS_U16 usMSGKeyInfo = 0;
6574     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6575 
6576     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
6577     {
6578         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6579     }
6580     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6581     {
6582         _mdrv_mhl_PollingEventProc(pMHLResourcePrivate);
6583 
6584         if(GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CALLBACK_FUNCTION_FLAG))
6585         {
6586             CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CALLBACK_FUNCTION_FLAG);
6587 
6588             usMSGKeyInfo = pMHLResourcePrivate->usMSGKeyInfo;
6589         }
6590     }
6591 
6592     return usMSGKeyInfo;
6593 }
6594 
6595 //**************************************************************************
6596 //  [Function Name]:
6597 //                  mdrv_mhl_AutoSwitchHandler()
6598 //  [Description]
6599 //
6600 //  [Arguments]:
6601 //
6602 //  [Return]:
6603 //
6604 //**************************************************************************
mdrv_mhl_AutoSwitchHandler(MS_BOOL bReset,MS_U8 * ucCbusPath)6605 MS_BOOL mdrv_mhl_AutoSwitchHandler(MS_BOOL bReset, MS_U8 *ucCbusPath)
6606 {
6607     MS_BOOL bAutoSwitchFlag = FALSE;
6608     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6609 
6610     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
6611     {
6612         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6613     }
6614     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6615     {
6616         if(bReset)
6617         {
6618             CLR_MHL_DONE_FLAG(pMHLResourcePrivate->ucProcDoneIndex, MHL_AUTO_SWITCH_DONE_FLAG);
6619             CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_SWITCH_FLAG);
6620         }
6621         else
6622         {
6623             if(GET_MHL_DONE_FLAG(pMHLResourcePrivate->ucProcDoneIndex, MHL_AUTO_SWITCH_DONE_FLAG))
6624             {
6625                 CLR_MHL_DONE_FLAG(pMHLResourcePrivate->ucProcDoneIndex, MHL_AUTO_SWITCH_DONE_FLAG);
6626 
6627                 _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_AUTO_SWITCH_STOP, MHL_AUTO_SWITCH_STOP_TIME);
6628 
6629                 SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_SWITCH_STOP_FLAG);
6630 
6631                 bAutoSwitchFlag = TRUE;
6632             }
6633             else if(!GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_SWITCH_STOP_FLAG))
6634             {
6635                 if(!GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_SWITCH_FLAG))
6636                 {
6637                     if(!GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_CONNECT_FLAG))
6638                     {
6639                         SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_SWITCH_FLAG);
6640                     }
6641                 }
6642             }
6643         }
6644     }
6645 
6646     return bAutoSwitchFlag;
6647 }
6648 
6649 //**************************************************************************
6650 //  [Function Name]:
6651 //                  mdrv_mhl_SetPowerState()
6652 //  [Description]
6653 //
6654 //  [Arguments]:
6655 //
6656 //  [Return]:
6657 //
6658 //**************************************************************************
mdrv_mhl_SetPowerState(EN_POWER_MODE usPowerState)6659 MS_U32 mdrv_mhl_SetPowerState(EN_POWER_MODE usPowerState)
6660 {
6661     return mdrv_mhl_STREventProc(usPowerState);
6662 }
6663 
6664 //**************************************************************************
6665 //  [Function Name]:
6666 //                  mdrv_mhl_CbusControl()
6667 //  [Description]
6668 //
6669 //  [Arguments]:
6670 //
6671 //  [Return]:
6672 //
6673 //**************************************************************************
mdrv_mhl_CbusControl(MS_U8 ucState)6674 void mdrv_mhl_CbusControl(MS_U8 ucState)
6675 {
6676     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6677 
6678     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
6679     {
6680         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6681     }
6682     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6683     {
6684         switch(ucState)
6685         {
6686             case MHL_CBUS_FORCE_READY_DEVCAP:
6687                 SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_DEVCAP_FLAG);
6688                 break;
6689 
6690             case MHL_CBUS_FORCE_RECEIVE_3D_REQ:
6691                 SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_3D_REQ_FLAG);
6692                 break;
6693 
6694             case MHL_CBUS_FORCE_SEND_COMMAND_ENABLE:
6695                 SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_FORCE_SEND_COMMAND_FLAG);
6696                 break;
6697 
6698             case MHL_CBUS_FORCE_SEND_COMMAND_DISABLE:
6699                 CLR_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_FORCE_SEND_COMMAND_FLAG);
6700                 break;
6701 
6702             case MHL_CBUS_CHECK_CONTEND_ON_ENABLE:
6703                 SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CHECK_CONTENT_ENABLE_FLAG);
6704                 break;
6705 
6706             case MHL_CBUS_CHECK_CONTEND_ON_DISABLE:
6707                 CLR_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CHECK_CONTENT_ENABLE_FLAG);
6708                 break;
6709 
6710             case MHL_CBUS_ISOLATION_ON:
6711                 mhal_mhl_CbusIsolate(pMHLResourcePrivate->ucMHLSupportPath, TRUE);
6712                 break;
6713 
6714             case MHL_CBUS_ISOLATION_OFF:
6715                 mhal_mhl_CbusIsolate(pMHLResourcePrivate->ucMHLSupportPath, FALSE);
6716                 break;
6717 
6718             case MHL_CBUS_FLOATING_ON:
6719                 mhal_mhl_CbusFloating(TRUE);
6720                 break;
6721 
6722             case MHL_CBUS_FLOATING_OFF:
6723                 mhal_mhl_CbusFloating(FALSE);
6724                 break;
6725 
6726             case MHL_VBUS_HW_DETCET:
6727                 mhal_mhl_VbusCharge(pMHLResourcePrivate->ucMHLSupportPath, VBUS_HW_DETECT);
6728                 break;
6729 
6730             case MHL_VBUS_CHARGE_ON:
6731                 mhal_mhl_VbusCharge(pMHLResourcePrivate->ucMHLSupportPath, VBUS_SW_CHARGE);
6732                 break;
6733 
6734             case MHL_VBUS_CHARGE_OFF:
6735                 mhal_mhl_VbusCharge(pMHLResourcePrivate->ucMHLSupportPath, VBUS_SW_UNCHARGE);
6736                 break;
6737 
6738             default:
6739 
6740                 break;
6741         };
6742     }
6743 }
6744 
6745 //**************************************************************************
6746 //  [Function Name]:
6747 //                  mdrv_mhl_LoadEDID()
6748 //  [Description]
6749 //
6750 //  [Arguments]:
6751 //
6752 //  [Return]:
6753 //
6754 //**************************************************************************
mdrv_mhl_LoadEDID(MS_U8 * edid)6755 void mdrv_mhl_LoadEDID(MS_U8 *edid)
6756 {
6757     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6758 
6759     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
6760     {
6761         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6762     }
6763     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6764     {
6765         mhal_mhl_LoadEDID(edid);
6766 
6767         // Parsing EDID
6768         _mdrv_mhl_ParsingEDIDfor3D(pMHLResourcePrivate, edid);
6769     }
6770 }
6771 
6772 //**************************************************************************
6773 //  [Function Name]:
6774 //                  mdrv_mhl_ReadEDID()
6775 //  [Description]
6776 //
6777 //  [Arguments]:
6778 //
6779 //  [Return]:
6780 //
6781 //**************************************************************************
mdrv_mhl_ReadEDID(MS_U16 usSize,MS_U8 * edid)6782 void mdrv_mhl_ReadEDID(MS_U16 usSize, MS_U8 *edid)
6783 {
6784     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6785 
6786     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
6787     {
6788         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6789     }
6790     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6791     {
6792         if(usSize > 0)
6793         {
6794             mhal_mhl_ReadEDID(usSize, edid);
6795         }
6796     }
6797 }
6798 
6799 //**************************************************************************
6800 //  [Function Name]:
6801 //                  mdrv_mhl_LoadDeviceCapability()
6802 //  [Description]
6803 //
6804 //  [Arguments]:
6805 //
6806 //  [Return]:
6807 //
6808 //**************************************************************************
mdrv_mhl_LoadDeviceCapability(MS_U8 * devcap)6809 void mdrv_mhl_LoadDeviceCapability(MS_U8 *devcap)
6810 {
6811     MS_U8 uctemp = 0;
6812     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6813 
6814     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
6815     {
6816         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6817     }
6818     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6819     {
6820         if(devcap != NULL)
6821         {
6822             for(uctemp = 0; uctemp < MHL_DEVICE_CAPABILITY_SIZE; uctemp++)
6823             {
6824                 pMHLResourcePrivate->ucDeviceCapabilityTable[uctemp] = devcap[uctemp];
6825             }
6826 
6827             if(_mdrv_mhl_GetEnhanceCbusFlag(pMHLResourcePrivate)) // Chip support MHL 3.0
6828             {
6829                 SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_ENHANCE_FLAG);
6830 
6831                 for(uctemp = 0; uctemp < MHL_XDEVICE_CAPABILITY_SIZE; uctemp++)
6832                 {
6833                     pMHLResourcePrivate->ucDeviceCapabilityTable[MHL_DEVICE_CAPABILITY_SIZE +uctemp] = devcap[MHL_DEVICE_CAPABILITY_SIZE +uctemp];
6834                 }
6835             }
6836             else if(devcap[MHL_CBUS_VERSION] >= 0x30) // Change MHL version to 2.1
6837             {
6838                 pMHLResourcePrivate->ucDeviceCapabilityTable[MHL_CBUS_VERSION] = 0x21;
6839 
6840                 mhal_mhl_LoadDeviceCapability(pMHLResourcePrivate->ucDeviceCapabilityTable);
6841 
6842                 MDRV_MHL_MSG_INFO("** MHL this chip not supprt MHL 3.0 \r\n");
6843             }
6844 
6845             // Attach eCbus ISR
6846             if(!GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_ECBUS_ISR_ATTACH_FLAG))
6847             {
6848                 if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_ENHANCE_FLAG))
6849                 {
6850                     MsOS_AttachInterrupt(E_INT_IRQ_MHL_ECBUS_INT, _mdrv_mhl_ECbusIsrHandler);
6851                     MsOS_EnableInterrupt(E_INT_IRQ_MHL_ECBUS_INT);
6852 
6853                     SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_ECBUS_ISR_ATTACH_FLAG);
6854                 }
6855             }
6856         }
6857     }
6858 }
6859 
6860 //**************************************************************************
6861 //  [Function Name]:
6862 //                  mdrv_mhl_SetVenderID()
6863 //  [Description]
6864 //
6865 //  [Arguments]:
6866 //
6867 //  [Return]:
6868 //
6869 //**************************************************************************
mdrv_mhl_SetVenderID(MS_U8 ucVenderID)6870 void mdrv_mhl_SetVenderID(MS_U8 ucVenderID)
6871 {
6872     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6873 
6874     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
6875     {
6876         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6877     }
6878     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6879     {
6880         pMHLResourcePrivate->ucDeviceVenderID = ucVenderID;
6881 
6882         mhal_mhl_SetVenderID(ucVenderID);
6883     }
6884 }
6885 
6886 //**************************************************************************
6887 //  [Function Name]:
6888 //                  mdrv_mhl_InvertCableDetect()
6889 //  [Description]
6890 //
6891 //  [Arguments]:
6892 //
6893 //  [Return]:
6894 //
6895 //**************************************************************************
mdrv_mhl_InvertCableDetect(MS_BOOL bCableDetectInvert)6896 void mdrv_mhl_InvertCableDetect(MS_BOOL bCableDetectInvert)
6897 {
6898     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6899 
6900     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
6901     {
6902         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6903     }
6904     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6905     {
6906         mhal_mhl_InvertCableDetect(pMHLResourcePrivate->ucMHLSupportPath, bCableDetectInvert);
6907     }
6908 }
6909 
6910 //**************************************************************************
6911 //  [Function Name]:
6912 //                  mdrv_mhl_VbusConfigSetting()
6913 //  [Description]
6914 //
6915 //  [Arguments]:
6916 //
6917 //  [Return]:
6918 //
6919 //**************************************************************************
mdrv_mhl_VbusConfigSetting(MS_U8 ucState)6920 void mdrv_mhl_VbusConfigSetting(MS_U8 ucState)
6921 {
6922     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6923 
6924     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
6925     {
6926         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6927     }
6928     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6929     {
6930         mhal_mhl_VbusConfigSetting(pMHLResourcePrivate->ucMHLSupportPath, ucState);
6931     }
6932 }
6933 
6934 //**************************************************************************
6935 //  [Function Name]:
6936 //                  mdrv_mhl_AdjustSettingIControl()
6937 //  [Description]
6938 //
6939 //  [Arguments]:
6940 //
6941 //  [Return]:
6942 //
6943 //**************************************************************************
mdrv_mhl_AdjustSettingIControl(MS_U8 ucIControl)6944 void mdrv_mhl_AdjustSettingIControl(MS_U8 ucIControl)
6945 {
6946     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6947 
6948     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
6949     {
6950         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6951     }
6952     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6953     {
6954         pMHLResourcePrivate->stSignalStatusInfo.ucIControlValue = ucIControl;
6955     }
6956 }
6957 
6958 //**************************************************************************
6959 //  [Function Name]:
6960 //                  mdrv_mhl_AdjustImpedanceSetting()
6961 //  [Description]
6962 //
6963 //  [Arguments]:
6964 //
6965 //  [Return]:
6966 //
6967 //**************************************************************************
mdrv_mhl_AdjustImpedanceSetting(MS_U8 ucImpedance)6968 void mdrv_mhl_AdjustImpedanceSetting(MS_U8 ucImpedance)
6969 {
6970     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6971 
6972     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
6973     {
6974         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
6975     }
6976     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
6977     {
6978         pMHLResourcePrivate->stSignalStatusInfo.ucImpedanceOffset = ucImpedance;
6979     }
6980 }
6981 
6982 //**************************************************************************
6983 //  [Function Name]:
6984 //                  mdrv_mhl_GetCableDetectFlag()
6985 //  [Description]
6986 //
6987 //  [Arguments]:
6988 //
6989 //  [Return]:
6990 //
6991 //**************************************************************************
mdrv_mhl_GetCableDetectFlag(void)6992 MS_BOOL mdrv_mhl_GetCableDetectFlag(void)
6993 {
6994     MS_BOOL bStatusFlag = FALSE;
6995     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
6996 
6997     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
6998     {
6999         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7000     }
7001     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7002     {
7003         bStatusFlag = GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CABLE_PLUG_FLAG);
7004     }
7005 
7006     return bStatusFlag;
7007 }
7008 
7009 //**************************************************************************
7010 //  [Function Name]:
7011 //                  mdrv_mhl_GetCbusConnectFlag()
7012 //  [Description]
7013 //
7014 //  [Arguments]:
7015 //
7016 //  [Return]:
7017 //
7018 //**************************************************************************
mdrv_mhl_GetCbusConnectFlag(void)7019 MS_BOOL mdrv_mhl_GetCbusConnectFlag(void)
7020 {
7021     MS_BOOL bStatusFlag = FALSE;
7022     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7023 
7024     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7025     {
7026         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7027     }
7028     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7029     {
7030         bStatusFlag = GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_CONNECT_FLAG);
7031     }
7032 
7033     return bStatusFlag;
7034 }
7035 
7036 //**************************************************************************
7037 //  [Function Name]:
7038 //                  mdrv_mhl_CbusWakeupIntFlag()
7039 //  [Description]
7040 //
7041 //  [Arguments]:
7042 //
7043 //  [Return]:
7044 //
7045 //**************************************************************************
mdrv_mhl_CbusWakeupIntFlag(void)7046 MS_BOOL mdrv_mhl_CbusWakeupIntFlag(void)
7047 {
7048     MS_BOOL bStatusFlag = FALSE;
7049     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7050 
7051     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7052     {
7053         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7054     }
7055     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7056     {
7057         bStatusFlag = GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_WAKE_FLAG);
7058     }
7059 
7060     return bStatusFlag;
7061 }
7062 
7063 //**************************************************************************
7064 //  [Function Name]:
7065 //                  mdrv_mhl_SrcRCPSupportFlag()
7066 //  [Description]
7067 //
7068 //  [Arguments]:
7069 //
7070 //  [Return]:
7071 //
7072 //**************************************************************************
mdrv_mhl_SrcRCPSupportFlag(void)7073 MS_BOOL mdrv_mhl_SrcRCPSupportFlag(void)
7074 {
7075     MS_BOOL bStatusFlag = FALSE;
7076     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7077 
7078     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7079     {
7080         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7081     }
7082     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7083     {
7084         bStatusFlag = GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_RCP_FUNCTION_FLAG);
7085     }
7086 
7087     return bStatusFlag;
7088 }
7089 
7090 //**************************************************************************
7091 //  [Function Name]:
7092 //                  mdrv_mhl_SrcRAPSupportFlag()
7093 //  [Description]
7094 //
7095 //  [Arguments]:
7096 //
7097 //  [Return]:
7098 //
7099 //**************************************************************************
mdrv_mhl_SrcRAPSupportFlag(void)7100 MS_BOOL mdrv_mhl_SrcRAPSupportFlag(void)
7101 {
7102     MS_BOOL bStatusFlag = FALSE;
7103     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7104 
7105     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7106     {
7107         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7108     }
7109     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7110     {
7111         bStatusFlag = GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_RAP_FUNCTION_FLAG);
7112     }
7113 
7114     return bStatusFlag;
7115 }
7116 
7117 //**************************************************************************
7118 //  [Function Name]:
7119 //                  mdrv_mhl_CbusGetStatusFlag()
7120 //  [Description]
7121 //
7122 //  [Arguments]:
7123 //
7124 //  [Return]:
7125 //
7126 //**************************************************************************
mdrv_mhl_CbusGetStatusFlag(MS_U8 ucState)7127 MS_BOOL mdrv_mhl_CbusGetStatusFlag(MS_U8 ucState)
7128 {
7129     MS_BOOL bStatusFlag = FALSE;
7130     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7131 
7132     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7133     {
7134         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7135     }
7136     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7137     {
7138         switch(ucState)
7139         {
7140             case MHL_CBUS_STATUS_FLAG_CABLE_DETECT:
7141                 bStatusFlag = GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CABLE_PLUG_FLAG);
7142                 break;
7143 
7144             case MHL_CBUS_STATUS_FLAG_CBUS_CONNECT:
7145                 bStatusFlag = GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_CONNECT_FLAG);
7146                 break;
7147 
7148             case MHL_CBUS_STATUS_FLAG_PATH_EN:
7149                 break;
7150 
7151             case MHL_CBUS_STATUS_FLAG_RECEIVE_PATH_EN:
7152                 break;
7153 
7154             case MHL_CBUS_STATUS_FLAG_RECEIVE_MUTED:
7155                 break;
7156 
7157             case MHL_CBUS_STATUS_FLAG_COMMUNICATE_BUSY:
7158                 bStatusFlag = GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_COMMUNICATE_BUSY_FLAG);
7159                 break;
7160 
7161             default:
7162 
7163                 break;
7164         };
7165     }
7166 
7167     return bStatusFlag;
7168 }
7169 
7170 //**************************************************************************
7171 //  [Function Name]:
7172 //                  mdrv_mhl_SendRAPCommand
7173 //  [Description]
7174 //                  MHL Cbus MSC Send RAP Command
7175 //  [Arguments]:
7176 //
7177 //  [Return]:
7178 //                  TRUE: success
7179 //                  FALSE: fail
7180 //**************************************************************************
mdrv_mhl_SendRAPCommand(MS_U8 ucKeyCode)7181 MS_BOOL mdrv_mhl_SendRAPCommand(MS_U8 ucKeyCode)
7182 {
7183     MS_BOOL bSendFlag = FALSE;
7184     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7185 
7186     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7187     {
7188         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7189     }
7190     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7191     {
7192         bSendFlag = _mdrv_mhl_CbusSendSubMessage(pMHLResourcePrivate, MSC_MSG_RAP, ucKeyCode, TRUE);
7193     }
7194 
7195     return bSendFlag;
7196 }
7197 
7198 //**************************************************************************
7199 //  [Function Name]:
7200 //                  mdrv_mhl_SendRCPAutoReleaseCmd
7201 //  [Description]
7202 //                  MHL Cbus MSC Send RCP Command
7203 //  [Arguments]:
7204 //
7205 //  [Return]:
7206 //                  TRUE: success
7207 //                  FALSE: fail
7208 //**************************************************************************
mdrv_mhl_SendRCPAutoReleaseCmd(MS_U8 ucKeyCode)7209 MS_BOOL mdrv_mhl_SendRCPAutoReleaseCmd(MS_U8 ucKeyCode)
7210 {
7211     MS_BOOL bSendFlag = FALSE;
7212     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7213 
7214     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7215     {
7216         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7217     }
7218     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7219     {
7220         if(pMHLResourcePrivate->ucPreRCPKeyCode != ucKeyCode) // Key change
7221         {
7222             if(!GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_RCP_RELEASE_ENABLE_FLAG))
7223             {
7224                 bSendFlag = _mdrv_mhl_CbusSendSubMessage(pMHLResourcePrivate, MSC_MSG_RCP, ucKeyCode, TRUE);
7225             }
7226         }
7227         else
7228         {
7229             bSendFlag = _mdrv_mhl_CbusSendSubMessage(pMHLResourcePrivate, MSC_MSG_RCP, ucKeyCode, TRUE);
7230         }
7231 
7232         if(bSendFlag)
7233         {
7234             pMHLResourcePrivate->ucPreRCPKeyCode = ucKeyCode;
7235 
7236             _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_RCP_AUTO_RELEASE, MHL_CBUS_RCP_RELEASE_TIME);
7237 
7238             SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_RCP_RELEASE_ENABLE_FLAG);
7239         }
7240     }
7241 
7242     return bSendFlag;
7243 }
7244 
7245 //**************************************************************************
7246 //  [Function Name]:
7247 //                  mdrv_mhl_SendUCPCommand
7248 //  [Description]
7249 //                  MHL Cbus MSC Send UCP Command
7250 //  [Arguments]:
7251 //
7252 //  [Return]:
7253 //                  TRUE: success
7254 //                  FALSE: fail
7255 //**************************************************************************
mdrv_mhl_SendUCPCommand(MS_U8 ucKeyCode)7256 MS_BOOL mdrv_mhl_SendUCPCommand(MS_U8 ucKeyCode)
7257 {
7258     MS_BOOL bSendFlag = FALSE;
7259     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7260 
7261     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7262     {
7263         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7264     }
7265     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7266     {
7267         bSendFlag = _mdrv_mhl_CbusSendSubMessage(pMHLResourcePrivate, MSC_MSG_UCP, ucKeyCode, TRUE);
7268     }
7269 
7270     return bSendFlag;
7271 }
7272 
7273 //**************************************************************************
7274 //  [Function Name]:
7275 //                  mdrv_mhl_SendWriteBurst
7276 //  [Description]
7277 //
7278 //  [Arguments]:
7279 //
7280 //  [Return]:
7281 //                  TRUE: success
7282 //                  FALSE: fail
7283 //**************************************************************************
mdrv_mhl_SendWriteBurst(MS_U8 ucAddr,MS_U8 ucLength,MS_U8 * ucData)7284 MS_BOOL mdrv_mhl_SendWriteBurst(MS_U8 ucAddr, MS_U8 ucLength, MS_U8 *ucData)
7285 {
7286     MS_BOOL bSendFlag = FALSE;
7287     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7288 
7289     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7290     {
7291         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7292     }
7293     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7294     {
7295         bSendFlag = _mdrv_mhl_CbusSendWriteBurst(pMHLResourcePrivate, ucAddr, ucLength, ucData);
7296     }
7297 
7298     return bSendFlag;
7299 }
7300 
7301 //**************************************************************************
7302 //  [Function Name]:
7303 //                  mdrv_mhl_CbusSendUserWriteBurst
7304 //  [Description]
7305 //
7306 //  [Arguments]:
7307 //
7308 //  [Return]:
7309 //                  TRUE: success
7310 //                  FALSE: fail
7311 //**************************************************************************
mdrv_mhl_CbusSendUserWriteBurst(MS_U8 ucLength,MS_U8 * ucData)7312 MS_BOOL mdrv_mhl_CbusSendUserWriteBurst(MS_U8 ucLength, MS_U8 *ucData)
7313 {
7314     MS_BOOL bSendFlag = FALSE;
7315     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7316 
7317     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7318     {
7319         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7320     }
7321     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7322     {
7323         if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_USER_WRITE_BURST_FLAG))
7324         {
7325             if(pMHLResourcePrivate->ucWriteBurstState == MHL_CBUS_WRITE_BURST_REVEIVE_GRANT)
7326             {
7327                 if(_mdrv_mhl_CbusSendWriteBurst(pMHLResourcePrivate, 0x40, ucLength, ucData))
7328                 {
7329                     CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_USER_WRITE_BURST_FLAG);
7330 
7331                     pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_SEND_DATA;
7332 
7333                     bSendFlag = TRUE;
7334                 }
7335             }
7336         }
7337         else if(pMHLResourcePrivate->ucWriteBurstState == MHL_CBUS_WRITE_BURST_NONE)
7338         {
7339             SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_USER_WRITE_BURST_FLAG);
7340         }
7341     }
7342 
7343     return bSendFlag;
7344 }
7345 
7346 //**************************************************************************
7347 //  [Function Name]:
7348 //                  mdrv_mhl_GetDeviceCapability
7349 //  [Description]
7350 //
7351 //  [Arguments]:
7352 //
7353 //  [Return]:
7354 //
7355 //**************************************************************************
mdrv_mhl_GetDeviceCapability(MS_U16 usDevcapMask,MS_U8 * ucDevcap)7356 MS_BOOL mdrv_mhl_GetDeviceCapability(MS_U16 usDevcapMask, MS_U8 *ucDevcap)
7357 {
7358     MS_BOOL bDoneFlag = FALSE;
7359     MS_U8 uctemp = 0;
7360     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7361 
7362     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7363     {
7364         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7365     }
7366     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7367     {
7368         if(!GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_READ_DEVCAP_FLAG))
7369         {
7370             pMHLResourcePrivate->usReadDevcapMask = usDevcapMask;
7371         }
7372 
7373         if(GET_MHL_DONE_FLAG(pMHLResourcePrivate->ucProcDoneIndex, MHL_READ_DEVCAP_DONE_FLAG))
7374         {
7375             if(ucDevcap != NULL)
7376             {
7377                 for(uctemp = 0; uctemp < MHL_DEVICE_CAPABILITY_SIZE; uctemp++)
7378                 {
7379                     if(usDevcapMask &BIT(uctemp))
7380                     {
7381                         ucDevcap[uctemp] = pMHLResourcePrivate->ucSourceDevcapTable[uctemp];
7382                     }
7383                     else
7384                     {
7385                         ucDevcap[uctemp] = 0;
7386                     }
7387                 }
7388             }
7389 
7390             bDoneFlag = TRUE;
7391         }
7392     }
7393 
7394     return bDoneFlag;
7395 }
7396 
7397 //**************************************************************************
7398 //  [Function Name]:
7399 //                  mdrv_mhl_GetExtendDeviceCapability
7400 //  [Description]
7401 //
7402 //  [Arguments]:
7403 //
7404 //  [Return]:
7405 //
7406 //**************************************************************************
mdrv_mhl_GetExtendDeviceCapability(MS_U16 usExtendDevcapMask,MS_U8 * ucExtendDevcap)7407 MS_BOOL mdrv_mhl_GetExtendDeviceCapability(MS_U16 usExtendDevcapMask, MS_U8 *ucExtendDevcap)
7408 {
7409     MS_BOOL bDoneFlag = FALSE;
7410     MS_U8 uctemp = 0;
7411     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7412 
7413     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7414     {
7415         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7416     }
7417     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7418     {
7419         if(!GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_READ_XDEVCAP_FLAG))
7420         {
7421             pMHLResourcePrivate->usReadExtendDevcapMask = usExtendDevcapMask;
7422         }
7423 
7424         if(GET_MHL_DONE_FLAG(pMHLResourcePrivate->ucProcDoneIndex, MHL_READ_XDEVCAP_DONE_FLAG))
7425         {
7426             if(ucExtendDevcap != NULL)
7427             {
7428                 for(uctemp = 0; uctemp < MHL_XDEVICE_CAPABILITY_SIZE; uctemp++)
7429                 {
7430                     if(usExtendDevcapMask &BIT(uctemp))
7431                     {
7432                         ucExtendDevcap[uctemp] = pMHLResourcePrivate->ucSourceDevcapTable[MHL_DEVICE_CAPABILITY_SIZE +uctemp];
7433                     }
7434                     else
7435                     {
7436                         ucExtendDevcap[uctemp] = 0;
7437                     }
7438                 }
7439             }
7440 
7441             bDoneFlag = TRUE;
7442         }
7443     }
7444 
7445     return bDoneFlag;
7446 }
7447 
7448 //**************************************************************************
7449 //  [Function Name]:
7450 //                  mdrv_mhl_GetDeviceVenderID
7451 //  [Description]
7452 //
7453 //  [Arguments]:
7454 //
7455 //  [Return]:
7456 //
7457 //**************************************************************************
mdrv_mhl_GetDeviceVenderID(MS_U8 * ucVenderID)7458 MS_BOOL mdrv_mhl_GetDeviceVenderID(MS_U8 *ucVenderID)
7459 {
7460     MS_BOOL bDoneFlag = FALSE;
7461     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7462 
7463     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7464     {
7465         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7466     }
7467     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7468     {
7469         if(GET_MHL_DONE_FLAG(pMHLResourcePrivate->ucProcDoneIndex, MHL_GET_VENDER_ID_DONE_FLAG))
7470         {
7471             *ucVenderID = pMHLResourcePrivate->ucSourceVenderID;
7472 
7473             bDoneFlag = TRUE;
7474         }
7475         else
7476         {
7477             SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_GET_VENDER_ID_FLAG);
7478         }
7479     }
7480 
7481     return bDoneFlag;
7482 }
7483 
7484 //**************************************************************************
7485 //  [Function Name]:
7486 //                  mdrv_mhl_GetWriteBurstData
7487 //  [Description]
7488 //
7489 //  [Arguments]:
7490 //
7491 //  [Return]:
7492 //
7493 //**************************************************************************
mdrv_mhl_GetWriteBurstData(MS_U8 * ucData)7494 MS_BOOL mdrv_mhl_GetWriteBurstData(MS_U8 *ucData)
7495 {
7496     MS_BOOL bDoneFlag = FALSE;
7497     MS_U8 uctemp = 0;
7498     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7499 
7500     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7501     {
7502         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7503     }
7504     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7505     {
7506         if(pMHLResourcePrivate->ucWriteBurstAddress > 0)
7507         {
7508             pMHLResourcePrivate->ucWriteBurstAddress = 0;
7509 
7510             for(uctemp = 0; uctemp < pMHLResourcePrivate->ucWriteBurstLength; uctemp++)
7511             {
7512                 ucData[uctemp] = pMHLResourcePrivate->ucWriteBurstInformation[uctemp];
7513             }
7514 
7515             bDoneFlag = TRUE;
7516         }
7517     }
7518 
7519     return bDoneFlag;
7520 }
7521 
7522 //**************************************************************************
7523 //  [Function Name]:
7524 //                  mdrv_mhl_RegisterCallBackFunctions()
7525 //  [Description]
7526 //                  RCP &RAP call back
7527 //  [Arguments]:
7528 //
7529 //  [Return]:
7530 //
7531 //**************************************************************************
mdrv_mhl_RegisterCallBackFunctions(MS_BOOL bRCPfunctionFlag,MS_BOOL bRAPfunctionFlag)7532 void mdrv_mhl_RegisterCallBackFunctions(MS_BOOL bRCPfunctionFlag, MS_BOOL bRAPfunctionFlag)
7533 {
7534     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7535 
7536     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7537     {
7538         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7539     }
7540     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7541     {
7542         if(bRCPfunctionFlag)
7543         {
7544             SET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_RCP_FUNCTION_FLAG);
7545         }
7546 
7547         if(bRAPfunctionFlag)
7548         {
7549             SET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_RAP_FUNCTION_FLAG);
7550         }
7551     }
7552 }
7553 
7554 //**************************************************************************
7555 //  [Function Name]:
7556 //                  mdrv_mhl_RegisterRcpCallBackFunction()
7557 //  [Description]
7558 //                  RCP call back
7559 //  [Arguments]:
7560 //
7561 //  [Return]:
7562 //
7563 //**************************************************************************
mdrv_mhl_RegisterRcpCallBackFunction(MS_BOOL bRCPfunctionFlag)7564 void mdrv_mhl_RegisterRcpCallBackFunction(MS_BOOL bRCPfunctionFlag)
7565 {
7566     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7567 
7568     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7569     {
7570         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7571     }
7572     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7573     {
7574         if(bRCPfunctionFlag)
7575         {
7576             SET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_RCP_FUNCTION_FLAG);
7577         }
7578     }
7579 }
7580 
7581 //**************************************************************************
7582 //  [Function Name]:
7583 //                  mdrv_mhl_RegisterRapCallBackFunction()
7584 //  [Description]
7585 //                  RAP call back
7586 //  [Arguments]:
7587 //
7588 //  [Return]:
7589 //
7590 //**************************************************************************
mdrv_mhl_RegisterRapCallBackFunction(MS_BOOL bRAPfunctionFlag)7591 void mdrv_mhl_RegisterRapCallBackFunction(MS_BOOL bRAPfunctionFlag)
7592 {
7593     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7594 
7595     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7596     {
7597         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7598     }
7599     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7600     {
7601         if(bRAPfunctionFlag)
7602         {
7603             SET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_RAP_FUNCTION_FLAG);
7604         }
7605     }
7606 }
7607 
7608 //**************************************************************************
7609 //  [Function Name]:
7610 //                  mdrv_mhl_RegisterUcpCallBackFunction()
7611 //  [Description]
7612 //                  UCP call back
7613 //  [Arguments]:
7614 //
7615 //  [Return]:
7616 //
7617 //**************************************************************************
mdrv_mhl_RegisterUcpCallBackFunction(MS_BOOL bUCPfunctionFlag)7618 void mdrv_mhl_RegisterUcpCallBackFunction(MS_BOOL bUCPfunctionFlag)
7619 {
7620     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7621 
7622     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7623     {
7624         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7625     }
7626     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7627     {
7628         if(bUCPfunctionFlag)
7629         {
7630             SET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_UCP_FUNCTION_FLAG);
7631         }
7632     }
7633 }
7634 
7635 //**************************************************************************
7636 //  [Function Name]:
7637 //                  mdrv_mhl_RegisterAttCallBackFunction()
7638 //  [Description]
7639 //                  ATT call back
7640 //  [Arguments]:
7641 //
7642 //  [Return]:
7643 //
7644 //**************************************************************************
mdrv_mhl_RegisterAttCallBackFunction(MS_BOOL bATTfunctionFlag)7645 void mdrv_mhl_RegisterAttCallBackFunction(MS_BOOL bATTfunctionFlag)
7646 {
7647     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7648 
7649     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7650     {
7651         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7652     }
7653     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7654     {
7655         if(bATTfunctionFlag)
7656         {
7657             SET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_ATT_FUNCTION_FLAG);
7658         }
7659     }
7660 }
7661 
7662 //**************************************************************************
7663 //  [Function Name]:
7664 //                  mdrv_mhl_RegisterRbpCallBackFunction()
7665 //  [Description]
7666 //                  RBP call back
7667 //  [Arguments]:
7668 //
7669 //  [Return]:
7670 //
7671 //**************************************************************************
mdrv_mhl_RegisterRbpCallBackFunction(MS_BOOL bRBPfunctionFlag)7672 void mdrv_mhl_RegisterRbpCallBackFunction(MS_BOOL bRBPfunctionFlag)
7673 {
7674     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7675 
7676     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7677     {
7678         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7679     }
7680     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7681     {
7682         if(bRBPfunctionFlag)
7683         {
7684             SET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_RBP_FUNCTION_FLAG);
7685         }
7686     }
7687 }
7688 
7689 //**************************************************************************
7690 //  [Function Name]:
7691 //                  mdrv_mhl_GetConfiguration()
7692 //  [Description]
7693 //                  MHL get init config
7694 //  [Arguments]:
7695 //
7696 //  [Return]:
7697 //
7698 //**************************************************************************
mdrv_mhl_GetConfiguration(void)7699 stMHL_INITIAL_CONFIG_INFO mdrv_mhl_GetConfiguration(void)
7700 {
7701     MS_U8 uctemp = 0;
7702     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7703     stMHL_INITIAL_CONFIG_INFO stInitialConfigInfo;
7704 
7705     if(!_mdrv_mhl_ResourceGetPrivate((void*)&pMHLResourcePrivate))
7706     {
7707         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7708     }
7709     else
7710     {
7711         if(_mdrv_mhl_InitRiuBase(pMHLResourcePrivate)) // Get base success
7712         {
7713             MDRV_MHL_MSG_INFO("** MHL get XC and PM base success \n");
7714         }
7715 
7716         if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_PREVENT_REINITIAL_FLAG))
7717         {
7718             stInitialConfigInfo.ulReturnValue = UTOPIA_STATUS_SUCCESS;
7719             stInitialConfigInfo.ucMHLSupportPath = pMHLResourcePrivate->ucMHLSupportPath;
7720 
7721             for(uctemp = 0; uctemp < (MHL_DEVICE_CAPABILITY_SIZE +MHL_XDEVICE_CAPABILITY_SIZE); uctemp++)
7722             {
7723                 stInitialConfigInfo.ucDeviceCapabilityTable[uctemp] = pMHLResourcePrivate->ucDeviceCapabilityTable[uctemp];
7724             }
7725         }
7726     }
7727 
7728     return stInitialConfigInfo;
7729 }
7730 
7731 #elif(MHL_USE_UTOPIA_VERSION == MHL_UTOPIA_VERSION_20)
7732 //**************************************************************************
7733 //  [Function Name]:
7734 //                  mdrv_mhl_STREventProc()
7735 //  [Description]
7736 //
7737 //  [Arguments]:
7738 //
7739 //  [Return]:
7740 //
7741 //**************************************************************************
mdrv_mhl_STREventProc(void * pModule,EN_POWER_MODE usPowerState)7742 MS_U32 mdrv_mhl_STREventProc(void* pModule, EN_POWER_MODE usPowerState)
7743 {
7744     void* pMHLResource = NULL;
7745     MS_U32 ulReturnValue = UTOPIA_STATUS_FAIL;
7746     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7747 
7748     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
7749     {
7750         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
7751     }
7752     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
7753     {
7754         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7755     }
7756     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7757     {
7758         if(pMHLResourcePrivate->usPrePowerState != usPowerState)
7759         {
7760             if(usPowerState == E_POWER_SUSPEND)
7761             {
7762                 if(GET_MHL_DISPLAY_FLAG(pMHLResourcePrivate->usDisplayIndex, MHL_CBUS_HPD_SET_FLAG))
7763                 {
7764                     _mdrv_mhl_ForceSendClearHPD(pMHLResourcePrivate);
7765                 }
7766 
7767                 ulReturnValue = UTOPIA_STATUS_SUCCESS;
7768             }
7769             else if(usPowerState == E_POWER_RESUME)
7770             {
7771 #if defined(MSOS_TYPE_LINUX_KERNEL)
7772                 UtopiaStrWaitCondition("mhl", usPowerState, 0);
7773 #endif
7774                 pMHLResourcePrivate->ucChipCapability = mhal_mhl_initial(pMHLResourcePrivate->ucMHLSupportPath, NULL, NULL, pMHLResourcePrivate->ucDeviceVenderID);
7775 
7776                 CLR_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_NORMAL_FLAG);
7777 
7778                 if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CABLE_PLUG_FLAG))
7779                 {
7780                     if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_CONNECT_FLAG))
7781                     {
7782                         mhal_mhl_ClockModeSwitchProc(pMHLResourcePrivate->ucMHLSupportPath, FALSE, &(pMHLResourcePrivate->stSignalStatusInfo));
7783 
7784                         mhal_mhl_CbusConnectProc(pMHLResourcePrivate->ucMHLSupportPath);
7785 
7786                         if(pMHLResourcePrivate->ucTMDSClockMode == MHL_PHY_CLOCK_PACKET_PIXEL)
7787                         {
7788                             mhal_mhl_ClockModeSwitchProc(pMHLResourcePrivate->ucMHLSupportPath, TRUE, &(pMHLResourcePrivate->stSignalStatusInfo));
7789                         }
7790                     }
7791                     else
7792                     {
7793                         mhal_mhl_CablePlugProc(pMHLResourcePrivate->ucMHLSupportPath, &(pMHLResourcePrivate->stSignalStatusInfo));
7794                     }
7795                 }
7796 
7797                 ulReturnValue = UTOPIA_STATUS_SUCCESS;
7798             }
7799 
7800             pMHLResourcePrivate->usPrePowerState = usPowerState;
7801         }
7802     }
7803 
7804     UtopiaResourceRelease(pMHLResource);
7805 
7806     return ulReturnValue;
7807 }
7808 
7809 //**************************************************************************
7810 //  [Function Name]:
7811 //                  mdrv_mhl_MHLSupportPath()
7812 //  [Description]
7813 //                  MHL support path
7814 //  [Arguments]:
7815 //
7816 //  [Return]:
7817 //
7818 //**************************************************************************
mdrv_mhl_MHLSupportPath(void * pInstance,MS_U8 ucSelect)7819 void mdrv_mhl_MHLSupportPath(void* pInstance, MS_U8 ucSelect)
7820 {
7821     void* pModule = NULL;
7822     void* pMHLResource = NULL;
7823     MS_BOOL bMHLEfuseFlag = TRUE;
7824     MS_U8 uctemp = 0;
7825     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7826 
7827     UtopiaInstanceGetModule(pInstance, &pModule);
7828 
7829     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
7830     {
7831         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
7832     }
7833     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
7834     {
7835         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7836     }
7837     else
7838     {
7839         // Clear flag
7840         if(pMHLResourcePrivate->ucInitialIndex != 0xA5)
7841         {
7842             _mdrv_mhl_ClearCbusFlag(pMHLResourcePrivate, MHL_CLEAR_INITIAL_FLAG);
7843 
7844             pMHLResourcePrivate->ucInitialIndex = 0xA5;
7845 
7846             if(_mdrv_mhl_InitRiuBase(pMHLResourcePrivate)) // Get base success
7847             {
7848                 MDRV_MHL_MSG_INFO("** MHL get XC and PM base success \n");
7849 
7850                 SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG);
7851             }
7852         }
7853         else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7854         {
7855             mhal_mhl_SetRegisterBaseAddress(pMHLResourcePrivate->ulRiuBaseAddress, pMHLResourcePrivate->ulPMRiuBaseAddress);
7856         }
7857 
7858         mhal_mhl_MHLSupportPath(ucSelect);
7859 
7860         bMHLEfuseFlag = MDrv_SYS_Query(E_SYS_QUERY_MHL_SUPPORTED);
7861 
7862         if(mhal_mhl_CheckEfuseControlFlag(bMHLEfuseFlag))
7863         {
7864             MDRV_MHL_MSG_INFO("** MHL function not support in this chip ###\r\n");
7865         }
7866         else
7867         {
7868             for(uctemp = 0; uctemp < MHL_CBUS_SELECT_MASK ;uctemp++)
7869             {
7870                 if(ucSelect &BIT(uctemp))
7871                 {
7872                     pMHLResourcePrivate->ucMHLSupportPath = uctemp;
7873 
7874                     MDRV_MHL_MSG_INFO("** MHL function support in port %c\r\n", MHL_INPUT_PORT(uctemp));
7875                 }
7876             }
7877         }
7878     }
7879 
7880     UtopiaResourceRelease(pMHLResource);
7881 }
7882 
7883 //**************************************************************************
7884 //  [Function Name]:
7885 //                  mdrv_mhl_Initial()
7886 //  [Description]
7887 //                  MHL init
7888 //  [Arguments]:
7889 //                  *edid: MHL EDID data
7890 //                  *devcap: MHL device capability
7891 //  [Return]:
7892 //
7893 //**************************************************************************
mdrv_mhl_Initial(void * pInstance,MS_U8 * edid,MS_U8 * DevCap)7894 void mdrv_mhl_Initial(void* pInstance, MS_U8 *edid, MS_U8 *DevCap)
7895 {
7896     void* pModule = NULL;
7897     void* pMHLResource = NULL;
7898     MS_U8 uctemp = 0;
7899     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
7900 
7901     UtopiaInstanceGetModule(pInstance, &pModule);
7902 
7903     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
7904     {
7905         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
7906     }
7907     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
7908     {
7909         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
7910     }
7911     else
7912     {
7913         // Clear flag
7914         if(pMHLResourcePrivate->ucInitialIndex != 0xA5)
7915         {
7916             _mdrv_mhl_ClearCbusFlag(pMHLResourcePrivate, MHL_CLEAR_INITIAL_FLAG);
7917 
7918             pMHLResourcePrivate->ucInitialIndex = 0xA5;
7919         }
7920 
7921         if(_mdrv_mhl_InitRiuBase(pMHLResourcePrivate)) // Get base success
7922         {
7923             MDRV_MHL_MSG_INFO("** MHL get XC and PM base success \n");
7924 
7925             SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG);
7926         }
7927 
7928         if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
7929         {
7930             if(!GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_PREVENT_REINITIAL_FLAG))
7931             {
7932                 // Chip initial
7933                 pMHLResourcePrivate->ucChipCapability = mhal_mhl_initial(pMHLResourcePrivate->ucMHLSupportPath, edid, DevCap, pMHLResourcePrivate->ucDeviceVenderID);
7934 
7935                 SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_PREVENT_REINITIAL_FLAG);
7936             }
7937             else
7938             {
7939                 // Load EDID
7940                 mhal_mhl_LoadEDID(edid);
7941 
7942                 // Load vendor ID
7943                 mhal_mhl_SetVenderID(pMHLResourcePrivate->ucDeviceVenderID);
7944 
7945                 // Load DevCap
7946                 mhal_mhl_LoadDeviceCapability(DevCap);
7947             }
7948 
7949             // Parsing EDID
7950             _mdrv_mhl_ParsingEDIDfor3D(pMHLResourcePrivate, edid);
7951 
7952             // Check and insert device capability
7953             if(DevCap != NULL)
7954             {
7955                 for(uctemp = 0; uctemp < MHL_DEVICE_CAPABILITY_SIZE; uctemp++)
7956                 {
7957                     pMHLResourcePrivate->ucDeviceCapabilityTable[uctemp] = DevCap[uctemp];
7958                 }
7959 
7960                 if(_mdrv_mhl_GetEnhanceCbusFlag(pMHLResourcePrivate)) // Chip support MHL 3.0
7961                 {
7962                     SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_ENHANCE_FLAG);
7963 
7964                     for(uctemp = 0; uctemp < MHL_XDEVICE_CAPABILITY_SIZE; uctemp++)
7965                     {
7966                         pMHLResourcePrivate->ucDeviceCapabilityTable[MHL_DEVICE_CAPABILITY_SIZE +uctemp] = DevCap[MHL_DEVICE_CAPABILITY_SIZE +uctemp];
7967                     }
7968                 }
7969                 else if(DevCap[MHL_CBUS_VERSION] >= 0x30) // Change MHL version to 2.1
7970                 {
7971                     pMHLResourcePrivate->ucDeviceCapabilityTable[MHL_CBUS_VERSION] = 0x21;
7972 
7973                     mhal_mhl_LoadDeviceCapability(pMHLResourcePrivate->ucDeviceCapabilityTable);
7974 
7975                     MDRV_MHL_MSG_INFO("** MHL this chip not supprt MHL 3.0 \r\n");
7976                 }
7977             }
7978 
7979             // Attach Cbus ISR
7980             if(!GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_ISR_ATTACH_FLAG))
7981             {
7982                 if(GET_MHL_CHIP_FLAG(pMHLResourcePrivate->ucChipCapability, MHL_CHIP_INTERRUPT_USE_PM_IRQ_FLAG))
7983                 {
7984                     MsOS_AttachInterrupt(E_INT_IRQ_PM, _mdrv_mhl_IsrHandler);
7985                     MsOS_EnableInterrupt(E_INT_IRQ_PM);
7986                 }
7987                 else
7988                 {
7989                     MsOS_AttachInterrupt(E_INT_IRQ_MHL_CBUS_PM, _mdrv_mhl_IsrHandler);
7990                     MsOS_EnableInterrupt(E_INT_IRQ_MHL_CBUS_PM);
7991                 }
7992 
7993                 SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_ISR_ATTACH_FLAG);
7994             }
7995 
7996             // Attach eCbus ISR
7997             if(!GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_ECBUS_ISR_ATTACH_FLAG))
7998             {
7999                 if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_ENHANCE_FLAG))
8000                 {
8001                     MsOS_AttachInterrupt(E_INT_IRQ_MHL_ECBUS_INT, _mdrv_mhl_ECbusIsrHandler);
8002                     MsOS_EnableInterrupt(E_INT_IRQ_MHL_ECBUS_INT);
8003 
8004                     SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_ECBUS_ISR_ATTACH_FLAG);
8005                 }
8006             }
8007 
8008             if(GET_MHL_CHIP_FLAG(pMHLResourcePrivate->ucChipCapability, MHL_CHIP_SELF_CREATE_TASK_FLAG))
8009             {
8010                 if(!GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_SELF_CREATE_TASK_FLAG))
8011                 {
8012                     if(_mdrv_mhl_CreateTask(pMHLResourcePrivate))
8013                     {
8014                         MDRV_MHL_MSG_INFO("** MHL create polling task by self \r\n");
8015 
8016                         SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_SELF_CREATE_TASK_FLAG);
8017                     }
8018                 }
8019             }
8020         }
8021     }
8022 
8023     UtopiaResourceRelease(pMHLResource);
8024 }
8025 
8026 //**************************************************************************
8027 //  [Function Name]:
8028 //                  mdrv_mhl_Handler()
8029 //  [Description]
8030 //                  MHL handler
8031 //  [Arguments]:
8032 //
8033 //  [Return]:
8034 //
8035 //**************************************************************************
mdrv_mhl_Handler(void * pInstance)8036 MS_U16 mdrv_mhl_Handler(void* pInstance)
8037 {
8038     void* pModule = NULL;
8039     void* pMHLResource = NULL;
8040     MS_U16 usMSGKeyInfo = 0;
8041     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8042 
8043     UtopiaInstanceGetModule(pInstance, &pModule);
8044 
8045     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8046     {
8047         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8048     }
8049     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8050     {
8051         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8052     }
8053     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8054     {
8055         if(!GET_MHL_CHIP_FLAG(pMHLResourcePrivate->ucChipCapability, MHL_CHIP_SELF_CREATE_TASK_FLAG))
8056         {
8057             _mdrv_mhl_PollingEventProc(pMHLResourcePrivate);
8058         }
8059 
8060         if(GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CALLBACK_FUNCTION_FLAG))
8061         {
8062             CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_CALLBACK_FUNCTION_FLAG);
8063 
8064             usMSGKeyInfo = pMHLResourcePrivate->usMSGKeyInfo;
8065         }
8066     }
8067 
8068     UtopiaResourceRelease(pMHLResource);
8069 
8070     return usMSGKeyInfo;
8071 }
8072 
8073 //**************************************************************************
8074 //  [Function Name]:
8075 //                  mdrv_mhl_AutoSwitchHandler()
8076 //  [Description]
8077 //
8078 //  [Arguments]:
8079 //
8080 //  [Return]:
8081 //
8082 //**************************************************************************
mdrv_mhl_AutoSwitchHandler(void * pInstance,MS_BOOL bReset,MS_U8 * ucCbusPath)8083 MS_BOOL mdrv_mhl_AutoSwitchHandler(void* pInstance, MS_BOOL bReset, MS_U8 *ucCbusPath)
8084 {
8085     void* pModule = NULL;
8086     void* pMHLResource = NULL;
8087     MS_BOOL bAutoSwitchFlag = FALSE;
8088     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8089 
8090     UtopiaInstanceGetModule(pInstance, &pModule);
8091 
8092     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8093     {
8094         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8095     }
8096     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8097     {
8098         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8099     }
8100     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8101     {
8102         if(bReset)
8103         {
8104             CLR_MHL_DONE_FLAG(pMHLResourcePrivate->ucProcDoneIndex, MHL_AUTO_SWITCH_DONE_FLAG);
8105             CLR_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_SWITCH_FLAG);
8106         }
8107         else
8108         {
8109             if(GET_MHL_DONE_FLAG(pMHLResourcePrivate->ucProcDoneIndex, MHL_AUTO_SWITCH_DONE_FLAG))
8110             {
8111                 CLR_MHL_DONE_FLAG(pMHLResourcePrivate->ucProcDoneIndex, MHL_AUTO_SWITCH_DONE_FLAG);
8112 
8113                 _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_AUTO_SWITCH_STOP, MHL_AUTO_SWITCH_STOP_TIME);
8114 
8115                 SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_SWITCH_STOP_FLAG);
8116 
8117                 bAutoSwitchFlag = TRUE;
8118             }
8119             else if(!GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_SWITCH_STOP_FLAG))
8120             {
8121                 if(!GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_SWITCH_FLAG))
8122                 {
8123                     if(!GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_CONNECT_FLAG))
8124                     {
8125                         SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_AUTO_SWITCH_FLAG);
8126                     }
8127                 }
8128             }
8129         }
8130     }
8131 
8132     UtopiaResourceRelease(pMHLResource);
8133 
8134     return bAutoSwitchFlag;
8135 }
8136 
8137 //**************************************************************************
8138 //  [Function Name]:
8139 //                  mdrv_mhl_SetPowerState()
8140 //  [Description]
8141 //
8142 //  [Arguments]:
8143 //
8144 //  [Return]:
8145 //
8146 //**************************************************************************
mdrv_mhl_SetPowerState(void * pInstance,EN_POWER_MODE usPowerState)8147 MS_U32 mdrv_mhl_SetPowerState(void* pInstance, EN_POWER_MODE usPowerState)
8148 {
8149     void* pModule = NULL;
8150 
8151     UtopiaInstanceGetModule(pInstance, &pModule);
8152 
8153     return mdrv_mhl_STREventProc(pModule, usPowerState);
8154 }
8155 
8156 //**************************************************************************
8157 //  [Function Name]:
8158 //                  mdrv_mhl_CbusControl()
8159 //  [Description]
8160 //
8161 //  [Arguments]:
8162 //
8163 //  [Return]:
8164 //
8165 //**************************************************************************
mdrv_mhl_CbusControl(void * pInstance,MS_U8 ucState)8166 void mdrv_mhl_CbusControl(void* pInstance, MS_U8 ucState)
8167 {
8168     void* pModule = NULL;
8169     void* pMHLResource = NULL;
8170     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8171 
8172     UtopiaInstanceGetModule(pInstance, &pModule);
8173 
8174     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8175     {
8176         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8177     }
8178     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8179     {
8180         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8181     }
8182     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8183     {
8184         switch(ucState)
8185         {
8186             case MHL_CBUS_FORCE_READY_DEVCAP:
8187                 SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_DEVCAP_FLAG);
8188                 break;
8189 
8190             case MHL_CBUS_FORCE_RECEIVE_3D_REQ:
8191                 SET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_3D_REQ_FLAG);
8192                 break;
8193 
8194             case MHL_CBUS_FORCE_SEND_COMMAND_ENABLE:
8195                 SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_FORCE_SEND_COMMAND_FLAG);
8196                 break;
8197 
8198             case MHL_CBUS_FORCE_SEND_COMMAND_DISABLE:
8199                 CLR_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_FORCE_SEND_COMMAND_FLAG);
8200                 break;
8201 
8202             case MHL_CBUS_CHECK_CONTEND_ON_ENABLE:
8203                 SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CHECK_CONTENT_ENABLE_FLAG);
8204                 break;
8205 
8206             case MHL_CBUS_CHECK_CONTEND_ON_DISABLE:
8207                 CLR_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CHECK_CONTENT_ENABLE_FLAG);
8208                 break;
8209 
8210             case MHL_CBUS_ISOLATION_ON:
8211                 mhal_mhl_CbusIsolate(pMHLResourcePrivate->ucMHLSupportPath, TRUE);
8212                 break;
8213 
8214             case MHL_CBUS_ISOLATION_OFF:
8215                 mhal_mhl_CbusIsolate(pMHLResourcePrivate->ucMHLSupportPath, FALSE);
8216                 break;
8217 
8218             case MHL_CBUS_FLOATING_ON:
8219                 mhal_mhl_CbusFloating(TRUE);
8220                 break;
8221 
8222             case MHL_CBUS_FLOATING_OFF:
8223                 mhal_mhl_CbusFloating(FALSE);
8224                 break;
8225 
8226             case MHL_VBUS_HW_DETCET:
8227                 mhal_mhl_VbusCharge(pMHLResourcePrivate->ucMHLSupportPath, VBUS_HW_DETECT);
8228                 break;
8229 
8230             case MHL_VBUS_CHARGE_ON:
8231                 mhal_mhl_VbusCharge(pMHLResourcePrivate->ucMHLSupportPath, VBUS_SW_CHARGE);
8232                 break;
8233 
8234             case MHL_VBUS_CHARGE_OFF:
8235                 mhal_mhl_VbusCharge(pMHLResourcePrivate->ucMHLSupportPath, VBUS_SW_UNCHARGE);
8236                 break;
8237 
8238             default:
8239 
8240                 break;
8241         };
8242     }
8243 
8244     UtopiaResourceRelease(pMHLResource);
8245 }
8246 
8247 //**************************************************************************
8248 //  [Function Name]:
8249 //                  mdrv_mhl_LoadEDID()
8250 //  [Description]
8251 //
8252 //  [Arguments]:
8253 //
8254 //  [Return]:
8255 //
8256 //**************************************************************************
mdrv_mhl_LoadEDID(void * pInstance,MS_U8 * edid)8257 void mdrv_mhl_LoadEDID(void* pInstance, MS_U8 *edid)
8258 {
8259     void* pModule = NULL;
8260     void* pMHLResource = NULL;
8261     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8262 
8263     UtopiaInstanceGetModule(pInstance, &pModule);
8264 
8265     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8266     {
8267         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8268     }
8269     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8270     {
8271         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8272     }
8273     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8274     {
8275         mhal_mhl_LoadEDID(edid);
8276 
8277         // Parsing EDID
8278         _mdrv_mhl_ParsingEDIDfor3D(pMHLResourcePrivate, edid);
8279     }
8280 
8281     UtopiaResourceRelease(pMHLResource);
8282 }
8283 
8284 //**************************************************************************
8285 //  [Function Name]:
8286 //                  mdrv_mhl_ReadEDID()
8287 //  [Description]
8288 //
8289 //  [Arguments]:
8290 //
8291 //  [Return]:
8292 //
8293 //**************************************************************************
mdrv_mhl_ReadEDID(void * pInstance,MS_U16 usSize,MS_U8 * edid)8294 void mdrv_mhl_ReadEDID(void* pInstance, MS_U16 usSize, MS_U8 *edid)
8295 {
8296     void* pModule = NULL;
8297     void* pMHLResource = NULL;
8298     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8299 
8300     UtopiaInstanceGetModule(pInstance, &pModule);
8301 
8302     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8303     {
8304         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8305     }
8306     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8307     {
8308         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8309     }
8310     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8311     {
8312         if(usSize > 0)
8313         {
8314             mhal_mhl_ReadEDID(usSize, edid);
8315         }
8316     }
8317 
8318     UtopiaResourceRelease(pMHLResource);
8319 }
8320 
8321 //**************************************************************************
8322 //  [Function Name]:
8323 //                  mdrv_mhl_LoadDeviceCapability()
8324 //  [Description]
8325 //
8326 //  [Arguments]:
8327 //
8328 //  [Return]:
8329 //
8330 //**************************************************************************
mdrv_mhl_LoadDeviceCapability(void * pInstance,MS_U8 * devcap)8331 void mdrv_mhl_LoadDeviceCapability(void* pInstance, MS_U8 *devcap)
8332 {
8333     void* pModule = NULL;
8334     void* pMHLResource = NULL;
8335     MS_U8 uctemp = 0;
8336     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8337 
8338     UtopiaInstanceGetModule(pInstance, &pModule);
8339 
8340     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8341     {
8342         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8343     }
8344     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8345     {
8346         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8347     }
8348     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8349     {
8350         if(devcap != NULL)
8351         {
8352             for(uctemp = 0; uctemp < MHL_DEVICE_CAPABILITY_SIZE; uctemp++)
8353             {
8354                 pMHLResourcePrivate->ucDeviceCapabilityTable[uctemp] = devcap[uctemp];
8355             }
8356 
8357             if(_mdrv_mhl_GetEnhanceCbusFlag(pMHLResourcePrivate)) // Chip support MHL 3.0
8358             {
8359                 SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_ENHANCE_FLAG);
8360 
8361                 for(uctemp = 0; uctemp < MHL_XDEVICE_CAPABILITY_SIZE; uctemp++)
8362                 {
8363                     pMHLResourcePrivate->ucDeviceCapabilityTable[MHL_DEVICE_CAPABILITY_SIZE +uctemp] = devcap[MHL_DEVICE_CAPABILITY_SIZE +uctemp];
8364                 }
8365             }
8366             else if(devcap[MHL_CBUS_VERSION] >= 0x30) // Change MHL version to 2.1
8367             {
8368                 pMHLResourcePrivate->ucDeviceCapabilityTable[MHL_CBUS_VERSION] = 0x21;
8369 
8370                 mhal_mhl_LoadDeviceCapability(pMHLResourcePrivate->ucDeviceCapabilityTable);
8371 
8372                 MDRV_MHL_MSG_INFO("** MHL this chip not supprt MHL 3.0 \r\n");
8373             }
8374 
8375             // Attach eCbus ISR
8376             if(!GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_ECBUS_ISR_ATTACH_FLAG))
8377             {
8378                 if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_ENHANCE_FLAG))
8379                 {
8380                     MsOS_AttachInterrupt(E_INT_IRQ_MHL_ECBUS_INT, _mdrv_mhl_ECbusIsrHandler);
8381                     MsOS_EnableInterrupt(E_INT_IRQ_MHL_ECBUS_INT);
8382 
8383                     SET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_ECBUS_ISR_ATTACH_FLAG);
8384                 }
8385             }
8386         }
8387     }
8388 
8389     UtopiaResourceRelease(pMHLResource);
8390 }
8391 
8392 //**************************************************************************
8393 //  [Function Name]:
8394 //                  mdrv_mhl_SetVenderID()
8395 //  [Description]
8396 //
8397 //  [Arguments]:
8398 //
8399 //  [Return]:
8400 //
8401 //**************************************************************************
mdrv_mhl_SetVenderID(void * pInstance,MS_U8 ucVenderID)8402 void mdrv_mhl_SetVenderID(void* pInstance, MS_U8 ucVenderID)
8403 {
8404     void* pModule = NULL;
8405     void* pMHLResource = NULL;
8406     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8407 
8408     UtopiaInstanceGetModule(pInstance, &pModule);
8409 
8410     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8411     {
8412         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8413     }
8414     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8415     {
8416         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8417     }
8418     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8419     {
8420         pMHLResourcePrivate->ucDeviceVenderID = ucVenderID;
8421 
8422         mhal_mhl_SetVenderID(ucVenderID);
8423     }
8424 
8425     UtopiaResourceRelease(pMHLResource);
8426 }
8427 
8428 //**************************************************************************
8429 //  [Function Name]:
8430 //                  mdrv_mhl_InvertCableDetect()
8431 //  [Description]
8432 //
8433 //  [Arguments]:
8434 //
8435 //  [Return]:
8436 //
8437 //**************************************************************************
mdrv_mhl_InvertCableDetect(void * pInstance,MS_BOOL bCableDetectInvert)8438 void mdrv_mhl_InvertCableDetect(void* pInstance, MS_BOOL bCableDetectInvert)
8439 {
8440     void* pModule = NULL;
8441     void* pMHLResource = NULL;
8442     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8443 
8444     UtopiaInstanceGetModule(pInstance, &pModule);
8445 
8446     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8447     {
8448         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8449     }
8450     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8451     {
8452         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8453     }
8454     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8455     {
8456         mhal_mhl_InvertCableDetect(pMHLResourcePrivate->ucMHLSupportPath, bCableDetectInvert);
8457     }
8458 
8459     UtopiaResourceRelease(pMHLResource);
8460 }
8461 
8462 //**************************************************************************
8463 //  [Function Name]:
8464 //                  mdrv_mhl_VbusConfigSetting()
8465 //  [Description]
8466 //
8467 //  [Arguments]:
8468 //
8469 //  [Return]:
8470 //
8471 //**************************************************************************
mdrv_mhl_VbusConfigSetting(void * pInstance,MS_U8 ucState)8472 void mdrv_mhl_VbusConfigSetting(void* pInstance, MS_U8 ucState)
8473 {
8474     void* pModule = NULL;
8475     void* pMHLResource = NULL;
8476     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8477 
8478     UtopiaInstanceGetModule(pInstance, &pModule);
8479 
8480     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8481     {
8482         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8483     }
8484     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8485     {
8486         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8487     }
8488     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8489     {
8490         mhal_mhl_VbusConfigSetting(pMHLResourcePrivate->ucMHLSupportPath, ucState);
8491     }
8492 
8493     UtopiaResourceRelease(pMHLResource);
8494 }
8495 
8496 //**************************************************************************
8497 //  [Function Name]:
8498 //                  mdrv_mhl_AdjustSettingIControl()
8499 //  [Description]
8500 //
8501 //  [Arguments]:
8502 //
8503 //  [Return]:
8504 //
8505 //**************************************************************************
mdrv_mhl_AdjustSettingIControl(void * pInstance,MS_U8 ucIControl)8506 void mdrv_mhl_AdjustSettingIControl(void* pInstance, MS_U8 ucIControl)
8507 {
8508     void* pModule = NULL;
8509     void* pMHLResource = NULL;
8510     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8511 
8512     UtopiaInstanceGetModule(pInstance, &pModule);
8513 
8514     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8515     {
8516         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8517     }
8518     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8519     {
8520         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8521     }
8522     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8523     {
8524         pMHLResourcePrivate->stSignalStatusInfo.ucIControlValue = ucIControl;
8525     }
8526 
8527     UtopiaResourceRelease(pMHLResource);
8528 }
8529 
8530 //**************************************************************************
8531 //  [Function Name]:
8532 //                  mdrv_mhl_AdjustImpedanceSetting()
8533 //  [Description]
8534 //
8535 //  [Arguments]:
8536 //
8537 //  [Return]:
8538 //
8539 //**************************************************************************
mdrv_mhl_AdjustImpedanceSetting(void * pInstance,MS_U8 ucImpedance)8540 void mdrv_mhl_AdjustImpedanceSetting(void* pInstance, MS_U8 ucImpedance)
8541 {
8542     void* pModule = NULL;
8543     void* pMHLResource = NULL;
8544     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8545 
8546     UtopiaInstanceGetModule(pInstance, &pModule);
8547 
8548     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8549     {
8550         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8551     }
8552     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8553     {
8554         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8555     }
8556     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8557     {
8558         pMHLResourcePrivate->stSignalStatusInfo.ucImpedanceOffset = ucImpedance;
8559     }
8560 
8561     UtopiaResourceRelease(pMHLResource);
8562 }
8563 
8564 //**************************************************************************
8565 //  [Function Name]:
8566 //                  mdrv_mhl_GetCableDetectFlag()
8567 //  [Description]
8568 //
8569 //  [Arguments]:
8570 //
8571 //  [Return]:
8572 //
8573 //**************************************************************************
mdrv_mhl_GetCableDetectFlag(void * pInstance)8574 MS_BOOL mdrv_mhl_GetCableDetectFlag(void* pInstance)
8575 {
8576     void* pModule = NULL;
8577     void* pMHLResource = NULL;
8578     MS_BOOL bStatusFlag = FALSE;
8579     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8580 
8581     UtopiaInstanceGetModule(pInstance, &pModule);
8582 
8583     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8584     {
8585         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8586     }
8587     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8588     {
8589         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8590     }
8591     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8592     {
8593         bStatusFlag = GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CABLE_PLUG_FLAG);
8594     }
8595 
8596     UtopiaResourceRelease(pMHLResource);
8597 
8598     return bStatusFlag;
8599 }
8600 
8601 //**************************************************************************
8602 //  [Function Name]:
8603 //                  mdrv_mhl_GetCbusConnectFlag()
8604 //  [Description]
8605 //
8606 //  [Arguments]:
8607 //
8608 //  [Return]:
8609 //
8610 //**************************************************************************
mdrv_mhl_GetCbusConnectFlag(void * pInstance)8611 MS_BOOL mdrv_mhl_GetCbusConnectFlag(void* pInstance)
8612 {
8613     void* pModule = NULL;
8614     void* pMHLResource = NULL;
8615     MS_BOOL bStatusFlag = FALSE;
8616     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8617 
8618     UtopiaInstanceGetModule(pInstance, &pModule);
8619 
8620     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8621     {
8622         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8623     }
8624     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8625     {
8626         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8627     }
8628     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8629     {
8630         bStatusFlag = GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_CONNECT_FLAG);
8631     }
8632 
8633     UtopiaResourceRelease(pMHLResource);
8634 
8635     return bStatusFlag;
8636 }
8637 
8638 //**************************************************************************
8639 //  [Function Name]:
8640 //                  mdrv_mhl_CbusWakeupIntFlag()
8641 //  [Description]
8642 //
8643 //  [Arguments]:
8644 //
8645 //  [Return]:
8646 //
8647 //**************************************************************************
mdrv_mhl_CbusWakeupIntFlag(void * pInstance)8648 MS_BOOL mdrv_mhl_CbusWakeupIntFlag(void* pInstance)
8649 {
8650     void* pModule = NULL;
8651     void* pMHLResource = NULL;
8652     MS_BOOL bStatusFlag = FALSE;
8653     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8654 
8655     UtopiaInstanceGetModule(pInstance, &pModule);
8656 
8657     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8658     {
8659         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8660     }
8661     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8662     {
8663         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8664     }
8665     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8666     {
8667         bStatusFlag = GET_MHL_RECEIVE_FLAG(pMHLResourcePrivate->ulCbusReceiveIndex, MHL_CBUS_RECEIVE_WAKE_FLAG);
8668     }
8669 
8670     UtopiaResourceRelease(pMHLResource);
8671 
8672     return bStatusFlag;
8673 }
8674 
8675 //**************************************************************************
8676 //  [Function Name]:
8677 //                  mdrv_mhl_SrcRCPSupportFlag()
8678 //  [Description]
8679 //
8680 //  [Arguments]:
8681 //
8682 //  [Return]:
8683 //
8684 //**************************************************************************
mdrv_mhl_SrcRCPSupportFlag(void * pInstance)8685 MS_BOOL mdrv_mhl_SrcRCPSupportFlag(void* pInstance)
8686 {
8687     void* pModule = NULL;
8688     void* pMHLResource = NULL;
8689     MS_BOOL bStatusFlag = FALSE;
8690     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8691 
8692     UtopiaInstanceGetModule(pInstance, &pModule);
8693 
8694     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8695     {
8696         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8697     }
8698     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8699     {
8700         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8701     }
8702     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8703     {
8704         bStatusFlag = GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_RCP_FUNCTION_FLAG);
8705     }
8706 
8707     UtopiaResourceRelease(pMHLResource);
8708 
8709     return bStatusFlag;
8710 }
8711 
8712 //**************************************************************************
8713 //  [Function Name]:
8714 //                  mdrv_mhl_SrcRAPSupportFlag()
8715 //  [Description]
8716 //
8717 //  [Arguments]:
8718 //
8719 //  [Return]:
8720 //
8721 //**************************************************************************
mdrv_mhl_SrcRAPSupportFlag(void * pInstance)8722 MS_BOOL mdrv_mhl_SrcRAPSupportFlag(void* pInstance)
8723 {
8724     void* pModule = NULL;
8725     void* pMHLResource = NULL;
8726     MS_BOOL bStatusFlag = FALSE;
8727     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8728 
8729     UtopiaInstanceGetModule(pInstance, &pModule);
8730 
8731     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8732     {
8733         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8734     }
8735     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8736     {
8737         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8738     }
8739     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8740     {
8741         bStatusFlag = GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_RAP_FUNCTION_FLAG);
8742     }
8743 
8744     UtopiaResourceRelease(pMHLResource);
8745 
8746     return bStatusFlag;
8747 }
8748 
8749 //**************************************************************************
8750 //  [Function Name]:
8751 //                  mdrv_mhl_CbusGetStatusFlag()
8752 //  [Description]
8753 //
8754 //  [Arguments]:
8755 //
8756 //  [Return]:
8757 //
8758 //**************************************************************************
mdrv_mhl_CbusGetStatusFlag(void * pInstance,MS_U8 ucState)8759 MS_BOOL mdrv_mhl_CbusGetStatusFlag(void* pInstance, MS_U8 ucState)
8760 {
8761     void* pModule = NULL;
8762     void* pMHLResource = NULL;
8763     MS_BOOL bStatusFlag = FALSE;
8764     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8765 
8766     UtopiaInstanceGetModule(pInstance, &pModule);
8767 
8768     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8769     {
8770         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8771     }
8772     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8773     {
8774         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8775     }
8776     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8777     {
8778         switch(ucState)
8779         {
8780             case MHL_CBUS_STATUS_FLAG_CABLE_DETECT:
8781                 bStatusFlag = GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CABLE_PLUG_FLAG);
8782                 break;
8783 
8784             case MHL_CBUS_STATUS_FLAG_CBUS_CONNECT:
8785                 bStatusFlag = GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_CONNECT_FLAG);
8786                 break;
8787 
8788             case MHL_CBUS_STATUS_FLAG_PATH_EN:
8789                 break;
8790 
8791             case MHL_CBUS_STATUS_FLAG_RECEIVE_PATH_EN:
8792                 break;
8793 
8794             case MHL_CBUS_STATUS_FLAG_RECEIVE_MUTED:
8795                 break;
8796 
8797             case MHL_CBUS_STATUS_FLAG_COMMUNICATE_BUSY:
8798                 bStatusFlag = GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_COMMUNICATE_BUSY_FLAG);
8799                 break;
8800 
8801             default:
8802 
8803                 break;
8804         };
8805     }
8806 
8807     UtopiaResourceRelease(pMHLResource);
8808 
8809     return bStatusFlag;
8810 }
8811 
8812 //**************************************************************************
8813 //  [Function Name]:
8814 //                  mdrv_mhl_SendRAPCommand
8815 //  [Description]
8816 //                  MHL Cbus MSC Send RAP Command
8817 //  [Arguments]:
8818 //
8819 //  [Return]:
8820 //                  TRUE: success
8821 //                  FALSE: fail
8822 //**************************************************************************
mdrv_mhl_SendRAPCommand(void * pInstance,MS_U8 ucKeyCode)8823 MS_BOOL mdrv_mhl_SendRAPCommand(void* pInstance, MS_U8 ucKeyCode)
8824 {
8825     void* pModule = NULL;
8826     void* pMHLResource = NULL;
8827     MS_BOOL bSendFlag = FALSE;
8828     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8829 
8830     UtopiaInstanceGetModule(pInstance, &pModule);
8831 
8832     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8833     {
8834         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8835     }
8836     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8837     {
8838         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8839     }
8840     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8841     {
8842         bSendFlag = _mdrv_mhl_CbusSendSubMessage(pMHLResourcePrivate, MSC_MSG_RAP, ucKeyCode, TRUE);
8843     }
8844 
8845     UtopiaResourceRelease(pMHLResource);
8846 
8847     return bSendFlag;
8848 }
8849 
8850 //**************************************************************************
8851 //  [Function Name]:
8852 //                  mdrv_mhl_SendRCPAutoReleaseCmd
8853 //  [Description]
8854 //                  MHL Cbus MSC Send RCP Command
8855 //  [Arguments]:
8856 //
8857 //  [Return]:
8858 //                  TRUE: success
8859 //                  FALSE: fail
8860 //**************************************************************************
mdrv_mhl_SendRCPAutoReleaseCmd(void * pInstance,MS_U8 ucKeyCode)8861 MS_BOOL mdrv_mhl_SendRCPAutoReleaseCmd(void* pInstance, MS_U8 ucKeyCode)
8862 {
8863     void* pModule = NULL;
8864     void* pMHLResource = NULL;
8865     MS_BOOL bSendFlag = FALSE;
8866     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8867 
8868     UtopiaInstanceGetModule(pInstance, &pModule);
8869 
8870     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8871     {
8872         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8873     }
8874     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8875     {
8876         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8877     }
8878     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8879     {
8880         if(pMHLResourcePrivate->ucPreRCPKeyCode != ucKeyCode) // Key change
8881         {
8882             if(!GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_RCP_RELEASE_ENABLE_FLAG))
8883             {
8884                 bSendFlag = _mdrv_mhl_CbusSendSubMessage(pMHLResourcePrivate, MSC_MSG_RCP, ucKeyCode, TRUE);
8885             }
8886         }
8887         else
8888         {
8889             bSendFlag = _mdrv_mhl_CbusSendSubMessage(pMHLResourcePrivate, MSC_MSG_RCP, ucKeyCode, TRUE);
8890         }
8891 
8892         if(bSendFlag)
8893         {
8894             pMHLResourcePrivate->ucPreRCPKeyCode = ucKeyCode;
8895 
8896             _mdrv_mhl_SetCbusTimerEvent(pMHLResourcePrivate, MHL_TIMER_EVENT_RCP_AUTO_RELEASE, MHL_CBUS_RCP_RELEASE_TIME);
8897 
8898             SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_RCP_RELEASE_ENABLE_FLAG);
8899         }
8900     }
8901 
8902     UtopiaResourceRelease(pMHLResource);
8903 
8904     return bSendFlag;
8905 }
8906 
8907 //**************************************************************************
8908 //  [Function Name]:
8909 //                  mdrv_mhl_SendUCPCommand
8910 //  [Description]
8911 //                  MHL Cbus MSC Send UCP Command
8912 //  [Arguments]:
8913 //
8914 //  [Return]:
8915 //                  TRUE: success
8916 //                  FALSE: fail
8917 //**************************************************************************
mdrv_mhl_SendUCPCommand(void * pInstance,MS_U8 ucKeyCode)8918 MS_BOOL mdrv_mhl_SendUCPCommand(void* pInstance, MS_U8 ucKeyCode)
8919 {
8920     void* pModule = NULL;
8921     void* pMHLResource = NULL;
8922     MS_BOOL bSendFlag = FALSE;
8923     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8924 
8925     UtopiaInstanceGetModule(pInstance, &pModule);
8926 
8927     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8928     {
8929         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8930     }
8931     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8932     {
8933         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8934     }
8935     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8936     {
8937         bSendFlag = _mdrv_mhl_CbusSendSubMessage(pMHLResourcePrivate, MSC_MSG_UCP, ucKeyCode, TRUE);
8938     }
8939 
8940     UtopiaResourceRelease(pMHLResource);
8941 
8942     return bSendFlag;
8943 }
8944 
8945 //**************************************************************************
8946 //  [Function Name]:
8947 //                  mdrv_mhl_SendWriteBurst
8948 //  [Description]
8949 //
8950 //  [Arguments]:
8951 //
8952 //  [Return]:
8953 //                  TRUE: success
8954 //                  FALSE: fail
8955 //**************************************************************************
mdrv_mhl_SendWriteBurst(void * pInstance,MS_U8 ucAddr,MS_U8 ucLength,MS_U8 * ucData)8956 MS_BOOL mdrv_mhl_SendWriteBurst(void* pInstance, MS_U8 ucAddr, MS_U8 ucLength, MS_U8 *ucData)
8957 {
8958     void* pModule = NULL;
8959     void* pMHLResource = NULL;
8960     MS_BOOL bSendFlag = FALSE;
8961     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
8962 
8963     UtopiaInstanceGetModule(pInstance, &pModule);
8964 
8965     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
8966     {
8967         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
8968     }
8969     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
8970     {
8971         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
8972     }
8973     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
8974     {
8975         bSendFlag = _mdrv_mhl_CbusSendWriteBurst(pMHLResourcePrivate, ucAddr, ucLength, ucData);
8976     }
8977 
8978     UtopiaResourceRelease(pMHLResource);
8979 
8980     return bSendFlag;
8981 }
8982 
8983 //**************************************************************************
8984 //  [Function Name]:
8985 //                  mdrv_mhl_CbusSendUserWriteBurst
8986 //  [Description]
8987 //
8988 //  [Arguments]:
8989 //
8990 //  [Return]:
8991 //                  TRUE: success
8992 //                  FALSE: fail
8993 //**************************************************************************
mdrv_mhl_CbusSendUserWriteBurst(void * pInstance,MS_U8 ucLength,MS_U8 * ucData)8994 MS_BOOL mdrv_mhl_CbusSendUserWriteBurst(void* pInstance, MS_U8 ucLength, MS_U8 *ucData)
8995 {
8996     void* pModule = NULL;
8997     void* pMHLResource = NULL;
8998     MS_BOOL bSendFlag = FALSE;
8999     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
9000 
9001     UtopiaInstanceGetModule(pInstance, &pModule);
9002 
9003     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
9004     {
9005         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
9006     }
9007     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
9008     {
9009         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
9010     }
9011     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
9012     {
9013         if(GET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_USER_WRITE_BURST_FLAG))
9014         {
9015             if(pMHLResourcePrivate->ucWriteBurstState == MHL_CBUS_WRITE_BURST_REVEIVE_GRANT)
9016             {
9017                 if(_mdrv_mhl_CbusSendWriteBurst(pMHLResourcePrivate, 0x40, ucLength, ucData))
9018                 {
9019                     CLR_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_USER_WRITE_BURST_FLAG);
9020 
9021                     pMHLResourcePrivate->ucWriteBurstState = MHL_CBUS_WRITE_BURST_SEND_DATA;
9022 
9023                     bSendFlag = TRUE;
9024                 }
9025             }
9026         }
9027         else if(pMHLResourcePrivate->ucWriteBurstState == MHL_CBUS_WRITE_BURST_NONE)
9028         {
9029             SET_MHL_SEND_FLAG(pMHLResourcePrivate->ulCbusSendIndex, MHL_CBUS_SEND_USER_WRITE_BURST_FLAG);
9030         }
9031     }
9032 
9033     UtopiaResourceRelease(pMHLResource);
9034 
9035     return bSendFlag;
9036 }
9037 
9038 //**************************************************************************
9039 //  [Function Name]:
9040 //                  mdrv_mhl_GetDeviceCapability
9041 //  [Description]
9042 //
9043 //  [Arguments]:
9044 //
9045 //  [Return]:
9046 //
9047 //**************************************************************************
mdrv_mhl_GetDeviceCapability(void * pInstance,MS_U16 usDevcapMask,MS_U8 * ucDevcap)9048 MS_BOOL mdrv_mhl_GetDeviceCapability(void* pInstance, MS_U16 usDevcapMask, MS_U8 *ucDevcap)
9049 {
9050     void* pModule = NULL;
9051     void* pMHLResource = NULL;
9052     MS_BOOL bDoneFlag = FALSE;
9053     MS_U8 uctemp = 0;
9054     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
9055 
9056     UtopiaInstanceGetModule(pInstance, &pModule);
9057 
9058     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
9059     {
9060         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
9061     }
9062     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
9063     {
9064         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
9065     }
9066     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
9067     {
9068         if(!GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_READ_DEVCAP_FLAG))
9069         {
9070             pMHLResourcePrivate->usReadDevcapMask = usDevcapMask;
9071         }
9072 
9073         if(GET_MHL_DONE_FLAG(pMHLResourcePrivate->ucProcDoneIndex, MHL_READ_DEVCAP_DONE_FLAG))
9074         {
9075             if(ucDevcap != NULL)
9076             {
9077                 for(uctemp = 0; uctemp < MHL_DEVICE_CAPABILITY_SIZE; uctemp++)
9078                 {
9079                     if(usDevcapMask &BIT(uctemp))
9080                     {
9081                         ucDevcap[uctemp] = pMHLResourcePrivate->ucSourceDevcapTable[uctemp];
9082                     }
9083                     else
9084                     {
9085                         ucDevcap[uctemp] = 0;
9086                     }
9087                 }
9088             }
9089 
9090             bDoneFlag = TRUE;
9091         }
9092     }
9093 
9094     UtopiaResourceRelease(pMHLResource);
9095 
9096     return bDoneFlag;
9097 }
9098 
9099 //**************************************************************************
9100 //  [Function Name]:
9101 //                  mdrv_mhl_GetExtendDeviceCapability
9102 //  [Description]
9103 //
9104 //  [Arguments]:
9105 //
9106 //  [Return]:
9107 //
9108 //**************************************************************************
mdrv_mhl_GetExtendDeviceCapability(void * pInstance,MS_U16 usExtendDevcapMask,MS_U8 * ucExtendDevcap)9109 MS_BOOL mdrv_mhl_GetExtendDeviceCapability(void* pInstance, MS_U16 usExtendDevcapMask, MS_U8 *ucExtendDevcap)
9110 {
9111     void* pModule = NULL;
9112     void* pMHLResource = NULL;
9113     MS_BOOL bDoneFlag = FALSE;
9114     MS_U8 uctemp = 0;
9115     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
9116 
9117     UtopiaInstanceGetModule(pInstance, &pModule);
9118 
9119     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
9120     {
9121         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
9122     }
9123     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
9124     {
9125         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
9126     }
9127     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
9128     {
9129         if(!GET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_READ_XDEVCAP_FLAG))
9130         {
9131             pMHLResourcePrivate->usReadExtendDevcapMask = usExtendDevcapMask;
9132         }
9133 
9134         if(GET_MHL_DONE_FLAG(pMHLResourcePrivate->ucProcDoneIndex, MHL_READ_XDEVCAP_DONE_FLAG))
9135         {
9136             if(ucExtendDevcap != NULL)
9137             {
9138                 for(uctemp = 0; uctemp < MHL_XDEVICE_CAPABILITY_SIZE; uctemp++)
9139                 {
9140                     if(usExtendDevcapMask &BIT(uctemp))
9141                     {
9142                         ucExtendDevcap[uctemp] = pMHLResourcePrivate->ucSourceDevcapTable[MHL_DEVICE_CAPABILITY_SIZE +uctemp];
9143                     }
9144                     else
9145                     {
9146                         ucExtendDevcap[uctemp] = 0;
9147                     }
9148                 }
9149             }
9150 
9151             bDoneFlag = TRUE;
9152         }
9153     }
9154 
9155     UtopiaResourceRelease(pMHLResource);
9156 
9157     return bDoneFlag;
9158 }
9159 
9160 //**************************************************************************
9161 //  [Function Name]:
9162 //                  mdrv_mhl_GetDeviceVenderID
9163 //  [Description]
9164 //
9165 //  [Arguments]:
9166 //
9167 //  [Return]:
9168 //
9169 //**************************************************************************
mdrv_mhl_GetDeviceVenderID(void * pInstance,MS_U8 * ucVenderID)9170 MS_BOOL mdrv_mhl_GetDeviceVenderID(void* pInstance, MS_U8 *ucVenderID)
9171 {
9172     void* pModule = NULL;
9173     void* pMHLResource = NULL;
9174     MS_BOOL bDoneFlag = FALSE;
9175     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
9176 
9177     UtopiaInstanceGetModule(pInstance, &pModule);
9178 
9179     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
9180     {
9181         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
9182     }
9183     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
9184     {
9185         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
9186     }
9187     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
9188     {
9189         if(GET_MHL_DONE_FLAG(pMHLResourcePrivate->ucProcDoneIndex, MHL_GET_VENDER_ID_DONE_FLAG))
9190         {
9191             *ucVenderID = pMHLResourcePrivate->ucSourceVenderID;
9192 
9193             bDoneFlag = TRUE;
9194         }
9195         else
9196         {
9197             SET_MHL_ENABLE_FLAG(pMHLResourcePrivate->ulEnableIndex, MHL_ENABLE_GET_VENDER_ID_FLAG);
9198         }
9199     }
9200 
9201     UtopiaResourceRelease(pMHLResource);
9202 
9203     return bDoneFlag;
9204 }
9205 
9206 //**************************************************************************
9207 //  [Function Name]:
9208 //                  mdrv_mhl_GetWriteBurstData
9209 //  [Description]
9210 //
9211 //  [Arguments]:
9212 //
9213 //  [Return]:
9214 //
9215 //**************************************************************************
mdrv_mhl_GetWriteBurstData(void * pInstance,MS_U8 * ucData)9216 MS_BOOL mdrv_mhl_GetWriteBurstData(void* pInstance, MS_U8 *ucData)
9217 {
9218     void* pModule = NULL;
9219     void* pMHLResource = NULL;
9220     MS_BOOL bDoneFlag = FALSE;
9221     MS_U8 uctemp = 0;
9222     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
9223 
9224     UtopiaInstanceGetModule(pInstance, &pModule);
9225 
9226     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
9227     {
9228         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
9229     }
9230     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
9231     {
9232         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
9233     }
9234     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
9235     {
9236         if(pMHLResourcePrivate->ucWriteBurstAddress > 0)
9237         {
9238             pMHLResourcePrivate->ucWriteBurstAddress = 0;
9239 
9240             for(uctemp = 0; uctemp < pMHLResourcePrivate->ucWriteBurstLength; uctemp++)
9241             {
9242                 ucData[uctemp] = pMHLResourcePrivate->ucWriteBurstInformation[uctemp];
9243             }
9244 
9245             bDoneFlag = TRUE;
9246         }
9247     }
9248 
9249     UtopiaResourceRelease(pMHLResource);
9250 
9251     return bDoneFlag;
9252 }
9253 
9254 //**************************************************************************
9255 //  [Function Name]:
9256 //                  mdrv_mhl_RegisterCallBackFunctions()
9257 //  [Description]
9258 //                  RCP &RAP call back
9259 //  [Arguments]:
9260 //
9261 //  [Return]:
9262 //
9263 //**************************************************************************
mdrv_mhl_RegisterCallBackFunctions(void * pInstance,MS_BOOL bRCPfunctionFlag,MS_BOOL bRAPfunctionFlag)9264 void mdrv_mhl_RegisterCallBackFunctions(void* pInstance, MS_BOOL bRCPfunctionFlag, MS_BOOL bRAPfunctionFlag)
9265 {
9266     void* pModule = NULL;
9267     void* pMHLResource = NULL;
9268     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
9269 
9270     UtopiaInstanceGetModule(pInstance, &pModule);
9271 
9272     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
9273     {
9274         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
9275     }
9276     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
9277     {
9278         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
9279     }
9280     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
9281     {
9282         if(bRCPfunctionFlag)
9283         {
9284             SET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_RCP_FUNCTION_FLAG);
9285         }
9286 
9287         if(bRAPfunctionFlag)
9288         {
9289             SET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_RAP_FUNCTION_FLAG);
9290         }
9291     }
9292 
9293     UtopiaResourceRelease(pMHLResource);
9294 }
9295 
9296 //**************************************************************************
9297 //  [Function Name]:
9298 //                  mdrv_mhl_RegisterRcpCallBackFunction()
9299 //  [Description]
9300 //                  RCP call back
9301 //  [Arguments]:
9302 //
9303 //  [Return]:
9304 //
9305 //**************************************************************************
mdrv_mhl_RegisterRcpCallBackFunction(void * pInstance,MS_BOOL bRCPfunctionFlag)9306 void mdrv_mhl_RegisterRcpCallBackFunction(void* pInstance, MS_BOOL bRCPfunctionFlag)
9307 {
9308     void* pModule = NULL;
9309     void* pMHLResource = NULL;
9310     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
9311 
9312     UtopiaInstanceGetModule(pInstance, &pModule);
9313 
9314     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
9315     {
9316         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
9317     }
9318     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
9319     {
9320         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
9321     }
9322     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
9323     {
9324         if(bRCPfunctionFlag)
9325         {
9326             SET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_RCP_FUNCTION_FLAG);
9327         }
9328     }
9329 
9330     UtopiaResourceRelease(pMHLResource);
9331 }
9332 
9333 //**************************************************************************
9334 //  [Function Name]:
9335 //                  mdrv_mhl_RegisterRapCallBackFunction()
9336 //  [Description]
9337 //                  RAP call back
9338 //  [Arguments]:
9339 //
9340 //  [Return]:
9341 //
9342 //**************************************************************************
mdrv_mhl_RegisterRapCallBackFunction(void * pInstance,MS_BOOL bRAPfunctionFlag)9343 void mdrv_mhl_RegisterRapCallBackFunction(void* pInstance, MS_BOOL bRAPfunctionFlag)
9344 {
9345     void* pModule = NULL;
9346     void* pMHLResource = NULL;
9347     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
9348 
9349     UtopiaInstanceGetModule(pInstance, &pModule);
9350 
9351     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
9352     {
9353         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
9354     }
9355     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
9356     {
9357         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
9358     }
9359     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
9360     {
9361         if(bRAPfunctionFlag)
9362         {
9363             SET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_RAP_FUNCTION_FLAG);
9364         }
9365     }
9366 
9367     UtopiaResourceRelease(pMHLResource);
9368 }
9369 
9370 //**************************************************************************
9371 //  [Function Name]:
9372 //                  mdrv_mhl_RegisterUcpCallBackFunction()
9373 //  [Description]
9374 //                  UCP call back
9375 //  [Arguments]:
9376 //
9377 //  [Return]:
9378 //
9379 //**************************************************************************
mdrv_mhl_RegisterUcpCallBackFunction(void * pInstance,MS_BOOL bUCPfunctionFlag)9380 void mdrv_mhl_RegisterUcpCallBackFunction(void* pInstance, MS_BOOL bUCPfunctionFlag)
9381 {
9382     void* pModule = NULL;
9383     void* pMHLResource = NULL;
9384     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
9385 
9386     UtopiaInstanceGetModule(pInstance, &pModule);
9387 
9388     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
9389     {
9390         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
9391     }
9392     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
9393     {
9394         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
9395     }
9396     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
9397     {
9398         if(bUCPfunctionFlag)
9399         {
9400             SET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_UCP_FUNCTION_FLAG);
9401         }
9402     }
9403 
9404     UtopiaResourceRelease(pMHLResource);
9405 }
9406 
9407 //**************************************************************************
9408 //  [Function Name]:
9409 //                  mdrv_mhl_RegisterAttCallBackFunction()
9410 //  [Description]
9411 //                  ATT call back
9412 //  [Arguments]:
9413 //
9414 //  [Return]:
9415 //
9416 //**************************************************************************
mdrv_mhl_RegisterAttCallBackFunction(void * pInstance,MS_BOOL bATTfunctionFlag)9417 void mdrv_mhl_RegisterAttCallBackFunction(void* pInstance, MS_BOOL bATTfunctionFlag)
9418 {
9419     void* pModule = NULL;
9420     void* pMHLResource = NULL;
9421     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
9422 
9423     UtopiaInstanceGetModule(pInstance, &pModule);
9424 
9425     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
9426     {
9427         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
9428     }
9429     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
9430     {
9431         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
9432     }
9433     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
9434     {
9435         if(bATTfunctionFlag)
9436         {
9437             SET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_ATT_FUNCTION_FLAG);
9438         }
9439     }
9440 
9441     UtopiaResourceRelease(pMHLResource);
9442 }
9443 
9444 //**************************************************************************
9445 //  [Function Name]:
9446 //                  mdrv_mhl_RegisterRbpCallBackFunction()
9447 //  [Description]
9448 //                  RBP call back
9449 //  [Arguments]:
9450 //
9451 //  [Return]:
9452 //
9453 //**************************************************************************
mdrv_mhl_RegisterRbpCallBackFunction(void * pInstance,MS_BOOL bRBPfunctionFlag)9454 void mdrv_mhl_RegisterRbpCallBackFunction(void* pInstance, MS_BOOL bRBPfunctionFlag)
9455 {
9456     void* pModule = NULL;
9457     void* pMHLResource = NULL;
9458     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
9459 
9460     UtopiaInstanceGetModule(pInstance, &pModule);
9461 
9462     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
9463     {
9464         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
9465     }
9466     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
9467     {
9468         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
9469     }
9470     else if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_GET_BASE_SUCCESS_FLAG))
9471     {
9472         if(bRBPfunctionFlag)
9473         {
9474             SET_MHL_CALLBACK_FLAG(pMHLResourcePrivate->ucCallBackFunctionIndex, MHL_CALLBACK_RBP_FUNCTION_FLAG);
9475         }
9476     }
9477 
9478     UtopiaResourceRelease(pMHLResource);
9479 }
9480 
9481 //**************************************************************************
9482 //  [Function Name]:
9483 //                  mdrv_mhl_GetConfiguration()
9484 //  [Description]
9485 //                  MHL get init config
9486 //  [Arguments]:
9487 //
9488 //  [Return]:
9489 //
9490 //**************************************************************************
mdrv_mhl_GetConfiguration(void * pInstance)9491 stMHL_INITIAL_CONFIG_INFO mdrv_mhl_GetConfiguration(void* pInstance)
9492 {
9493     void* pModule = NULL;
9494     void* pMHLResource = NULL;
9495     MS_U8 uctemp = 0;
9496     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
9497     stMHL_INITIAL_CONFIG_INFO stInitialConfigInfo = {0};
9498 
9499     stInitialConfigInfo.ulReturnValue = UTOPIA_STATUS_ERR_NOT_AVAIL;
9500 
9501     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
9502     {
9503         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
9504     }
9505     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
9506     {
9507         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
9508     }
9509     else
9510     {
9511         if(_mdrv_mhl_InitRiuBase(pMHLResourcePrivate)) // Get base success
9512         {
9513             MDRV_MHL_MSG_INFO("** MHL get XC and PM base success \n");
9514         }
9515 
9516         if(GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_PREVENT_REINITIAL_FLAG))
9517         {
9518             stInitialConfigInfo.ulReturnValue = UTOPIA_STATUS_SUCCESS;
9519             stInitialConfigInfo.ucMHLSupportPath = pMHLResourcePrivate->ucMHLSupportPath;
9520 
9521             for(uctemp = 0; uctemp < (MHL_DEVICE_CAPABILITY_SIZE +MHL_XDEVICE_CAPABILITY_SIZE); uctemp++)
9522             {
9523                 stInitialConfigInfo.ucDeviceCapabilityTable[uctemp] = pMHLResourcePrivate->ucDeviceCapabilityTable[uctemp];
9524             }
9525         }
9526     }
9527 
9528     UtopiaResourceRelease(pMHLResource);
9529 
9530     return stInitialConfigInfo;
9531 }
9532 
9533 #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
9534 //**************************************************************************
9535 //  [Function Name]:
9536 //                  mdrv_mhl_MDCMDEchoCommand()
9537 //  [Description]
9538 //                  MHL MDCMD echo command function
9539 //  [Arguments]:
9540 //
9541 //  [Return]:
9542 //
9543 //**************************************************************************
mdrv_mhl_MDCMDEchoCommand(void * pInstance,MS_U64 * u64ReqHdl,char * pcCmdLine)9544 void mdrv_mhl_MDCMDEchoCommand(void* pInstance, MS_U64* u64ReqHdl, char* pcCmdLine)
9545 {
9546     char pch[] = "=,";
9547     char* psep;
9548 
9549     MdbPrint(u64ReqHdl, "LINE:%d, MDBCMD_CMDLINE\n", __LINE__);
9550     MdbPrint(u64ReqHdl, "pcCmdLine: %s\n", pcCmdLine);
9551 
9552     psep = strsep(&pcCmdLine, pch);
9553 
9554     if(strncmp("MHLOn", psep, 5) == 0)
9555     {
9556 
9557     }
9558 }
9559 
9560 //**************************************************************************
9561 //  [Function Name]:
9562 //                  mdrv_mhl_MDCMDGetInfo()
9563 //  [Description]
9564 //                  MHL MDCMD get info function
9565 //  [Arguments]:
9566 //
9567 //  [Return]:
9568 //
9569 //**************************************************************************
mdrv_mhl_MDCMDGetInfo(void * pInstance,MS_U64 * u64ReqHdl)9570 void mdrv_mhl_MDCMDGetInfo(void* pInstance, MS_U64* u64ReqHdl)
9571 {
9572     void* pModule = NULL;
9573     void* pMHLResource = NULL;
9574     MHL_RESOURCE_PRIVATE *pMHLResourcePrivate = NULL;
9575 
9576     if(UtopiaResourceObtain(pModule, MHL_POOL, &pMHLResource) != UTOPIA_STATUS_SUCCESS)
9577     {
9578         MDRV_MHL_MSG_ERROR("[%s,%5d] UtopiaResourceObtainToInstant failed\n", __FUNCTION__, __LINE__);
9579     }
9580     else if(UtopiaResourceGetPrivate(pMHLResource, (void*)&pMHLResourcePrivate) != UTOPIA_STATUS_SUCCESS)
9581     {
9582         MDRV_MHL_MSG_ERROR("[%s,%5d] Get MHL resource failed\n", __FUNCTION__, __LINE__);
9583     }
9584     else
9585     {
9586         MdbPrint(u64ReqHdl, "LINE:%d, MDBCMD_GETINFO\n", __LINE__);
9587         MdbPrint(u64ReqHdl, "----------------  Mstar MHL Info -----------------\n");
9588         MdbPrint(u64ReqHdl, "Debug Cbus:\n");
9589         MdbPrint(u64ReqHdl, "Cable detect flag:    %d\n", GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CABLE_PLUG_FLAG));
9590         MdbPrint(u64ReqHdl, "Cbus connect flag:    %d\n", GET_MHL_SYSTEM_FLAG(pMHLResourcePrivate->ulSystemIndex, MHL_SYSTEM_CBUS_CONNECT_FLAG));
9591         MdbPrint(u64ReqHdl, "System index info:  0x%x\n", pMHLResourcePrivate->ulSystemIndex);
9592         MdbPrint(u64ReqHdl, "Timer index info:   0x%x\n", pMHLResourcePrivate->ulTimerIndex);
9593         MdbPrint(u64ReqHdl, "Enable index info:  0x%x\n", pMHLResourcePrivate->ulEnableIndex);
9594         MdbPrint(u64ReqHdl, "Cbus receive info:  0x%x\n", pMHLResourcePrivate->ulCbusReceiveIndex);
9595         MdbPrint(u64ReqHdl, "Cbus send info:     0x%x\n", pMHLResourcePrivate->ulCbusSendIndex);
9596         MdbPrint(u64ReqHdl, "Debug eCbus:\n");
9597         MdbPrint(u64ReqHdl, "eCbus state:          %d\n", pMHLResourcePrivate->ucECbusState);
9598         MdbPrint(u64ReqHdl, "Debug PHY:\n");
9599         MdbPrint(u64ReqHdl, "TMDS clock mode:      %d\n", pMHLResourcePrivate->ucTMDSClockMode);
9600         MdbPrint(u64ReqHdl, "Main link rate:       %d\n", pMHLResourcePrivate->stSignalStatusInfo.ucMainLinkRate);
9601         MdbPrint(u64ReqHdl, "Clock stable flag:    %d\n", pMHLResourcePrivate->stSignalStatusInfo.bClockStableFlag);
9602         MdbPrint(u64ReqHdl, "Signal stable flag:   %d\n", pMHLResourcePrivate->stSignalStatusInfo.bSignalStableFlag);
9603     }
9604 
9605     UtopiaResourceRelease(pMHLResource);
9606 }
9607 
9608 #endif
9609 
9610 #endif
9611 
9612 #endif // _MDRV_MHL_C_
9613