xref: /utopia/UTPA2-700.0.x/modules/hdmi/drv/hdmitx/drvHDMITx.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi //    Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi //    No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi //    modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi //    supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi //    Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi //    Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi //    obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi //    such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi //    MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi //    confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi //    third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi //    without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi //    intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi //    and in conformity with any international standard.  You agree to waive any
38*53ee8cc1Swenshuai.xi //    claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi //    incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi //    In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi //    consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi //    revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi //    You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi //    even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi //    request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi //    parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi //    services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi //    MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi //    ("Services").
52*53ee8cc1Swenshuai.xi //    You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi //    writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi //    disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi //    or otherwise:
58*53ee8cc1Swenshuai.xi //    (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi //        mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi //    (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi //        including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi //        of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi //    (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi //    of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi //    Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi //    settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi //    Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi //    with the said Rules.
72*53ee8cc1Swenshuai.xi //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi //    be English.
74*53ee8cc1Swenshuai.xi //    The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2006-2007 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // (¡§MStar Confidential Information¡¨) by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi 
95*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
96*53ee8cc1Swenshuai.xi ///
97*53ee8cc1Swenshuai.xi /// file    drvHDMITx.c
98*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
99*53ee8cc1Swenshuai.xi /// @brief  HDMI Tx Driver Interface
100*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
101*53ee8cc1Swenshuai.xi 
102*53ee8cc1Swenshuai.xi #define  MDRV_HDMITX_C
103*53ee8cc1Swenshuai.xi 
104*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
105*53ee8cc1Swenshuai.xi //  Include Files
106*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
107*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
108*53ee8cc1Swenshuai.xi #include <linux/string.h>
109*53ee8cc1Swenshuai.xi #else
110*53ee8cc1Swenshuai.xi #include <string.h>
111*53ee8cc1Swenshuai.xi #endif
112*53ee8cc1Swenshuai.xi #include "MsCommon.h"
113*53ee8cc1Swenshuai.xi #include "MsVersion.h"
114*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
115*53ee8cc1Swenshuai.xi #include "drvSYS.h"
116*53ee8cc1Swenshuai.xi #include "regHDMITx.h"
117*53ee8cc1Swenshuai.xi #include "halHDMIUtilTx.h"
118*53ee8cc1Swenshuai.xi #include "halHDMITx.h"
119*53ee8cc1Swenshuai.xi #include "halHDCPTx.h"
120*53ee8cc1Swenshuai.xi #include "drvHDMITx.h"
121*53ee8cc1Swenshuai.xi 
122*53ee8cc1Swenshuai.xi //#include <bigd.h>
123*53ee8cc1Swenshuai.xi 
124*53ee8cc1Swenshuai.xi #include "MsDevice.h"
125*53ee8cc1Swenshuai.xi 
126*53ee8cc1Swenshuai.xi #include "apiHDMITx.h"
127*53ee8cc1Swenshuai.xi #include "utopia_dapi.h"
128*53ee8cc1Swenshuai.xi 
129*53ee8cc1Swenshuai.xi #include "utopia.h"
130*53ee8cc1Swenshuai.xi #include "HDMITX_private.h"
131*53ee8cc1Swenshuai.xi 
132*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
133*53ee8cc1Swenshuai.xi //  Driver Compiler Options
134*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
135*53ee8cc1Swenshuai.xi 
136*53ee8cc1Swenshuai.xi 
137*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
138*53ee8cc1Swenshuai.xi //  Local Defines
139*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
140*53ee8cc1Swenshuai.xi 
141*53ee8cc1Swenshuai.xi 
142*53ee8cc1Swenshuai.xi #define HDMITX_TASK_STACK_SIZE          4096UL
143*53ee8cc1Swenshuai.xi //#define HDCPTX_TASK_STACK_SIZE          4096UL //wilson@kano
144*53ee8cc1Swenshuai.xi 
145*53ee8cc1Swenshuai.xi #define HDMITX_MUTEX_TIMEOUT            2000UL        ///< The maximum timeout
146*53ee8cc1Swenshuai.xi #define HDMITX_MONITOR_DELAY            50UL
147*53ee8cc1Swenshuai.xi 
148*53ee8cc1Swenshuai.xi #define HDCPTX_MONITOR_DELAY            10UL //wilson@kano
149*53ee8cc1Swenshuai.xi 
150*53ee8cc1Swenshuai.xi 
151*53ee8cc1Swenshuai.xi #define USE_INTERNAL_HDCP_KEY           1UL // Use internal HDCP key
152*53ee8cc1Swenshuai.xi #define USE_AUTO_GEN_AN                 1UL // Use auto An generator
153*53ee8cc1Swenshuai.xi #define CheckRx_Timer                   100UL // Check Rx HPD and TMDS clock status
154*53ee8cc1Swenshuai.xi 
155*53ee8cc1Swenshuai.xi /*
156*53ee8cc1Swenshuai.xi  * HDCP CTS 1A-01: NOT JUDGED
157*53ee8cc1Swenshuai.xi  * Refine timing to fix Ri Timer expired issue: Inactivity timer expired.
158*53ee8cc1Swenshuai.xi  */
159*53ee8cc1Swenshuai.xi #define HDCP_1ST_RiCheck_Timer          100UL //2600 // Check HDCP Ri value in both of Rx and Tx sides
160*53ee8cc1Swenshuai.xi #define HDCP_RiCheck_Timer              500UL //2600 // Check HDCP Ri value in both of Rx and Tx sides
161*53ee8cc1Swenshuai.xi 
162*53ee8cc1Swenshuai.xi //In Test Instrument, Quantumdata882, it read each DDC step with 30ms sample periods
163*53ee8cc1Swenshuai.xi //While doing SEC Compatibility Test, we find some REPEATER need enlarge sample rate to above 20ms to avoid timeout problem (YAMAHA RX-V2700)
164*53ee8cc1Swenshuai.xi //In SEC Compatibility Test, another repeater face RX Ri freeze after auth done. Enlarge sample rate to 125ms to avoid problem (YAMAHA RX-V467)
165*53ee8cc1Swenshuai.xi #define HDCP_DDC_SAMPLE_PERIOD          125UL //20//10 //SEC Compatibility Test (YAMAHA RX-V2700)(YAMAHA RX-V467)
166*53ee8cc1Swenshuai.xi 
167*53ee8cc1Swenshuai.xi #define HDCP14TX_R0_WDT		 			100UL     //wilson@kano 100 ms
168*53ee8cc1Swenshuai.xi #define HDCP14TX_BSTATUS_TIMEOUT_CNT    9000UL //according to QD886 log, it require 9second polling bstatus //600UL //wilson@kano
169*53ee8cc1Swenshuai.xi #define HDCP14TX_REP_RDY_BIT_WDT		5000UL    //wilson@kano 5sec
170*53ee8cc1Swenshuai.xi 
171*53ee8cc1Swenshuai.xi 
172*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
173*53ee8cc1Swenshuai.xi //  Local Structures
174*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
175*53ee8cc1Swenshuai.xi #if 0
176*53ee8cc1Swenshuai.xi typedef    struct    {
177*53ee8cc1Swenshuai.xi     BIGD   p, q, g, x, y;
178*53ee8cc1Swenshuai.xi } dsa_context;
179*53ee8cc1Swenshuai.xi #endif
180*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
181*53ee8cc1Swenshuai.xi //  Global Variables
182*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
183*53ee8cc1Swenshuai.xi static MsHDMITX_RX_STATUS gbCurRxStatus = E_HDMITX_DVIClock_L_HPD_L;
184*53ee8cc1Swenshuai.xi 
185*53ee8cc1Swenshuai.xi //MDrvHDMITX_PARAMETER_LIST   gHDMITxInfo;
186*53ee8cc1Swenshuai.xi //MDrvHdcpTx_PARAMETER_LIST   gHdcpTxInfo;
187*53ee8cc1Swenshuai.xi 
188*53ee8cc1Swenshuai.xi MsHDMITX_INTERRUPT_TYPE gHDMITXIRQ = E_HDMITX_IRQ_12|E_HDMITX_IRQ_10; // HPD and Clock disconnect
189*53ee8cc1Swenshuai.xi MS_U8 gRepeaterFailTime = 0; // for MAX_CASCADE_EXCEEDED and MAX_DEVS_EXCEEDED
190*53ee8cc1Swenshuai.xi MS_U32 gRepeaterStartTime = 0; // for MAX_CASCADE_EXCEEDED and MAX_DEVS_EXCEEDED
191*53ee8cc1Swenshuai.xi MS_U16 gHDCPCheckRiTimer = HDCP_RiCheck_Timer;//2600;
192*53ee8cc1Swenshuai.xi MS_BOOL g_bDisableRegWrite = FALSE;
193*53ee8cc1Swenshuai.xi MS_BOOL g_bDisableTMDSCtrl = FALSE;
194*53ee8cc1Swenshuai.xi 
195*53ee8cc1Swenshuai.xi MS_BOOL g_bDisableVSInfo = TRUE;
196*53ee8cc1Swenshuai.xi 
197*53ee8cc1Swenshuai.xi MS_BOOL g_bHDMITxTask = TRUE;
198*53ee8cc1Swenshuai.xi MS_BOOL g_bHdcpTxTask = TRUE; //wilson@kano
199*53ee8cc1Swenshuai.xi 
200*53ee8cc1Swenshuai.xi ///MS_BOOL g_bHDCPRxValid = TRUE; //E_HDMITX_HDCP_RX_IS_NOT_VALID //E_HDMITX_HDCP_RX_IS_VALID //wilson@kano
201*53ee8cc1Swenshuai.xi static MS_U32 gdwPreTime = 0; //wilson@kano
202*53ee8cc1Swenshuai.xi static MS_U32 gdwCurTime = 0; //wilson@kano
203*53ee8cc1Swenshuai.xi 
204*53ee8cc1Swenshuai.xi MsHDMITX_RX_STATUS                 _hdmitx_preRX_status = E_HDMITX_DVIClock_L_HPD_L;
205*53ee8cc1Swenshuai.xi 
206*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
207*53ee8cc1Swenshuai.xi //  Local Variables
208*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
209*53ee8cc1Swenshuai.xi //wilson@kano
210*53ee8cc1Swenshuai.xi MS_U8 g_u8Bstatus[2] = {0x00};
211*53ee8cc1Swenshuai.xi MS_U8 g_u8KSVList[635] = {0x00};
212*53ee8cc1Swenshuai.xi MS_BOOL g_bValidKSVList = FALSE;
213*53ee8cc1Swenshuai.xi static MS_U8 g_u8SupTimingNum = 0;
214*53ee8cc1Swenshuai.xi 
215*53ee8cc1Swenshuai.xi const MS_U8 VSDB_HDMI_IEEE_ID[3] =
216*53ee8cc1Swenshuai.xi {
217*53ee8cc1Swenshuai.xi 	0x03, 0x0C, 0x00
218*53ee8cc1Swenshuai.xi };
219*53ee8cc1Swenshuai.xi //wilson@kano
220*53ee8cc1Swenshuai.xi const MS_U8 HFVSDB_HDMI_IEEE_ID[3] =
221*53ee8cc1Swenshuai.xi {
222*53ee8cc1Swenshuai.xi 	0xD8, 0x5D, 0xC4
223*53ee8cc1Swenshuai.xi };
224*53ee8cc1Swenshuai.xi 
225*53ee8cc1Swenshuai.xi 
226*53ee8cc1Swenshuai.xi static void                           *_pHDMITxTaskStack;
227*53ee8cc1Swenshuai.xi static MS_S32                          _s32HDMITxTaskId = -1;
228*53ee8cc1Swenshuai.xi static MS_S32                          _s32HDMITxEventId;
229*53ee8cc1Swenshuai.xi static MS_U8                           _u8HDMITx_StackBuffer[HDMITX_TASK_STACK_SIZE];
230*53ee8cc1Swenshuai.xi 
231*53ee8cc1Swenshuai.xi //wilson@kano
232*53ee8cc1Swenshuai.xi #if 0
233*53ee8cc1Swenshuai.xi static void                           *_pHdcpTxTaskStack;
234*53ee8cc1Swenshuai.xi static MS_S32                          _s32HdcpTxTaskId = -1;
235*53ee8cc1Swenshuai.xi static MS_S32                          _s32HdcpTxEventId;
236*53ee8cc1Swenshuai.xi static MS_U8                           _u8HdcpTx_StackBuffer[HDCPTX_TASK_STACK_SIZE];
237*53ee8cc1Swenshuai.xi #endif
238*53ee8cc1Swenshuai.xi //wilson@kano
239*53ee8cc1Swenshuai.xi 
240*53ee8cc1Swenshuai.xi 
241*53ee8cc1Swenshuai.xi static MS_S32                       _s32CheckRxTimerId = -1;
242*53ee8cc1Swenshuai.xi static MS_S32                       _s32HDCPRiTimerId = -1;
243*53ee8cc1Swenshuai.xi 
244*53ee8cc1Swenshuai.xi static MS_U32                       _u32Aksv2RoInterval = 150;
245*53ee8cc1Swenshuai.xi 
246*53ee8cc1Swenshuai.xi 
247*53ee8cc1Swenshuai.xi MS_U8 HDMITX_EdidHeaderTbl[] =
248*53ee8cc1Swenshuai.xi {
249*53ee8cc1Swenshuai.xi     0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
250*53ee8cc1Swenshuai.xi };
251*53ee8cc1Swenshuai.xi 
252*53ee8cc1Swenshuai.xi MS_U8 HDMITX_IEEEHdmiIdTbl[] =
253*53ee8cc1Swenshuai.xi {
254*53ee8cc1Swenshuai.xi     0x03, 0x0C, 0x00,
255*53ee8cc1Swenshuai.xi };
256*53ee8cc1Swenshuai.xi 
257*53ee8cc1Swenshuai.xi #define HDMITX_DRV_VERSION                  /* Character String for DRV/API version             */  \
258*53ee8cc1Swenshuai.xi     MSIF_TAG,                           /* 'MSIF'                                           */  \
259*53ee8cc1Swenshuai.xi     MSIF_CLASS,                         /* '00'                                             */  \
260*53ee8cc1Swenshuai.xi     MSIF_CUS,                           /* 0x0000                                           */  \
261*53ee8cc1Swenshuai.xi     MSIF_MOD,                           /* 0x0000                                           */  \
262*53ee8cc1Swenshuai.xi     MSIF_CHIP,                                                                                  \
263*53ee8cc1Swenshuai.xi     MSIF_CPU,                                                                                   \
264*53ee8cc1Swenshuai.xi     {'P','Q','_','_'},                  /* IP__                                             */  \
265*53ee8cc1Swenshuai.xi     {'0','0'},                          /* 0.0 ~ Z.Z                                        */  \
266*53ee8cc1Swenshuai.xi     {'0','0'},                          /* 00 ~ 99                                          */  \
267*53ee8cc1Swenshuai.xi     {'0','0','1','1','5','1','5','7'},  /* CL#                                              */  \
268*53ee8cc1Swenshuai.xi     MSIF_OS
269*53ee8cc1Swenshuai.xi 
270*53ee8cc1Swenshuai.xi /// Debug information
271*53ee8cc1Swenshuai.xi static MSIF_Version _drv_hdmi_tx_version = {.DDI = { HDMITX_DRV_VERSION },};
272*53ee8cc1Swenshuai.xi static MS_HDMI_TX_INFO _info =
273*53ee8cc1Swenshuai.xi     {
274*53ee8cc1Swenshuai.xi         // TODO: ADD hdmi tx related info here.
275*53ee8cc1Swenshuai.xi     };
276*53ee8cc1Swenshuai.xi static MS_HDMI_TX_Status _hdmitx_status = {.bIsInitialized = FALSE, .bIsRunning = FALSE,};
277*53ee8cc1Swenshuai.xi //static MS_HDCP_TX_Status _hdcptx_status = {.bIsInitialized = FALSE, .bIsRunning = FALSE,};
278*53ee8cc1Swenshuai.xi 
279*53ee8cc1Swenshuai.xi 
280*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
281*53ee8cc1Swenshuai.xi static MS_U16 _u16DbgHDMITXSwitch = HDMITX_DBG|HDMITX_DBG_HDCP;
282*53ee8cc1Swenshuai.xi #else
283*53ee8cc1Swenshuai.xi static MS_U16 _u16DbgHDMITXSwitch = 0x00;
284*53ee8cc1Swenshuai.xi #endif
285*53ee8cc1Swenshuai.xi 
286*53ee8cc1Swenshuai.xi MS_BOOL bCheckEDID = TRUE; // Check EDID only when HPD from low to high
287*53ee8cc1Swenshuai.xi 
288*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
289*53ee8cc1Swenshuai.xi //  Debug Functions
290*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
291*53ee8cc1Swenshuai.xi 
292*53ee8cc1Swenshuai.xi #define DBG_HDMITX(_f)                do{ if(_u16DbgHDMITXSwitch & HDMITX_DBG) (_f); } while(0);
293*53ee8cc1Swenshuai.xi #define DBG_HDCP(_f)                  do{ if(_u16DbgHDMITXSwitch & HDMITX_DBG_HDCP) (_f); } while(0);
294*53ee8cc1Swenshuai.xi 
295*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
296*53ee8cc1Swenshuai.xi //  Local Functions
297*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
298*53ee8cc1Swenshuai.xi 
299*53ee8cc1Swenshuai.xi //extern MS_BOOL MDrv_EEPROM_Write(MS_U32 u32Addr, MS_U8 *pu8Buf, MS_U32 u32Size);
MDrv_EEPROM_Read(MS_U32 u32Addr,MS_U8 * pu8Buf,MS_U32 u32Size)300*53ee8cc1Swenshuai.xi MS_BOOL MDrv_EEPROM_Read(MS_U32 u32Addr, MS_U8 *pu8Buf, MS_U32 u32Size)
301*53ee8cc1Swenshuai.xi {
302*53ee8cc1Swenshuai.xi     return TRUE;
303*53ee8cc1Swenshuai.xi }
304*53ee8cc1Swenshuai.xi 
305*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
306*53ee8cc1Swenshuai.xi /// @brief Set event of HDMI ISR
307*53ee8cc1Swenshuai.xi /// @param  None
308*53ee8cc1Swenshuai.xi /// @return None
309*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
310*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
_HDMITx_Isr(InterruptNum eIntNum)311*53ee8cc1Swenshuai.xi static void _HDMITx_Isr(InterruptNum eIntNum)//irqreturn_t _HDMITx_Isr(InterruptNum eIntNum, void* dev_id)
312*53ee8cc1Swenshuai.xi {
313*53ee8cc1Swenshuai.xi //Wilson:undercheck, remove argument #2 to avoid build warning
314*53ee8cc1Swenshuai.xi     MS_U32 irq_status;
315*53ee8cc1Swenshuai.xi     eIntNum = eIntNum;      // prevent compile warning
316*53ee8cc1Swenshuai.xi 
317*53ee8cc1Swenshuai.xi     //Clear Interrupt Bit
318*53ee8cc1Swenshuai.xi     irq_status = MHal_HDMITx_Int_Status();
319*53ee8cc1Swenshuai.xi     if(irq_status & E_HDMITX_IRQ_12) // TMDS hot-plug
320*53ee8cc1Swenshuai.xi     {
321*53ee8cc1Swenshuai.xi         MHal_HDMITx_Int_Clear(E_HDMITX_IRQ_12);
322*53ee8cc1Swenshuai.xi     }
323*53ee8cc1Swenshuai.xi     else if(irq_status & E_HDMITX_IRQ_10) // Rx disconnection
324*53ee8cc1Swenshuai.xi     {
325*53ee8cc1Swenshuai.xi         MHal_HDMITx_Int_Clear(E_HDMITX_IRQ_10);
326*53ee8cc1Swenshuai.xi     }
327*53ee8cc1Swenshuai.xi 
328*53ee8cc1Swenshuai.xi     MsOS_SetEvent(_s32HDMITxEventId, E_HDMITX_EVENT_IRQ);
329*53ee8cc1Swenshuai.xi     //return IRQ_HANDLED;
330*53ee8cc1Swenshuai.xi }
331*53ee8cc1Swenshuai.xi 
332*53ee8cc1Swenshuai.xi #if 0 //ENABLE_CEC_INT
333*53ee8cc1Swenshuai.xi irqreturn_t _HDMITX_CEC_RxIsr(InterruptNum eIntNum, void* dev_id)
334*53ee8cc1Swenshuai.xi {
335*53ee8cc1Swenshuai.xi     eIntNum = eIntNum;      // prevent compile warning
336*53ee8cc1Swenshuai.xi 
337*53ee8cc1Swenshuai.xi     MDrv_CEC_RxChkBuf();
338*53ee8cc1Swenshuai.xi     MsOS_EnableInterrupt(E_INT_IRQ_CEC);
339*53ee8cc1Swenshuai.xi 
340*53ee8cc1Swenshuai.xi     MsOS_SetEvent(_s32HDMITxEventId, E_HDMITX_EVENT_CECRX);
341*53ee8cc1Swenshuai.xi     return IRQ_HANDLED;
342*53ee8cc1Swenshuai.xi }
343*53ee8cc1Swenshuai.xi #endif // ENABLE_CEC_INT
344*53ee8cc1Swenshuai.xi 
345*53ee8cc1Swenshuai.xi #else
346*53ee8cc1Swenshuai.xi 
_HDMITx_Isr(InterruptNum eIntNum)347*53ee8cc1Swenshuai.xi static void _HDMITx_Isr(InterruptNum eIntNum)
348*53ee8cc1Swenshuai.xi {
349*53ee8cc1Swenshuai.xi     MS_U32 irq_status;
350*53ee8cc1Swenshuai.xi     //eIntNum = eIntNum;      // prevent compile warning
351*53ee8cc1Swenshuai.xi     DBG_HDCP(printf("_HDMITx_Isr!!! %d \r\n", eIntNum)); // Fix coverity impact.
352*53ee8cc1Swenshuai.xi 
353*53ee8cc1Swenshuai.xi     //Clear Interrupt Bit
354*53ee8cc1Swenshuai.xi     irq_status = MHal_HDMITx_Int_Status();
355*53ee8cc1Swenshuai.xi     if(irq_status & E_HDMITX_IRQ_12) // TMDS hot-plug
356*53ee8cc1Swenshuai.xi     {
357*53ee8cc1Swenshuai.xi         MHal_HDMITx_Int_Clear(E_HDMITX_IRQ_12);
358*53ee8cc1Swenshuai.xi     }
359*53ee8cc1Swenshuai.xi     else if(irq_status & E_HDMITX_IRQ_10) // Rx disconnection
360*53ee8cc1Swenshuai.xi     {
361*53ee8cc1Swenshuai.xi         MHal_HDMITx_Int_Clear(E_HDMITX_IRQ_10);
362*53ee8cc1Swenshuai.xi     }
363*53ee8cc1Swenshuai.xi     MsOS_SetEvent(_s32HDMITxEventId, E_HDMITX_EVENT_IRQ);
364*53ee8cc1Swenshuai.xi }
365*53ee8cc1Swenshuai.xi 
366*53ee8cc1Swenshuai.xi #if 0 //ENABLE_CEC_INT
367*53ee8cc1Swenshuai.xi static void _HDMITX_CEC_RxIsr(InterruptNum eIntNum)
368*53ee8cc1Swenshuai.xi {
369*53ee8cc1Swenshuai.xi     //eIntNum = eIntNum;      // prevent compile warning
370*53ee8cc1Swenshuai.xi     DBG_HDCP(printf("_HDMITX_CEC_RxIsr!!! %d \r\n", eIntNum)); // Fix coverity impact.
371*53ee8cc1Swenshuai.xi 
372*53ee8cc1Swenshuai.xi     MDrv_CEC_RxChkBuf();
373*53ee8cc1Swenshuai.xi     MsOS_EnableInterrupt(E_INT_IRQ_CEC);
374*53ee8cc1Swenshuai.xi 
375*53ee8cc1Swenshuai.xi     MsOS_SetEvent(_s32HDMITxEventId, E_HDMITX_EVENT_CECRX);
376*53ee8cc1Swenshuai.xi }
377*53ee8cc1Swenshuai.xi #endif // ENABLE_CEC_INT
378*53ee8cc1Swenshuai.xi 
379*53ee8cc1Swenshuai.xi #endif
380*53ee8cc1Swenshuai.xi 
381*53ee8cc1Swenshuai.xi //**************************************************************************
382*53ee8cc1Swenshuai.xi //  [Function Name]:
383*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_Get_Semaphore()
384*53ee8cc1Swenshuai.xi //  [Description]:
385*53ee8cc1Swenshuai.xi //                  get hdmi tx semaphore
386*53ee8cc1Swenshuai.xi //  [Arguments]:
387*53ee8cc1Swenshuai.xi //                  [void] *pInstances
388*53ee8cc1Swenshuai.xi //  [Return]:
389*53ee8cc1Swenshuai.xi //                  MS_U32
390*53ee8cc1Swenshuai.xi //
391*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_Get_Semaphore(void * pInstance)392*53ee8cc1Swenshuai.xi MS_U32 MDrv_HDMITx_Get_Semaphore(void *pInstance)
393*53ee8cc1Swenshuai.xi {
394*53ee8cc1Swenshuai.xi     MS_U32 u32Return = UTOPIA_STATUS_FAIL;
395*53ee8cc1Swenshuai.xi 
396*53ee8cc1Swenshuai.xi     if (pInstance == NULL)
397*53ee8cc1Swenshuai.xi     {
398*53ee8cc1Swenshuai.xi         printf("[%s,%5d]No instance existed, please get an instance by calling HDMITx() first\n",__FUNCTION__,__LINE__);
399*53ee8cc1Swenshuai.xi         return u32Return;
400*53ee8cc1Swenshuai.xi     }
401*53ee8cc1Swenshuai.xi 
402*53ee8cc1Swenshuai.xi     HDMITX_INSTANCE_PRIVATE *psHDMITXInstPri = NULL;
403*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&psHDMITXInstPri);
404*53ee8cc1Swenshuai.xi 
405*53ee8cc1Swenshuai.xi     if (psHDMITXInstPri->u32DeviceID>= E_HDMITX_POOL_ID_MAX)
406*53ee8cc1Swenshuai.xi     {
407*53ee8cc1Swenshuai.xi         printf("[%s,%5d] Unknown HDMITX Pool ID\n",__func__, __LINE__);
408*53ee8cc1Swenshuai.xi         return u32Return;
409*53ee8cc1Swenshuai.xi     }
410*53ee8cc1Swenshuai.xi 
411*53ee8cc1Swenshuai.xi     void* pModule = NULL;
412*53ee8cc1Swenshuai.xi     UtopiaInstanceGetModule(pInstance, &pModule);
413*53ee8cc1Swenshuai.xi     if(UtopiaResourceObtain(pModule, psHDMITXInstPri->u32DeviceID, &pu32HDMITXRes[psHDMITXInstPri->u32DeviceID]) != UTOPIA_STATUS_SUCCESS)
414*53ee8cc1Swenshuai.xi     {
415*53ee8cc1Swenshuai.xi         printf("UtopiaResourceObtain fail\n");
416*53ee8cc1Swenshuai.xi         return UTOPIA_STATUS_ERR_RESOURCE;
417*53ee8cc1Swenshuai.xi     }
418*53ee8cc1Swenshuai.xi     u32Return = UTOPIA_STATUS_SUCCESS;
419*53ee8cc1Swenshuai.xi     return u32Return;
420*53ee8cc1Swenshuai.xi }
421*53ee8cc1Swenshuai.xi 
422*53ee8cc1Swenshuai.xi //**************************************************************************
423*53ee8cc1Swenshuai.xi //  [Function Name]:
424*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_Release_Semaphore()
425*53ee8cc1Swenshuai.xi //  [Description]:
426*53ee8cc1Swenshuai.xi //                  Release hdmi tx semaphore
427*53ee8cc1Swenshuai.xi //  [Arguments]:
428*53ee8cc1Swenshuai.xi //                  [void] *pInstances
429*53ee8cc1Swenshuai.xi //  [Return]:
430*53ee8cc1Swenshuai.xi //                  MS_U32
431*53ee8cc1Swenshuai.xi //
432*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_Release_Semaphore(void * pInstance)433*53ee8cc1Swenshuai.xi MS_U32 MDrv_HDMITx_Release_Semaphore(void *pInstance)
434*53ee8cc1Swenshuai.xi {
435*53ee8cc1Swenshuai.xi     MS_U32 u32Return = UTOPIA_STATUS_FAIL;
436*53ee8cc1Swenshuai.xi 
437*53ee8cc1Swenshuai.xi     HDMITX_INSTANCE_PRIVATE *psHDMITXInstPri = NULL;
438*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&psHDMITXInstPri);
439*53ee8cc1Swenshuai.xi     if (psHDMITXInstPri->u32DeviceID >= E_HDMITX_POOL_ID_MAX)
440*53ee8cc1Swenshuai.xi     {
441*53ee8cc1Swenshuai.xi         printf("[%s,%5d] Unknown HDMITX Pool ID\n",__func__, __LINE__);
442*53ee8cc1Swenshuai.xi         return u32Return;
443*53ee8cc1Swenshuai.xi     }
444*53ee8cc1Swenshuai.xi 
445*53ee8cc1Swenshuai.xi     u32Return = UtopiaResourceRelease(pu32HDMITXRes[psHDMITXInstPri->u32DeviceID]);
446*53ee8cc1Swenshuai.xi     return u32Return;
447*53ee8cc1Swenshuai.xi }
448*53ee8cc1Swenshuai.xi 
449*53ee8cc1Swenshuai.xi 
450*53ee8cc1Swenshuai.xi //**************************************************************************
451*53ee8cc1Swenshuai.xi //  [Function Name]:
452*53ee8cc1Swenshuai.xi //			_MDrv_HDCP_StopRiTimer()
453*53ee8cc1Swenshuai.xi //  [Description]:
454*53ee8cc1Swenshuai.xi //                  stop Ri timer
455*53ee8cc1Swenshuai.xi //  [Arguments]:
456*53ee8cc1Swenshuai.xi //                  void
457*53ee8cc1Swenshuai.xi //  [Return]:
458*53ee8cc1Swenshuai.xi //                  void
459*53ee8cc1Swenshuai.xi //
460*53ee8cc1Swenshuai.xi //**************************************************************************
_MDrv_HDCPTx_StopRiTimer(void)461*53ee8cc1Swenshuai.xi void _MDrv_HDCPTx_StopRiTimer(void)
462*53ee8cc1Swenshuai.xi {
463*53ee8cc1Swenshuai.xi     if(_s32HDCPRiTimerId > 0)
464*53ee8cc1Swenshuai.xi     {
465*53ee8cc1Swenshuai.xi         MsOS_StopTimer(_s32HDCPRiTimerId);
466*53ee8cc1Swenshuai.xi     }
467*53ee8cc1Swenshuai.xi }
468*53ee8cc1Swenshuai.xi 
469*53ee8cc1Swenshuai.xi /*********************************************************************/
470*53ee8cc1Swenshuai.xi /*                                                                                                                     */
471*53ee8cc1Swenshuai.xi /*                               Sorting HDCP Tx function here                                          */
472*53ee8cc1Swenshuai.xi /*                                                                                                                     */
473*53ee8cc1Swenshuai.xi /*********************************************************************/
____HdcpTx_Relative_Func____(void)474*53ee8cc1Swenshuai.xi void ____HdcpTx_Relative_Func____(void){} //Null function for navigation
475*53ee8cc1Swenshuai.xi 
476*53ee8cc1Swenshuai.xi /*********************************************************************/
477*53ee8cc1Swenshuai.xi /*                                                                                                                     */
478*53ee8cc1Swenshuai.xi /*                                         HDCP22 Relative                                                    */
479*53ee8cc1Swenshuai.xi /*                                                                                                                     */
480*53ee8cc1Swenshuai.xi /*********************************************************************/
MDrv_HDMITx_HDCP2AccessX74(MS_U8 u8PortIdx,MS_U8 u8OffsetAddr,MS_U8 u8OpCode,MS_U8 * pu8RdBuf,MS_U8 * pu8WRBuff,MS_U16 u16RdLen,MS_U16 u16WRLen)481*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_HDCP2AccessX74(MS_U8 u8PortIdx, MS_U8 u8OffsetAddr, MS_U8 u8OpCode, MS_U8 *pu8RdBuf, MS_U8 *pu8WRBuff, MS_U16 u16RdLen, MS_U16 u16WRLen)
482*53ee8cc1Swenshuai.xi {
483*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
484*53ee8cc1Swenshuai.xi 
485*53ee8cc1Swenshuai.xi     //printf("[HDCP2Tx]PrtIdx = %d, Offset : 0x%02X, OpCode : %d, Data Len = 0x%X\r\n", u8PortIdx, u8OffsetAddr, u8OpCode, (u8OpCode == 0x01) ? u16RdLen : u16WRLen);
486*53ee8cc1Swenshuai.xi     switch (u8OffsetAddr)
487*53ee8cc1Swenshuai.xi     {
488*53ee8cc1Swenshuai.xi         case 0x50: //HDCP2Version
489*53ee8cc1Swenshuai.xi             bRet = MHal_HDMITx_Rx74ReadByte(u8OffsetAddr, pu8RdBuf);
490*53ee8cc1Swenshuai.xi         break;
491*53ee8cc1Swenshuai.xi 
492*53ee8cc1Swenshuai.xi         case 0x60: //Write_Message
493*53ee8cc1Swenshuai.xi             bRet = MHal_HDMITx_Rx74WriteBytes(u8OffsetAddr, u16WRLen, pu8WRBuff);
494*53ee8cc1Swenshuai.xi         break;
495*53ee8cc1Swenshuai.xi 
496*53ee8cc1Swenshuai.xi         case 0x70: //RxStatus
497*53ee8cc1Swenshuai.xi             bRet = MHal_HDMITx_Rx74ReadBytes(u8OffsetAddr, (u16RdLen > 0x02) ? 0x02 : u16RdLen, pu8RdBuf);
498*53ee8cc1Swenshuai.xi         break;
499*53ee8cc1Swenshuai.xi 
500*53ee8cc1Swenshuai.xi         case 0x80:
501*53ee8cc1Swenshuai.xi             bRet = MHal_HDMITx_Rx74ReadBytes(u8OffsetAddr, u16RdLen, pu8RdBuf);
502*53ee8cc1Swenshuai.xi         break;
503*53ee8cc1Swenshuai.xi 
504*53ee8cc1Swenshuai.xi         case 0xC0:
505*53ee8cc1Swenshuai.xi             if (u8OpCode == 0x01)
506*53ee8cc1Swenshuai.xi                 bRet = MHal_HDMITx_Rx74ReadBytes(u8OffsetAddr, u16RdLen, pu8RdBuf);
507*53ee8cc1Swenshuai.xi             else
508*53ee8cc1Swenshuai.xi                 bRet = MHal_HDMITx_Rx74WriteBytes(u8OffsetAddr, u16WRLen, pu8WRBuff);
509*53ee8cc1Swenshuai.xi         break;
510*53ee8cc1Swenshuai.xi 
511*53ee8cc1Swenshuai.xi         default:
512*53ee8cc1Swenshuai.xi             if (u8OpCode == E_HDCP2_OPCODE_READ)
513*53ee8cc1Swenshuai.xi             {
514*53ee8cc1Swenshuai.xi                 bRet = MHal_HDMITx_Rx74ReadBytes(u8OffsetAddr, u16RdLen, pu8RdBuf);
515*53ee8cc1Swenshuai.xi             }
516*53ee8cc1Swenshuai.xi             else
517*53ee8cc1Swenshuai.xi             {
518*53ee8cc1Swenshuai.xi                 bRet = MHal_HDMITx_Rx74WriteBytes(u8OffsetAddr, u16WRLen, pu8WRBuff);
519*53ee8cc1Swenshuai.xi             }
520*53ee8cc1Swenshuai.xi             break;
521*53ee8cc1Swenshuai.xi     }
522*53ee8cc1Swenshuai.xi 
523*53ee8cc1Swenshuai.xi     return bRet;
524*53ee8cc1Swenshuai.xi }
525*53ee8cc1Swenshuai.xi 
MDrv_HDMITx_HDCP2TxInit(MS_U8 u8PortIdx,MS_BOOL bEnable)526*53ee8cc1Swenshuai.xi void MDrv_HDMITx_HDCP2TxInit(MS_U8 u8PortIdx, MS_BOOL bEnable)
527*53ee8cc1Swenshuai.xi {
528*53ee8cc1Swenshuai.xi     MHal_HDMITx_HDCP2TxInit(bEnable);
529*53ee8cc1Swenshuai.xi }
530*53ee8cc1Swenshuai.xi 
MDrv_HDMITx_HDCP2TxEnableEncryptEnable(MS_U8 u8PortIdx,MS_BOOL bEnable)531*53ee8cc1Swenshuai.xi void MDrv_HDMITx_HDCP2TxEnableEncryptEnable(MS_U8 u8PortIdx, MS_BOOL bEnable)
532*53ee8cc1Swenshuai.xi {
533*53ee8cc1Swenshuai.xi     MHal_HDMITx_HDCP2TxEnableEncryptEnable(bEnable);
534*53ee8cc1Swenshuai.xi }
535*53ee8cc1Swenshuai.xi 
MDrv_HDMITx_HDCP2TxFillCipherKey(MS_U8 u8PortIdx,MS_U8 * pu8Riv,MS_U8 * pu8KsXORLC128)536*53ee8cc1Swenshuai.xi void MDrv_HDMITx_HDCP2TxFillCipherKey(MS_U8 u8PortIdx, MS_U8 *pu8Riv, MS_U8 *pu8KsXORLC128)
537*53ee8cc1Swenshuai.xi {
538*53ee8cc1Swenshuai.xi     MHal_HDMITx_HDCP2TxFillCipherKey(pu8Riv, pu8KsXORLC128);
539*53ee8cc1Swenshuai.xi }
540*53ee8cc1Swenshuai.xi 
541*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
542*53ee8cc1Swenshuai.xi /// @brief This routine is to HDCP check repeater function
543*53ee8cc1Swenshuai.xi /// @return authentication status
544*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
_MDrv_HDCPTx_CheckRepeater(void)545*53ee8cc1Swenshuai.xi MsHDMITX_HDCP_AUTH_STATUS _MDrv_HDCPTx_CheckRepeater(void)
546*53ee8cc1Swenshuai.xi {
547*53ee8cc1Swenshuai.xi     MS_U16 i, j;
548*53ee8cc1Swenshuai.xi     MS_U8 count;
549*53ee8cc1Swenshuai.xi     MS_U8 testbyte[635], bstatus[2];
550*53ee8cc1Swenshuai.xi     SHA1_DATA   test_dig;
551*53ee8cc1Swenshuai.xi     MS_U8 check_error = 0;
552*53ee8cc1Swenshuai.xi     MS_U16 reg_value;
553*53ee8cc1Swenshuai.xi     MS_U8 tempV[20];
554*53ee8cc1Swenshuai.xi     MS_U32 u32DDCDelay = 0;
555*53ee8cc1Swenshuai.xi 
556*53ee8cc1Swenshuai.xi     MHal_HDMITx_HdcpSha1Init(&test_dig);
557*53ee8cc1Swenshuai.xi 
558*53ee8cc1Swenshuai.xi     DBG_HDCP(printf("Repeater is ready!!!\r\n"));
559*53ee8cc1Swenshuai.xi 
560*53ee8cc1Swenshuai.xi     // read ksv list
561*53ee8cc1Swenshuai.xi #if 0
562*53ee8cc1Swenshuai.xi     if(MHal_HDMITx_Rx74ReadByte(0x41, &count) == FALSE)
563*53ee8cc1Swenshuai.xi     {
564*53ee8cc1Swenshuai.xi         DBG_HDCP(printf("HDCP check repeater failed because I2C\r\n"));
565*53ee8cc1Swenshuai.xi         return E_HDMITX_HDCP_REPEATER_SHA1_FAIL;
566*53ee8cc1Swenshuai.xi     }
567*53ee8cc1Swenshuai.xi     count &= 0x7F;
568*53ee8cc1Swenshuai.xi #else
569*53ee8cc1Swenshuai.xi     if(MHal_HDMITx_Rx74ReadBytes(0x41, 2, bstatus) == FALSE)
570*53ee8cc1Swenshuai.xi     {
571*53ee8cc1Swenshuai.xi         DBG_HDCP(printf("HDCP check repeater failed because I2C\r\n"));
572*53ee8cc1Swenshuai.xi         return E_HDMITX_HDCP_REPEATER_SHA1_FAIL;
573*53ee8cc1Swenshuai.xi     }
574*53ee8cc1Swenshuai.xi 
575*53ee8cc1Swenshuai.xi     memcpy(g_u8Bstatus, bstatus, sizeof(bstatus));
576*53ee8cc1Swenshuai.xi 
577*53ee8cc1Swenshuai.xi     if((bstatus[0] & 0x80) || (bstatus[1] & 0x08)) // "MAX_DECS_EXCEEDED" or "MAX_CASCADE_EXCEEDED"
578*53ee8cc1Swenshuai.xi     {
579*53ee8cc1Swenshuai.xi         return E_HDMITX_HDCP_REPEATER_SHA1_FAIL;
580*53ee8cc1Swenshuai.xi     }
581*53ee8cc1Swenshuai.xi     count = bstatus[0];
582*53ee8cc1Swenshuai.xi 
583*53ee8cc1Swenshuai.xi #endif
584*53ee8cc1Swenshuai.xi 
585*53ee8cc1Swenshuai.xi     if(count)
586*53ee8cc1Swenshuai.xi     {
587*53ee8cc1Swenshuai.xi         if (count > 16)
588*53ee8cc1Swenshuai.xi         {
589*53ee8cc1Swenshuai.xi             //Store original delay count
590*53ee8cc1Swenshuai.xi             u32DDCDelay = MHal_HDMITx_GetDDCDelayCount();
591*53ee8cc1Swenshuai.xi             MHal_HDMITx_AdjustDDCFreq(100); //speed-up to 100KHz
592*53ee8cc1Swenshuai.xi         }
593*53ee8cc1Swenshuai.xi 
594*53ee8cc1Swenshuai.xi         if(MHal_HDMITx_Rx74ReadBytes(0x43, 5*count, (MS_U8 *)testbyte) == FALSE)
595*53ee8cc1Swenshuai.xi         {
596*53ee8cc1Swenshuai.xi             DBG_HDCP(printf("HDCP check repeater failed because I2C\r\n"));
597*53ee8cc1Swenshuai.xi             return E_HDMITX_HDCP_REPEATER_SHA1_FAIL;
598*53ee8cc1Swenshuai.xi         }
599*53ee8cc1Swenshuai.xi 
600*53ee8cc1Swenshuai.xi         if (count > 16)
601*53ee8cc1Swenshuai.xi         {
602*53ee8cc1Swenshuai.xi             //Set original delay count
603*53ee8cc1Swenshuai.xi             MHal_HDMITx_SetDDCDelayCount(u32DDCDelay);
604*53ee8cc1Swenshuai.xi         }
605*53ee8cc1Swenshuai.xi 
606*53ee8cc1Swenshuai.xi         memcpy(g_u8KSVList, testbyte, 5*count);
607*53ee8cc1Swenshuai.xi         g_bValidKSVList = TRUE;
608*53ee8cc1Swenshuai.xi     }
609*53ee8cc1Swenshuai.xi     DBG_HDCP(printf("KSV List:(=%d) ", count));
610*53ee8cc1Swenshuai.xi     if(count)
611*53ee8cc1Swenshuai.xi     {
612*53ee8cc1Swenshuai.xi         for (j = 0; j < 5*count; j++)
613*53ee8cc1Swenshuai.xi             DBG_HDCP(printf("0x%x, ", testbyte[j]));
614*53ee8cc1Swenshuai.xi         DBG_HDCP(printf("\r\n"));
615*53ee8cc1Swenshuai.xi         MHal_HDMITx_HdcpSha1AddData(&test_dig, testbyte, 5*count);
616*53ee8cc1Swenshuai.xi     }
617*53ee8cc1Swenshuai.xi     // read Bstatus (2 bytes)
618*53ee8cc1Swenshuai.xi     if(MHal_HDMITx_Rx74ReadBytes(0x41, 2, (MS_U8 *) testbyte) == FALSE)
619*53ee8cc1Swenshuai.xi     {
620*53ee8cc1Swenshuai.xi         DBG_HDCP(printf("HDCP check repeater failed because I2C\r\n"));
621*53ee8cc1Swenshuai.xi         return E_HDMITX_HDCP_REPEATER_SHA1_FAIL;
622*53ee8cc1Swenshuai.xi     }
623*53ee8cc1Swenshuai.xi     MHal_HDMITx_HdcpSha1AddData(&test_dig, testbyte, 2);
624*53ee8cc1Swenshuai.xi 
625*53ee8cc1Swenshuai.xi     // read M0 (8 byte)
626*53ee8cc1Swenshuai.xi     for (i = 0; i < 4; i++)
627*53ee8cc1Swenshuai.xi     {
628*53ee8cc1Swenshuai.xi         reg_value = MHal_HDMITX_GetM02Bytes(i);
629*53ee8cc1Swenshuai.xi         testbyte[2*i] = (MS_U8)(reg_value & 0x00FF);
630*53ee8cc1Swenshuai.xi         testbyte[2*i+1] = (MS_U8)((reg_value & 0xFF00) >> 8);
631*53ee8cc1Swenshuai.xi        // DBG_HDCP(printf(DBG_HDCP, "0x%x, ", testbyte[i]);
632*53ee8cc1Swenshuai.xi     }
633*53ee8cc1Swenshuai.xi 
634*53ee8cc1Swenshuai.xi     MHal_HDMITx_HdcpSha1AddData(&test_dig, testbyte, 8);
635*53ee8cc1Swenshuai.xi     MHal_HDMITx_HdcpSha1FinalDigest(&test_dig, testbyte);
636*53ee8cc1Swenshuai.xi 
637*53ee8cc1Swenshuai.xi     //print out SHA1 encode result
638*53ee8cc1Swenshuai.xi     DBG_HDCP(printf("SHA1 encode result(V)=: "));
639*53ee8cc1Swenshuai.xi     for (i = 0; i < 20; i++)
640*53ee8cc1Swenshuai.xi         DBG_HDCP(printf("0x%x, ", testbyte[i]));
641*53ee8cc1Swenshuai.xi     DBG_HDCP(printf("\r\n"));
642*53ee8cc1Swenshuai.xi 
643*53ee8cc1Swenshuai.xi     DBG_HDCP(printf("V'=: "));
644*53ee8cc1Swenshuai.xi 
645*53ee8cc1Swenshuai.xi     /*
646*53ee8cc1Swenshuai.xi      * [HDCP] 1A-01, 1B-01a: DUT kept HDCP encryption even though it did not read V' completely
647*53ee8cc1Swenshuai.xi      */
648*53ee8cc1Swenshuai.xi     if( MHal_HDMITx_Rx74ReadBytes(0x20, 20, tempV) == FALSE)
649*53ee8cc1Swenshuai.xi     {
650*53ee8cc1Swenshuai.xi         DBG_HDCP(printf("HDCP check repeater failed because I2C\r\n"));
651*53ee8cc1Swenshuai.xi         return E_HDMITX_HDCP_REPEATER_SHA1_FAIL;
652*53ee8cc1Swenshuai.xi     }
653*53ee8cc1Swenshuai.xi 
654*53ee8cc1Swenshuai.xi     for (i = 0; i < 20; i++)
655*53ee8cc1Swenshuai.xi     {
656*53ee8cc1Swenshuai.xi         DBG_HDCP(printf("0x%x, ", tempV[i]));
657*53ee8cc1Swenshuai.xi         if (tempV[i] != testbyte[i])
658*53ee8cc1Swenshuai.xi             check_error = 1;
659*53ee8cc1Swenshuai.xi     }
660*53ee8cc1Swenshuai.xi 
661*53ee8cc1Swenshuai.xi     DBG_HDCP(printf("\r\n"));
662*53ee8cc1Swenshuai.xi 
663*53ee8cc1Swenshuai.xi     return ((check_error == 0) ? E_HDMITX_HDCP_REPEATER_SHA1_PASS: E_HDMITX_HDCP_REPEATER_SHA1_FAIL);
664*53ee8cc1Swenshuai.xi }
665*53ee8cc1Swenshuai.xi 
666*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
667*53ee8cc1Swenshuai.xi /// @brief This routine is to HDCP check Ri function
668*53ee8cc1Swenshuai.xi /// @return authentication status
669*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
_MDrv_HDCPTX_AuthCheckRi(void)670*53ee8cc1Swenshuai.xi MsHDMITX_HDCP_AUTH_STATUS _MDrv_HDCPTX_AuthCheckRi(void)
671*53ee8cc1Swenshuai.xi {
672*53ee8cc1Swenshuai.xi     MS_U16 ptx_ri = 0, prx_ri = 0; // Fix coverity impact.
673*53ee8cc1Swenshuai.xi 
674*53ee8cc1Swenshuai.xi     if (MHal_HDMITx_HdcpCheckRi(&ptx_ri, &prx_ri) == TRUE)
675*53ee8cc1Swenshuai.xi     {
676*53ee8cc1Swenshuai.xi         //DBG_HDCP(printf("\nKey match: tx_ri= 0x%x, rx_ri= 0x%x\n", ptx_ri, prx_ri));
677*53ee8cc1Swenshuai.xi         return E_HDMITX_HDCP_SYNC_RI_PASS;
678*53ee8cc1Swenshuai.xi     }
679*53ee8cc1Swenshuai.xi     else
680*53ee8cc1Swenshuai.xi     {
681*53ee8cc1Swenshuai.xi         DBG_HDCP(printf("Tx_Ri=%x, Rx_Ri=%x\n", ptx_ri, prx_ri));
682*53ee8cc1Swenshuai.xi         return E_HDMITX_HDCP_SYNC_RI_FAIL;
683*53ee8cc1Swenshuai.xi     }
684*53ee8cc1Swenshuai.xi }
685*53ee8cc1Swenshuai.xi 
686*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
687*53ee8cc1Swenshuai.xi // HDCP Ri timer callback
688*53ee8cc1Swenshuai.xi // @param  stTimer \b IN: Useless
689*53ee8cc1Swenshuai.xi // @param  u32Data \b IN: Useless
690*53ee8cc1Swenshuai.xi // @return None
691*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
_MDrv_HDMITX_HDCP_Ri_TimerCallback(MS_U32 stTimer,MS_U32 u32Data)692*53ee8cc1Swenshuai.xi static void _MDrv_HDMITX_HDCP_Ri_TimerCallback(MS_U32 stTimer, MS_U32 u32Data)
693*53ee8cc1Swenshuai.xi {
694*53ee8cc1Swenshuai.xi     MsOS_SetEvent(_s32HDMITxEventId, E_HdcpTX_EVENT_RITIMER); //wilson@kano
695*53ee8cc1Swenshuai.xi }
696*53ee8cc1Swenshuai.xi 
697*53ee8cc1Swenshuai.xi /*
698*53ee8cc1Swenshuai.xi  * [HDCP] 1A and 1B: AKSV -> Ro should be large than 100msec
699*53ee8cc1Swenshuai.xi  * to pass Quantumdata 882 HDCP test, we delay 150ms
700*53ee8cc1Swenshuai.xi  *
701*53ee8cc1Swenshuai.xi  * 2013/11/07, in SEC Compatibility test, we meet an Repeater timeout error on PEPEATER YAMAHA RX-V2700
702*53ee8cc1Swenshuai.xi  * patch AKSV -> Ro large than 250ms
703*53ee8cc1Swenshuai.xi  */
MDrv_HDCPTx_SetAksv2R0Interval(MS_U32 u32Interval)704*53ee8cc1Swenshuai.xi void MDrv_HDCPTx_SetAksv2R0Interval(MS_U32 u32Interval)
705*53ee8cc1Swenshuai.xi {
706*53ee8cc1Swenshuai.xi     _u32Aksv2RoInterval = u32Interval;
707*53ee8cc1Swenshuai.xi }
708*53ee8cc1Swenshuai.xi 
709*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
710*53ee8cc1Swenshuai.xi /// @brief This routine is to HDCP waiting for the active Rx
711*53ee8cc1Swenshuai.xi /// @return authentication status
712*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
_MDrv_HDCPTx_AuthWaitingActiveRx(void)713*53ee8cc1Swenshuai.xi MsHDMITX_HDCP_AUTH_STATUS _MDrv_HDCPTx_AuthWaitingActiveRx(void)
714*53ee8cc1Swenshuai.xi {
715*53ee8cc1Swenshuai.xi     MHal_HDMITx_HdcpInit();
716*53ee8cc1Swenshuai.xi     if (!MHal_HDMITx_HdcpRxActive())
717*53ee8cc1Swenshuai.xi     {
718*53ee8cc1Swenshuai.xi         return E_HDMITX_HDCP_RX_IS_NOT_VALID; // not active
719*53ee8cc1Swenshuai.xi     }
720*53ee8cc1Swenshuai.xi 
721*53ee8cc1Swenshuai.xi     return E_HDMITX_HDCP_RX_IS_VALID; // active Rx
722*53ee8cc1Swenshuai.xi }
723*53ee8cc1Swenshuai.xi 
724*53ee8cc1Swenshuai.xi 
725*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
726*53ee8cc1Swenshuai.xi /// @brief This routine is to HDCP check whether repeater is ready or not
727*53ee8cc1Swenshuai.xi /// @return authentication status
728*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
_MDrv_HDCPTx_AuthCheckRepeaterReady(void)729*53ee8cc1Swenshuai.xi MsHDMITX_HDCP_AUTH_STATUS _MDrv_HDCPTx_AuthCheckRepeaterReady(void)
730*53ee8cc1Swenshuai.xi {
731*53ee8cc1Swenshuai.xi     MS_U8 regval;
732*53ee8cc1Swenshuai.xi 
733*53ee8cc1Swenshuai.xi     if(MHal_HDMITx_Rx74ReadByte(0x40, &regval) == TRUE)
734*53ee8cc1Swenshuai.xi     {
735*53ee8cc1Swenshuai.xi         if(regval & BIT5)
736*53ee8cc1Swenshuai.xi             return  E_HDMITX_HDCP_REPEATER_READY; // ready
737*53ee8cc1Swenshuai.xi     }
738*53ee8cc1Swenshuai.xi     return E_HDMITX_HDCP_REPEATER_NOT_READY; // not ready
739*53ee8cc1Swenshuai.xi }
740*53ee8cc1Swenshuai.xi 
741*53ee8cc1Swenshuai.xi 
742*53ee8cc1Swenshuai.xi //**************************************************************************
743*53ee8cc1Swenshuai.xi //  [Function Name]:
744*53ee8cc1Swenshuai.xi //			_MDrv_HDCP_GetTimeDiff()
745*53ee8cc1Swenshuai.xi //  [Description]:
746*53ee8cc1Swenshuai.xi //                  calculate timer difference
747*53ee8cc1Swenshuai.xi //  [Arguments]:
748*53ee8cc1Swenshuai.xi //                  [MS_U32] dwPreTime
749*53ee8cc1Swenshuai.xi //                  [MS_U32] dwPostTime
750*53ee8cc1Swenshuai.xi //  [Return]:
751*53ee8cc1Swenshuai.xi //                  MS_U32
752*53ee8cc1Swenshuai.xi //
753*53ee8cc1Swenshuai.xi //**************************************************************************
_MDrv_HDCP_GetTimeDiff(MS_U32 dwPreTime,MS_U32 dwPostTime)754*53ee8cc1Swenshuai.xi MS_U32 _MDrv_HDCP_GetTimeDiff(MS_U32 dwPreTime, MS_U32 dwPostTime)
755*53ee8cc1Swenshuai.xi {
756*53ee8cc1Swenshuai.xi 	if (dwPreTime > dwPostTime)
757*53ee8cc1Swenshuai.xi 	{
758*53ee8cc1Swenshuai.xi 		return (dwPreTime + (~dwPostTime));
759*53ee8cc1Swenshuai.xi 	}
760*53ee8cc1Swenshuai.xi 	else
761*53ee8cc1Swenshuai.xi 	{
762*53ee8cc1Swenshuai.xi 		return (dwPostTime - dwPreTime);
763*53ee8cc1Swenshuai.xi 	}
764*53ee8cc1Swenshuai.xi }
765*53ee8cc1Swenshuai.xi 
766*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
767*53ee8cc1Swenshuai.xi /// @brief This routine is to check HDCP sync setting
768*53ee8cc1Swenshuai.xi /// @return None
769*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
_MDrv_HDCPTx_HdcpSyncSetting(void * pInstance,MsHDMITX_OUTPUT_MODE tmds_mode)770*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_HDCPTx_HdcpSyncSetting(void* pInstance, MsHDMITX_OUTPUT_MODE tmds_mode)
771*53ee8cc1Swenshuai.xi {
772*53ee8cc1Swenshuai.xi     MS_U8 temp, regval = 0; // Fix coverity impact.
773*53ee8cc1Swenshuai.xi     MS_U8 tx_mode = 0;
774*53ee8cc1Swenshuai.xi     MS_BOOL tmp = 0;  // Fix coverity impact.
775*53ee8cc1Swenshuai.xi 
776*53ee8cc1Swenshuai.xi     //Check Bcaps
777*53ee8cc1Swenshuai.xi     if(MHal_HDMITx_Rx74ReadByte(0x40, &temp) == FALSE)
778*53ee8cc1Swenshuai.xi         return FALSE;
779*53ee8cc1Swenshuai.xi 
780*53ee8cc1Swenshuai.xi     // EESS/OESS, advance cipher
781*53ee8cc1Swenshuai.xi     if (tmds_mode & BIT1)
782*53ee8cc1Swenshuai.xi     {
783*53ee8cc1Swenshuai.xi         tx_mode |= BIT2;      // EESS
784*53ee8cc1Swenshuai.xi 
785*53ee8cc1Swenshuai.xi         if (temp & BIT1)
786*53ee8cc1Swenshuai.xi         {
787*53ee8cc1Swenshuai.xi             tx_mode |= BIT3;
788*53ee8cc1Swenshuai.xi             tmp = MHal_HDMITx_Rx74WriteByte(0x15, 0x02);
789*53ee8cc1Swenshuai.xi             tmp = MHal_HDMITx_Rx74ReadByte(0x15, &regval);
790*53ee8cc1Swenshuai.xi             DBG_HDCP(printf("HDMI Advanced Cipher!!! %d \r\n", regval))
791*53ee8cc1Swenshuai.xi         }
792*53ee8cc1Swenshuai.xi     }
793*53ee8cc1Swenshuai.xi     else     //DVI
794*53ee8cc1Swenshuai.xi     {
795*53ee8cc1Swenshuai.xi         if(temp & BIT1)
796*53ee8cc1Swenshuai.xi         {
797*53ee8cc1Swenshuai.xi             tx_mode  |= BIT2;
798*53ee8cc1Swenshuai.xi             tx_mode  |= BIT3;
799*53ee8cc1Swenshuai.xi             tmp = MHal_HDMITx_Rx74WriteByte(0x15,0x02);
800*53ee8cc1Swenshuai.xi             DBG_HDCP(printf("Tx select EESS and enable Advance Cipher!!\r\n"));
801*53ee8cc1Swenshuai.xi         }
802*53ee8cc1Swenshuai.xi     }
803*53ee8cc1Swenshuai.xi 
804*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
805*53ee8cc1Swenshuai.xi 
806*53ee8cc1Swenshuai.xi     // Repeater mode?
807*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdmitx_HdcpCheckRepeater_flag = FALSE;
808*53ee8cc1Swenshuai.xi     if (temp & BIT6)
809*53ee8cc1Swenshuai.xi     {
810*53ee8cc1Swenshuai.xi         tx_mode |= BIT1;
811*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHdcpTxInfo.hdmitx_HdcpCheckRepeater_flag = TRUE;
812*53ee8cc1Swenshuai.xi         DBG_HDCP(printf("Rx is a Repeater!!!\r\n"));
813*53ee8cc1Swenshuai.xi     }
814*53ee8cc1Swenshuai.xi     MHal_HDMITX_SetHDCPConfig(tx_mode);
815*53ee8cc1Swenshuai.xi     tmp = TRUE;
816*53ee8cc1Swenshuai.xi     return tmp;
817*53ee8cc1Swenshuai.xi }
818*53ee8cc1Swenshuai.xi 
819*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
820*53ee8cc1Swenshuai.xi /// @brief This routine set HDMI Tx initial situation.
821*53ee8cc1Swenshuai.xi /// @return None
822*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDCPTx_InitVariable(void * pInstance)823*53ee8cc1Swenshuai.xi void MDrv_HDCPTx_InitVariable(void *pInstance)
824*53ee8cc1Swenshuai.xi {
825*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
826*53ee8cc1Swenshuai.xi 
827*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdcp_Rx_valid = FALSE;
828*53ee8cc1Swenshuai.xi 
829*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A0;
830*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_IDLE;
831*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdcp14tx_PreSubState = HDCP14Tx_SubFSM_IDLE;
832*53ee8cc1Swenshuai.xi 
833*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdmitx_HdcpUseInternalKey_flag = TRUE;
834*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdmitx_HdcpStartAuth_flag = FALSE;
835*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdmitx_HdcpAuthDone_flag = FALSE;
836*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdmitx_HdcpCheckRepeater_flag = FALSE;
837*53ee8cc1Swenshuai.xi 
838*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPAuth_Status = E_HDMITX_HDCP_RESET;
839*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdmitx_unHDCPRx_Control = E_NORMAL_OUTPUT;
840*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPRxFail_Control = E_RXFail_NORMAL_OUTPUT;
841*53ee8cc1Swenshuai.xi 
842*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.revocationlist_ready = FALSE;
843*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.revocation_size = 0;
844*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.revocation_state = E_CHECK_NOT_READY;
845*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.HDCP_74_check = FALSE;
846*53ee8cc1Swenshuai.xi 
847*53ee8cc1Swenshuai.xi     // HDCP init
848*53ee8cc1Swenshuai.xi     MHal_HDMITx_HdcpDebugEnable(_u16DbgHDMITXSwitch & HDMITX_DBG_HDCP ? TRUE : FALSE);
849*53ee8cc1Swenshuai.xi 
850*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHdcpTxInfo.hdmitx_HdcpUseInternalKey_flag == TRUE)
851*53ee8cc1Swenshuai.xi     {
852*53ee8cc1Swenshuai.xi         MHal_HDMITx_HdcpKeyInit(USE_INTERNAL_HDCP_KEY);
853*53ee8cc1Swenshuai.xi     }
854*53ee8cc1Swenshuai.xi 
855*53ee8cc1Swenshuai.xi     memset(g_u8Bstatus, 0x00, sizeof(g_u8Bstatus));
856*53ee8cc1Swenshuai.xi     memset(g_u8KSVList, 0x00, sizeof(g_u8KSVList));
857*53ee8cc1Swenshuai.xi     g_bValidKSVList = FALSE;
858*53ee8cc1Swenshuai.xi 
859*53ee8cc1Swenshuai.xi }
860*53ee8cc1Swenshuai.xi 
861*53ee8cc1Swenshuai.xi 
862*53ee8cc1Swenshuai.xi //**************************************************************************
863*53ee8cc1Swenshuai.xi //  [Function Name]:
864*53ee8cc1Swenshuai.xi //			MDrv_HDCPTx_SetAuthStartFlag()
865*53ee8cc1Swenshuai.xi //  [Description]:
866*53ee8cc1Swenshuai.xi //                  Set hdcp14 Authentication Start flag
867*53ee8cc1Swenshuai.xi //  [Arguments]:
868*53ee8cc1Swenshuai.xi //                  [MS_BOOL] bFlag
869*53ee8cc1Swenshuai.xi //  [Return]:
870*53ee8cc1Swenshuai.xi //                  void
871*53ee8cc1Swenshuai.xi //
872*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDCPTx_SetAuthStartFlag(void * pInstance,MS_BOOL bFlag)873*53ee8cc1Swenshuai.xi void MDrv_HDCPTx_SetAuthStartFlag(void* pInstance, MS_BOOL bFlag)
874*53ee8cc1Swenshuai.xi {
875*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
876*53ee8cc1Swenshuai.xi 
877*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdmitx_HdcpStartAuth_flag = bFlag;
878*53ee8cc1Swenshuai.xi }
879*53ee8cc1Swenshuai.xi 
880*53ee8cc1Swenshuai.xi //**************************************************************************
881*53ee8cc1Swenshuai.xi //  [Function Name]:
882*53ee8cc1Swenshuai.xi //			MDrv_HDCPTx_SetAuthDoneFlag()
883*53ee8cc1Swenshuai.xi //  [Description]:
884*53ee8cc1Swenshuai.xi //                  Set HDCP14 Authentication done flag
885*53ee8cc1Swenshuai.xi //  [Arguments]:
886*53ee8cc1Swenshuai.xi //                  [MS_BOOL] bFlag
887*53ee8cc1Swenshuai.xi //  [Return]:
888*53ee8cc1Swenshuai.xi //                  void
889*53ee8cc1Swenshuai.xi //
890*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDCPTx_SetAuthDoneFlag(void * pInstance,MS_BOOL bFlag)891*53ee8cc1Swenshuai.xi void MDrv_HDCPTx_SetAuthDoneFlag(void* pInstance, MS_BOOL bFlag)
892*53ee8cc1Swenshuai.xi {
893*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
894*53ee8cc1Swenshuai.xi 
895*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdmitx_HdcpAuthDone_flag = bFlag;
896*53ee8cc1Swenshuai.xi }
897*53ee8cc1Swenshuai.xi 
898*53ee8cc1Swenshuai.xi //**************************************************************************
899*53ee8cc1Swenshuai.xi //  [Function Name]:
900*53ee8cc1Swenshuai.xi //                      MDrv_HDCPTx_SetRxValid()
901*53ee8cc1Swenshuai.xi //  [Description]:
902*53ee8cc1Swenshuai.xi //                      Set Rx status
903*53ee8cc1Swenshuai.xi //  [Arguments]:
904*53ee8cc1Swenshuai.xi //                      [MS_BOOL] bIsRxValid
905*53ee8cc1Swenshuai.xi //  [Return]:
906*53ee8cc1Swenshuai.xi //                      void
907*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDCPTx_SetRxValid(void * pInstance,MS_BOOL bIsRxValid)908*53ee8cc1Swenshuai.xi void MDrv_HDCPTx_SetRxValid(void* pInstance, MS_BOOL bIsRxValid) //wilson@kano
909*53ee8cc1Swenshuai.xi {
910*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
911*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdcp_Rx_valid = bIsRxValid;
912*53ee8cc1Swenshuai.xi }
913*53ee8cc1Swenshuai.xi 
914*53ee8cc1Swenshuai.xi //**************************************************************************
915*53ee8cc1Swenshuai.xi //  [Function Name]:
916*53ee8cc1Swenshuai.xi //                      MDrv_HDCPTx_SetFSMState()
917*53ee8cc1Swenshuai.xi //  [Description]:
918*53ee8cc1Swenshuai.xi //                      Set hdcp14 FSM state
919*53ee8cc1Swenshuai.xi //  [Arguments]:
920*53ee8cc1Swenshuai.xi //                      [enHDCP14Tx_MainStates] enMainState
921*53ee8cc1Swenshuai.xi //                      [enHDCP14Tx_SubStates] enSubState
922*53ee8cc1Swenshuai.xi //  [Return]:
923*53ee8cc1Swenshuai.xi //                      void
924*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDCPTx_SetFSMState(void * pInstance,enHDCP14Tx_MainStates enMainState,enHDCP14Tx_SubStates enSubState)925*53ee8cc1Swenshuai.xi void MDrv_HDCPTx_SetFSMState(void* pInstance, enHDCP14Tx_MainStates enMainState, enHDCP14Tx_SubStates enSubState) //wilson@kano
926*53ee8cc1Swenshuai.xi {
927*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
928*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = enMainState;
929*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = enSubState;
930*53ee8cc1Swenshuai.xi }
931*53ee8cc1Swenshuai.xi 
932*53ee8cc1Swenshuai.xi //**************************************************************************
933*53ee8cc1Swenshuai.xi //  [Function Name]:
934*53ee8cc1Swenshuai.xi //			MDrv_HDCPTx_SetUnHDCPRxCtrl()
935*53ee8cc1Swenshuai.xi //  [Description]:
936*53ee8cc1Swenshuai.xi //                  set signal control mode when hdcp function is not enabled
937*53ee8cc1Swenshuai.xi //  [Arguments]:
938*53ee8cc1Swenshuai.xi //                  [MDrvHDMITX_UNHDCPRX_CONTROL] enUnHDCPCtrl
939*53ee8cc1Swenshuai.xi //  [Return]:
940*53ee8cc1Swenshuai.xi //                  void
941*53ee8cc1Swenshuai.xi //
942*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDCPTx_SetUnHDCPRxCtrl(void * pInstance,MDrvHDMITX_UNHDCPRX_CONTROL enUnHDCPCtrl)943*53ee8cc1Swenshuai.xi void MDrv_HDCPTx_SetUnHDCPRxCtrl(void* pInstance, MDrvHDMITX_UNHDCPRX_CONTROL enUnHDCPCtrl)
944*53ee8cc1Swenshuai.xi {
945*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
946*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdmitx_unHDCPRx_Control = enUnHDCPCtrl;
947*53ee8cc1Swenshuai.xi }
948*53ee8cc1Swenshuai.xi 
949*53ee8cc1Swenshuai.xi //**************************************************************************
950*53ee8cc1Swenshuai.xi //  [Function Name]:
951*53ee8cc1Swenshuai.xi //			MDrv_HDCPTx_SetHDCPRxFailCtrl()
952*53ee8cc1Swenshuai.xi //  [Description]:
953*53ee8cc1Swenshuai.xi //                  set signal control mode when hdcp function is failed
954*53ee8cc1Swenshuai.xi //  [Arguments]:
955*53ee8cc1Swenshuai.xi //                  [MDrvHDMITX_UNHDCPRX_CONTROL] enUnHDCPCtrl
956*53ee8cc1Swenshuai.xi //  [Return]:
957*53ee8cc1Swenshuai.xi //                  void
958*53ee8cc1Swenshuai.xi //
959*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDCPTx_SetHDCPRxFailCtrl(void * pInstance,MDrvHDMITX_UNHDCPRX_CONTROL enUnHDCPCtrl)960*53ee8cc1Swenshuai.xi void MDrv_HDCPTx_SetHDCPRxFailCtrl(void* pInstance, MDrvHDMITX_UNHDCPRX_CONTROL enUnHDCPCtrl)
961*53ee8cc1Swenshuai.xi {
962*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
963*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPRxFail_Control = enUnHDCPCtrl;
964*53ee8cc1Swenshuai.xi }
965*53ee8cc1Swenshuai.xi 
966*53ee8cc1Swenshuai.xi //**************************************************************************
967*53ee8cc1Swenshuai.xi //  [Function Name]:
968*53ee8cc1Swenshuai.xi //			MDrv_HDCPTx_GetAuthStartFlag()
969*53ee8cc1Swenshuai.xi //  [Description]:
970*53ee8cc1Swenshuai.xi //                  Get hdcp14 Authentication Start flag
971*53ee8cc1Swenshuai.xi //  [Arguments]:
972*53ee8cc1Swenshuai.xi //                  void
973*53ee8cc1Swenshuai.xi //  [Return]:
974*53ee8cc1Swenshuai.xi //                  [MS_BOOL]
975*53ee8cc1Swenshuai.xi //
976*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDCPTx_GetAuthStartFlag(void * pInstance)977*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDCPTx_GetAuthStartFlag(void* pInstance) //wilson@kano
978*53ee8cc1Swenshuai.xi {
979*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
980*53ee8cc1Swenshuai.xi     return psHDMITXResPri->stHdcpTxInfo.hdmitx_HdcpStartAuth_flag;
981*53ee8cc1Swenshuai.xi }
982*53ee8cc1Swenshuai.xi 
983*53ee8cc1Swenshuai.xi //**************************************************************************
984*53ee8cc1Swenshuai.xi //  [Function Name]:
985*53ee8cc1Swenshuai.xi //			MDrv_HDCPTx_GetAuthDoneFlag()
986*53ee8cc1Swenshuai.xi //  [Description]:
987*53ee8cc1Swenshuai.xi //                  Get HDCP14 Authentication done flag
988*53ee8cc1Swenshuai.xi //  [Arguments]:
989*53ee8cc1Swenshuai.xi //                  void
990*53ee8cc1Swenshuai.xi //  [Return]:
991*53ee8cc1Swenshuai.xi //                  [MS_BOOL]
992*53ee8cc1Swenshuai.xi //
993*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDCPTx_GetAuthDoneFlag(void * pInstance)994*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDCPTx_GetAuthDoneFlag(void* pInstance) //wilson@kano
995*53ee8cc1Swenshuai.xi {
996*53ee8cc1Swenshuai.xi     extern MS_BOOL MDrv_HDMITx_GetHdcpEnFlag(void*);
997*53ee8cc1Swenshuai.xi     extern MDrvHDMITX_FSM_STATE MDrv_HDMITx_GetFSMState(void*);
998*53ee8cc1Swenshuai.xi 
999*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
1000*53ee8cc1Swenshuai.xi 
1001*53ee8cc1Swenshuai.xi     if (MDrv_HDMITx_GetHdcpEnFlag(pInstance) == TRUE)
1002*53ee8cc1Swenshuai.xi         return psHDMITXResPri->stHdcpTxInfo.hdmitx_HdcpAuthDone_flag;
1003*53ee8cc1Swenshuai.xi     else
1004*53ee8cc1Swenshuai.xi         return (E_HDMITX_FSM_DONE == MDrv_HDMITx_GetFSMState(pInstance))? TRUE : FALSE;
1005*53ee8cc1Swenshuai.xi }
1006*53ee8cc1Swenshuai.xi 
1007*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1008*53ee8cc1Swenshuai.xi /// @brief This routine get HDCP key
1009*53ee8cc1Swenshuai.xi /// @param[in] useinternalkey: TRUE -> from internal, FALSE -> from external, like SPI flash
1010*53ee8cc1Swenshuai.xi /// @param[in] data: data point
1011*53ee8cc1Swenshuai.xi /// @return None
1012*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDCPTx_GetHdcpKey(void * pInstance,MS_BOOL useinternalkey,MS_U8 * data)1013*53ee8cc1Swenshuai.xi void MDrv_HDCPTx_GetHdcpKey(void* pInstance, MS_BOOL useinternalkey, MS_U8 *data)
1014*53ee8cc1Swenshuai.xi {
1015*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
1016*53ee8cc1Swenshuai.xi 
1017*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.hdmitx_HdcpUseInternalKey_flag = useinternalkey;
1018*53ee8cc1Swenshuai.xi     MHal_HDMITx_GetHdcpKey(useinternalkey, data);
1019*53ee8cc1Swenshuai.xi }
1020*53ee8cc1Swenshuai.xi 
1021*53ee8cc1Swenshuai.xi //**************************************************************************
1022*53ee8cc1Swenshuai.xi //  [Function Name]:
1023*53ee8cc1Swenshuai.xi //			    MDrv_HDMITx_GetBksv()
1024*53ee8cc1Swenshuai.xi //  [Description]:
1025*53ee8cc1Swenshuai.xi //                      fetch BKsv
1026*53ee8cc1Swenshuai.xi //  [Arguments]:
1027*53ee8cc1Swenshuai.xi //			    [MS_U8] *pucData
1028*53ee8cc1Swenshuai.xi //  [Return]:
1029*53ee8cc1Swenshuai.xi //			    MS_BOOL
1030*53ee8cc1Swenshuai.xi //
1031*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDCPTx_GetBksv(void * pInstance,MS_U8 * pucData)1032*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDCPTx_GetBksv(void* pInstance, MS_U8 *pucData)
1033*53ee8cc1Swenshuai.xi {
1034*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
1035*53ee8cc1Swenshuai.xi 
1036*53ee8cc1Swenshuai.xi     memcpy(pucData, &psHDMITXResPri->stHdcpTxInfo.HDCP_BKSV, 5*sizeof(MS_U8));
1037*53ee8cc1Swenshuai.xi 
1038*53ee8cc1Swenshuai.xi 	return psHDMITXResPri->stHdcpTxInfo.HDCP_74_check;
1039*53ee8cc1Swenshuai.xi }
1040*53ee8cc1Swenshuai.xi 
1041*53ee8cc1Swenshuai.xi //**************************************************************************
1042*53ee8cc1Swenshuai.xi //  [Function Name]:
1043*53ee8cc1Swenshuai.xi //			    MDrv_HDMITx_GetAksv()
1044*53ee8cc1Swenshuai.xi //  [Description]:
1045*53ee8cc1Swenshuai.xi //                      fetch AKsv
1046*53ee8cc1Swenshuai.xi //  [Arguments]:
1047*53ee8cc1Swenshuai.xi //			    [MS_U8] *pucData
1048*53ee8cc1Swenshuai.xi //  [Return]:
1049*53ee8cc1Swenshuai.xi //			    MS_BOOL
1050*53ee8cc1Swenshuai.xi //
1051*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDCPTx_GetAksv(void * pInstance,MS_U8 * pucData)1052*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDCPTx_GetAksv(void* pInstance, MS_U8 *pucData)
1053*53ee8cc1Swenshuai.xi {
1054*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
1055*53ee8cc1Swenshuai.xi 
1056*53ee8cc1Swenshuai.xi     memcpy(pucData, &psHDMITXResPri->stHdcpTxInfo.HDCP_AKSV, 5*sizeof(MS_U8));
1057*53ee8cc1Swenshuai.xi 
1058*53ee8cc1Swenshuai.xi 	return psHDMITXResPri->stHdcpTxInfo.HDCP_74_check;
1059*53ee8cc1Swenshuai.xi }
1060*53ee8cc1Swenshuai.xi 
1061*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1062*53ee8cc1Swenshuai.xi /// @brief This routine update revocation list
1063*53ee8cc1Swenshuai.xi /// @argument:
1064*53ee8cc1Swenshuai.xi ///              - *data: data point
1065*53ee8cc1Swenshuai.xi ///              -  size: amount of revoked key (size 1 = 1*5 bytes, size 2= 2*5 bytes)
1066*53ee8cc1Swenshuai.xi /// @return:
1067*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDCPTx_GetRevocationKeyList(void * pInstance,MS_U8 * data,MS_U16 size)1068*53ee8cc1Swenshuai.xi void MDrv_HDCPTx_GetRevocationKeyList(void* pInstance, MS_U8 *data, MS_U16 size)
1069*53ee8cc1Swenshuai.xi {
1070*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
1071*53ee8cc1Swenshuai.xi 
1072*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.revocation_size= size;
1073*53ee8cc1Swenshuai.xi     memcpy(&psHDMITXResPri->stHdcpTxInfo.hdcp_revocationlist[0], data, 5*size);
1074*53ee8cc1Swenshuai.xi }
1075*53ee8cc1Swenshuai.xi 
1076*53ee8cc1Swenshuai.xi //**************************************************************************
1077*53ee8cc1Swenshuai.xi //  [Function Name]:
1078*53ee8cc1Swenshuai.xi //			    MDrv_HDCPTx_GetPreState()
1079*53ee8cc1Swenshuai.xi //  [Description]:
1080*53ee8cc1Swenshuai.xi //                      return previous state of hdcp14 handler
1081*53ee8cc1Swenshuai.xi //  [Arguments]:
1082*53ee8cc1Swenshuai.xi //			    void
1083*53ee8cc1Swenshuai.xi //  [Return]:
1084*53ee8cc1Swenshuai.xi //			    enHDCP14Tx_SubStates
1085*53ee8cc1Swenshuai.xi //
1086*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDCPTx_GetPreState(void * pInstance)1087*53ee8cc1Swenshuai.xi enHDCP14Tx_SubStates MDrv_HDCPTx_GetPreState(void* pInstance)
1088*53ee8cc1Swenshuai.xi {
1089*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
1090*53ee8cc1Swenshuai.xi 
1091*53ee8cc1Swenshuai.xi     return psHDMITXResPri->stHdcpTxInfo.hdcp14tx_PreSubState;
1092*53ee8cc1Swenshuai.xi }
1093*53ee8cc1Swenshuai.xi 
1094*53ee8cc1Swenshuai.xi //**************************************************************************
1095*53ee8cc1Swenshuai.xi //  [Function Name]:
1096*53ee8cc1Swenshuai.xi //                      MDrv_HDCPTx_GetRxValid()
1097*53ee8cc1Swenshuai.xi //  [Description]:
1098*53ee8cc1Swenshuai.xi //                      Get Rx status
1099*53ee8cc1Swenshuai.xi //  [Arguments]:
1100*53ee8cc1Swenshuai.xi //                      void
1101*53ee8cc1Swenshuai.xi //  [Return]:
1102*53ee8cc1Swenshuai.xi //                      MS_BOOL
1103*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDCPTx_GetRxValid(void * pInstance)1104*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDCPTx_GetRxValid(void* pInstance) //wilson@kano
1105*53ee8cc1Swenshuai.xi {
1106*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
1107*53ee8cc1Swenshuai.xi 
1108*53ee8cc1Swenshuai.xi     return psHDMITXResPri->stHdcpTxInfo.hdcp_Rx_valid;
1109*53ee8cc1Swenshuai.xi }
1110*53ee8cc1Swenshuai.xi 
1111*53ee8cc1Swenshuai.xi //**************************************************************************
1112*53ee8cc1Swenshuai.xi //  [Function Name]:
1113*53ee8cc1Swenshuai.xi //                      MDrv_HDCPTx_GetUnHdcpControl()
1114*53ee8cc1Swenshuai.xi //  [Description]:
1115*53ee8cc1Swenshuai.xi //                      Get Un-Hdcp control value
1116*53ee8cc1Swenshuai.xi //  [Arguments]:
1117*53ee8cc1Swenshuai.xi //                      void
1118*53ee8cc1Swenshuai.xi //  [Return]:
1119*53ee8cc1Swenshuai.xi //                      MDrvHDMITX_UNHDCPRX_CONTROL
1120*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDCPTx_GetUnHdcpControl(void * pInstance)1121*53ee8cc1Swenshuai.xi MDrvHDMITX_UNHDCPRX_CONTROL MDrv_HDCPTx_GetUnHdcpControl(void* pInstance)
1122*53ee8cc1Swenshuai.xi {
1123*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
1124*53ee8cc1Swenshuai.xi 
1125*53ee8cc1Swenshuai.xi     return psHDMITXResPri->stHdcpTxInfo.hdmitx_unHDCPRx_Control;
1126*53ee8cc1Swenshuai.xi }
1127*53ee8cc1Swenshuai.xi 
1128*53ee8cc1Swenshuai.xi //**************************************************************************
1129*53ee8cc1Swenshuai.xi //  [Function Name]:
1130*53ee8cc1Swenshuai.xi //			    MDrv_HDCPTx_GetKSVList()
1131*53ee8cc1Swenshuai.xi //  [Description]:
1132*53ee8cc1Swenshuai.xi //                      get BStatus, KSVList content for Repeater Mode
1133*53ee8cc1Swenshuai.xi //  [Arguments]:
1134*53ee8cc1Swenshuai.xi //                      [MS_U8*] pu8Bstatus;
1135*53ee8cc1Swenshuai.xi //                      [MS_U8*] pu8KSVList;
1136*53ee8cc1Swenshuai.xi //                      [MS_U16*] pu16KSVLength;
1137*53ee8cc1Swenshuai.xi //  [Return]:
1138*53ee8cc1Swenshuai.xi //			    MS_BOOL
1139*53ee8cc1Swenshuai.xi //
1140*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDCPTx_GetKSVList(MS_U8 * pu8Bstatus,MS_U8 * pu8KSVList,MS_U16 u16BufLen,MS_U16 * pu16KSVLength)1141*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDCPTx_GetKSVList(MS_U8 *pu8Bstatus, MS_U8* pu8KSVList, MS_U16 u16BufLen, MS_U16 *pu16KSVLength)
1142*53ee8cc1Swenshuai.xi {
1143*53ee8cc1Swenshuai.xi     if (g_bValidKSVList == TRUE)
1144*53ee8cc1Swenshuai.xi     {
1145*53ee8cc1Swenshuai.xi         if ((pu8Bstatus != NULL) && (pu8KSVList != NULL) && (pu16KSVLength != NULL))
1146*53ee8cc1Swenshuai.xi         {
1147*53ee8cc1Swenshuai.xi             MS_U16 u16TmpLen = 0x00;
1148*53ee8cc1Swenshuai.xi 
1149*53ee8cc1Swenshuai.xi             u16TmpLen = (u16BufLen > g_u8Bstatus[0]) ? g_u8Bstatus[0] : u16BufLen;
1150*53ee8cc1Swenshuai.xi             memcpy(pu8Bstatus, g_u8Bstatus, sizeof(g_u8Bstatus));
1151*53ee8cc1Swenshuai.xi             memcpy(pu8KSVList, g_u8KSVList, u16TmpLen);
1152*53ee8cc1Swenshuai.xi             *pu16KSVLength = g_u8Bstatus[0];
1153*53ee8cc1Swenshuai.xi         }
1154*53ee8cc1Swenshuai.xi     }
1155*53ee8cc1Swenshuai.xi 
1156*53ee8cc1Swenshuai.xi     return g_bValidKSVList;
1157*53ee8cc1Swenshuai.xi }
1158*53ee8cc1Swenshuai.xi 
1159*53ee8cc1Swenshuai.xi //**************************************************************************
1160*53ee8cc1Swenshuai.xi //  [Function Name]:
1161*53ee8cc1Swenshuai.xi //			    MDrv_HDCPTx_CheckAuthFailFlag()
1162*53ee8cc1Swenshuai.xi //  [Description]:
1163*53ee8cc1Swenshuai.xi //                      return TRUE if hdcp14 authentication failed
1164*53ee8cc1Swenshuai.xi //  [Arguments]:
1165*53ee8cc1Swenshuai.xi //			    void
1166*53ee8cc1Swenshuai.xi //  [Return]:
1167*53ee8cc1Swenshuai.xi //			    MS_BOOL
1168*53ee8cc1Swenshuai.xi //
1169*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDCPTx_CheckAuthFailFlag(void * pInstance)1170*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDCPTx_CheckAuthFailFlag(void* pInstance)
1171*53ee8cc1Swenshuai.xi {
1172*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
1173*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState == HDCP14Tx_SubFSM_AuthFail)
1174*53ee8cc1Swenshuai.xi         return TRUE;
1175*53ee8cc1Swenshuai.xi     else
1176*53ee8cc1Swenshuai.xi         return FALSE;
1177*53ee8cc1Swenshuai.xi }
1178*53ee8cc1Swenshuai.xi 
1179*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1180*53ee8cc1Swenshuai.xi /// @brief This function return revocation check result
1181*53ee8cc1Swenshuai.xi /// @argument:
1182*53ee8cc1Swenshuai.xi /// @return:
1183*53ee8cc1Swenshuai.xi ///              - E_CHECK_NOT_READY
1184*53ee8cc1Swenshuai.xi ///              - E_CHECK_REVOKED
1185*53ee8cc1Swenshuai.xi ///              - E_CHECL_NOT_REVOKED
1186*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDCPTx_RevocationKey_Check(void * pInstance)1187*53ee8cc1Swenshuai.xi MDrvHDMITX_REVOCATION_STATE MDrv_HDCPTx_RevocationKey_Check(void* pInstance)
1188*53ee8cc1Swenshuai.xi {
1189*53ee8cc1Swenshuai.xi     MDrvHDMITX_REVOCATION_STATE stRet;
1190*53ee8cc1Swenshuai.xi 
1191*53ee8cc1Swenshuai.xi     _HDMITX_SEMAPHORE_ENTRY(pInstance);
1192*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
1193*53ee8cc1Swenshuai.xi 
1194*53ee8cc1Swenshuai.xi     stRet = psHDMITXResPri->stHdcpTxInfo.revocation_state;
1195*53ee8cc1Swenshuai.xi 
1196*53ee8cc1Swenshuai.xi     _HDMITX_SEMAPHORE_RETURN(pInstance);
1197*53ee8cc1Swenshuai.xi 
1198*53ee8cc1Swenshuai.xi     return stRet;
1199*53ee8cc1Swenshuai.xi }
1200*53ee8cc1Swenshuai.xi 
1201*53ee8cc1Swenshuai.xi //  *** Sample empty SRM ***
1202*53ee8cc1Swenshuai.xi //  0x80 0x00                                             // SRM ID and reserved bit-field
1203*53ee8cc1Swenshuai.xi //  0x00 0x01                                             // SRM version 0001
1204*53ee8cc1Swenshuai.xi //  0x00                                                     // SRM generator no
1205*53ee8cc1Swenshuai.xi //  0x00 0x00 0x2B                                     // VRL length (in bytes) 40+3 bytes.
1206*53ee8cc1Swenshuai.xi //  0xD2 0x48 0x9E 0x49 0xD0 0x57 0xAE 0x31 0x5B 0x1A 0xBC 0xE0 0x0E 0x4F 0x6B 0x92    // DCP LLC signature
1207*53ee8cc1Swenshuai.xi //  0xA6 0xBA 0x03 0x3B 0x98 0xCC 0xED 0x4A 0x97 0x8F 0x5D 0xD2 0x27 0x29 0x25 0x19
1208*53ee8cc1Swenshuai.xi //  0xA5 0xD5 0xF0 0x5D 0x5E 0x56 0x3D 0x0E
MDrv_HDCPTx_CheckRevokedKey(void * pInstance)1209*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDCPTx_CheckRevokedKey(void* pInstance)
1210*53ee8cc1Swenshuai.xi {
1211*53ee8cc1Swenshuai.xi #if 1
1212*53ee8cc1Swenshuai.xi     MS_U16 i;
1213*53ee8cc1Swenshuai.xi     MS_U8 j, u8bksv[5];
1214*53ee8cc1Swenshuai.xi     //MS_U32 u32keylen;
1215*53ee8cc1Swenshuai.xi     // The revoked key from QD882: Bksv=0x23, 0xde, 0x5c, 0x43, 0x93
1216*53ee8cc1Swenshuai.xi     MS_U8 u8Revokedksv[5] = {0x23, 0xDE, 0x5C, 0x43, 0x93};
1217*53ee8cc1Swenshuai.xi 
1218*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
1219*53ee8cc1Swenshuai.xi 
1220*53ee8cc1Swenshuai.xi     if (!MHal_HDMITx_HDCP_Get_BKSV(&u8bksv[0]))
1221*53ee8cc1Swenshuai.xi     {
1222*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHdcpTxInfo.revocation_state = E_CHECK_NOT_READY;
1223*53ee8cc1Swenshuai.xi         return FALSE;
1224*53ee8cc1Swenshuai.xi     }
1225*53ee8cc1Swenshuai.xi     //if(gHDMITxInfo.hdcp_srmlist[0] != 0x80) // no SRM list
1226*53ee8cc1Swenshuai.xi     if (!psHDMITXResPri->stHdcpTxInfo.revocationlist_ready)
1227*53ee8cc1Swenshuai.xi 	{
1228*53ee8cc1Swenshuai.xi     // HDCP CTS 1A-08
1229*53ee8cc1Swenshuai.xi         for(i=0;i<5;i++)
1230*53ee8cc1Swenshuai.xi         {
1231*53ee8cc1Swenshuai.xi             if(u8bksv[i] != u8Revokedksv[i])
1232*53ee8cc1Swenshuai.xi             {
1233*53ee8cc1Swenshuai.xi                 psHDMITXResPri->stHdcpTxInfo.revocation_state = E_CHECK_NOT_REVOKED;
1234*53ee8cc1Swenshuai.xi                 return FALSE;
1235*53ee8cc1Swenshuai.xi             }
1236*53ee8cc1Swenshuai.xi         }
1237*53ee8cc1Swenshuai.xi         DBG_HDCP(printf("MDrv_HDMITx_HDCP_CheckRevokedKey: Revoked Rx key!!\n"));
1238*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHdcpTxInfo.revocation_state = E_CHECK_REVOKED;
1239*53ee8cc1Swenshuai.xi         return TRUE;
1240*53ee8cc1Swenshuai.xi     }
1241*53ee8cc1Swenshuai.xi     else
1242*53ee8cc1Swenshuai.xi     {
1243*53ee8cc1Swenshuai.xi         // revoked key length
1244*53ee8cc1Swenshuai.xi         //u32keylen = (gHDMITxInfo.hdcp_srmlist[5]<<16) | (gHDMITxInfo.hdcp_srmlist[6]<<8) | gHDMITxInfo.hdcp_srmlist[7];
1245*53ee8cc1Swenshuai.xi         //u32keylen = (u32keylen >= 43) ? u32keylen-43 : 0; // 3 bytes is VRL length and 40 bytes is DCP LLC signature
1246*53ee8cc1Swenshuai.xi         //if((u32keylen == 0) || (u32keylen%5 != 0)) // keylen is 0 or not 5 times
1247*53ee8cc1Swenshuai.xi         if (psHDMITXResPri->stHdcpTxInfo.revocation_size == 0) // keylen is 0 or not 5 times
1248*53ee8cc1Swenshuai.xi         {
1249*53ee8cc1Swenshuai.xi             psHDMITXResPri->stHdcpTxInfo.revocation_state = E_CHECK_NOT_REVOKED;
1250*53ee8cc1Swenshuai.xi             return FALSE;
1251*53ee8cc1Swenshuai.xi         }
1252*53ee8cc1Swenshuai.xi         else
1253*53ee8cc1Swenshuai.xi         {
1254*53ee8cc1Swenshuai.xi             for(i=0 ; i<psHDMITXResPri->stHdcpTxInfo.revocation_size ; i++)
1255*53ee8cc1Swenshuai.xi             {
1256*53ee8cc1Swenshuai.xi                 for(j=0 ; j<5 ; j++)
1257*53ee8cc1Swenshuai.xi                 {
1258*53ee8cc1Swenshuai.xi                     if(psHDMITXResPri->stHdcpTxInfo.hdcp_revocationlist[5*i+j] != u8bksv[j])
1259*53ee8cc1Swenshuai.xi                     break;
1260*53ee8cc1Swenshuai.xi                 }
1261*53ee8cc1Swenshuai.xi                 if(j==5) // Bksv is matched the SRM revoked keys
1262*53ee8cc1Swenshuai.xi                 {
1263*53ee8cc1Swenshuai.xi                     psHDMITXResPri->stHdcpTxInfo.revocation_state = E_CHECK_REVOKED;
1264*53ee8cc1Swenshuai.xi                     return TRUE;
1265*53ee8cc1Swenshuai.xi                 }
1266*53ee8cc1Swenshuai.xi             }
1267*53ee8cc1Swenshuai.xi         }
1268*53ee8cc1Swenshuai.xi     }
1269*53ee8cc1Swenshuai.xi #endif
1270*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHdcpTxInfo.revocation_state = E_CHECK_NOT_REVOKED;
1271*53ee8cc1Swenshuai.xi     return FALSE;
1272*53ee8cc1Swenshuai.xi }
1273*53ee8cc1Swenshuai.xi 
1274*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1275*53ee8cc1Swenshuai.xi /// @brief This routine check whether SRM DSA signauter is valid or not
1276*53ee8cc1Swenshuai.xi /// @argument:
1277*53ee8cc1Swenshuai.xi ///              - *data: data point
1278*53ee8cc1Swenshuai.xi ///              -   size: size of SRM list(bytes)
1279*53ee8cc1Swenshuai.xi /// @return:
1280*53ee8cc1Swenshuai.xi ///              Ture: valid, FALSE: invalid
1281*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDCPTx_IsSRMSignatureValid(MS_U8 * data,MS_U32 size)1282*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDCPTx_IsSRMSignatureValid(MS_U8 *data, MS_U32 size)
1283*53ee8cc1Swenshuai.xi {
1284*53ee8cc1Swenshuai.xi #if 0
1285*53ee8cc1Swenshuai.xi     MS_U8 Msg[8]; // message, hex format
1286*53ee8cc1Swenshuai.xi     MS_U8 u8rtemp[20], u8stemp[20]; // DSA signature, hex format
1287*53ee8cc1Swenshuai.xi     char ms[50];
1288*53ee8cc1Swenshuai.xi     MS_U32 u32DSASigIdx;
1289*53ee8cc1Swenshuai.xi     unsigned int SHA1[5];
1290*53ee8cc1Swenshuai.xi     MS_S8 result;
1291*53ee8cc1Swenshuai.xi     BIGD   m, r, s;
1292*53ee8cc1Swenshuai.xi     dsa_context dsa;
1293*53ee8cc1Swenshuai.xi 
1294*53ee8cc1Swenshuai.xi     // ps, qs, gs is from HDCP specification v1.3
1295*53ee8cc1Swenshuai.xi     // msg[] Source message (will be hashed by SHA-1)
1296*53ee8cc1Swenshuai.xi     // ps[] (p) Prime Modulus, 1024 bits
1297*53ee8cc1Swenshuai.xi     // qs[] (q) Prime Divisor, 160 bits
1298*53ee8cc1Swenshuai.xi     // gs[] (g) Generator, 1024 bits
1299*53ee8cc1Swenshuai.xi     // ys[] (y) Public key, 1024 bits
1300*53ee8cc1Swenshuai.xi     char ps[] = "d3c3f5b2 fd1761b7 018d75f7 9343786b\
1301*53ee8cc1Swenshuai.xi                 17395b35 5a52c7b8 a1a24fc3 6a7058ff\
1302*53ee8cc1Swenshuai.xi                 8e7fa164 f500e0dc a0d28482 1d969e4b\
1303*53ee8cc1Swenshuai.xi                 4f34dc0c ae7c7667 b844c747 d4c6b983\
1304*53ee8cc1Swenshuai.xi                 e52ba70e 5447cf35 f404a0bc d1974c3a\
1305*53ee8cc1Swenshuai.xi                 10715509 b3721530 a73f3207 b9982049\
1306*53ee8cc1Swenshuai.xi                 5c7b9c14 3275733b 028a49fd 96891954\
1307*53ee8cc1Swenshuai.xi                 2a39951c 46edc211 8c59802b f3287527";
1308*53ee8cc1Swenshuai.xi     char qs[] = "ee8af2ce 5e6db56a cd6d14e2 97ef3f4d f9c708e7";
1309*53ee8cc1Swenshuai.xi     char gs[] = "92f85d1b 6a4d5213 1ae43e24 45de1ab5\
1310*53ee8cc1Swenshuai.xi                 02afdeac a9bed731 5d56d766 cd278611\
1311*53ee8cc1Swenshuai.xi                 8f5db14a bdeca9d2 5162977d a83effa8\
1312*53ee8cc1Swenshuai.xi                 8eedc6bf eb37e1a9 0e29cd0c a03d799e\
1313*53ee8cc1Swenshuai.xi                 92dd2945 f778585f f7c83564 2c21ba7f\
1314*53ee8cc1Swenshuai.xi                 b1a0b6be 81c8a5e3 c8ab69b2 1da54242\
1315*53ee8cc1Swenshuai.xi                 c98e9b8a ab4a9dc2 51fa7dac 29216fe8\
1316*53ee8cc1Swenshuai.xi                 b93f185b 2f67405b 69462442 c2ba0bd9";
1317*53ee8cc1Swenshuai.xi     char ys[] = "c7060052 6ba0b086 3a80fbe0 a3acff0d\
1318*53ee8cc1Swenshuai.xi                 4f0d7665 8a1754a8 e7654755 f15ba78d\
1319*53ee8cc1Swenshuai.xi                 56950e48 654f0bbd e16804de 1b541874\
1320*53ee8cc1Swenshuai.xi                 db22e14f 031704db 8d5cb2a4 17c4566c\
1321*53ee8cc1Swenshuai.xi                 27ba973c 43d84e0d a2a70856 fe9ea48d\
1322*53ee8cc1Swenshuai.xi                 87259038 b16553e6 62435ff7 fd5206e2\
1323*53ee8cc1Swenshuai.xi                 7bb7ffbd 886c2410 95c8dc8d 66f662cb\
1324*53ee8cc1Swenshuai.xi                 d88f9df7 e9b3fb83 62a9f7fa 36e53799";
1325*53ee8cc1Swenshuai.xi 
1326*53ee8cc1Swenshuai.xi     m = bdNew();
1327*53ee8cc1Swenshuai.xi     r = bdNew();
1328*53ee8cc1Swenshuai.xi     s = bdNew();
1329*53ee8cc1Swenshuai.xi     memcpy(&gHDMITxInfo.hdcp_srmlist[0], data, size);
1330*53ee8cc1Swenshuai.xi 
1331*53ee8cc1Swenshuai.xi     u32DSASigIdx = (gHDMITxInfo.hdcp_srmlist[5]<<16) | (gHDMITxInfo.hdcp_srmlist[6]<<8) | gHDMITxInfo.hdcp_srmlist[7];
1332*53ee8cc1Swenshuai.xi     if(u32DSASigIdx < 43) // illegal length
1333*53ee8cc1Swenshuai.xi         return FALSE;
1334*53ee8cc1Swenshuai.xi     else
1335*53ee8cc1Swenshuai.xi         u32DSASigIdx -= 43;
1336*53ee8cc1Swenshuai.xi 
1337*53ee8cc1Swenshuai.xi     memcpy(&Msg[0], &(gHDMITxInfo.hdcp_srmlist[0]), 8*sizeof(MS_U8)); // Message: The first 64 bits of SRM list
1338*53ee8cc1Swenshuai.xi     memcpy(&u8rtemp[0], &(gHDMITxInfo.hdcp_srmlist[8+u32DSASigIdx]), 20*sizeof(MS_U8)); // r: the first 160 bits of DSA signature
1339*53ee8cc1Swenshuai.xi     memcpy(&u8stemp[0], &(gHDMITxInfo.hdcp_srmlist[8+20+u32DSASigIdx]), 20*sizeof(MS_U8)); // s: the trailing 160 bits of DSA signature
1340*53ee8cc1Swenshuai.xi     MHal_HDMITx_HDCP_SHA1_Transform(SHA1, Msg); // Msg: 64 bits -> 512bits, SHA-1(Msg)
1341*53ee8cc1Swenshuai.xi     snprintf(ms, sizeof(ms), "%08x%08x%08x%08x%08x",SHA1[0],SHA1[1],SHA1[2],SHA1[3],SHA1[4]);
1342*53ee8cc1Swenshuai.xi     //sprintf(ms,"%08x%08x%08x%08x%08x",SHA1[0],SHA1[1],SHA1[2],SHA1[3],SHA1[4]);
1343*53ee8cc1Swenshuai.xi 
1344*53ee8cc1Swenshuai.xi     _dsa_init(&dsa);
1345*53ee8cc1Swenshuai.xi 
1346*53ee8cc1Swenshuai.xi     bdConvFromHex(dsa.p, ps);
1347*53ee8cc1Swenshuai.xi     bdConvFromHex(dsa.q, qs);
1348*53ee8cc1Swenshuai.xi     bdConvFromHex(dsa.g, gs);
1349*53ee8cc1Swenshuai.xi     bdConvFromHex(dsa.y, ys);
1350*53ee8cc1Swenshuai.xi     bdConvFromHex(m,ms);
1351*53ee8cc1Swenshuai.xi     bdConvFromOctets(r, u8rtemp, 20);
1352*53ee8cc1Swenshuai.xi     bdConvFromOctets(s, u8stemp, 20);
1353*53ee8cc1Swenshuai.xi 
1354*53ee8cc1Swenshuai.xi     printf("@@SRM-SHA-1 Digest= ");
1355*53ee8cc1Swenshuai.xi     bdPrint(m, BD_PRINT_TRIM | BD_PRINT_NL);
1356*53ee8cc1Swenshuai.xi     printf("@@SRM-R= ");
1357*53ee8cc1Swenshuai.xi     bdPrint(r, BD_PRINT_TRIM | BD_PRINT_NL);
1358*53ee8cc1Swenshuai.xi 
1359*53ee8cc1Swenshuai.xi     result = _dsa_verify(&dsa, m, r, s);
1360*53ee8cc1Swenshuai.xi 
1361*53ee8cc1Swenshuai.xi     printf("@@SRM- Verify result= ");
1362*53ee8cc1Swenshuai.xi     result == 0 ? printf("PASS!\r\n") : printf("FAIL!\r\n");
1363*53ee8cc1Swenshuai.xi 
1364*53ee8cc1Swenshuai.xi     bdFree(&m);
1365*53ee8cc1Swenshuai.xi     bdFree(&r);
1366*53ee8cc1Swenshuai.xi     bdFree(&s);
1367*53ee8cc1Swenshuai.xi 
1368*53ee8cc1Swenshuai.xi     _dsa_clear(&dsa);
1369*53ee8cc1Swenshuai.xi 
1370*53ee8cc1Swenshuai.xi     if(result == 0)
1371*53ee8cc1Swenshuai.xi         return TRUE;
1372*53ee8cc1Swenshuai.xi     else
1373*53ee8cc1Swenshuai.xi         return FALSE;
1374*53ee8cc1Swenshuai.xi #endif
1375*53ee8cc1Swenshuai.xi     return TRUE;
1376*53ee8cc1Swenshuai.xi }
1377*53ee8cc1Swenshuai.xi 
1378*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1379*53ee8cc1Swenshuai.xi /// @brief This routine start/stop HDCP authentication
1380*53ee8cc1Swenshuai.xi /// @param[in] bFlag: TRUE -> start authentication, FALSE -> stop authentication
1381*53ee8cc1Swenshuai.xi /// @return None
1382*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDCPTx_StartAuth(void * pInstance,MS_BOOL bFlag)1383*53ee8cc1Swenshuai.xi void MDrv_HDCPTx_StartAuth(void* pInstance, MS_BOOL bFlag)
1384*53ee8cc1Swenshuai.xi {
1385*53ee8cc1Swenshuai.xi     extern void MDrv_HDMITx_SetFSMState(void*, MDrvHDMITX_FSM_STATE); //avoid compile error due to presented order of functions
1386*53ee8cc1Swenshuai.xi 
1387*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
1388*53ee8cc1Swenshuai.xi 
1389*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetHDCPOnOff(pInstance, bFlag);
1390*53ee8cc1Swenshuai.xi 
1391*53ee8cc1Swenshuai.xi     if (bFlag)
1392*53ee8cc1Swenshuai.xi     {
1393*53ee8cc1Swenshuai.xi         MDrv_HDCPTx_SetAuthStartFlag(pInstance, TRUE);
1394*53ee8cc1Swenshuai.xi         MDrv_HDCPTx_SetAuthDoneFlag(pInstance, FALSE);
1395*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPAuth_Status = E_HDMITX_HDCP_RESET;
1396*53ee8cc1Swenshuai.xi 
1397*53ee8cc1Swenshuai.xi         MDrv_HDCPTx_SetFSMState(pInstance, HDCP14Tx_MainState_A0, HDCP14Tx_SubFSM_IDLE);
1398*53ee8cc1Swenshuai.xi 
1399*53ee8cc1Swenshuai.xi         MsOS_SetEvent(_s32HDMITxEventId, E_HdcpTX_EVENT_RUN);
1400*53ee8cc1Swenshuai.xi     }
1401*53ee8cc1Swenshuai.xi     else
1402*53ee8cc1Swenshuai.xi     {
1403*53ee8cc1Swenshuai.xi         MDrv_HDCPTx_SetAuthStartFlag(pInstance, FALSE);
1404*53ee8cc1Swenshuai.xi         MDrv_HDCPTx_SetAuthDoneFlag(pInstance, FALSE);
1405*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPAuth_Status = E_HDMITX_HDCP_RESET;
1406*53ee8cc1Swenshuai.xi 
1407*53ee8cc1Swenshuai.xi         if (MDrv_HDMITx_GetEdidRdyFlag(pInstance) == TRUE)
1408*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SetFSMState(pInstance, E_HDMITX_FSM_TRANSMIT);
1409*53ee8cc1Swenshuai.xi         else
1410*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SetFSMState(pInstance, E_HDMITX_FSM_VALIDATE_EDID);
1411*53ee8cc1Swenshuai.xi 
1412*53ee8cc1Swenshuai.xi         MsOS_SetEvent(_s32HDMITxEventId, E_HDMITX_EVENT_RUN);
1413*53ee8cc1Swenshuai.xi 
1414*53ee8cc1Swenshuai.xi         _MDrv_HDCPTx_StopRiTimer();
1415*53ee8cc1Swenshuai.xi     }
1416*53ee8cc1Swenshuai.xi }
1417*53ee8cc1Swenshuai.xi 
1418*53ee8cc1Swenshuai.xi //**************************************************************************
1419*53ee8cc1Swenshuai.xi //  [Function Name]:
1420*53ee8cc1Swenshuai.xi //			    HDCPTx_Handler()
1421*53ee8cc1Swenshuai.xi //  [Description]:
1422*53ee8cc1Swenshuai.xi //                      main handler of hdcp1.4 process
1423*53ee8cc1Swenshuai.xi //  [Arguments]:
1424*53ee8cc1Swenshuai.xi //			    [MS_U32] u32State
1425*53ee8cc1Swenshuai.xi //  [Return]:
1426*53ee8cc1Swenshuai.xi //			    void
1427*53ee8cc1Swenshuai.xi //
1428*53ee8cc1Swenshuai.xi //**************************************************************************
HDCPTx_Handler(void * pInstance,MS_U32 u32State)1429*53ee8cc1Swenshuai.xi void HDCPTx_Handler(void* pInstance, MS_U32 u32State) //wilson@kano
1430*53ee8cc1Swenshuai.xi {
1431*53ee8cc1Swenshuai.xi     static MS_BOOL bPolling = FALSE;
1432*53ee8cc1Swenshuai.xi     static MS_BOOL bCheckDone = FALSE;
1433*53ee8cc1Swenshuai.xi 
1434*53ee8cc1Swenshuai.xi     extern MS_BOOL MDrv_HDMITx_GetTmdsEnFlag(void* ); //avoid compile error due to presented order of functions
1435*53ee8cc1Swenshuai.xi     extern MS_BOOL MDrv_HDMITx_GetHdcpEnFlag(void* );
1436*53ee8cc1Swenshuai.xi     extern MS_BOOL MDrv_HDMITx_GetAVMUTEStatus(void* );
1437*53ee8cc1Swenshuai.xi     extern void MDrv_HDMITx_SetAVMUTE(void* , MS_BOOL);
1438*53ee8cc1Swenshuai.xi 
1439*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
1440*53ee8cc1Swenshuai.xi 
1441*53ee8cc1Swenshuai.xi     if(gbCurRxStatus != E_HDMITX_DVIClock_H_HPD_H || MDrv_HDMITx_GetTmdsEnFlag(pInstance) == FALSE)
1442*53ee8cc1Swenshuai.xi         return;
1443*53ee8cc1Swenshuai.xi 
1444*53ee8cc1Swenshuai.xi     if (MDrv_HDCPTx_GetRxValid(pInstance) == FALSE)
1445*53ee8cc1Swenshuai.xi     {
1446*53ee8cc1Swenshuai.xi         MHal_HDMITx_HdcpSetEncrypt(DISABLE);
1447*53ee8cc1Swenshuai.xi         MDrv_HDCPTx_SetFSMState(pInstance, HDCP14Tx_MainState_A0, HDCP14Tx_SubFSM_IDLE);
1448*53ee8cc1Swenshuai.xi 
1449*53ee8cc1Swenshuai.xi         bPolling = FALSE;
1450*53ee8cc1Swenshuai.xi         bCheckDone = FALSE;
1451*53ee8cc1Swenshuai.xi 
1452*53ee8cc1Swenshuai.xi         if (psHDMITXResPri->stHdcpTxInfo.hdmitx_unHDCPRx_Control == E_HDCP_ENCRYPTION)
1453*53ee8cc1Swenshuai.xi         {
1454*53ee8cc1Swenshuai.xi             MHal_HDMITx_HdcpSetEncrypt(ENABLE); // for HDCP CTS
1455*53ee8cc1Swenshuai.xi         }
1456*53ee8cc1Swenshuai.xi         else if (psHDMITXResPri->stHdcpTxInfo.hdmitx_unHDCPRx_Control == E_BLUE_SCREEN)
1457*53ee8cc1Swenshuai.xi         {
1458*53ee8cc1Swenshuai.xi             _MDrv_HDCPTx_StopRiTimer();
1459*53ee8cc1Swenshuai.xi 
1460*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SetVideoOnOff(pInstance, FALSE); //wilson@kano
1461*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SetAudioOnOff(pInstance, FALSE); //wilson@kano
1462*53ee8cc1Swenshuai.xi         }
1463*53ee8cc1Swenshuai.xi         else //normal display
1464*53ee8cc1Swenshuai.xi         {
1465*53ee8cc1Swenshuai.xi             _MDrv_HDCPTx_StopRiTimer();
1466*53ee8cc1Swenshuai.xi             MHal_HDMITx_HdcpSetEncrypt(DISABLE); // for HDCP CTS
1467*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SetVideoOnOff(pInstance, TRUE); //wilson@kano
1468*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SetAudioOnOff(pInstance, TRUE);
1469*53ee8cc1Swenshuai.xi         }
1470*53ee8cc1Swenshuai.xi 
1471*53ee8cc1Swenshuai.xi         //return;
1472*53ee8cc1Swenshuai.xi     }
1473*53ee8cc1Swenshuai.xi 
1474*53ee8cc1Swenshuai.xi     if (MDrv_HDMITx_GetTmdsEnFlag(pInstance) == TRUE)//((gHdcpTxInfo.hdcp_Rx_valid == TRUE) && (MDrv_HDMITx_GetTmdsEnFlag() == TRUE)) //edid is ready & tmds signal is enabled
1475*53ee8cc1Swenshuai.xi     {
1476*53ee8cc1Swenshuai.xi         if (MDrv_HDMITx_GetHdcpEnFlag(pInstance) == TRUE) //(gHdcpTxInfo.hdmitx_hdcp_flag == TRUE)
1477*53ee8cc1Swenshuai.xi         {
1478*53ee8cc1Swenshuai.xi             switch (psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState)
1479*53ee8cc1Swenshuai.xi         	{
1480*53ee8cc1Swenshuai.xi         		case HDCP14Tx_MainState_A0:
1481*53ee8cc1Swenshuai.xi         			switch (psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState)
1482*53ee8cc1Swenshuai.xi         			{
1483*53ee8cc1Swenshuai.xi                         case HDCP14Tx_SubFSM_AuthFail:
1484*53ee8cc1Swenshuai.xi                         {
1485*53ee8cc1Swenshuai.xi                             if (psHDMITXResPri->stHdcpTxInfo.hdmitx_unHDCPRx_Control == E_HDCP_ENCRYPTION)
1486*53ee8cc1Swenshuai.xi                             {
1487*53ee8cc1Swenshuai.xi                                 MHal_HDMITx_HdcpSetEncrypt(ENABLE); // for HDCP CTS
1488*53ee8cc1Swenshuai.xi                             }
1489*53ee8cc1Swenshuai.xi                             else if (psHDMITXResPri->stHdcpTxInfo.hdmitx_unHDCPRx_Control == E_BLUE_SCREEN)
1490*53ee8cc1Swenshuai.xi                             {
1491*53ee8cc1Swenshuai.xi                                 _MDrv_HDCPTx_StopRiTimer();
1492*53ee8cc1Swenshuai.xi 
1493*53ee8cc1Swenshuai.xi                                 MDrv_HDMITx_SetVideoOnOff(pInstance, FALSE); //wilson@kano
1494*53ee8cc1Swenshuai.xi                                 MDrv_HDMITx_SetAudioOnOff(pInstance, FALSE); //wilson@kano
1495*53ee8cc1Swenshuai.xi                             }
1496*53ee8cc1Swenshuai.xi                             else //normal display
1497*53ee8cc1Swenshuai.xi                             {
1498*53ee8cc1Swenshuai.xi                                 _MDrv_HDCPTx_StopRiTimer();
1499*53ee8cc1Swenshuai.xi                                 MHal_HDMITx_HdcpSetEncrypt(DISABLE); // for HDCP CTS
1500*53ee8cc1Swenshuai.xi                                 MDrv_HDMITx_SetVideoOnOff(pInstance, TRUE); //wilson@kano
1501*53ee8cc1Swenshuai.xi                                 MDrv_HDMITx_SetAudioOnOff(pInstance, TRUE);
1502*53ee8cc1Swenshuai.xi                             }
1503*53ee8cc1Swenshuai.xi 
1504*53ee8cc1Swenshuai.xi                             if (MDrv_HDMITx_GetHdcpEnFlag(pInstance) == TRUE) //(gHdcpTxInfo.hdmitx_hdcp_flag == TRUE) //if hdcp is enabled, keep re-try defalut state
1505*53ee8cc1Swenshuai.xi                             {
1506*53ee8cc1Swenshuai.xi                                 psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A0;
1507*53ee8cc1Swenshuai.xi                                 psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_IDLE;
1508*53ee8cc1Swenshuai.xi                             }
1509*53ee8cc1Swenshuai.xi 
1510*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A0;
1511*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_IDLE;//HDCP14Tx_SubFSM_PreExchangeKSV;
1512*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHdcpTxInfo.hdcp14tx_PreSubState = HDCP14Tx_SubFSM_AuthFail;
1513*53ee8cc1Swenshuai.xi                         }
1514*53ee8cc1Swenshuai.xi                         break;
1515*53ee8cc1Swenshuai.xi 
1516*53ee8cc1Swenshuai.xi         				case HDCP14Tx_SubFSM_IDLE:
1517*53ee8cc1Swenshuai.xi                             {
1518*53ee8cc1Swenshuai.xi                                 MS_U16 wBstatus = 0;
1519*53ee8cc1Swenshuai.xi 
1520*53ee8cc1Swenshuai.xi                                 memset(g_u8Bstatus, 0x00, sizeof(g_u8Bstatus));
1521*53ee8cc1Swenshuai.xi                                 memset(g_u8KSVList, 0x00, sizeof(g_u8KSVList));
1522*53ee8cc1Swenshuai.xi                                 g_bValidKSVList = FALSE;
1523*53ee8cc1Swenshuai.xi 
1524*53ee8cc1Swenshuai.xi                                 if (MDrv_HDMITx_GetOutputMode(pInstance) & 0x02) //if HDMI mode
1525*53ee8cc1Swenshuai.xi                                 {
1526*53ee8cc1Swenshuai.xi                                     if ((bCheckDone == FALSE) && (_MDrv_HDCP_GetTimeDiff(gdwPreTime, gdwCurTime) < HDCP14TX_BSTATUS_TIMEOUT_CNT))
1527*53ee8cc1Swenshuai.xi                                     {
1528*53ee8cc1Swenshuai.xi                                         if (bPolling == FALSE)
1529*53ee8cc1Swenshuai.xi                                             gdwPreTime = MsOS_GetSystemTime(); //first time
1530*53ee8cc1Swenshuai.xi 
1531*53ee8cc1Swenshuai.xi                                         bPolling = TRUE;
1532*53ee8cc1Swenshuai.xi                                         gdwCurTime = MsOS_GetSystemTime();
1533*53ee8cc1Swenshuai.xi 
1534*53ee8cc1Swenshuai.xi                                         if (MHal_HDMITx_HDCP_Get_BStatus(&wBstatus) == TRUE)
1535*53ee8cc1Swenshuai.xi                                         {
1536*53ee8cc1Swenshuai.xi                                             psHDMITXResPri->stHdcpTxInfo.ucBStatus[1] = (MS_U8)((wBstatus & 0xFF00)>>8);
1537*53ee8cc1Swenshuai.xi                                             psHDMITXResPri->stHdcpTxInfo.ucBStatus[0] = (MS_U8)(wBstatus & 0x00FF);
1538*53ee8cc1Swenshuai.xi 
1539*53ee8cc1Swenshuai.xi                                             if (wBstatus & BIT12)
1540*53ee8cc1Swenshuai.xi                                             {
1541*53ee8cc1Swenshuai.xi                                                 bPolling = FALSE;
1542*53ee8cc1Swenshuai.xi                                                 bCheckDone = TRUE;
1543*53ee8cc1Swenshuai.xi                                                 //break;
1544*53ee8cc1Swenshuai.xi                                             }
1545*53ee8cc1Swenshuai.xi                                             else
1546*53ee8cc1Swenshuai.xi                                             {
1547*53ee8cc1Swenshuai.xi                                                 bPolling = TRUE;
1548*53ee8cc1Swenshuai.xi                                                 bCheckDone = FALSE;
1549*53ee8cc1Swenshuai.xi                                                 MsOS_SetEvent(_s32HDMITxEventId, E_HdcpTX_EVENT_RUN);
1550*53ee8cc1Swenshuai.xi                                                 return;
1551*53ee8cc1Swenshuai.xi                                             }
1552*53ee8cc1Swenshuai.xi                                         }
1553*53ee8cc1Swenshuai.xi                                     }
1554*53ee8cc1Swenshuai.xi                                 }
1555*53ee8cc1Swenshuai.xi 
1556*53ee8cc1Swenshuai.xi                                 gRepeaterFailTime = 0;
1557*53ee8cc1Swenshuai.xi                                 gRepeaterStartTime = MsOS_GetSystemTime();
1558*53ee8cc1Swenshuai.xi 
1559*53ee8cc1Swenshuai.xi                                 psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPAuth_Status = E_HDMITX_HDCP_WAITING_ACTIVE_RX;
1560*53ee8cc1Swenshuai.xi 
1561*53ee8cc1Swenshuai.xi                                 MHal_HDMITx_HdcpSetEncrypt(DISABLE);
1562*53ee8cc1Swenshuai.xi 
1563*53ee8cc1Swenshuai.xi             					psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPAuth_Status = _MDrv_HDCPTx_AuthWaitingActiveRx();
1564*53ee8cc1Swenshuai.xi 
1565*53ee8cc1Swenshuai.xi                                 if (psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPAuth_Status == E_HDMITX_HDCP_RX_IS_NOT_VALID)
1566*53ee8cc1Swenshuai.xi                                 {
1567*53ee8cc1Swenshuai.xi                                     MDrv_HDCPTx_SetRxValid(pInstance, FALSE);
1568*53ee8cc1Swenshuai.xi 
1569*53ee8cc1Swenshuai.xi                                     if (psHDMITXResPri->stHdcpTxInfo.hdmitx_unHDCPRx_Control == E_HDCP_ENCRYPTION)
1570*53ee8cc1Swenshuai.xi                                     {
1571*53ee8cc1Swenshuai.xi                                         MHal_HDMITx_HdcpSetEncrypt(ENABLE); // for HDCP CTS
1572*53ee8cc1Swenshuai.xi                                     }
1573*53ee8cc1Swenshuai.xi                                     else if (psHDMITXResPri->stHdcpTxInfo.hdmitx_unHDCPRx_Control == E_BLUE_SCREEN)
1574*53ee8cc1Swenshuai.xi                                     {
1575*53ee8cc1Swenshuai.xi                                         _MDrv_HDCPTx_StopRiTimer();
1576*53ee8cc1Swenshuai.xi 
1577*53ee8cc1Swenshuai.xi                                         MDrv_HDMITx_SetVideoOnOff(pInstance, FALSE); //wilson@kano
1578*53ee8cc1Swenshuai.xi                                         MDrv_HDMITx_SetAudioOnOff(pInstance, FALSE); //wilson@kano
1579*53ee8cc1Swenshuai.xi                                     }
1580*53ee8cc1Swenshuai.xi                                     else //normal display
1581*53ee8cc1Swenshuai.xi                                     {
1582*53ee8cc1Swenshuai.xi                                         _MDrv_HDCPTx_StopRiTimer();
1583*53ee8cc1Swenshuai.xi                                         MHal_HDMITx_HdcpSetEncrypt(DISABLE); // for HDCP CTS
1584*53ee8cc1Swenshuai.xi                                         MDrv_HDMITx_SetVideoOnOff(pInstance, TRUE); //wilson@kano
1585*53ee8cc1Swenshuai.xi                                         MDrv_HDMITx_SetAudioOnOff(pInstance, TRUE);
1586*53ee8cc1Swenshuai.xi                                     }
1587*53ee8cc1Swenshuai.xi 
1588*53ee8cc1Swenshuai.xi                                     if (MDrv_HDMITx_GetHdcpEnFlag(pInstance) == TRUE) //(gHdcpTxInfo.hdmitx_hdcp_flag == TRUE) //if hdcp is enabled, keep re-try defalut state
1589*53ee8cc1Swenshuai.xi                                     {
1590*53ee8cc1Swenshuai.xi                                         psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A0;
1591*53ee8cc1Swenshuai.xi                                         psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_IDLE;
1592*53ee8cc1Swenshuai.xi                                     }
1593*53ee8cc1Swenshuai.xi 
1594*53ee8cc1Swenshuai.xi                                     MDrv_HDCPTx_SetAuthDoneFlag(pInstance, FALSE);
1595*53ee8cc1Swenshuai.xi                                 }
1596*53ee8cc1Swenshuai.xi                                 else
1597*53ee8cc1Swenshuai.xi                                 {
1598*53ee8cc1Swenshuai.xi                                     MDrv_HDCPTx_SetRxValid(pInstance, TRUE);
1599*53ee8cc1Swenshuai.xi 
1600*53ee8cc1Swenshuai.xi                                     //move to next state
1601*53ee8cc1Swenshuai.xi                                     psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A0;
1602*53ee8cc1Swenshuai.xi                                     psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_ExchangeKSV;//HDCP14Tx_SubFSM_PreExchangeKSV;
1603*53ee8cc1Swenshuai.xi                                     psHDMITXResPri->stHdcpTxInfo.hdcp14tx_PreSubState = HDCP14Tx_SubFSM_IDLE;
1604*53ee8cc1Swenshuai.xi                                     gdwPreTime = MsOS_GetSystemTime();
1605*53ee8cc1Swenshuai.xi                                     //MsOS_SetEvent(_s32HDMITxEventId, E_HdcpTX_EVENT_RUN);
1606*53ee8cc1Swenshuai.xi                                 }
1607*53ee8cc1Swenshuai.xi                             }
1608*53ee8cc1Swenshuai.xi         				break;
1609*53ee8cc1Swenshuai.xi         				case HDCP14Tx_SubFSM_ExchangeKSV:
1610*53ee8cc1Swenshuai.xi                             {
1611*53ee8cc1Swenshuai.xi             					//send an and aksv, if failed then go back to state A0
1612*53ee8cc1Swenshuai.xi             					//if (hal_HDCP14Tx_SendAn(gHdcpTxInfo.bUseInternalAn) && hal_HDCP14Tx_SendAKSV())
1613*53ee8cc1Swenshuai.xi             					psHDMITXResPri->stHdcpTxInfo.hdcp14tx_PreSubState = HDCP14Tx_SubFSM_ExchangeKSV;
1614*53ee8cc1Swenshuai.xi 
1615*53ee8cc1Swenshuai.xi             					if (MHal_HDMITx_HdcpWriteAn(USE_AUTO_GEN_AN) == TRUE)
1616*53ee8cc1Swenshuai.xi             					{
1617*53ee8cc1Swenshuai.xi             					    MsOS_DelayTask(HDCP_DDC_SAMPLE_PERIOD);
1618*53ee8cc1Swenshuai.xi 
1619*53ee8cc1Swenshuai.xi             					    if (MHal_HDMITx_HdcpWriteAksv() == TRUE)
1620*53ee8cc1Swenshuai.xi                                     {
1621*53ee8cc1Swenshuai.xi                 						gdwPreTime = MsOS_GetSystemTime();//MAsm_GetSystemTime();
1622*53ee8cc1Swenshuai.xi                 						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A1andA2;
1623*53ee8cc1Swenshuai.xi                 						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_VerifyBksv;//HDCP14Tx_SubFSM_IDLE;
1624*53ee8cc1Swenshuai.xi                                     }
1625*53ee8cc1Swenshuai.xi                                     else
1626*53ee8cc1Swenshuai.xi                                     {
1627*53ee8cc1Swenshuai.xi                                         psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPAuth_Status = E_HDMITX_HDCP_TX_KEY_FAIL;
1628*53ee8cc1Swenshuai.xi                                         psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A0;
1629*53ee8cc1Swenshuai.xi                                         psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_AuthFail;
1630*53ee8cc1Swenshuai.xi                                         DBG_HDCP(printf("%s::MHal_HDMITx_HdcpWriteAksv fail!! \n", __FUNCTION__));
1631*53ee8cc1Swenshuai.xi                                     }
1632*53ee8cc1Swenshuai.xi             					}
1633*53ee8cc1Swenshuai.xi             					else
1634*53ee8cc1Swenshuai.xi             					{
1635*53ee8cc1Swenshuai.xi             					    psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPAuth_Status = E_HDMITX_HDCP_TX_KEY_FAIL;
1636*53ee8cc1Swenshuai.xi 
1637*53ee8cc1Swenshuai.xi             						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A0;
1638*53ee8cc1Swenshuai.xi             						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_AuthFail;
1639*53ee8cc1Swenshuai.xi             						DBG_HDCP(printf("%s::Exchange KSV fail!! \n", __FUNCTION__));
1640*53ee8cc1Swenshuai.xi             					}
1641*53ee8cc1Swenshuai.xi                             }
1642*53ee8cc1Swenshuai.xi         				break;
1643*53ee8cc1Swenshuai.xi 
1644*53ee8cc1Swenshuai.xi         				default:
1645*53ee8cc1Swenshuai.xi         					DBG_HDCP(printf("[HDCP14TX]%s::Invalid State!\n", __FUNCTION__));
1646*53ee8cc1Swenshuai.xi         				break;
1647*53ee8cc1Swenshuai.xi         			}
1648*53ee8cc1Swenshuai.xi 
1649*53ee8cc1Swenshuai.xi                     MsOS_SetEvent(_s32HDMITxEventId, E_HdcpTX_EVENT_RUN);
1650*53ee8cc1Swenshuai.xi         		break;
1651*53ee8cc1Swenshuai.xi 
1652*53ee8cc1Swenshuai.xi         		case HDCP14Tx_MainState_A1andA2:
1653*53ee8cc1Swenshuai.xi         			switch (psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState)
1654*53ee8cc1Swenshuai.xi         			{
1655*53ee8cc1Swenshuai.xi         				case HDCP14Tx_SubFSM_IDLE:
1656*53ee8cc1Swenshuai.xi         				break;
1657*53ee8cc1Swenshuai.xi 
1658*53ee8cc1Swenshuai.xi         				case HDCP14Tx_SubFSM_VerifyBksv:
1659*53ee8cc1Swenshuai.xi         					//read BCaps, set Ainfo(optional)
1660*53ee8cc1Swenshuai.xi         					psHDMITXResPri->stHdcpTxInfo.hdcp14tx_PreSubState = HDCP14Tx_SubFSM_VerifyBksv;
1661*53ee8cc1Swenshuai.xi 
1662*53ee8cc1Swenshuai.xi         					if(_MDrv_HDCPTx_HdcpSyncSetting(pInstance, MDrv_HDMITx_GetOutputMode(pInstance)) == FALSE)
1663*53ee8cc1Swenshuai.xi                             {
1664*53ee8cc1Swenshuai.xi                                 DBG_HDCP(printf("%s::I2C Read BCaps ERROR!\n", __FUNCTION__));
1665*53ee8cc1Swenshuai.xi 
1666*53ee8cc1Swenshuai.xi         						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A0;
1667*53ee8cc1Swenshuai.xi                                 psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_AuthFail; //HDCP14Tx_SubFSM_IDLE;
1668*53ee8cc1Swenshuai.xi                                 psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPAuth_Status = E_HDMITX_HDCP_TX_KEY_FAIL;
1669*53ee8cc1Swenshuai.xi                                 psHDMITXResPri->stHdcpTxInfo.HDCP_74_check = FALSE;
1670*53ee8cc1Swenshuai.xi 
1671*53ee8cc1Swenshuai.xi                                 break;
1672*53ee8cc1Swenshuai.xi                             }
1673*53ee8cc1Swenshuai.xi         					else
1674*53ee8cc1Swenshuai.xi         					{
1675*53ee8cc1Swenshuai.xi         					    if (MHal_HDMITx_HdcpCheckBksvLn() == TRUE)
1676*53ee8cc1Swenshuai.xi                                 {
1677*53ee8cc1Swenshuai.xi                                     MHal_HDMITx_GET74(0x00, psHDMITXResPri->stHdcpTxInfo.HDCP_BKSV);
1678*53ee8cc1Swenshuai.xi                                     MHal_HDMITx_GET74(0x10, psHDMITXResPri->stHdcpTxInfo.HDCP_AKSV);
1679*53ee8cc1Swenshuai.xi                                     psHDMITXResPri->stHdcpTxInfo.HDCP_74_check = TRUE;
1680*53ee8cc1Swenshuai.xi                                     psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A3;
1681*53ee8cc1Swenshuai.xi                                     psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_IDLE;
1682*53ee8cc1Swenshuai.xi                                 }
1683*53ee8cc1Swenshuai.xi                                 else
1684*53ee8cc1Swenshuai.xi                                 {
1685*53ee8cc1Swenshuai.xi                                     psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A0;
1686*53ee8cc1Swenshuai.xi                                     psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_AuthFail; //HDCP14Tx_SubFSM_IDLE;
1687*53ee8cc1Swenshuai.xi                                     psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPAuth_Status = E_HDMITX_HDCP_TX_KEY_FAIL;
1688*53ee8cc1Swenshuai.xi                                     psHDMITXResPri->stHdcpTxInfo.HDCP_74_check = FALSE;
1689*53ee8cc1Swenshuai.xi                                 }
1690*53ee8cc1Swenshuai.xi         					}
1691*53ee8cc1Swenshuai.xi         				break;
1692*53ee8cc1Swenshuai.xi 
1693*53ee8cc1Swenshuai.xi         				default:
1694*53ee8cc1Swenshuai.xi         					DBG_HDCP(printf("%s::Invalid State!\n", __FUNCTION__));
1695*53ee8cc1Swenshuai.xi         				break;
1696*53ee8cc1Swenshuai.xi         			}
1697*53ee8cc1Swenshuai.xi                     MsOS_SetEvent(_s32HDMITxEventId, E_HdcpTX_EVENT_RUN);
1698*53ee8cc1Swenshuai.xi         		break;
1699*53ee8cc1Swenshuai.xi 
1700*53ee8cc1Swenshuai.xi         		case HDCP14Tx_MainState_A3:
1701*53ee8cc1Swenshuai.xi         			switch (psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState)
1702*53ee8cc1Swenshuai.xi         			{
1703*53ee8cc1Swenshuai.xi         				case HDCP14Tx_SubFSM_IDLE:
1704*53ee8cc1Swenshuai.xi         					//check revoke list
1705*53ee8cc1Swenshuai.xi         					if (MDrv_HDCPTx_CheckRevokedKey(pInstance) == TRUE)
1706*53ee8cc1Swenshuai.xi         					{
1707*53ee8cc1Swenshuai.xi         						DBG_HDCP(printf("%s::Revoke BKSV !!\n", __FUNCTION__));
1708*53ee8cc1Swenshuai.xi                                 psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPAuth_Status = E_HDMITX_HDCP_RX_KEY_REVOKED;
1709*53ee8cc1Swenshuai.xi                                 psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A0;
1710*53ee8cc1Swenshuai.xi                                 psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_AuthFail; //HDCP14Tx_SubFSM_IDLE;
1711*53ee8cc1Swenshuai.xi                                 MDrv_HDCPTx_SetRxValid(pInstance, FALSE);
1712*53ee8cc1Swenshuai.xi                                 break;
1713*53ee8cc1Swenshuai.xi         					}
1714*53ee8cc1Swenshuai.xi         					else
1715*53ee8cc1Swenshuai.xi         					{
1716*53ee8cc1Swenshuai.xi         						MHal_HDMITx_HdcpStartCipher();
1717*53ee8cc1Swenshuai.xi         						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A3;
1718*53ee8cc1Swenshuai.xi         						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_CheckR0;
1719*53ee8cc1Swenshuai.xi         						//gdwCurTime = _MDrv_HDCP_GetTimeDiff();
1720*53ee8cc1Swenshuai.xi         						//gdwPreTime = gdwCurTime;
1721*53ee8cc1Swenshuai.xi         					}
1722*53ee8cc1Swenshuai.xi         				break;
1723*53ee8cc1Swenshuai.xi 
1724*53ee8cc1Swenshuai.xi         				case HDCP14Tx_SubFSM_CheckR0:
1725*53ee8cc1Swenshuai.xi         					//validate receiver
1726*53ee8cc1Swenshuai.xi         					/**************************************************************************/
1727*53ee8cc1Swenshuai.xi         					// [HDCP] 1A and 1B: AKSV -> Ro should be large than 100msec
1728*53ee8cc1Swenshuai.xi         					// to pass Quantumdata 882 HDCP test, we delay 150ms
1729*53ee8cc1Swenshuai.xi         					//
1730*53ee8cc1Swenshuai.xi         					// 2013/11/07, in SEC Compatibility test, we meet an Repeater timeout error on PEPEATER YAMAHA RX-V2700
1731*53ee8cc1Swenshuai.xi         					// patch AKSV -> Ro large than 250ms
1732*53ee8cc1Swenshuai.xi         					/***************************************************************************/
1733*53ee8cc1Swenshuai.xi 
1734*53ee8cc1Swenshuai.xi         					//wait 100ms(at least) before check R0
1735*53ee8cc1Swenshuai.xi         					#if 1
1736*53ee8cc1Swenshuai.xi         					gdwCurTime = MsOS_GetSystemTime();
1737*53ee8cc1Swenshuai.xi         					if (_MDrv_HDCP_GetTimeDiff(gdwPreTime, gdwCurTime) < HDCP14TX_R0_WDT)
1738*53ee8cc1Swenshuai.xi         					{
1739*53ee8cc1Swenshuai.xi             						//gdwPreTime = gdwCurTime;
1740*53ee8cc1Swenshuai.xi         						break;
1741*53ee8cc1Swenshuai.xi         					}
1742*53ee8cc1Swenshuai.xi                             gdwPreTime = gdwCurTime;
1743*53ee8cc1Swenshuai.xi                             #else
1744*53ee8cc1Swenshuai.xi                             if (u32State & E_HdcpTX_EVENT_RITIMER)
1745*53ee8cc1Swenshuai.xi                             #endif
1746*53ee8cc1Swenshuai.xi                             {
1747*53ee8cc1Swenshuai.xi             					if (_MDrv_HDCPTX_AuthCheckRi() == E_HDMITX_HDCP_SYNC_RI_PASS) //R0 = R0'
1748*53ee8cc1Swenshuai.xi             					{
1749*53ee8cc1Swenshuai.xi             						if (psHDMITXResPri->stHdcpTxInfo.hdmitx_HdcpCheckRepeater_flag == TRUE)
1750*53ee8cc1Swenshuai.xi             						{
1751*53ee8cc1Swenshuai.xi             							psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A6;
1752*53ee8cc1Swenshuai.xi             							psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_IDLE;
1753*53ee8cc1Swenshuai.xi                                         psHDMITXResPri->stHdcpTxInfo.hdcp14tx_PreSubState = HDCP14Tx_SubFSM_CheckR0;
1754*53ee8cc1Swenshuai.xi             						}
1755*53ee8cc1Swenshuai.xi             						else
1756*53ee8cc1Swenshuai.xi             						{
1757*53ee8cc1Swenshuai.xi             							psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A4;
1758*53ee8cc1Swenshuai.xi             							psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_IDLE;
1759*53ee8cc1Swenshuai.xi                                         psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPAuth_Status = E_HDMITX_HDCP_SYNC_RI_PASS;
1760*53ee8cc1Swenshuai.xi                                         psHDMITXResPri->stHdcpTxInfo.hdcp14tx_PreSubState = HDCP14Tx_SubFSM_CheckR0;
1761*53ee8cc1Swenshuai.xi             						}
1762*53ee8cc1Swenshuai.xi             					}
1763*53ee8cc1Swenshuai.xi             					else //E_HDMITX_HDCP_SYNC_RI_FAIL
1764*53ee8cc1Swenshuai.xi             					{
1765*53ee8cc1Swenshuai.xi             						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A0;
1766*53ee8cc1Swenshuai.xi             						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_AuthFail;
1767*53ee8cc1Swenshuai.xi                                     psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPAuth_Status = E_HDMITX_HDCP_SYNC_RI_FAIL;
1768*53ee8cc1Swenshuai.xi                                     psHDMITXResPri->stHdcpTxInfo.hdcp14tx_PreSubState = HDCP14Tx_SubFSM_CheckR0;
1769*53ee8cc1Swenshuai.xi             					}
1770*53ee8cc1Swenshuai.xi                             }
1771*53ee8cc1Swenshuai.xi 
1772*53ee8cc1Swenshuai.xi         				break;
1773*53ee8cc1Swenshuai.xi 
1774*53ee8cc1Swenshuai.xi         				default:
1775*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A0;
1776*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_AuthFail;
1777*53ee8cc1Swenshuai.xi         					DBG_HDCP(printf("%s::Invalid State!\n", __FUNCTION__));
1778*53ee8cc1Swenshuai.xi         				break;
1779*53ee8cc1Swenshuai.xi         			}
1780*53ee8cc1Swenshuai.xi                     MsOS_SetEvent(_s32HDMITxEventId, E_HdcpTX_EVENT_RUN);
1781*53ee8cc1Swenshuai.xi         		break;
1782*53ee8cc1Swenshuai.xi 
1783*53ee8cc1Swenshuai.xi         		case HDCP14Tx_MainState_A4:
1784*53ee8cc1Swenshuai.xi         			switch (psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState)
1785*53ee8cc1Swenshuai.xi         			{
1786*53ee8cc1Swenshuai.xi         				case HDCP14Tx_SubFSM_IDLE:
1787*53ee8cc1Swenshuai.xi         					psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A4;
1788*53ee8cc1Swenshuai.xi         					psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_AuthDone;
1789*53ee8cc1Swenshuai.xi                             MsOS_SetEvent(_s32HDMITxEventId, E_HdcpTX_EVENT_RUN);
1790*53ee8cc1Swenshuai.xi         				break;
1791*53ee8cc1Swenshuai.xi 
1792*53ee8cc1Swenshuai.xi         				case HDCP14Tx_SubFSM_AuthDone:
1793*53ee8cc1Swenshuai.xi         					//authentication done;
1794*53ee8cc1Swenshuai.xi         					MHal_HDMITx_HdcpAuthPass();//hal_HDCP14Tx_SetAuthDone(TRUE);
1795*53ee8cc1Swenshuai.xi                             MDrv_HDCPTx_SetAuthDoneFlag(pInstance, TRUE);
1796*53ee8cc1Swenshuai.xi         					psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A4;
1797*53ee8cc1Swenshuai.xi         					psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_CheckRi;
1798*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPAuth_Status = E_HDMITX_HDCP_AUTH_DONE;
1799*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHdcpTxInfo.hdcp14tx_PreSubState = HDCP14Tx_SubFSM_AuthDone;
1800*53ee8cc1Swenshuai.xi 
1801*53ee8cc1Swenshuai.xi                             MDrv_HDMITx_SetVideoOnOff(pInstance, TRUE);
1802*53ee8cc1Swenshuai.xi                             MDrv_HDMITx_SetAudioOnOff(pInstance, TRUE);
1803*53ee8cc1Swenshuai.xi 
1804*53ee8cc1Swenshuai.xi                             if (_s32HDCPRiTimerId > 0) //already created
1805*53ee8cc1Swenshuai.xi                             {
1806*53ee8cc1Swenshuai.xi                                 MsOS_DeleteTimer(_s32HDCPRiTimerId);
1807*53ee8cc1Swenshuai.xi                             }
1808*53ee8cc1Swenshuai.xi 
1809*53ee8cc1Swenshuai.xi                             if (MDrv_HDMITx_GetAVMUTEStatus(pInstance) == TRUE)
1810*53ee8cc1Swenshuai.xi                             {
1811*53ee8cc1Swenshuai.xi                                 MDrv_HDMITx_SetAVMUTE(pInstance, FALSE);
1812*53ee8cc1Swenshuai.xi                             }
1813*53ee8cc1Swenshuai.xi 
1814*53ee8cc1Swenshuai.xi                             _s32HDCPRiTimerId = MsOS_CreateTimer( _MDrv_HDMITX_HDCP_Ri_TimerCallback,
1815*53ee8cc1Swenshuai.xi                                                               gHDCPCheckRiTimer,
1816*53ee8cc1Swenshuai.xi                                                               gHDCPCheckRiTimer,
1817*53ee8cc1Swenshuai.xi                                                               TRUE,
1818*53ee8cc1Swenshuai.xi                                                               "HDCP Ri Timer");
1819*53ee8cc1Swenshuai.xi 
1820*53ee8cc1Swenshuai.xi         					//gdwCurTime = _MDrv_HDCP_GetTimeDiff();
1821*53ee8cc1Swenshuai.xi         					//gdwPreTime = gdwCurTime;
1822*53ee8cc1Swenshuai.xi         				break;
1823*53ee8cc1Swenshuai.xi 
1824*53ee8cc1Swenshuai.xi         				case HDCP14Tx_SubFSM_CheckRi:
1825*53ee8cc1Swenshuai.xi         					//gdwCurTime = _MDrv_HDCP_GetTimeDiff();
1826*53ee8cc1Swenshuai.xi 
1827*53ee8cc1Swenshuai.xi         					if (u32State & E_HdcpTX_EVENT_RITIMER)//if (_MDrv_HDCP_GetTimeDiff(gdwPreTime, gdwCurTime) > HDCP14TX_CHECK_RI_WDT)
1828*53ee8cc1Swenshuai.xi         					{
1829*53ee8cc1Swenshuai.xi         						if (_MDrv_HDCPTX_AuthCheckRi() == E_HDMITX_HDCP_SYNC_RI_FAIL) //if (hal_HDCP14Tx_CompareRi() == FALSE) //Ri failed
1830*53ee8cc1Swenshuai.xi         						{
1831*53ee8cc1Swenshuai.xi         							DBG_HDCP(printf("%s::Check Ri failed! %d\n", __FUNCTION__, gdwCurTime));
1832*53ee8cc1Swenshuai.xi 
1833*53ee8cc1Swenshuai.xi         							psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A0;
1834*53ee8cc1Swenshuai.xi         							psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_AuthFail;
1835*53ee8cc1Swenshuai.xi         							MHal_HDMITx_HdcpSetEncrypt(DISABLE);//hal_HDCP14Tx_EnableEncryption(FALSE);
1836*53ee8cc1Swenshuai.xi         							psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPAuth_Status = E_HDMITX_HDCP_SYNC_RI_FAIL;
1837*53ee8cc1Swenshuai.xi                                     psHDMITXResPri->stHdcpTxInfo.hdcp14tx_PreSubState = HDCP14Tx_SubFSM_CheckRi;
1838*53ee8cc1Swenshuai.xi         						}
1839*53ee8cc1Swenshuai.xi         						//gdwPreTime = gdwCurTime;
1840*53ee8cc1Swenshuai.xi         					}
1841*53ee8cc1Swenshuai.xi         				break;
1842*53ee8cc1Swenshuai.xi 
1843*53ee8cc1Swenshuai.xi         				default:
1844*53ee8cc1Swenshuai.xi         				break;
1845*53ee8cc1Swenshuai.xi         			}
1846*53ee8cc1Swenshuai.xi         		break;
1847*53ee8cc1Swenshuai.xi 
1848*53ee8cc1Swenshuai.xi         		case HDCP14Tx_MainState_A5:
1849*53ee8cc1Swenshuai.xi         		break;
1850*53ee8cc1Swenshuai.xi 
1851*53ee8cc1Swenshuai.xi         		case HDCP14Tx_MainState_A6:
1852*53ee8cc1Swenshuai.xi         			switch (psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState)
1853*53ee8cc1Swenshuai.xi         			{
1854*53ee8cc1Swenshuai.xi         				case HDCP14Tx_SubFSM_IDLE:
1855*53ee8cc1Swenshuai.xi         					//gHdcpTxInfo.bRepeaterMode = (gHdcpTxInfo.ucBCaps & 0x40) ? TRUE : FALSE; //BCaps: b'[6] downstream is repeater
1856*53ee8cc1Swenshuai.xi         					if (psHDMITXResPri->stHdcpTxInfo.hdmitx_HdcpCheckRepeater_flag == TRUE) //if (gHdcpTxInfo.bRepeaterMode == TRUE)
1857*53ee8cc1Swenshuai.xi         					{
1858*53ee8cc1Swenshuai.xi         						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A8;
1859*53ee8cc1Swenshuai.xi         						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_IDLE;
1860*53ee8cc1Swenshuai.xi         					}
1861*53ee8cc1Swenshuai.xi         					else
1862*53ee8cc1Swenshuai.xi         					{
1863*53ee8cc1Swenshuai.xi         						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A4;
1864*53ee8cc1Swenshuai.xi         						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_IDLE;
1865*53ee8cc1Swenshuai.xi         					}
1866*53ee8cc1Swenshuai.xi         				break;
1867*53ee8cc1Swenshuai.xi         				default:
1868*53ee8cc1Swenshuai.xi         					DBG_HDCP(printf("%s::Invalid State!\n", __FUNCTION__));
1869*53ee8cc1Swenshuai.xi         				break;
1870*53ee8cc1Swenshuai.xi         			}
1871*53ee8cc1Swenshuai.xi                     MsOS_SetEvent(_s32HDMITxEventId, E_HdcpTX_EVENT_RUN);
1872*53ee8cc1Swenshuai.xi         		break;
1873*53ee8cc1Swenshuai.xi 
1874*53ee8cc1Swenshuai.xi         		case HDCP14Tx_MainState_A7:
1875*53ee8cc1Swenshuai.xi         			DBG_HDCP(printf("%s::Invalid State!\n", __FUNCTION__));
1876*53ee8cc1Swenshuai.xi         		break;
1877*53ee8cc1Swenshuai.xi 
1878*53ee8cc1Swenshuai.xi         		case HDCP14Tx_MainState_A8:
1879*53ee8cc1Swenshuai.xi         			switch (psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState)
1880*53ee8cc1Swenshuai.xi         			{
1881*53ee8cc1Swenshuai.xi         				case HDCP14Tx_SubFSM_IDLE:
1882*53ee8cc1Swenshuai.xi         					//TBD: set up 5 sec WDT and polling Rx ready bit
1883*53ee8cc1Swenshuai.xi         					gdwPreTime = MsOS_GetSystemTime();
1884*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A8;
1885*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_PollingRdyBit;
1886*53ee8cc1Swenshuai.xi         				break;
1887*53ee8cc1Swenshuai.xi 
1888*53ee8cc1Swenshuai.xi         				case HDCP14Tx_SubFSM_PollingRdyBit:
1889*53ee8cc1Swenshuai.xi         					//TBD: if ready then go A9; else go to A0
1890*53ee8cc1Swenshuai.xi         					gdwCurTime = MsOS_GetSystemTime();
1891*53ee8cc1Swenshuai.xi         					if (_MDrv_HDCP_GetTimeDiff(gdwPreTime, gdwCurTime) < HDCP14TX_REP_RDY_BIT_WDT)
1892*53ee8cc1Swenshuai.xi         					{
1893*53ee8cc1Swenshuai.xi         						if (_MDrv_HDCPTx_AuthCheckRepeaterReady() == E_HDMITX_HDCP_REPEATER_NOT_READY)
1894*53ee8cc1Swenshuai.xi         						{
1895*53ee8cc1Swenshuai.xi         							//gdwPreTime = gdwCurTime;
1896*53ee8cc1Swenshuai.xi         							break;
1897*53ee8cc1Swenshuai.xi         						}
1898*53ee8cc1Swenshuai.xi         						else
1899*53ee8cc1Swenshuai.xi         						{
1900*53ee8cc1Swenshuai.xi         							//go to state A9 and start check KSV list
1901*53ee8cc1Swenshuai.xi         							psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A9;
1902*53ee8cc1Swenshuai.xi         							psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_AuthWithRepeater;//HDCP14Tx_SubFSM_IDLE;
1903*53ee8cc1Swenshuai.xi                                     psHDMITXResPri->stHdcpTxInfo.hdcp14tx_PreSubState = HDCP14Tx_SubFSM_PollingRdyBit;
1904*53ee8cc1Swenshuai.xi         						}
1905*53ee8cc1Swenshuai.xi         					}
1906*53ee8cc1Swenshuai.xi         					else //timeout
1907*53ee8cc1Swenshuai.xi         					{
1908*53ee8cc1Swenshuai.xi         						DBG_HDCP(printf("%s::Polling Repeater Ready Bit Timeout !!\n", __FUNCTION__));
1909*53ee8cc1Swenshuai.xi         						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A0;
1910*53ee8cc1Swenshuai.xi         						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_AuthFail;
1911*53ee8cc1Swenshuai.xi                                 psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPAuth_Status = E_HDMITX_HDCP_REPEATER_TIMEOUT;
1912*53ee8cc1Swenshuai.xi                                 psHDMITXResPri->stHdcpTxInfo.hdcp14tx_PreSubState = HDCP14Tx_SubFSM_PollingRdyBit;
1913*53ee8cc1Swenshuai.xi         					}
1914*53ee8cc1Swenshuai.xi         				break;
1915*53ee8cc1Swenshuai.xi 
1916*53ee8cc1Swenshuai.xi         				default:
1917*53ee8cc1Swenshuai.xi         					DBG_HDCP(printf("%s::Invalid State!\n", __FUNCTION__));
1918*53ee8cc1Swenshuai.xi         				break;
1919*53ee8cc1Swenshuai.xi         			}
1920*53ee8cc1Swenshuai.xi                     MsOS_SetEvent(_s32HDMITxEventId, E_HdcpTX_EVENT_RUN);
1921*53ee8cc1Swenshuai.xi         		break;
1922*53ee8cc1Swenshuai.xi 
1923*53ee8cc1Swenshuai.xi         		case HDCP14Tx_MainState_A9:
1924*53ee8cc1Swenshuai.xi         			switch (psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState)
1925*53ee8cc1Swenshuai.xi         			{
1926*53ee8cc1Swenshuai.xi         				case HDCP14Tx_SubFSM_IDLE:
1927*53ee8cc1Swenshuai.xi         					psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A9;
1928*53ee8cc1Swenshuai.xi         					psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_AuthWithRepeater;
1929*53ee8cc1Swenshuai.xi         				break;
1930*53ee8cc1Swenshuai.xi 
1931*53ee8cc1Swenshuai.xi         				case HDCP14Tx_SubFSM_AuthWithRepeater:
1932*53ee8cc1Swenshuai.xi         					if (_MDrv_HDCPTx_CheckRepeater() == E_HDMITX_HDCP_REPEATER_SHA1_PASS)//if (hal_HDCP14Tx_AuthWithRepeater())
1933*53ee8cc1Swenshuai.xi         					{
1934*53ee8cc1Swenshuai.xi         						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A4;
1935*53ee8cc1Swenshuai.xi         						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_IDLE;
1936*53ee8cc1Swenshuai.xi                                 psHDMITXResPri->stHdcpTxInfo.hdcp14tx_PreSubState = HDCP14Tx_SubFSM_AuthWithRepeater;
1937*53ee8cc1Swenshuai.xi         					}
1938*53ee8cc1Swenshuai.xi         					else
1939*53ee8cc1Swenshuai.xi         					{
1940*53ee8cc1Swenshuai.xi         						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A0;
1941*53ee8cc1Swenshuai.xi         						psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_AuthFail;
1942*53ee8cc1Swenshuai.xi                                 psHDMITXResPri->stHdcpTxInfo.hdcp14tx_PreSubState = HDCP14Tx_SubFSM_AuthWithRepeater;
1943*53ee8cc1Swenshuai.xi         					}
1944*53ee8cc1Swenshuai.xi         				break;
1945*53ee8cc1Swenshuai.xi 
1946*53ee8cc1Swenshuai.xi         				default:
1947*53ee8cc1Swenshuai.xi         					DBG_HDCP(printf("%s::Invalid State!\n", __FUNCTION__));
1948*53ee8cc1Swenshuai.xi         				break;
1949*53ee8cc1Swenshuai.xi         			}
1950*53ee8cc1Swenshuai.xi                     MsOS_SetEvent(_s32HDMITxEventId, E_HdcpTX_EVENT_RUN);
1951*53ee8cc1Swenshuai.xi         		break;
1952*53ee8cc1Swenshuai.xi 
1953*53ee8cc1Swenshuai.xi         		default:
1954*53ee8cc1Swenshuai.xi         		break;
1955*53ee8cc1Swenshuai.xi         	}
1956*53ee8cc1Swenshuai.xi 
1957*53ee8cc1Swenshuai.xi             //MsOS_SetEvent(_s32HDMITxEventId, E_HdcpTX_EVENT_RUN);
1958*53ee8cc1Swenshuai.xi 
1959*53ee8cc1Swenshuai.xi         } //gHdcpTxInfo.hdmitx_hdcp_flag == TRUE;
1960*53ee8cc1Swenshuai.xi         else
1961*53ee8cc1Swenshuai.xi         {
1962*53ee8cc1Swenshuai.xi             MDrv_HDCPTx_SetAuthDoneFlag(pInstance, FALSE);
1963*53ee8cc1Swenshuai.xi             psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPAuth_Status = E_HDMITX_HDCP_AUTH_FAIL;
1964*53ee8cc1Swenshuai.xi         }
1965*53ee8cc1Swenshuai.xi     } //((gHdcpTxInfo.hdcp_Rx_valid == TRUE) && (MDrv_HDMITx_GetTmdsEnFlag() == TRUE))
1966*53ee8cc1Swenshuai.xi     else
1967*53ee8cc1Swenshuai.xi     {
1968*53ee8cc1Swenshuai.xi         MDrv_HDCPTx_SetAuthDoneFlag(pInstance, FALSE);
1969*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState = HDCP14Tx_MainState_A0;
1970*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState = HDCP14Tx_SubFSM_IDLE;
1971*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHdcpTxInfo.hdmitx_HDCPAuth_Status = E_HDMITX_HDCP_RX_IS_NOT_VALID;
1972*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHdcpTxInfo.revocation_state = E_CHECK_NOT_READY;
1973*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHdcpTxInfo.HDCP_74_check = FALSE;
1974*53ee8cc1Swenshuai.xi     }
1975*53ee8cc1Swenshuai.xi }
1976*53ee8cc1Swenshuai.xi 
1977*53ee8cc1Swenshuai.xi //**************************************************************************
1978*53ee8cc1Swenshuai.xi //  [Function Name]:
1979*53ee8cc1Swenshuai.xi //			()
1980*53ee8cc1Swenshuai.xi //  [Description]:
1981*53ee8cc1Swenshuai.xi //
1982*53ee8cc1Swenshuai.xi //  [Arguments]:
1983*53ee8cc1Swenshuai.xi //
1984*53ee8cc1Swenshuai.xi //  [Return]:
1985*53ee8cc1Swenshuai.xi //
1986*53ee8cc1Swenshuai.xi //
1987*53ee8cc1Swenshuai.xi //**************************************************************************
1988*53ee8cc1Swenshuai.xi #if 0
1989*53ee8cc1Swenshuai.xi 
1990*53ee8cc1Swenshuai.xi static void _HDCPTx_Task(void) //wilson@kano
1991*53ee8cc1Swenshuai.xi {
1992*53ee8cc1Swenshuai.xi     MS_U32 u32Events = 0;
1993*53ee8cc1Swenshuai.xi 
1994*53ee8cc1Swenshuai.xi     while (g_bHdcpTxTask == TRUE)
1995*53ee8cc1Swenshuai.xi     {
1996*53ee8cc1Swenshuai.xi         MsOS_WaitEvent(_s32HdcpTxEventId, E_HdcpTX_EVENT_RUN | E_HdcpTX_EVENT_IRQ | E_HdcpTX_EVENT_RITIMER, &u32Events, E_OR_CLEAR, 5000);
1997*53ee8cc1Swenshuai.xi 
1998*53ee8cc1Swenshuai.xi         if (gHdcpTxInfo.hdcp_Rx_valid == TRUE)
1999*53ee8cc1Swenshuai.xi             HDCPTx_Handler(u32Events);
2000*53ee8cc1Swenshuai.xi 
2001*53ee8cc1Swenshuai.xi         MsOS_DelayTask(HDCPTX_MONITOR_DELAY);
2002*53ee8cc1Swenshuai.xi     } // Task loop
2003*53ee8cc1Swenshuai.xi }
2004*53ee8cc1Swenshuai.xi 
2005*53ee8cc1Swenshuai.xi #endif
2006*53ee8cc1Swenshuai.xi 
2007*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2008*53ee8cc1Swenshuai.xi /// @brief This routine initializes HDCP Tx module
2009*53ee8cc1Swenshuai.xi /// @return None
2010*53ee8cc1Swenshuai.xi /// HDCP driver is in @ref E_TASK_PRI_HIGH level
2011*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDCPTx_Init(void * pInstance)2012*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDCPTx_Init(void *pInstance) //wilson@kano
2013*53ee8cc1Swenshuai.xi {
2014*53ee8cc1Swenshuai.xi     #if 1
2015*53ee8cc1Swenshuai.xi     MDrv_HDCPTx_InitVariable(pInstance);
2016*53ee8cc1Swenshuai.xi     #else
2017*53ee8cc1Swenshuai.xi     _hdcptx_status.bIsInitialized = TRUE;
2018*53ee8cc1Swenshuai.xi     _hdcptx_status.bIsRunning     = TRUE;
2019*53ee8cc1Swenshuai.xi 
2020*53ee8cc1Swenshuai.xi     if (_s32HdcpTxTaskId >= 0)
2021*53ee8cc1Swenshuai.xi     {
2022*53ee8cc1Swenshuai.xi         DBG_HDMITX(printf("MDrv_HdcpTx_Init: already initialized.\n"));
2023*53ee8cc1Swenshuai.xi         return TRUE;
2024*53ee8cc1Swenshuai.xi     }
2025*53ee8cc1Swenshuai.xi 
2026*53ee8cc1Swenshuai.xi     DBG_HDMITX(printf("%s\n", __FUNCTION__));
2027*53ee8cc1Swenshuai.xi 
2028*53ee8cc1Swenshuai.xi     MDrv_HDCPTx_InitVariable();
2029*53ee8cc1Swenshuai.xi 
2030*53ee8cc1Swenshuai.xi     _s32HdcpTxEventId = MsOS_CreateEventGroup("HDCPTx_Event");
2031*53ee8cc1Swenshuai.xi     if (_s32HdcpTxEventId < 0)
2032*53ee8cc1Swenshuai.xi     {
2033*53ee8cc1Swenshuai.xi         ///MsOS_DeleteMutex(_s32HDMITxMutexId);
2034*53ee8cc1Swenshuai.xi         return FALSE;
2035*53ee8cc1Swenshuai.xi     }
2036*53ee8cc1Swenshuai.xi 
2037*53ee8cc1Swenshuai.xi     _pHdcpTxTaskStack = _u8HdcpTx_StackBuffer;
2038*53ee8cc1Swenshuai.xi     g_bHdcpTxTask = TRUE;
2039*53ee8cc1Swenshuai.xi     _s32HdcpTxTaskId = MsOS_CreateTask((TaskEntry)_HDCPTx_Task,
2040*53ee8cc1Swenshuai.xi                                     (MS_U32)NULL,
2041*53ee8cc1Swenshuai.xi                                     E_TASK_PRI_HIGH,
2042*53ee8cc1Swenshuai.xi                                     TRUE,
2043*53ee8cc1Swenshuai.xi                                     _pHdcpTxTaskStack,
2044*53ee8cc1Swenshuai.xi                                     HDCPTX_TASK_STACK_SIZE,
2045*53ee8cc1Swenshuai.xi                                     "HDCPTx_Task");
2046*53ee8cc1Swenshuai.xi     if (_s32HdcpTxTaskId < 0)
2047*53ee8cc1Swenshuai.xi     {
2048*53ee8cc1Swenshuai.xi         MsOS_DeleteEventGroup(_s32HdcpTxEventId);
2049*53ee8cc1Swenshuai.xi         printf("create hdmi task failed\r\n");
2050*53ee8cc1Swenshuai.xi         ///MsOS_DeleteMutex(_s32HDMITxMutexId);
2051*53ee8cc1Swenshuai.xi         return FALSE;
2052*53ee8cc1Swenshuai.xi     }
2053*53ee8cc1Swenshuai.xi     #endif
2054*53ee8cc1Swenshuai.xi 
2055*53ee8cc1Swenshuai.xi     return TRUE;
2056*53ee8cc1Swenshuai.xi }
2057*53ee8cc1Swenshuai.xi 
2058*53ee8cc1Swenshuai.xi 
2059*53ee8cc1Swenshuai.xi /*********************************************************************/
2060*53ee8cc1Swenshuai.xi /*                                                                                                                     */
2061*53ee8cc1Swenshuai.xi /*                               Sorting HDMI Tx function here                                           */
2062*53ee8cc1Swenshuai.xi /*                                                                                                                     */
2063*53ee8cc1Swenshuai.xi /*********************************************************************/
____HDMITx_Relative_Func____(void)2064*53ee8cc1Swenshuai.xi void ____HDMITx_Relative_Func____(void){} //Null function for navigation
2065*53ee8cc1Swenshuai.xi 
2066*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
2067*53ee8cc1Swenshuai.xi // Check Rx timer callback
2068*53ee8cc1Swenshuai.xi // @param  stTimer \b IN: Useless
2069*53ee8cc1Swenshuai.xi // @param  u32Data \b IN: Useless
2070*53ee8cc1Swenshuai.xi // @return None
2071*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
_MDrv_HDMITX_CheckRx_TimerCallback(MS_U32 stTimer,MS_U32 u32Data)2072*53ee8cc1Swenshuai.xi static void _MDrv_HDMITX_CheckRx_TimerCallback(MS_U32 stTimer, MS_U32 u32Data)
2073*53ee8cc1Swenshuai.xi {
2074*53ee8cc1Swenshuai.xi     // Check HDMI receiver status
2075*53ee8cc1Swenshuai.xi     gbCurRxStatus = MHal_HDMITx_GetRXStatus();
2076*53ee8cc1Swenshuai.xi     MsOS_SetEvent(_s32HDMITxEventId, E_HDMITX_EVENT_RXTIMER);
2077*53ee8cc1Swenshuai.xi }
2078*53ee8cc1Swenshuai.xi 
_MDrv_HDMITX_InitEdidField(void * pInstance)2079*53ee8cc1Swenshuai.xi void _MDrv_HDMITX_InitEdidField(void* pInstance)
2080*53ee8cc1Swenshuai.xi {
2081*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
2082*53ee8cc1Swenshuai.xi 
2083*53ee8cc1Swenshuai.xi     //edid relative //assign initial value
2084*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.EdidBlk0, 0x00, HDMITX_EDID_BLK_SIZE*sizeof(MS_U8));
2085*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.EdidBlk1, 0x00, HDMITX_EDID_BLK_SIZE*sizeof(MS_U8));
2086*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.ManufacturerID, 0x00, 3*sizeof(MS_U8));
2087*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.CEADataBlkLen, 0x00, HDMITX_CEA_DAT_BLK_TYPE_NUM*sizeof(MS_U8));
2088*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.PhyAddr, 0x00, 2*sizeof(MS_U8));
2089*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportHdmi = FALSE;
2090*53ee8cc1Swenshuai.xi 
2091*53ee8cc1Swenshuai.xi 	//HF-VSDB, scdc relative
2092*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HF_VSDBVerInfo = 0x00;
2093*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.MaxTmdsCharRate = 0x00;
2094*53ee8cc1Swenshuai.xi     #if 0
2095*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportIndependView = FALSE;
2096*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportDualView = FALSE;
2097*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support3DOsdDisparity = FALSE;
2098*53ee8cc1Swenshuai.xi     #endif
2099*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportLTEScramble = FALSE;
2100*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportSCDC = FALSE;
2101*53ee8cc1Swenshuai.xi 
2102*53ee8cc1Swenshuai.xi     //read request
2103*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YUV420DeepColorInfo = 0x00;
2104*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.AudSupportAI = FALSE;
2105*53ee8cc1Swenshuai.xi     #if 0
2106*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.b3DPresent = FALSE;
2107*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support2D_50Hz = FALSE;
2108*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support2D_60Hz = FALSE;
2109*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support3D_50Hz = FALSE;
2110*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support3D_60Hz = FALSE;
2111*53ee8cc1Swenshuai.xi     #endif
2112*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.ColorDepthInfo = E_HDMITX_VIDEO_CD_NoID;
2113*53ee8cc1Swenshuai.xi 
2114*53ee8cc1Swenshuai.xi     // data block content
2115*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.AudioDataBlk, 0x00, 32*sizeof(MS_U8));
2116*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VideoDataBlk, 0x00, 32*sizeof(MS_U8));
2117*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VendorDataBlk, 0x00, 32*sizeof(MS_U8));
2118*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SpeakerAllocDataBlk, 0x00, 32*sizeof(MS_U8));
2119*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VESA_DTCDataBlk, 0x00, 32*sizeof(MS_U8));
2120*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HdmiVICList, 0x00, 7*sizeof(MS_U8)); //this field has only 3 bits
2121*53ee8cc1Swenshuai.xi     #if 0
2122*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming, 0x00, 32*sizeof(MS_U8));
2123*53ee8cc1Swenshuai.xi     #endif
2124*53ee8cc1Swenshuai.xi 
2125*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HDMI_VSDB, 0x00, 32*sizeof(MS_U8));
2126*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HF_VSDB, 0x00, 32*sizeof(MS_U8));
2127*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HDMI_VSDB_Len = 0x00;
2128*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HF_VSDB_Len = 0x00;
2129*53ee8cc1Swenshuai.xi     #if 0
2130*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.b3dMultiPresent = 0x00;
2131*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Hdmi3DLen = 0x00;
2132*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HdmiVICLen = 0x00;
2133*53ee8cc1Swenshuai.xi     #endif
2134*53ee8cc1Swenshuai.xi 
2135*53ee8cc1Swenshuai.xi     //for 420
2136*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support420ColorFmt = FALSE;
2137*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YCbCr420VidDataBlk, 0x00, 32*sizeof(MS_U8));
2138*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YCbCr420CapMapDataBlk, 0x00, 32*sizeof(MS_U8));
2139*53ee8cc1Swenshuai.xi 
2140*53ee8cc1Swenshuai.xi     //for colorimetry
2141*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.ExtColorimetry = 0x00;
2142*53ee8cc1Swenshuai.xi 
2143*53ee8cc1Swenshuai.xi     //for HDR
2144*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.bSupportHDR = FALSE;
2145*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HDRStaticDataBlk, 0x00, 32*sizeof(MS_U8));
2146*53ee8cc1Swenshuai.xi }
2147*53ee8cc1Swenshuai.xi 
2148*53ee8cc1Swenshuai.xi /**************************************************************************/
2149*53ee8cc1Swenshuai.xi //  [Function Name]:
2150*53ee8cc1Swenshuai.xi //                      _MDrv_HDMIRx_MapVideoTimingToVIC()
2151*53ee8cc1Swenshuai.xi //  [Description]:
2152*53ee8cc1Swenshuai.xi //                      mapping timing table to VIC code
2153*53ee8cc1Swenshuai.xi //  [Arguments]:
2154*53ee8cc1Swenshuai.xi //                      [MsHDMITX_VIDEO_TIMING] timing
2155*53ee8cc1Swenshuai.xi //  [Return]:
2156*53ee8cc1Swenshuai.xi //                      MsHDMITX_AVI_VIC
2157*53ee8cc1Swenshuai.xi //**************************************************************************/
_MDrv_HDMIRx_MapVideoTimingToVIC(MsHDMITX_VIDEO_TIMING timing)2158*53ee8cc1Swenshuai.xi static MsHDMITX_AVI_VIC _MDrv_HDMIRx_MapVideoTimingToVIC(MsHDMITX_VIDEO_TIMING timing)
2159*53ee8cc1Swenshuai.xi {
2160*53ee8cc1Swenshuai.xi     //msdbg Todo: 6.6G report 3840x2160_60P VIc
2161*53ee8cc1Swenshuai.xi 
2162*53ee8cc1Swenshuai.xi     switch(timing)
2163*53ee8cc1Swenshuai.xi     {
2164*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_640x480p:
2165*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_640x480p_60_4_3;
2166*53ee8cc1Swenshuai.xi 
2167*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_720x480i:
2168*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_720x480i_60_16_9;
2169*53ee8cc1Swenshuai.xi 
2170*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_720x576i:
2171*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_720x576i_50_16_9;
2172*53ee8cc1Swenshuai.xi 
2173*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_720x480p:
2174*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_720x480p_60_16_9;
2175*53ee8cc1Swenshuai.xi 
2176*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_720x576p:
2177*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_720x576p_50_16_9;
2178*53ee8cc1Swenshuai.xi 
2179*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_1280x720p_50Hz:
2180*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_1280x720p_50_16_9;
2181*53ee8cc1Swenshuai.xi 
2182*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_1280x720p_60Hz:
2183*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_1280x720p_60_16_9;
2184*53ee8cc1Swenshuai.xi 
2185*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_1920x1080i_50Hz:
2186*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_1920x1080i_50_16_9;
2187*53ee8cc1Swenshuai.xi 
2188*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_1920x1080i_60Hz:
2189*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_1920x1080i_60_16_9;
2190*53ee8cc1Swenshuai.xi 
2191*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_1920x1080p_24Hz:
2192*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_1920x1080p_24_16_9;
2193*53ee8cc1Swenshuai.xi 
2194*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_1920x1080p_25Hz:
2195*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_1920x1080p_25_16_9;
2196*53ee8cc1Swenshuai.xi 
2197*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_1920x1080p_30Hz:
2198*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_1920x1080p_30_16_9;
2199*53ee8cc1Swenshuai.xi 
2200*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_1920x1080p_50Hz:
2201*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_1920x1080p_50_16_9;
2202*53ee8cc1Swenshuai.xi 
2203*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_1920x1080p_60Hz:
2204*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_1920x1080p_60_16_9;
2205*53ee8cc1Swenshuai.xi 
2206*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_1920x2205p_24Hz:// for 3D timing
2207*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_1920x1080p_24_16_9;
2208*53ee8cc1Swenshuai.xi 
2209*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_3840x2160p_24Hz:
2210*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_3840x2160p_24_16_9;
2211*53ee8cc1Swenshuai.xi 
2212*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_3840x2160p_25Hz:
2213*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_3840x2160p_25_16_9;
2214*53ee8cc1Swenshuai.xi 
2215*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_3840x2160p_30Hz:
2216*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_3840x2160p_30_16_9;
2217*53ee8cc1Swenshuai.xi 
2218*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_3840x2160p_50Hz:
2219*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_3840x2160p_50_16_9;
2220*53ee8cc1Swenshuai.xi 
2221*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_3840x2160p_60Hz:
2222*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_3840x2160p_60_16_9;
2223*53ee8cc1Swenshuai.xi 
2224*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_4096x2160p_24Hz:
2225*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_4096x2160p_24_256_135;
2226*53ee8cc1Swenshuai.xi 
2227*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_4096x2160p_25Hz:
2228*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_4096x2160p_25_256_135;
2229*53ee8cc1Swenshuai.xi 
2230*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_4096x2160p_30Hz:
2231*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_4096x2160p_25_256_135;
2232*53ee8cc1Swenshuai.xi 
2233*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_4096x2160p_50Hz:
2234*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_4096x2160p_50_256_135;
2235*53ee8cc1Swenshuai.xi 
2236*53ee8cc1Swenshuai.xi         case E_HDMITX_RES_4096x2160p_60Hz:
2237*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_4096x2160p_60_256_135;
2238*53ee8cc1Swenshuai.xi 
2239*53ee8cc1Swenshuai.xi         default:
2240*53ee8cc1Swenshuai.xi             printf("[HDMITx]: Error video timing: %d\n", timing);
2241*53ee8cc1Swenshuai.xi             return E_HDMITX_VIC_NOT_AVAILABLE;
2242*53ee8cc1Swenshuai.xi     }
2243*53ee8cc1Swenshuai.xi }
2244*53ee8cc1Swenshuai.xi 
2245*53ee8cc1Swenshuai.xi //**************************************************************************/
2246*53ee8cc1Swenshuai.xi //  [Function Name]:
2247*53ee8cc1Swenshuai.xi //                      _MDrv_HDMITx_ParseDeepColorInfo()
2248*53ee8cc1Swenshuai.xi //  [Description]:
2249*53ee8cc1Swenshuai.xi //                      mapping EDID field to color depth information
2250*53ee8cc1Swenshuai.xi //  [Arguments]:
2251*53ee8cc1Swenshuai.xi //                      [MS_U8] u8DataByte
2252*53ee8cc1Swenshuai.xi //  [Return]:
2253*53ee8cc1Swenshuai.xi //                      void
2254*53ee8cc1Swenshuai.xi //**************************************************************************/
_MDrv_HDMITx_ParseDeepColorInfo(void * pInstance,MS_U8 u8DataByte)2255*53ee8cc1Swenshuai.xi void _MDrv_HDMITx_ParseDeepColorInfo(void* pInstance, MS_U8 u8DataByte)
2256*53ee8cc1Swenshuai.xi {
2257*53ee8cc1Swenshuai.xi #define DBG_DEEPCOLOR_INFO 1
2258*53ee8cc1Swenshuai.xi 
2259*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
2260*53ee8cc1Swenshuai.xi 
2261*53ee8cc1Swenshuai.xi 	//check Deep Color information
2262*53ee8cc1Swenshuai.xi 	if ( u8DataByte & 0x40 )
2263*53ee8cc1Swenshuai.xi     {
2264*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.RxEdidInfo.ColorDepthInfo = E_HDMITX_VIDEO_CD_48Bits;
2265*53ee8cc1Swenshuai.xi         #if (DBG_DEEPCOLOR_INFO == 1)
2266*53ee8cc1Swenshuai.xi 			printf("%s::Support Color Depth 48-bit\r\n", __FUNCTION__);
2267*53ee8cc1Swenshuai.xi 		#endif
2268*53ee8cc1Swenshuai.xi     }
2269*53ee8cc1Swenshuai.xi 	else if ( u8DataByte & 0x20 )
2270*53ee8cc1Swenshuai.xi 	{
2271*53ee8cc1Swenshuai.xi 		psHDMITXResPri->stHDMITxInfo.RxEdidInfo.ColorDepthInfo = E_HDMITX_VIDEO_CD_36Bits;
2272*53ee8cc1Swenshuai.xi 
2273*53ee8cc1Swenshuai.xi 		#if (DBG_DEEPCOLOR_INFO == 1)
2274*53ee8cc1Swenshuai.xi 			printf("%s::Support Color Depth 36-bit\r\n", __FUNCTION__);
2275*53ee8cc1Swenshuai.xi 		#endif
2276*53ee8cc1Swenshuai.xi 	}
2277*53ee8cc1Swenshuai.xi 	else if ( u8DataByte & 0x10 )
2278*53ee8cc1Swenshuai.xi 	{
2279*53ee8cc1Swenshuai.xi 		psHDMITXResPri->stHDMITxInfo.RxEdidInfo.ColorDepthInfo = E_HDMITX_VIDEO_CD_30Bits;
2280*53ee8cc1Swenshuai.xi 
2281*53ee8cc1Swenshuai.xi 		#if (DBG_DEEPCOLOR_INFO == 1)
2282*53ee8cc1Swenshuai.xi 			printf("%s::Support Color Depth 30-bit\r\n", __FUNCTION__);
2283*53ee8cc1Swenshuai.xi 		#endif
2284*53ee8cc1Swenshuai.xi 	}
2285*53ee8cc1Swenshuai.xi 	else
2286*53ee8cc1Swenshuai.xi 		psHDMITXResPri->stHDMITxInfo.RxEdidInfo.ColorDepthInfo = E_HDMITX_VIDEO_CD_24Bits;
2287*53ee8cc1Swenshuai.xi 
2288*53ee8cc1Swenshuai.xi #undef DBG_DEEPCOLOR_INFO
2289*53ee8cc1Swenshuai.xi 
2290*53ee8cc1Swenshuai.xi }
2291*53ee8cc1Swenshuai.xi 
2292*53ee8cc1Swenshuai.xi 
2293*53ee8cc1Swenshuai.xi //**************************************************************************/
2294*53ee8cc1Swenshuai.xi //  [Function Name]:
2295*53ee8cc1Swenshuai.xi //                      _MDrv_HDMITx_ParseHdmiVSDB
2296*53ee8cc1Swenshuai.xi //  [Description]:
2297*53ee8cc1Swenshuai.xi //                      Parsing HDMI VSDB part
2298*53ee8cc1Swenshuai.xi //  [Arguments]:
2299*53ee8cc1Swenshuai.xi //                      [MS_U8]* pu8BlkData
2300*53ee8cc1Swenshuai.xi //                      [MS_U8] u8BlkLen
2301*53ee8cc1Swenshuai.xi //                      [MS_U8] u8SupTimingNum
2302*53ee8cc1Swenshuai.xi //  [Return]:
2303*53ee8cc1Swenshuai.xi //                      [MS_BOOL] TRUE: successful; FALSE: failed
2304*53ee8cc1Swenshuai.xi //**************************************************************************/
_MDrv_HDMITx_ParseHdmiVSDB(void * pInstance,MS_U8 * pu8BlkData,MS_U8 u8BlkLen,MS_U8 u8SupTimingNum)2305*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_HDMITx_ParseHdmiVSDB(void* pInstance, MS_U8* pu8BlkData, MS_U8 u8BlkLen, MS_U8 u8SupTimingNum)
2306*53ee8cc1Swenshuai.xi {
2307*53ee8cc1Swenshuai.xi #define DBG_HDMIVSDB_INFO 1U
2308*53ee8cc1Swenshuai.xi 	MS_U8 i = 0;
2309*53ee8cc1Swenshuai.xi 
2310*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
2311*53ee8cc1Swenshuai.xi 
2312*53ee8cc1Swenshuai.xi 	//get Physical Address
2313*53ee8cc1Swenshuai.xi 	psHDMITXResPri->stHDMITxInfo.RxEdidInfo.PhyAddr[0] = *(pu8BlkData + 3);
2314*53ee8cc1Swenshuai.xi 	psHDMITXResPri->stHDMITxInfo.RxEdidInfo.PhyAddr[1] = *(pu8BlkData + 4);
2315*53ee8cc1Swenshuai.xi     #if (DBG_HDMIVSDB_INFO == 1)
2316*53ee8cc1Swenshuai.xi         printf("Physcal Address = [%d, %d, %d, %d]\r\n", (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.PhyAddr[0] & 0xF0) >> 4, \
2317*53ee8cc1Swenshuai.xi                 psHDMITXResPri->stHDMITxInfo.RxEdidInfo.PhyAddr[0] & 0x0F, (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.PhyAddr[1] & 0xF0) >> 4, \
2318*53ee8cc1Swenshuai.xi                 psHDMITXResPri->stHDMITxInfo.RxEdidInfo.PhyAddr[1] & 0x0F);
2319*53ee8cc1Swenshuai.xi     #endif
2320*53ee8cc1Swenshuai.xi 
2321*53ee8cc1Swenshuai.xi 	if (u8BlkLen > 5)
2322*53ee8cc1Swenshuai.xi 	{
2323*53ee8cc1Swenshuai.xi 		psHDMITXResPri->stHDMITxInfo.RxEdidInfo.AudSupportAI = (*(pu8BlkData + 5) & 0x80)? TRUE : FALSE;
2324*53ee8cc1Swenshuai.xi 
2325*53ee8cc1Swenshuai.xi 		#if (DBG_HDMIVSDB_INFO == 1)
2326*53ee8cc1Swenshuai.xi 			printf("%s::Support AI = %d !\n", __FUNCTION__, psHDMITXResPri->stHDMITxInfo.RxEdidInfo.AudSupportAI);
2327*53ee8cc1Swenshuai.xi 		#endif
2328*53ee8cc1Swenshuai.xi 
2329*53ee8cc1Swenshuai.xi 		//check Deep Color information
2330*53ee8cc1Swenshuai.xi 		_MDrv_HDMITx_ParseDeepColorInfo(pInstance, *(pu8BlkData + 5));
2331*53ee8cc1Swenshuai.xi 
2332*53ee8cc1Swenshuai.xi 		if (u8BlkLen > 7)
2333*53ee8cc1Swenshuai.xi 		{
2334*53ee8cc1Swenshuai.xi 			if ( *(pu8BlkData + 7) & 0x20 ) // HDMI_Video_Present
2335*53ee8cc1Swenshuai.xi 			{
2336*53ee8cc1Swenshuai.xi 				MS_U8 u8IdxOffset = 0;
2337*53ee8cc1Swenshuai.xi 
2338*53ee8cc1Swenshuai.xi 				if ((*(pu8BlkData + 7) & 0xC0) == 0xC0) //Latency_Field_present & I_Latency_Field_Present
2339*53ee8cc1Swenshuai.xi 					u8IdxOffset = 4;
2340*53ee8cc1Swenshuai.xi 				else if ((*(pu8BlkData + 7) & 0xC0) == 0x40) //I_Latency_Field_Present
2341*53ee8cc1Swenshuai.xi 					u8IdxOffset = 2;
2342*53ee8cc1Swenshuai.xi 				else
2343*53ee8cc1Swenshuai.xi 					u8IdxOffset = 0;
2344*53ee8cc1Swenshuai.xi 
2345*53ee8cc1Swenshuai.xi                 if( (*(pu8BlkData + 6)) > psHDMITXResPri->stHDMITxInfo.RxEdidInfo.MaxTmdsCharRate)
2346*53ee8cc1Swenshuai.xi                 {
2347*53ee8cc1Swenshuai.xi                     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.MaxTmdsCharRate = *(pu8BlkData + 6);
2348*53ee8cc1Swenshuai.xi                 }
2349*53ee8cc1Swenshuai.xi 
2350*53ee8cc1Swenshuai.xi 				if (u8BlkLen > (u8IdxOffset + 9))
2351*53ee8cc1Swenshuai.xi 				{
2352*53ee8cc1Swenshuai.xi 					if ( (*(pu8BlkData + u8IdxOffset + 8) & 0x80) || ( ((*(pu8BlkData + u8IdxOffset + 9) & 0xE0) >> 5) > 0 ))//3D present and VIC LEN
2353*53ee8cc1Swenshuai.xi 					{
2354*53ee8cc1Swenshuai.xi 						MS_U8 u8_3dMultiPresent = 0;
2355*53ee8cc1Swenshuai.xi 						MS_U8 u8_Hdmi3DLen = 0;
2356*53ee8cc1Swenshuai.xi 						MS_U8 u8_HdmiVICLen = 0;
2357*53ee8cc1Swenshuai.xi                         #if 0
2358*53ee8cc1Swenshuai.xi 						MS_U16 u16_3dStructAll = 0;
2359*53ee8cc1Swenshuai.xi 						MS_U16 u16_3dMask = 0;
2360*53ee8cc1Swenshuai.xi                         #endif
2361*53ee8cc1Swenshuai.xi 
2362*53ee8cc1Swenshuai.xi                         //psHDMITXResPri->stHDMITxInfo.RxEdidInfo.b3DPresent = TRUE;
2363*53ee8cc1Swenshuai.xi                         #if 0
2364*53ee8cc1Swenshuai.xi                         psHDMITXResPri->stHDMITxInfo.RxEdidInfo.b3DPresent = (*(pu8BlkData + u8IdxOffset + 8) & 0x80) ? TRUE : FALSE;
2365*53ee8cc1Swenshuai.xi 						u8_3dMultiPresent = (*(pu8BlkData + u8IdxOffset + 8) & 0x60) >> 5;
2366*53ee8cc1Swenshuai.xi 						u8_Hdmi3DLen = (*(pu8BlkData + u8IdxOffset + 9) & 0x1F);
2367*53ee8cc1Swenshuai.xi                         #endif
2368*53ee8cc1Swenshuai.xi 						u8_HdmiVICLen = (*(pu8BlkData + u8IdxOffset + 9) & 0xE0) >> 5;
2369*53ee8cc1Swenshuai.xi                         #if 0
2370*53ee8cc1Swenshuai.xi                         psHDMITXResPri->stHDMITxInfo.RxEdidInfo.b3dMultiPresent = u8_3dMultiPresent;
2371*53ee8cc1Swenshuai.xi                         psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Hdmi3DLen = u8_Hdmi3DLen;
2372*53ee8cc1Swenshuai.xi                         #endif
2373*53ee8cc1Swenshuai.xi                         psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HdmiVICLen = u8_HdmiVICLen;
2374*53ee8cc1Swenshuai.xi 
2375*53ee8cc1Swenshuai.xi                         #if 0
2376*53ee8cc1Swenshuai.xi                         if(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support2D_60Hz && psHDMITXResPri->stHDMITxInfo.RxEdidInfo.b3DPresent)
2377*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support3D_60Hz = TRUE;
2378*53ee8cc1Swenshuai.xi 
2379*53ee8cc1Swenshuai.xi                         if(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support2D_50Hz && psHDMITXResPri->stHDMITxInfo.RxEdidInfo.b3DPresent)
2380*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support3D_50Hz = TRUE;
2381*53ee8cc1Swenshuai.xi                         #endif
2382*53ee8cc1Swenshuai.xi 
2383*53ee8cc1Swenshuai.xi                         #if (DBG_HDMIVSDB_INFO == 1)
2384*53ee8cc1Swenshuai.xi                             printf("%s::3dmulti_present=%x, 3DLen=%d, VicLen=%d !\n",
2385*53ee8cc1Swenshuai.xi                                 __FUNCTION__, u8_3dMultiPresent, u8_Hdmi3DLen, u8_HdmiVICLen);
2386*53ee8cc1Swenshuai.xi                         #endif
2387*53ee8cc1Swenshuai.xi 
2388*53ee8cc1Swenshuai.xi 						//fetch VIC list
2389*53ee8cc1Swenshuai.xi 						if ( u8_HdmiVICLen > 0 )
2390*53ee8cc1Swenshuai.xi 						{
2391*53ee8cc1Swenshuai.xi 							if ( u8BlkLen > (u8IdxOffset + 9 + u8_HdmiVICLen))
2392*53ee8cc1Swenshuai.xi 							{
2393*53ee8cc1Swenshuai.xi 								for ( i = 0; i < u8_HdmiVICLen; i++ )
2394*53ee8cc1Swenshuai.xi 									psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HdmiVICList[i] = *(pu8BlkData + u8IdxOffset + 10 + i);
2395*53ee8cc1Swenshuai.xi 
2396*53ee8cc1Swenshuai.xi 								#if (DBG_HDMIVSDB_INFO == 1)
2397*53ee8cc1Swenshuai.xi 									printf("%s::HDMI VIC list\r\n",__FUNCTION__);
2398*53ee8cc1Swenshuai.xi 									for ( i = 0; i < u8_HdmiVICLen; i++ )
2399*53ee8cc1Swenshuai.xi 										printf("0x%02X ", psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HdmiVICList[i]);
2400*53ee8cc1Swenshuai.xi 									printf("\n");
2401*53ee8cc1Swenshuai.xi 								#endif
2402*53ee8cc1Swenshuai.xi 
2403*53ee8cc1Swenshuai.xi 								u8IdxOffset += u8_HdmiVICLen; //HDMI_VIC_LEN
2404*53ee8cc1Swenshuai.xi 							}
2405*53ee8cc1Swenshuai.xi 						}
2406*53ee8cc1Swenshuai.xi 
2407*53ee8cc1Swenshuai.xi                         #if (DBG_HDMIVSDB_INFO == 1)
2408*53ee8cc1Swenshuai.xi                             printf("3D_MultiPresent = 0x%02X\r\n", u8_3dMultiPresent);
2409*53ee8cc1Swenshuai.xi                         #endif
2410*53ee8cc1Swenshuai.xi 
2411*53ee8cc1Swenshuai.xi                         #if 0
2412*53ee8cc1Swenshuai.xi 						if (u8_3dMultiPresent == 0x01) // 3D_Structure_ALL_15..0
2413*53ee8cc1Swenshuai.xi 						{
2414*53ee8cc1Swenshuai.xi 						    //check length
2415*53ee8cc1Swenshuai.xi 							if (u8BlkLen > (u8IdxOffset + 11))
2416*53ee8cc1Swenshuai.xi 							{
2417*53ee8cc1Swenshuai.xi 								u16_3dStructAll = (*(pu8BlkData + u8IdxOffset + 10) << 8) |	(*(pu8BlkData + u8IdxOffset + 11));
2418*53ee8cc1Swenshuai.xi 								for ( i = 0; i < ((u8SupTimingNum > 16) ? 16 : u8SupTimingNum); i++ )
2419*53ee8cc1Swenshuai.xi 								{
2420*53ee8cc1Swenshuai.xi 									psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[i].Video3DInfo = u16_3dStructAll;
2421*53ee8cc1Swenshuai.xi                                     #if (DBG_HDMIVSDB_INFO == 1)
2422*53ee8cc1Swenshuai.xi                                         printf("SupVidTiming[%02d].Video3DInfo = 0x%02X\r\n", i, u16_3dStructAll);
2423*53ee8cc1Swenshuai.xi                                     #endif
2424*53ee8cc1Swenshuai.xi 							    }
2425*53ee8cc1Swenshuai.xi 								u8_Hdmi3DLen -= 2;
2426*53ee8cc1Swenshuai.xi 							}
2427*53ee8cc1Swenshuai.xi 
2428*53ee8cc1Swenshuai.xi 						}
2429*53ee8cc1Swenshuai.xi 						else if (u8_3dMultiPresent == 0x02) // 3D_Structure_ALL_15..0 and 3D_Mask_ALL_15..0
2430*53ee8cc1Swenshuai.xi 						{
2431*53ee8cc1Swenshuai.xi 							//check Length
2432*53ee8cc1Swenshuai.xi 							if (u8BlkLen > (u8IdxOffset + 13))
2433*53ee8cc1Swenshuai.xi 							{
2434*53ee8cc1Swenshuai.xi 								u16_3dStructAll = (*(pu8BlkData + u8IdxOffset + 10) << 8) |	(*(pu8BlkData + u8IdxOffset + 11));
2435*53ee8cc1Swenshuai.xi 								u16_3dMask = (*(pu8BlkData + u8IdxOffset + 12) << 8) | (*(pu8BlkData + u8IdxOffset + 13));
2436*53ee8cc1Swenshuai.xi 
2437*53ee8cc1Swenshuai.xi 								for ( i = 0; i < ((u8SupTimingNum > 16) ? 16 : u8SupTimingNum); i++ )
2438*53ee8cc1Swenshuai.xi 								{
2439*53ee8cc1Swenshuai.xi 									if ((u16_3dMask >> i) & 0x01)
2440*53ee8cc1Swenshuai.xi 										psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[i].Video3DInfo = u16_3dStructAll;
2441*53ee8cc1Swenshuai.xi 									else
2442*53ee8cc1Swenshuai.xi 										psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[i].Video3DInfo = 0;
2443*53ee8cc1Swenshuai.xi 
2444*53ee8cc1Swenshuai.xi                                     #if (DBG_HDMIVSDB_INFO == 1)
2445*53ee8cc1Swenshuai.xi                                         printf("SupVidTiming[%02d].Video3DInfo = 0x%02X\r\n", i, u16_3dStructAll);
2446*53ee8cc1Swenshuai.xi                                     #endif
2447*53ee8cc1Swenshuai.xi 								}
2448*53ee8cc1Swenshuai.xi 								u8_Hdmi3DLen -= 4;
2449*53ee8cc1Swenshuai.xi 							}
2450*53ee8cc1Swenshuai.xi 						}
2451*53ee8cc1Swenshuai.xi 
2452*53ee8cc1Swenshuai.xi 						if (u8_Hdmi3DLen > 1) // 3D structure remains
2453*53ee8cc1Swenshuai.xi 						{
2454*53ee8cc1Swenshuai.xi 							if (u8BlkLen > (u8IdxOffset + 11))
2455*53ee8cc1Swenshuai.xi 							{
2456*53ee8cc1Swenshuai.xi 								MS_U8 u8VicOrder = 0;
2457*53ee8cc1Swenshuai.xi 								MS_U8 u83DStruct = 0;
2458*53ee8cc1Swenshuai.xi 
2459*53ee8cc1Swenshuai.xi 								for ( i = 0; i < u8_Hdmi3DLen; i++ )
2460*53ee8cc1Swenshuai.xi 								{
2461*53ee8cc1Swenshuai.xi 									if (u8_3dMultiPresent == 0x01)
2462*53ee8cc1Swenshuai.xi 									{
2463*53ee8cc1Swenshuai.xi 										u8VicOrder = (*(pu8BlkData + u8IdxOffset + 12 + i) & 0xF0) >> 4;
2464*53ee8cc1Swenshuai.xi 										u83DStruct = (*(pu8BlkData + u8IdxOffset + 12 + i) & 0x0F);
2465*53ee8cc1Swenshuai.xi 									}
2466*53ee8cc1Swenshuai.xi 									else if (u8_3dMultiPresent == 0x02)
2467*53ee8cc1Swenshuai.xi 									{
2468*53ee8cc1Swenshuai.xi 										u8VicOrder = (*(pu8BlkData + u8IdxOffset + 14 + i) & 0xF0) >> 4;
2469*53ee8cc1Swenshuai.xi 										u83DStruct = (*(pu8BlkData + u8IdxOffset + 14 + i) & 0x0F);
2470*53ee8cc1Swenshuai.xi 									}
2471*53ee8cc1Swenshuai.xi 									else
2472*53ee8cc1Swenshuai.xi 									{
2473*53ee8cc1Swenshuai.xi 										u8VicOrder = (*(pu8BlkData + u8IdxOffset + 10 + i) & 0xF0) >> 4;
2474*53ee8cc1Swenshuai.xi 										u83DStruct = (*(pu8BlkData + u8IdxOffset + 10 + i) & 0x0F);
2475*53ee8cc1Swenshuai.xi 									}
2476*53ee8cc1Swenshuai.xi 
2477*53ee8cc1Swenshuai.xi 									switch (u83DStruct)
2478*53ee8cc1Swenshuai.xi 									{
2479*53ee8cc1Swenshuai.xi 										case 0:
2480*53ee8cc1Swenshuai.xi 											psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[u8VicOrder].Video3DInfo |= E_HDMITX_EDID_3D_FramePacking;
2481*53ee8cc1Swenshuai.xi 										break;
2482*53ee8cc1Swenshuai.xi 
2483*53ee8cc1Swenshuai.xi 										case 1:
2484*53ee8cc1Swenshuai.xi 											psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[u8VicOrder].Video3DInfo |= E_HDMITX_EDID_3D_FieldAlternative;
2485*53ee8cc1Swenshuai.xi 										break;
2486*53ee8cc1Swenshuai.xi 
2487*53ee8cc1Swenshuai.xi 										case 2:
2488*53ee8cc1Swenshuai.xi 											psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[u8VicOrder].Video3DInfo |= E_HDMITX_EDID_3D_LineAlternative;
2489*53ee8cc1Swenshuai.xi 										break;
2490*53ee8cc1Swenshuai.xi 
2491*53ee8cc1Swenshuai.xi 										case 3:
2492*53ee8cc1Swenshuai.xi 											psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[u8VicOrder].Video3DInfo |= E_HDMITX_EDID_3D_SidebySide_FULL;
2493*53ee8cc1Swenshuai.xi 										break;
2494*53ee8cc1Swenshuai.xi 
2495*53ee8cc1Swenshuai.xi 										case 4:
2496*53ee8cc1Swenshuai.xi 											psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[u8VicOrder].Video3DInfo |= E_HDMITX_EDID_3D_L_Dep;
2497*53ee8cc1Swenshuai.xi 										break;
2498*53ee8cc1Swenshuai.xi 
2499*53ee8cc1Swenshuai.xi 										case 5:
2500*53ee8cc1Swenshuai.xi 											psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[u8VicOrder].Video3DInfo |= E_HDMITX_EDID_3D_L_Dep_Graphic_Dep;
2501*53ee8cc1Swenshuai.xi 										break;
2502*53ee8cc1Swenshuai.xi 
2503*53ee8cc1Swenshuai.xi 										case 6:
2504*53ee8cc1Swenshuai.xi 											psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[u8VicOrder].Video3DInfo |= E_HDMITX_EDID_3D_TopandBottom;
2505*53ee8cc1Swenshuai.xi 										break;
2506*53ee8cc1Swenshuai.xi 
2507*53ee8cc1Swenshuai.xi 										case 7:
2508*53ee8cc1Swenshuai.xi 										break;
2509*53ee8cc1Swenshuai.xi 
2510*53ee8cc1Swenshuai.xi 										case 8:
2511*53ee8cc1Swenshuai.xi 											psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[u8VicOrder].Video3DInfo |= E_HDMITX_EDID_3D_SidebySide_Half_horizontal;
2512*53ee8cc1Swenshuai.xi 											i++;
2513*53ee8cc1Swenshuai.xi 										break;
2514*53ee8cc1Swenshuai.xi 
2515*53ee8cc1Swenshuai.xi 										default:
2516*53ee8cc1Swenshuai.xi 											i++;
2517*53ee8cc1Swenshuai.xi 										break;
2518*53ee8cc1Swenshuai.xi 									}
2519*53ee8cc1Swenshuai.xi 								}
2520*53ee8cc1Swenshuai.xi 							}
2521*53ee8cc1Swenshuai.xi 						}
2522*53ee8cc1Swenshuai.xi                         #endif//K6LITE_NVR_REDUCE
2523*53ee8cc1Swenshuai.xi 					}
2524*53ee8cc1Swenshuai.xi 				}
2525*53ee8cc1Swenshuai.xi 			}
2526*53ee8cc1Swenshuai.xi 		}
2527*53ee8cc1Swenshuai.xi 	}
2528*53ee8cc1Swenshuai.xi #undef DBG_HDMIVSDB_INFO
2529*53ee8cc1Swenshuai.xi 
2530*53ee8cc1Swenshuai.xi 	return TRUE;
2531*53ee8cc1Swenshuai.xi 
2532*53ee8cc1Swenshuai.xi }
2533*53ee8cc1Swenshuai.xi 
2534*53ee8cc1Swenshuai.xi //**************************************************************************/
2535*53ee8cc1Swenshuai.xi //  [Function Name]:
2536*53ee8cc1Swenshuai.xi //                      _drv_HDMITx_ParseHFVSDB()
2537*53ee8cc1Swenshuai.xi //  [Description]:
2538*53ee8cc1Swenshuai.xi //                      Parsing HF-VSDB ( new for HDMI 2.0 spec )
2539*53ee8cc1Swenshuai.xi //  [Arguments]:
2540*53ee8cc1Swenshuai.xi //                      [MS_U8]* pu8BlkData
2541*53ee8cc1Swenshuai.xi //                      [MS_U8] u8BlkLen
2542*53ee8cc1Swenshuai.xi //                      [MS_U8] u8SupTimingNum
2543*53ee8cc1Swenshuai.xi //  [Return]:
2544*53ee8cc1Swenshuai.xi //                      [MS_BOOL] TRUE: successful; FALSE: failed
2545*53ee8cc1Swenshuai.xi //
2546*53ee8cc1Swenshuai.xi //**************************************************************************/
_MDrv_HDMITx_ParseHFVSDB(void * pInstance,MS_U8 * pu8BlkData,MS_U8 u8BlkLen,MS_U8 u8SupTimingNum)2547*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_HDMITx_ParseHFVSDB(void* pInstance, MS_U8* pu8BlkData, MS_U8 u8BlkLen, MS_U8 u8SupTimingNum)
2548*53ee8cc1Swenshuai.xi {
2549*53ee8cc1Swenshuai.xi #define DBG_HFVSDB_INFO 1
2550*53ee8cc1Swenshuai.xi     MS_U8 i = 0;
2551*53ee8cc1Swenshuai.xi 
2552*53ee8cc1Swenshuai.xi 	//check IEEE HDMI identifier //NOTE: current index is BYTE 1
2553*53ee8cc1Swenshuai.xi 	for ( i = 0; i < sizeof(HFVSDB_HDMI_IEEE_ID); i++ )
2554*53ee8cc1Swenshuai.xi 	{
2555*53ee8cc1Swenshuai.xi 		if ( *(pu8BlkData + i) != HFVSDB_HDMI_IEEE_ID[i] )
2556*53ee8cc1Swenshuai.xi 			return FALSE;
2557*53ee8cc1Swenshuai.xi 	}
2558*53ee8cc1Swenshuai.xi     #if (DBG_HFVSDB_INFO == 1)
2559*53ee8cc1Swenshuai.xi 		printf("%s::IEEE HDMI Identifier PASS!\n", __FUNCTION__);
2560*53ee8cc1Swenshuai.xi 	#endif
2561*53ee8cc1Swenshuai.xi 
2562*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
2563*53ee8cc1Swenshuai.xi 
2564*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HF_VSDBVerInfo = *(pu8BlkData + 3);
2565*53ee8cc1Swenshuai.xi     //psHDMITXResPri->stHDMITxInfo.RxEdidInfo.MaxTmdsCharRate = *(pu8BlkData + 4);
2566*53ee8cc1Swenshuai.xi     if( (*(pu8BlkData + 4)) > psHDMITXResPri->stHDMITxInfo.RxEdidInfo.MaxTmdsCharRate)
2567*53ee8cc1Swenshuai.xi     {
2568*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.RxEdidInfo.MaxTmdsCharRate = *(pu8BlkData + 4);
2569*53ee8cc1Swenshuai.xi     }
2570*53ee8cc1Swenshuai.xi 
2571*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportSCDC = (*(pu8BlkData + 5) & 0x80) ? TRUE : FALSE;
2572*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportRR = (*(pu8BlkData + 5) & 0x40) ? TRUE : FALSE;
2573*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportLTEScramble = (*(pu8BlkData + 5) & 0x08) ? TRUE : FALSE;
2574*53ee8cc1Swenshuai.xi     #if 0
2575*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportIndependView = (*(pu8BlkData + 5) & 0x04) ? TRUE : FALSE;
2576*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportDualView = (*(pu8BlkData + 5) & 0x02) ? TRUE : FALSE;
2577*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support3DOsdDisparity = (*(pu8BlkData + 5) & 0x01) ? TRUE : FALSE;
2578*53ee8cc1Swenshuai.xi     #endif
2579*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YUV420DeepColorInfo = (*(pu8BlkData + 6) & 0x07);
2580*53ee8cc1Swenshuai.xi 
2581*53ee8cc1Swenshuai.xi     #if (DBG_HFVSDB_INFO == 1)
2582*53ee8cc1Swenshuai.xi         printf("[HF-VSDB] Version = %d\r\n", psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HF_VSDBVerInfo);
2583*53ee8cc1Swenshuai.xi         printf("[HF-VSDB] Max_TMDS_Character_Rate = %d Mhz\r\n", psHDMITXResPri->stHDMITxInfo.RxEdidInfo.MaxTmdsCharRate*5);
2584*53ee8cc1Swenshuai.xi         printf("[HF-VSDB] SCDC_Present = %d\r\n", psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportSCDC);
2585*53ee8cc1Swenshuai.xi         printf("[HF-VSDB] RR_Capable = %d\r\n", psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportRR);
2586*53ee8cc1Swenshuai.xi         printf("[HF-VSDB] LTF_340Mcsc_Scramble = %d\r\n", psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportLTEScramble);
2587*53ee8cc1Swenshuai.xi         #if 0
2588*53ee8cc1Swenshuai.xi         printf("[HF-VSDB] Independent_View = %d\r\n", psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportIndependView);
2589*53ee8cc1Swenshuai.xi         printf("[HF-VSDB] Dual_View = %d\r\n", psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportDualView);
2590*53ee8cc1Swenshuai.xi         printf("[HF-VSDB] 3D_OSD_Disparity = %d\r\n", psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support3DOsdDisparity);
2591*53ee8cc1Swenshuai.xi         #endif
2592*53ee8cc1Swenshuai.xi         printf("[HF-VSDB] DC_420_Info = %d\r\n", psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YUV420DeepColorInfo);
2593*53ee8cc1Swenshuai.xi     #endif
2594*53ee8cc1Swenshuai.xi 
2595*53ee8cc1Swenshuai.xi #undef DBG_HFVSDB_INFO
2596*53ee8cc1Swenshuai.xi 
2597*53ee8cc1Swenshuai.xi     return TRUE;
2598*53ee8cc1Swenshuai.xi }
2599*53ee8cc1Swenshuai.xi 
2600*53ee8cc1Swenshuai.xi //**************************************************************************/
2601*53ee8cc1Swenshuai.xi //  [Function Name]:
2602*53ee8cc1Swenshuai.xi //                      drv_HDMITx_ParseCEAExtEdid()
2603*53ee8cc1Swenshuai.xi //  [Description]:
2604*53ee8cc1Swenshuai.xi //                      Parsing CEA extend EDID part
2605*53ee8cc1Swenshuai.xi //  [Arguments]:
2606*53ee8cc1Swenshuai.xi //                      [MS_U8]* pu8BlkData
2607*53ee8cc1Swenshuai.xi //  [Return]:
2608*53ee8cc1Swenshuai.xi //                      [MS_BOOL] TRUE: successful; FALSE: failed
2609*53ee8cc1Swenshuai.xi //**************************************************************************/
_MDrv_HDMITx_ParseCEAExtEdid(void * pInstance,MS_U8 * pu8BlkData)2610*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_HDMITx_ParseCEAExtEdid(void* pInstance, MS_U8* pu8BlkData) //wilson@kano
2611*53ee8cc1Swenshuai.xi {
2612*53ee8cc1Swenshuai.xi #define DBG_PARSE_CEA_EDID 1
2613*53ee8cc1Swenshuai.xi     MS_U8 u8DescOffset = 0;
2614*53ee8cc1Swenshuai.xi     MS_U8 u8CurIdx = 0;
2615*53ee8cc1Swenshuai.xi     MS_U8 i = 0;
2616*53ee8cc1Swenshuai.xi     MS_U8 u8BlkLen = 0;
2617*53ee8cc1Swenshuai.xi     MS_U8 u8BlkTagCode = 0;
2618*53ee8cc1Swenshuai.xi 
2619*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
2620*53ee8cc1Swenshuai.xi 
2621*53ee8cc1Swenshuai.xi     //support CEA Extension Version 3
2622*53ee8cc1Swenshuai.xi     if ((*(pu8BlkData) == 0x02) && (*(pu8BlkData + 1) < 0x04))
2623*53ee8cc1Swenshuai.xi     {
2624*53ee8cc1Swenshuai.xi         u8DescOffset = *(pu8BlkData + 2);
2625*53ee8cc1Swenshuai.xi 
2626*53ee8cc1Swenshuai.xi         if ((u8DescOffset < 0x05) || (u8DescOffset == 0xFF)) //invalid offset value;
2627*53ee8cc1Swenshuai.xi             return FALSE;
2628*53ee8cc1Swenshuai.xi 
2629*53ee8cc1Swenshuai.xi         //psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportHdmi = TRUE;
2630*53ee8cc1Swenshuai.xi 
2631*53ee8cc1Swenshuai.xi         u8CurIdx = 0x04; //start of data block collection
2632*53ee8cc1Swenshuai.xi 
2633*53ee8cc1Swenshuai.xi         while (u8CurIdx < u8DescOffset)
2634*53ee8cc1Swenshuai.xi         {
2635*53ee8cc1Swenshuai.xi             u8BlkTagCode = (*(pu8BlkData + u8CurIdx) & 0xE0) >> 5;
2636*53ee8cc1Swenshuai.xi             u8BlkLen = *(pu8BlkData + u8CurIdx) & 0x1F;
2637*53ee8cc1Swenshuai.xi 
2638*53ee8cc1Swenshuai.xi             switch (u8BlkTagCode)
2639*53ee8cc1Swenshuai.xi             {
2640*53ee8cc1Swenshuai.xi                 case CEATag_AudioBlk:
2641*53ee8cc1Swenshuai.xi                 {
2642*53ee8cc1Swenshuai.xi                     #if (DBG_PARSE_CEA_EDID == 1)
2643*53ee8cc1Swenshuai.xi                     printf("%s::Short Audio Block:%d \n", __FUNCTION__, u8BlkLen);
2644*53ee8cc1Swenshuai.xi                     #endif
2645*53ee8cc1Swenshuai.xi 
2646*53ee8cc1Swenshuai.xi                     u8CurIdx++;
2647*53ee8cc1Swenshuai.xi 
2648*53ee8cc1Swenshuai.xi                     for ( i = 0; i < u8BlkLen; i++ )
2649*53ee8cc1Swenshuai.xi                         psHDMITXResPri->stHDMITxInfo.RxEdidInfo.AudioDataBlk[i] = *(pu8BlkData + u8CurIdx + i);
2650*53ee8cc1Swenshuai.xi 
2651*53ee8cc1Swenshuai.xi                     u8CurIdx += u8BlkLen;
2652*53ee8cc1Swenshuai.xi                     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.CEADataBlkLen[u8BlkTagCode] = u8BlkLen;
2653*53ee8cc1Swenshuai.xi                 }
2654*53ee8cc1Swenshuai.xi                 break;
2655*53ee8cc1Swenshuai.xi 
2656*53ee8cc1Swenshuai.xi                 case CEATag_VideoBlk:
2657*53ee8cc1Swenshuai.xi                 {
2658*53ee8cc1Swenshuai.xi                     MS_U8 ucOffset = 0; // for multiple video block present
2659*53ee8cc1Swenshuai.xi                     #if (DBG_PARSE_CEA_EDID == 1)
2660*53ee8cc1Swenshuai.xi                     printf("%s::Short Video Block: %d\r\n", __FUNCTION__, u8BlkLen);
2661*53ee8cc1Swenshuai.xi                     #endif
2662*53ee8cc1Swenshuai.xi 
2663*53ee8cc1Swenshuai.xi                     u8CurIdx++;
2664*53ee8cc1Swenshuai.xi                     ucOffset = g_u8SupTimingNum;
2665*53ee8cc1Swenshuai.xi                     for ( i = 0; i < u8BlkLen; i++ )
2666*53ee8cc1Swenshuai.xi                     {
2667*53ee8cc1Swenshuai.xi                         psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VideoDataBlk[ucOffset + i] = *(pu8BlkData + u8CurIdx + i);
2668*53ee8cc1Swenshuai.xi                         #if 0
2669*53ee8cc1Swenshuai.xi                         psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[g_u8SupTimingNum].VideoTiming = psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VideoDataBlk[ucOffset + i] & 0x7F;
2670*53ee8cc1Swenshuai.xi 
2671*53ee8cc1Swenshuai.xi                         if ((psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[g_u8SupTimingNum].VideoTiming <= E_HDMITX_VIC_1920x1080p_60_16_9) |
2672*53ee8cc1Swenshuai.xi                             (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[g_u8SupTimingNum].VideoTiming == E_HDMITX_VIC_2880x480p_60_4_3) |
2673*53ee8cc1Swenshuai.xi                             (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[g_u8SupTimingNum].VideoTiming == E_HDMITX_VIC_2880x480p_60_16_9))
2674*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support2D_60Hz = TRUE;
2675*53ee8cc1Swenshuai.xi                         else if ((psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[g_u8SupTimingNum].VideoTiming <= E_HDMITX_VIC_1920x1080p_50_16_9) |
2676*53ee8cc1Swenshuai.xi                             (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[g_u8SupTimingNum].VideoTiming == E_HDMITX_VIC_2880x576p_50_4_3) |
2677*53ee8cc1Swenshuai.xi                             (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[g_u8SupTimingNum].VideoTiming == E_HDMITX_VIC_2880x576p_50_16_9)|
2678*53ee8cc1Swenshuai.xi                             (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[g_u8SupTimingNum].VideoTiming == E_HDMITX_VIC_1920x1080i_50_16_9_1250_total))
2679*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support2D_50Hz = TRUE;
2680*53ee8cc1Swenshuai.xi                         #endif
2681*53ee8cc1Swenshuai.xi                         g_u8SupTimingNum++;
2682*53ee8cc1Swenshuai.xi                     }
2683*53ee8cc1Swenshuai.xi 
2684*53ee8cc1Swenshuai.xi                     u8CurIdx += u8BlkLen;
2685*53ee8cc1Swenshuai.xi                     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.CEADataBlkLen[u8BlkTagCode] = u8BlkLen;
2686*53ee8cc1Swenshuai.xi                 }
2687*53ee8cc1Swenshuai.xi                 break;
2688*53ee8cc1Swenshuai.xi                 case CEATag_VendorSpecific:
2689*53ee8cc1Swenshuai.xi                 {
2690*53ee8cc1Swenshuai.xi                     MS_BOOL bIsVSDB = TRUE;
2691*53ee8cc1Swenshuai.xi                     #if (DBG_PARSE_CEA_EDID == 1)
2692*53ee8cc1Swenshuai.xi                     printf("%s::VSDB\r\n", __FUNCTION__);
2693*53ee8cc1Swenshuai.xi                     #endif
2694*53ee8cc1Swenshuai.xi 
2695*53ee8cc1Swenshuai.xi                     u8CurIdx++;
2696*53ee8cc1Swenshuai.xi 
2697*53ee8cc1Swenshuai.xi                     //check IEEE HDMI identifier
2698*53ee8cc1Swenshuai.xi                     for ( i = 0; i < sizeof(VSDB_HDMI_IEEE_ID); i++ )
2699*53ee8cc1Swenshuai.xi                     {
2700*53ee8cc1Swenshuai.xi                         if ( *(pu8BlkData + u8CurIdx + i) != VSDB_HDMI_IEEE_ID[i] )
2701*53ee8cc1Swenshuai.xi                         {
2702*53ee8cc1Swenshuai.xi                             bIsVSDB = FALSE;
2703*53ee8cc1Swenshuai.xi                             break;
2704*53ee8cc1Swenshuai.xi                         }
2705*53ee8cc1Swenshuai.xi                     }
2706*53ee8cc1Swenshuai.xi 
2707*53ee8cc1Swenshuai.xi                     if (bIsVSDB == FALSE)
2708*53ee8cc1Swenshuai.xi                     {
2709*53ee8cc1Swenshuai.xi                         //check if HF-VSDB
2710*53ee8cc1Swenshuai.xi                         if (_MDrv_HDMITx_ParseHFVSDB(pInstance, pu8BlkData + u8CurIdx, u8BlkLen, g_u8SupTimingNum))
2711*53ee8cc1Swenshuai.xi                         {
2712*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HF_VSDB_Len = u8BlkLen;
2713*53ee8cc1Swenshuai.xi                             memcpy(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HF_VSDB, pu8BlkData + u8CurIdx, u8BlkLen);
2714*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportHdmi = TRUE;
2715*53ee8cc1Swenshuai.xi                             printf("HF-VSDB Presented!!\n");
2716*53ee8cc1Swenshuai.xi                         }
2717*53ee8cc1Swenshuai.xi                         else
2718*53ee8cc1Swenshuai.xi                         {
2719*53ee8cc1Swenshuai.xi                             printf("HF-VSDB Parsing Failed!!\n");
2720*53ee8cc1Swenshuai.xi                         }
2721*53ee8cc1Swenshuai.xi                     }
2722*53ee8cc1Swenshuai.xi                     else
2723*53ee8cc1Swenshuai.xi                     {
2724*53ee8cc1Swenshuai.xi                         psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportHdmi = TRUE;
2725*53ee8cc1Swenshuai.xi 
2726*53ee8cc1Swenshuai.xi                         if (_MDrv_HDMITx_ParseHdmiVSDB(pInstance, pu8BlkData + u8CurIdx, u8BlkLen, g_u8SupTimingNum))
2727*53ee8cc1Swenshuai.xi                         {
2728*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HDMI_VSDB_Len = u8BlkLen;
2729*53ee8cc1Swenshuai.xi                             memcpy(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HDMI_VSDB, pu8BlkData + u8CurIdx, u8BlkLen);
2730*53ee8cc1Swenshuai.xi 
2731*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHDMITxInfo.output_mode |= (MS_U8)BIT1; // default is DVI mode
2732*53ee8cc1Swenshuai.xi 
2733*53ee8cc1Swenshuai.xi                             switch (*(pu8BlkData + 3) & 0x30)
2734*53ee8cc1Swenshuai.xi                             {
2735*53ee8cc1Swenshuai.xi                                 case 0x00:
2736*53ee8cc1Swenshuai.xi                                     //psHDMITXResPri->stHDMITxInfo.output_color = E_HDMITX_VIDEO_COLOR_RGB444;
2737*53ee8cc1Swenshuai.xi                                     #if (DBG_PARSE_CEA_EDID == 1)
2738*53ee8cc1Swenshuai.xi                                     printf("%s::Not Support YCbCr!!\n", __FUNCTION__);
2739*53ee8cc1Swenshuai.xi                                     #endif
2740*53ee8cc1Swenshuai.xi                                 break;
2741*53ee8cc1Swenshuai.xi 
2742*53ee8cc1Swenshuai.xi                                 case 0x20:
2743*53ee8cc1Swenshuai.xi                                     if (psHDMITXResPri->stHDMITxInfo.input_color == E_HDMITX_VIDEO_COLOR_YUV444)
2744*53ee8cc1Swenshuai.xi                                     {
2745*53ee8cc1Swenshuai.xi                                         psHDMITXResPri->stHDMITxInfo.output_color = E_HDMITX_VIDEO_COLOR_YUV444;
2746*53ee8cc1Swenshuai.xi                                         #if (DBG_PARSE_CEA_EDID == 1)
2747*53ee8cc1Swenshuai.xi                                         printf("%s::Output YUV444!!\n", __FUNCTION__);
2748*53ee8cc1Swenshuai.xi                                         #endif
2749*53ee8cc1Swenshuai.xi                                     }
2750*53ee8cc1Swenshuai.xi                                 break;
2751*53ee8cc1Swenshuai.xi 
2752*53ee8cc1Swenshuai.xi                                 case 0x10:
2753*53ee8cc1Swenshuai.xi                                     if (psHDMITXResPri->stHDMITxInfo.input_color == E_HDMITX_VIDEO_COLOR_YUV422)
2754*53ee8cc1Swenshuai.xi                                     {
2755*53ee8cc1Swenshuai.xi                                         psHDMITXResPri->stHDMITxInfo.output_color = E_HDMITX_VIDEO_COLOR_YUV422;
2756*53ee8cc1Swenshuai.xi                                         #if (DBG_PARSE_CEA_EDID == 1)
2757*53ee8cc1Swenshuai.xi                                         printf("%s::Output YUV422!!\n",__FUNCTION__);
2758*53ee8cc1Swenshuai.xi                                         #endif
2759*53ee8cc1Swenshuai.xi                                     }
2760*53ee8cc1Swenshuai.xi                                 break;
2761*53ee8cc1Swenshuai.xi 
2762*53ee8cc1Swenshuai.xi                                 default:
2763*53ee8cc1Swenshuai.xi                                 break;
2764*53ee8cc1Swenshuai.xi                             }
2765*53ee8cc1Swenshuai.xi                         }
2766*53ee8cc1Swenshuai.xi                     }
2767*53ee8cc1Swenshuai.xi                     u8CurIdx += u8BlkLen;
2768*53ee8cc1Swenshuai.xi                     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.CEADataBlkLen[u8BlkTagCode] = u8BlkLen;
2769*53ee8cc1Swenshuai.xi                 }
2770*53ee8cc1Swenshuai.xi                 break;
2771*53ee8cc1Swenshuai.xi 
2772*53ee8cc1Swenshuai.xi                 case CEATag_UseExtTag:
2773*53ee8cc1Swenshuai.xi                 {
2774*53ee8cc1Swenshuai.xi                     MS_U8 ucExtTagCode = 0x00;
2775*53ee8cc1Swenshuai.xi 
2776*53ee8cc1Swenshuai.xi                     ucExtTagCode = *(pu8BlkData + (++u8CurIdx));
2777*53ee8cc1Swenshuai.xi                     u8CurIdx++;
2778*53ee8cc1Swenshuai.xi                     printf("%s::Extend Tag Code = 0x%02X, block Len = 0x%X\r\n", __FUNCTION__, ucExtTagCode, u8BlkLen);
2779*53ee8cc1Swenshuai.xi 
2780*53ee8cc1Swenshuai.xi                     switch (ucExtTagCode)
2781*53ee8cc1Swenshuai.xi                     {
2782*53ee8cc1Swenshuai.xi                         case CEAExtTag_YCbCr420VideoDB:
2783*53ee8cc1Swenshuai.xi                             printf("YCbCr420 Video Data Block::\n");
2784*53ee8cc1Swenshuai.xi                             for ( i = 0; i < (u8BlkLen - 1); i++ )
2785*53ee8cc1Swenshuai.xi                             {
2786*53ee8cc1Swenshuai.xi                                 psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YCbCr420VidDataBlk[i] = *(pu8BlkData + u8CurIdx);
2787*53ee8cc1Swenshuai.xi                                 u8CurIdx++;
2788*53ee8cc1Swenshuai.xi                                 printf("0x%02X, ", psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YCbCr420VidDataBlk[i]);
2789*53ee8cc1Swenshuai.xi                             }
2790*53ee8cc1Swenshuai.xi                             printf("\r\n");
2791*53ee8cc1Swenshuai.xi                         break;
2792*53ee8cc1Swenshuai.xi 
2793*53ee8cc1Swenshuai.xi                         case CEAExtTag_YCbCr420CapMapDB:
2794*53ee8cc1Swenshuai.xi                             printf("YCbCr420 Capability Map Data Block::\n");
2795*53ee8cc1Swenshuai.xi                             for ( i = 0; i < (u8BlkLen - 1); i++ )
2796*53ee8cc1Swenshuai.xi                             {
2797*53ee8cc1Swenshuai.xi                                 psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YCbCr420CapMapDataBlk[i] = *(pu8BlkData + u8CurIdx);
2798*53ee8cc1Swenshuai.xi                                 u8CurIdx++;
2799*53ee8cc1Swenshuai.xi                                 printf("0x%02X, ", psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YCbCr420CapMapDataBlk[i]);
2800*53ee8cc1Swenshuai.xi                             }
2801*53ee8cc1Swenshuai.xi                             printf("\r\n");
2802*53ee8cc1Swenshuai.xi                         break;
2803*53ee8cc1Swenshuai.xi 
2804*53ee8cc1Swenshuai.xi                         case CEAExtTag_ColorimetryDB:
2805*53ee8cc1Swenshuai.xi                             printf("Colorimetry Data Block::\n");
2806*53ee8cc1Swenshuai.xi 
2807*53ee8cc1Swenshuai.xi                             if (u8BlkLen != 0x03) //valid length
2808*53ee8cc1Swenshuai.xi                             {
2809*53ee8cc1Swenshuai.xi                                 printf("Invalid Length of Colorimetry Data Block\r\n");
2810*53ee8cc1Swenshuai.xi                                 return FALSE;
2811*53ee8cc1Swenshuai.xi                             }
2812*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHDMITxInfo.RxEdidInfo.ExtColorimetry = *(pu8BlkData + u8CurIdx);
2813*53ee8cc1Swenshuai.xi                             u8CurIdx+=2; //u8CurIdx++;
2814*53ee8cc1Swenshuai.xi                             //TBD: MD parsing
2815*53ee8cc1Swenshuai.xi                         break;
2816*53ee8cc1Swenshuai.xi 
2817*53ee8cc1Swenshuai.xi                         case CEAExtTag_HDRStaticMetaDB:
2818*53ee8cc1Swenshuai.xi                             printf("HDR Static Metadata Data Block::\n");
2819*53ee8cc1Swenshuai.xi 
2820*53ee8cc1Swenshuai.xi                             for ( i = 0; i < (u8BlkLen - 1); i++ )
2821*53ee8cc1Swenshuai.xi                             {
2822*53ee8cc1Swenshuai.xi                                 psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HDRStaticDataBlk[i] = *(pu8BlkData + u8CurIdx);
2823*53ee8cc1Swenshuai.xi                                 u8CurIdx++;
2824*53ee8cc1Swenshuai.xi                                 printf("0x%02X, ", psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HDRStaticDataBlk[i]);
2825*53ee8cc1Swenshuai.xi                                 if ((i+1)%16 == 0)
2826*53ee8cc1Swenshuai.xi                                     printf("\r\n");
2827*53ee8cc1Swenshuai.xi                             }
2828*53ee8cc1Swenshuai.xi                             printf("\r\n");
2829*53ee8cc1Swenshuai.xi 
2830*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHDMITxInfo.RxEdidInfo.bSupportHDR = TRUE;
2831*53ee8cc1Swenshuai.xi                         break;
2832*53ee8cc1Swenshuai.xi 
2833*53ee8cc1Swenshuai.xi                         default:
2834*53ee8cc1Swenshuai.xi                             printf("drv_HDMITx_ParseCEAExtEdid()::Extend Tag Code Unsupport!!\n");
2835*53ee8cc1Swenshuai.xi                             u8CurIdx += (u8BlkLen - 1);
2836*53ee8cc1Swenshuai.xi                         break;
2837*53ee8cc1Swenshuai.xi                     }
2838*53ee8cc1Swenshuai.xi                     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.CEADataBlkLen[u8BlkTagCode] = u8BlkLen;
2839*53ee8cc1Swenshuai.xi                 }
2840*53ee8cc1Swenshuai.xi                 break;
2841*53ee8cc1Swenshuai.xi 
2842*53ee8cc1Swenshuai.xi                 case CEATag_SpeakerAlloc:
2843*53ee8cc1Swenshuai.xi                 case CEATag_VESA_DTCBlk:
2844*53ee8cc1Swenshuai.xi                 case CEATag_Reserved_1:
2845*53ee8cc1Swenshuai.xi                 default:
2846*53ee8cc1Swenshuai.xi                     u8CurIdx += (u8BlkLen + 1);
2847*53ee8cc1Swenshuai.xi                     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.CEADataBlkLen[u8BlkTagCode] = u8BlkLen;
2848*53ee8cc1Swenshuai.xi                 break;
2849*53ee8cc1Swenshuai.xi             }
2850*53ee8cc1Swenshuai.xi         }
2851*53ee8cc1Swenshuai.xi     }
2852*53ee8cc1Swenshuai.xi 
2853*53ee8cc1Swenshuai.xi     return TRUE;
2854*53ee8cc1Swenshuai.xi }
2855*53ee8cc1Swenshuai.xi 
2856*53ee8cc1Swenshuai.xi //**************************************************************************/
2857*53ee8cc1Swenshuai.xi //  [Function Name]:
2858*53ee8cc1Swenshuai.xi //                      MDrv_HDMITx_EdidChecking()
2859*53ee8cc1Swenshuai.xi //  [Description]:
2860*53ee8cc1Swenshuai.xi //                      Parsing and storing information from sink device's EDID
2861*53ee8cc1Swenshuai.xi //  [Arguments]:
2862*53ee8cc1Swenshuai.xi //                      void
2863*53ee8cc1Swenshuai.xi //  [Return]:
2864*53ee8cc1Swenshuai.xi //                      [MS_BOOL] TRUE: successful; FALSE: failed
2865*53ee8cc1Swenshuai.xi //
2866*53ee8cc1Swenshuai.xi //**************************************************************************/
MDrv_HDMITx_EdidChecking(void * pInstance)2867*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_EdidChecking(void* pInstance)
2868*53ee8cc1Swenshuai.xi {
2869*53ee8cc1Swenshuai.xi #define DBG_HDMITx_CheckEDID 1
2870*53ee8cc1Swenshuai.xi     MS_U8 i = 0;
2871*53ee8cc1Swenshuai.xi     MS_U8 u8EDIDRetryCnt = 3;
2872*53ee8cc1Swenshuai.xi     MS_U8 u8ExtBlkNum = 0;
2873*53ee8cc1Swenshuai.xi     MS_U8 u8ValidBlkNum = 0;
2874*53ee8cc1Swenshuai.xi     MS_U8 blkData[HDMITX_EDID_BLK_SIZE] = {0x00};
2875*53ee8cc1Swenshuai.xi     const MS_U8 EDID_HEADER_TAG[8] =
2876*53ee8cc1Swenshuai.xi     {
2877*53ee8cc1Swenshuai.xi     	0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00
2878*53ee8cc1Swenshuai.xi     };
2879*53ee8cc1Swenshuai.xi 
2880*53ee8cc1Swenshuai.xi     if (!bCheckEDID)
2881*53ee8cc1Swenshuai.xi         return TRUE;
2882*53ee8cc1Swenshuai.xi 
2883*53ee8cc1Swenshuai.xi     //init buf
2884*53ee8cc1Swenshuai.xi     g_u8SupTimingNum = 0;
2885*53ee8cc1Swenshuai.xi     _MDrv_HDMITX_InitEdidField(pInstance);
2886*53ee8cc1Swenshuai.xi     //memset(&gHDMITxInfo.RxEdidInfo, 0x00, sizeof(stHDMITX_RxEDID_Info));
2887*53ee8cc1Swenshuai.xi     //memset(blkData, 0x00, HDMITX_EDID_BLK_SIZE);
2888*53ee8cc1Swenshuai.xi 
2889*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
2890*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_mode &= (~(MS_U8)BIT1); //default is DVI mode;
2891*53ee8cc1Swenshuai.xi 
2892*53ee8cc1Swenshuai.xi     while (MHal_HDMITx_EdidReadBlock(0x00, blkData) == FALSE)
2893*53ee8cc1Swenshuai.xi     {
2894*53ee8cc1Swenshuai.xi         u8EDIDRetryCnt--;
2895*53ee8cc1Swenshuai.xi 
2896*53ee8cc1Swenshuai.xi         if (u8EDIDRetryCnt == 0)
2897*53ee8cc1Swenshuai.xi         {
2898*53ee8cc1Swenshuai.xi             //reset buf
2899*53ee8cc1Swenshuai.xi             memset(blkData, 0x00, HDMITX_EDID_BLK_SIZE);
2900*53ee8cc1Swenshuai.xi 
2901*53ee8cc1Swenshuai.xi 		#if (DBG_HDMITx_CheckEDID == 1)
2902*53ee8cc1Swenshuai.xi             printf("[HDMITx] Check EDID fail!!\n");
2903*53ee8cc1Swenshuai.xi 		#endif
2904*53ee8cc1Swenshuai.xi 
2905*53ee8cc1Swenshuai.xi             break;
2906*53ee8cc1Swenshuai.xi         }
2907*53ee8cc1Swenshuai.xi 
2908*53ee8cc1Swenshuai.xi         MsOS_DelayTask(100);
2909*53ee8cc1Swenshuai.xi     }
2910*53ee8cc1Swenshuai.xi     if (u8EDIDRetryCnt == 0)
2911*53ee8cc1Swenshuai.xi     {
2912*53ee8cc1Swenshuai.xi         //return FALSE;
2913*53ee8cc1Swenshuai.xi     }
2914*53ee8cc1Swenshuai.xi 
2915*53ee8cc1Swenshuai.xi #if (DBG_HDMITx_CheckEDID == 1)
2916*53ee8cc1Swenshuai.xi         printf("%s::block 0 ==>\n", __FUNCTION__);
2917*53ee8cc1Swenshuai.xi         for ( i = 0; i < HDMITX_EDID_BLK_SIZE; i++ )
2918*53ee8cc1Swenshuai.xi         {
2919*53ee8cc1Swenshuai.xi             printf("0x%02X, ", blkData[i]);
2920*53ee8cc1Swenshuai.xi 
2921*53ee8cc1Swenshuai.xi             if ( (i+1)%16 == 0 )
2922*53ee8cc1Swenshuai.xi                 printf("\r\n");
2923*53ee8cc1Swenshuai.xi         }
2924*53ee8cc1Swenshuai.xi         printf("\r\n");
2925*53ee8cc1Swenshuai.xi #endif
2926*53ee8cc1Swenshuai.xi 
2927*53ee8cc1Swenshuai.xi     //validiate EDID tag
2928*53ee8cc1Swenshuai.xi     for ( i = 0; i < sizeof(EDID_HEADER_TAG); i++ )
2929*53ee8cc1Swenshuai.xi     {
2930*53ee8cc1Swenshuai.xi         if (blkData[i] != EDID_HEADER_TAG[i])
2931*53ee8cc1Swenshuai.xi         {
2932*53ee8cc1Swenshuai.xi             printf("%s::invalid EDID header!!\n", __FUNCTION__);
2933*53ee8cc1Swenshuai.xi             //return FALSE;
2934*53ee8cc1Swenshuai.xi         }
2935*53ee8cc1Swenshuai.xi     }
2936*53ee8cc1Swenshuai.xi 
2937*53ee8cc1Swenshuai.xi     //store block 0
2938*53ee8cc1Swenshuai.xi     memcpy(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.EdidBlk0, blkData, HDMITX_EDID_BLK_SIZE*sizeof(MS_U8));
2939*53ee8cc1Swenshuai.xi 
2940*53ee8cc1Swenshuai.xi     //Get Manufacturer ID
2941*53ee8cc1Swenshuai.xi     //****************************************
2942*53ee8cc1Swenshuai.xi     //  EISA 3-character ID
2943*53ee8cc1Swenshuai.xi     //  08h_b'[6..2]: first char
2944*53ee8cc1Swenshuai.xi     //  08h_b'[1..0] & 09h_b'[7..5]: second char
2945*53ee8cc1Swenshuai.xi     //  09h_b'[4..0]: third char
2946*53ee8cc1Swenshuai.xi     //****************************************
2947*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.ManufacturerID[0] = (blkData[8] & 0x7C) >> 2;
2948*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.ManufacturerID[1] = ((blkData[8] & 0x03) << 3) | ((blkData[9] & 0xE0) >> 5);
2949*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.ManufacturerID[2] = blkData[9] & 0x1F;
2950*53ee8cc1Swenshuai.xi 
2951*53ee8cc1Swenshuai.xi     //check if there are more Extended block
2952*53ee8cc1Swenshuai.xi     u8ExtBlkNum = blkData[0x7E];
2953*53ee8cc1Swenshuai.xi 
2954*53ee8cc1Swenshuai.xi #if (DBG_HDMITx_CheckEDID == 1)
2955*53ee8cc1Swenshuai.xi         printf("%s::Extension Block Number = %d\r\n", __FUNCTION__, u8ExtBlkNum);
2956*53ee8cc1Swenshuai.xi 
2957*53ee8cc1Swenshuai.xi         if (u8ExtBlkNum > 4)
2958*53ee8cc1Swenshuai.xi             printf("%s::Number of Extension Block > 4!!\n", __FUNCTION__);
2959*53ee8cc1Swenshuai.xi #endif
2960*53ee8cc1Swenshuai.xi 
2961*53ee8cc1Swenshuai.xi     for ( i = 1; i <= ((u8ExtBlkNum >= 4) ? 4 : u8ExtBlkNum); i++ )
2962*53ee8cc1Swenshuai.xi     {
2963*53ee8cc1Swenshuai.xi         u8EDIDRetryCnt = 3;
2964*53ee8cc1Swenshuai.xi 
2965*53ee8cc1Swenshuai.xi         while (MHal_HDMITx_EdidReadBlock(i, blkData) == FALSE)
2966*53ee8cc1Swenshuai.xi         {
2967*53ee8cc1Swenshuai.xi             u8EDIDRetryCnt--;
2968*53ee8cc1Swenshuai.xi 
2969*53ee8cc1Swenshuai.xi             if ((u8EDIDRetryCnt == 0) || (u8EDIDRetryCnt > 3))
2970*53ee8cc1Swenshuai.xi             {
2971*53ee8cc1Swenshuai.xi                 //reset buf
2972*53ee8cc1Swenshuai.xi                 memset(blkData, 0x00, HDMITX_EDID_BLK_SIZE);
2973*53ee8cc1Swenshuai.xi 
2974*53ee8cc1Swenshuai.xi 			#if (DBG_HDMITx_CheckEDID == 1)
2975*53ee8cc1Swenshuai.xi                 printf("[HDMITx] Check EDID fail--1!!\n");
2976*53ee8cc1Swenshuai.xi 			#endif
2977*53ee8cc1Swenshuai.xi 
2978*53ee8cc1Swenshuai.xi                 break;
2979*53ee8cc1Swenshuai.xi             }
2980*53ee8cc1Swenshuai.xi             MsOS_DelayTask(100);
2981*53ee8cc1Swenshuai.xi         }
2982*53ee8cc1Swenshuai.xi 
2983*53ee8cc1Swenshuai.xi         if (u8EDIDRetryCnt != 0)
2984*53ee8cc1Swenshuai.xi         {
2985*53ee8cc1Swenshuai.xi             u8ValidBlkNum++;
2986*53ee8cc1Swenshuai.xi         }
2987*53ee8cc1Swenshuai.xi     }
2988*53ee8cc1Swenshuai.xi 
2989*53ee8cc1Swenshuai.xi     if ((u8ValidBlkNum == 0) && (! psHDMITXResPri->stHDMITxInfo.hdmitx_force_mode))
2990*53ee8cc1Swenshuai.xi     {
2991*53ee8cc1Swenshuai.xi         //return FALSE;
2992*53ee8cc1Swenshuai.xi     }
2993*53ee8cc1Swenshuai.xi 
2994*53ee8cc1Swenshuai.xi     for ( i = 1; i <= u8ValidBlkNum; i++)
2995*53ee8cc1Swenshuai.xi     {
2996*53ee8cc1Swenshuai.xi         while (MHal_HDMITx_EdidReadBlock(i, blkData) == FALSE)
2997*53ee8cc1Swenshuai.xi         {
2998*53ee8cc1Swenshuai.xi             u8EDIDRetryCnt--;
2999*53ee8cc1Swenshuai.xi 
3000*53ee8cc1Swenshuai.xi             if ((u8EDIDRetryCnt == 0) || (u8EDIDRetryCnt > 3))
3001*53ee8cc1Swenshuai.xi             {
3002*53ee8cc1Swenshuai.xi                 //reset buf
3003*53ee8cc1Swenshuai.xi                 memset(blkData, 0x00, HDMITX_EDID_BLK_SIZE);
3004*53ee8cc1Swenshuai.xi 
3005*53ee8cc1Swenshuai.xi 			#if (DBG_HDMITx_CheckEDID == 1)
3006*53ee8cc1Swenshuai.xi                 printf("[HDMITx] Check EDID fail--2!!\n");
3007*53ee8cc1Swenshuai.xi 			#endif
3008*53ee8cc1Swenshuai.xi 
3009*53ee8cc1Swenshuai.xi                 break;
3010*53ee8cc1Swenshuai.xi             }
3011*53ee8cc1Swenshuai.xi             MsOS_DelayTask(100);
3012*53ee8cc1Swenshuai.xi         }
3013*53ee8cc1Swenshuai.xi 
3014*53ee8cc1Swenshuai.xi         if (u8EDIDRetryCnt != 0)
3015*53ee8cc1Swenshuai.xi         {
3016*53ee8cc1Swenshuai.xi             //dump block content
3017*53ee8cc1Swenshuai.xi 		#if (DBG_HDMITx_CheckEDID == 1)
3018*53ee8cc1Swenshuai.xi             MS_U8 j = 0;
3019*53ee8cc1Swenshuai.xi 
3020*53ee8cc1Swenshuai.xi             printf("%s::Block #%d\r\n", __FUNCTION__, i);
3021*53ee8cc1Swenshuai.xi             for ( j = 0; j < HDMITX_EDID_BLK_SIZE; j++ )
3022*53ee8cc1Swenshuai.xi             {
3023*53ee8cc1Swenshuai.xi                 printf("0x%02X, ", blkData[j]);
3024*53ee8cc1Swenshuai.xi                 if ( (j+1) % 16 == 0 )
3025*53ee8cc1Swenshuai.xi                     printf("\r\n");
3026*53ee8cc1Swenshuai.xi             }
3027*53ee8cc1Swenshuai.xi             printf("\r\n");
3028*53ee8cc1Swenshuai.xi 		#endif
3029*53ee8cc1Swenshuai.xi 
3030*53ee8cc1Swenshuai.xi             if ( i == 1 )
3031*53ee8cc1Swenshuai.xi                 memcpy(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.EdidBlk1, &blkData, 128); //store block #1
3032*53ee8cc1Swenshuai.xi 
3033*53ee8cc1Swenshuai.xi             if ( !_MDrv_HDMITx_ParseCEAExtEdid(pInstance, blkData) ) //invalid CEA Extension block
3034*53ee8cc1Swenshuai.xi                 continue;
3035*53ee8cc1Swenshuai.xi         }
3036*53ee8cc1Swenshuai.xi         else
3037*53ee8cc1Swenshuai.xi         {
3038*53ee8cc1Swenshuai.xi 		#if (DBG_HDMITx_CheckEDID == 1)
3039*53ee8cc1Swenshuai.xi             printf("%s::Access EDID fail @ Block 0x%02X!!\n", __FUNCTION__, i);
3040*53ee8cc1Swenshuai.xi 		#endif
3041*53ee8cc1Swenshuai.xi             if (! psHDMITXResPri->stHDMITxInfo.hdmitx_force_mode)
3042*53ee8cc1Swenshuai.xi             {
3043*53ee8cc1Swenshuai.xi                 //return FALSE;
3044*53ee8cc1Swenshuai.xi             }
3045*53ee8cc1Swenshuai.xi             else
3046*53ee8cc1Swenshuai.xi             {
3047*53ee8cc1Swenshuai.xi                 continue;
3048*53ee8cc1Swenshuai.xi             }
3049*53ee8cc1Swenshuai.xi         }
3050*53ee8cc1Swenshuai.xi     }
3051*53ee8cc1Swenshuai.xi 
3052*53ee8cc1Swenshuai.xi     //TBD: if API layer force output mode
3053*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.hdmitx_force_mode) // AP force output mode
3054*53ee8cc1Swenshuai.xi     {
3055*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.output_mode = psHDMITXResPri->stHDMITxInfo.force_output_mode;
3056*53ee8cc1Swenshuai.xi         if((psHDMITXResPri->stHDMITxInfo.force_output_mode == E_HDMITX_DVI) || (psHDMITXResPri->stHDMITxInfo.force_output_mode == E_HDMITX_DVI_HDCP)) // DVI mode
3057*53ee8cc1Swenshuai.xi         {
3058*53ee8cc1Swenshuai.xi             psHDMITXResPri->stHDMITxInfo.RxEdidInfo.AudSupportAI = FALSE;
3059*53ee8cc1Swenshuai.xi             psHDMITXResPri->stHDMITxInfo.output_color = E_HDMITX_VIDEO_COLOR_RGB444;
3060*53ee8cc1Swenshuai.xi         }
3061*53ee8cc1Swenshuai.xi     }
3062*53ee8cc1Swenshuai.xi 
3063*53ee8cc1Swenshuai.xi     // AP force output color format
3064*53ee8cc1Swenshuai.xi     if((psHDMITXResPri->stHDMITxInfo.output_mode == E_HDMITX_HDMI || psHDMITXResPri->stHDMITxInfo.output_mode == E_HDMITX_HDMI_HDCP) && (psHDMITXResPri->stHDMITxInfo.hdmitx_force_output_color))
3065*53ee8cc1Swenshuai.xi     {
3066*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.output_color = psHDMITXResPri->stHDMITxInfo.force_output_color;
3067*53ee8cc1Swenshuai.xi     }
3068*53ee8cc1Swenshuai.xi 
3069*53ee8cc1Swenshuai.xi     // YUV444 -> RGB444
3070*53ee8cc1Swenshuai.xi     #if 0
3071*53ee8cc1Swenshuai.xi     if( (psHDMITXResPri->stHDMITxInfo.input_color != psHDMITXResPri->stHDMITxInfo.output_color) && (psHDMITXResPri->stHDMITxInfo.output_color == E_HDMITX_VIDEO_COLOR_RGB444) )
3072*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag = TRUE;
3073*53ee8cc1Swenshuai.xi     else // bypass
3074*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag = FALSE;
3075*53ee8cc1Swenshuai.xi     #endif
3076*53ee8cc1Swenshuai.xi 
3077*53ee8cc1Swenshuai.xi #undef DBG_HDMITx_CheckEDID
3078*53ee8cc1Swenshuai.xi 
3079*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_edid_ready = TRUE;
3080*53ee8cc1Swenshuai.xi     bCheckEDID = FALSE;
3081*53ee8cc1Swenshuai.xi 
3082*53ee8cc1Swenshuai.xi     Mhal_HDMITx_SetSCDCCapability(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportSCDC);
3083*53ee8cc1Swenshuai.xi 
3084*53ee8cc1Swenshuai.xi     return TRUE;
3085*53ee8cc1Swenshuai.xi 
3086*53ee8cc1Swenshuai.xi }
3087*53ee8cc1Swenshuai.xi 
3088*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3089*53ee8cc1Swenshuai.xi /// @brief This routine set HDMI Tx initial situation.
3090*53ee8cc1Swenshuai.xi /// @return None
3091*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_InitVariable(void * pInstance)3092*53ee8cc1Swenshuai.xi void MDrv_HDMITx_InitVariable(void* pInstance)
3093*53ee8cc1Swenshuai.xi {
3094*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3095*53ee8cc1Swenshuai.xi 
3096*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.bHDMITxTaskIdCreated = FALSE;
3097*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.bHDMITxEventIdCreated = FALSE;
3098*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.bCheckRxTimerIdCreated = FALSE;
3099*53ee8cc1Swenshuai.xi 
3100*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_enable_flag = FALSE;
3101*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_tmds_flag = TRUE;
3102*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_video_flag = TRUE;
3103*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_audio_flag = TRUE;
3104*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_hdcp_flag = FALSE;
3105*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag = FALSE;
3106*53ee8cc1Swenshuai.xi 
3107*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_state = E_HDMITX_FSM_PENDING;
3108*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_prestate = E_HDMITX_FSM_PENDING;
3109*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_preRX_status = E_HDMITX_DVIClock_L_HPD_L;
3110*53ee8cc1Swenshuai.xi     _hdmitx_preRX_status = psHDMITXResPri->stHDMITxInfo.hdmitx_preRX_status;
3111*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_RB_swap_flag = FALSE;
3112*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_force_mode = FALSE;
3113*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_force_output_color = FALSE;
3114*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_AFD_override_mode = FALSE;
3115*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_edid_ready = FALSE;
3116*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_avmute_flag = FALSE;
3117*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_CECEnable_flag = TRUE; // CEC
3118*53ee8cc1Swenshuai.xi 
3119*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_mode = E_HDMITX_DVI;
3120*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.force_output_mode = E_HDMITX_HDMI;
3121*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.ext_colorimetry = E_HDMITX_EXT_COLORIMETRY_XVYCC601;
3122*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.colorimetry = E_HDMITX_COLORIMETRY_MAX;
3123*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.enYCCQuantRange = E_HDMITX_YCC_QUANT_LIMIT;
3124*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_colordepth_val = E_HDMITX_VIDEO_CD_NoID;//E_HDMITX_VIDEO_CD_24Bits;
3125*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_video_prevtiming = E_HDMITX_RES_MAX;
3126*53ee8cc1Swenshuai.xi     #if 0
3127*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_video_timing = E_HDMITX_RES_720x480p;
3128*53ee8cc1Swenshuai.xi     #else
3129*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_video_timing = E_HDMITX_RES_1280x720p_60Hz;
3130*53ee8cc1Swenshuai.xi     #endif
3131*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.force_output_color = E_HDMITX_VIDEO_COLOR_RGB444;
3132*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.input_color = E_HDMITX_VIDEO_COLOR_RGB444;
3133*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_color = E_HDMITX_VIDEO_COLOR_RGB444;
3134*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.input_range = E_HDMITX_YCC_QUANT_LIMIT;
3135*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_range = E_HDMITX_YCC_QUANT_LIMIT;
3136*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_aspect_ratio = E_HDMITX_VIDEO_AR_4_3;
3137*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_scan_info = E_HDMITX_VIDEO_SI_NoData;
3138*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_afd_ratio = E_HDMITX_VIDEO_AFD_SameAsPictureAR;
3139*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_activeformat_present = 1;
3140*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_audio_frequncy = E_HDMITX_AUDIO_48K;
3141*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_bypass_flag = FALSE;
3142*53ee8cc1Swenshuai.xi #ifdef OBERON
3143*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_audio_channel = E_HDMITX_AUDIO_CH_8;
3144*53ee8cc1Swenshuai.xi #else // Uranus, Uranus4
3145*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_audio_channel = E_HDMITX_AUDIO_CH_2;
3146*53ee8cc1Swenshuai.xi #endif
3147*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_audio_type = E_HDMITX_AUDIO_PCM;
3148*53ee8cc1Swenshuai.xi 
3149*53ee8cc1Swenshuai.xi     // HDMI Tx Pre-emphasis and Double termination
3150*53ee8cc1Swenshuai.xi     memset(&psHDMITXResPri->stHDMITxInfo.analog_setting, 0, sizeof(psHDMITXResPri->stHDMITxInfo.analog_setting));
3151*53ee8cc1Swenshuai.xi 
3152*53ee8cc1Swenshuai.xi     _MDrv_HDMITX_InitEdidField(pInstance);
3153*53ee8cc1Swenshuai.xi #if 0
3154*53ee8cc1Swenshuai.xi     //edid relative //assign initial value
3155*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.EdidBlk0, 0x00, HDMITX_EDID_BLK_SIZE*sizeof(MS_U8));
3156*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.EdidBlk1, 0x00, HDMITX_EDID_BLK_SIZE*sizeof(MS_U8));
3157*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.ManufacturerID, 0x00, 3*sizeof(MS_U8));
3158*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.CEADataBlkLen, 0x00, HDMITX_CEA_DAT_BLK_TYPE_NUM*sizeof(MS_U8));
3159*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.PhyAddr, 0x00, 2*sizeof(MS_U8));
3160*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportHdmi = FALSE;
3161*53ee8cc1Swenshuai.xi 
3162*53ee8cc1Swenshuai.xi 	//HF-VSDB, scdc relative
3163*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HF_VSDBVerInfo = 0x00;
3164*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.MaxTmdsCharRate = 0x00;
3165*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportIndependView = FALSE;
3166*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportDualView = FALSE;
3167*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support3DOsdDisparity = FALSE;
3168*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportLTEScramble = FALSE;
3169*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportSCDC = FALSE;
3170*53ee8cc1Swenshuai.xi 
3171*53ee8cc1Swenshuai.xi     //read request
3172*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YUV420DeepColorInfo = 0x00;
3173*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.AudSupportAI = FALSE;
3174*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.b3DPresent = FALSE;
3175*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support2D_50Hz = FALSE;
3176*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support2D_60Hz = FALSE;
3177*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support3D_50Hz = FALSE;
3178*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support3D_60Hz = FALSE;
3179*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.ColorDepthInfo = E_HDMITX_VIDEO_CD_NoID;
3180*53ee8cc1Swenshuai.xi 
3181*53ee8cc1Swenshuai.xi     // data block content
3182*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.AudioDataBlk, 0x00, 32*sizeof(MS_U8));
3183*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VideoDataBlk, 0x00, 32*sizeof(MS_U8));
3184*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VendorDataBlk, 0x00, 32*sizeof(MS_U8));
3185*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SpeakerAllocDataBlk, 0x00, 32*sizeof(MS_U8));
3186*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VESA_DTCDataBlk, 0x00, 32*sizeof(MS_U8));
3187*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HdmiVICList, 0x00, 7*sizeof(MS_U8)); //this field has only 3 bits
3188*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming, 0x00, 32*sizeof(MS_U8));
3189*53ee8cc1Swenshuai.xi 
3190*53ee8cc1Swenshuai.xi     //for 420
3191*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YCbCr420VidDataBlk, 0x00, 32*sizeof(MS_U8));
3192*53ee8cc1Swenshuai.xi     memset(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YCbCr420CapMapDataBlk, 0x00, 32*sizeof(MS_U8));
3193*53ee8cc1Swenshuai.xi 
3194*53ee8cc1Swenshuai.xi     //for colorimetry
3195*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.RxEdidInfo.ExtColorimetry = 0x00;
3196*53ee8cc1Swenshuai.xi #endif
3197*53ee8cc1Swenshuai.xi 
3198*53ee8cc1Swenshuai.xi     // Set DDC speed to 50KHz as default
3199*53ee8cc1Swenshuai.xi     MHal_HDMITx_AdjustDDCFreq(50);
3200*53ee8cc1Swenshuai.xi 
3201*53ee8cc1Swenshuai.xi }
3202*53ee8cc1Swenshuai.xi 
3203*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3204*53ee8cc1Swenshuai.xi /// @brief This routine sends HDMI related packets.
3205*53ee8cc1Swenshuai.xi /// @param[in] packet_type packet type
3206*53ee8cc1Swenshuai.xi /// @param[in] packet_process packet behavior
3207*53ee8cc1Swenshuai.xi /// @return None
3208*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_SendPacket(MsHDMITX_PACKET_TYPE packet_type,MsHDMITX_PACKET_PROCESS packet_process)3209*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SendPacket(MsHDMITX_PACKET_TYPE packet_type, MsHDMITX_PACKET_PROCESS packet_process)
3210*53ee8cc1Swenshuai.xi {
3211*53ee8cc1Swenshuai.xi     MHal_HDMITx_SendPacket(packet_type, packet_process);
3212*53ee8cc1Swenshuai.xi }
3213*53ee8cc1Swenshuai.xi 
3214*53ee8cc1Swenshuai.xi //**************************************************************************/
3215*53ee8cc1Swenshuai.xi //  [Function Name]:
3216*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_GetTmdsEnFlag()
3217*53ee8cc1Swenshuai.xi //  [Description]:
3218*53ee8cc1Swenshuai.xi //                  return flag which indicate if tmds signal is enabled or not
3219*53ee8cc1Swenshuai.xi //  [Arguments]:
3220*53ee8cc1Swenshuai.xi //			void
3221*53ee8cc1Swenshuai.xi //  [Return]:
3222*53ee8cc1Swenshuai.xi //			MS_BOOL
3223*53ee8cc1Swenshuai.xi //
3224*53ee8cc1Swenshuai.xi //**************************************************************************/
MDrv_HDMITx_GetTmdsEnFlag(void * pInstance)3225*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_GetTmdsEnFlag(void* pInstance)
3226*53ee8cc1Swenshuai.xi {
3227*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3228*53ee8cc1Swenshuai.xi     return psHDMITXResPri->stHDMITxInfo.hdmitx_tmds_flag;
3229*53ee8cc1Swenshuai.xi }
3230*53ee8cc1Swenshuai.xi 
3231*53ee8cc1Swenshuai.xi //**************************************************************************/
3232*53ee8cc1Swenshuai.xi //  [Function Name]:
3233*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_GetTmdsEnFlag()
3234*53ee8cc1Swenshuai.xi //  [Description]:
3235*53ee8cc1Swenshuai.xi //                  return flag which indicate if tmds signal is enabled or not
3236*53ee8cc1Swenshuai.xi //  [Arguments]:
3237*53ee8cc1Swenshuai.xi //			void
3238*53ee8cc1Swenshuai.xi //  [Return]:
3239*53ee8cc1Swenshuai.xi //			MS_BOOL
3240*53ee8cc1Swenshuai.xi //
3241*53ee8cc1Swenshuai.xi //**************************************************************************/
MDrv_HDMITx_GetHdcpEnFlag(void * pInstance)3242*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_GetHdcpEnFlag(void* pInstance)
3243*53ee8cc1Swenshuai.xi {
3244*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3245*53ee8cc1Swenshuai.xi     return psHDMITXResPri->stHDMITxInfo.hdmitx_hdcp_flag;
3246*53ee8cc1Swenshuai.xi }
3247*53ee8cc1Swenshuai.xi 
3248*53ee8cc1Swenshuai.xi 
3249*53ee8cc1Swenshuai.xi //**************************************************************************/
3250*53ee8cc1Swenshuai.xi //  [Function Name]:
3251*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_GetOutputMode()
3252*53ee8cc1Swenshuai.xi //  [Description]:
3253*53ee8cc1Swenshuai.xi //                  return current hdmi output mode value
3254*53ee8cc1Swenshuai.xi //  [Arguments]:
3255*53ee8cc1Swenshuai.xi //			void
3256*53ee8cc1Swenshuai.xi //  [Return]:
3257*53ee8cc1Swenshuai.xi //			MsHDMITX_OUTPUT_MODE
3258*53ee8cc1Swenshuai.xi //
3259*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_GetOutputMode(void * pInstance)3260*53ee8cc1Swenshuai.xi MsHDMITX_OUTPUT_MODE MDrv_HDMITx_GetOutputMode(void* pInstance)
3261*53ee8cc1Swenshuai.xi {
3262*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3263*53ee8cc1Swenshuai.xi 
3264*53ee8cc1Swenshuai.xi     return psHDMITXResPri->stHDMITxInfo.output_mode;
3265*53ee8cc1Swenshuai.xi }
3266*53ee8cc1Swenshuai.xi 
3267*53ee8cc1Swenshuai.xi //**************************************************************************/
3268*53ee8cc1Swenshuai.xi //  [Function Name]:
3269*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_GetRxStatus()
3270*53ee8cc1Swenshuai.xi //  [Description]:
3271*53ee8cc1Swenshuai.xi //                  return current HDMI status
3272*53ee8cc1Swenshuai.xi //  [Arguments]:
3273*53ee8cc1Swenshuai.xi //			void
3274*53ee8cc1Swenshuai.xi //  [Return]:
3275*53ee8cc1Swenshuai.xi //			[MS_BOOL]
3276*53ee8cc1Swenshuai.xi //
3277*53ee8cc1Swenshuai.xi //**************************************************************************/
MDrv_HDMITx_GetRxStatus(void)3278*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_GetRxStatus(void)
3279*53ee8cc1Swenshuai.xi {
3280*53ee8cc1Swenshuai.xi     if (MHal_HDMITx_GetRXStatus() == E_HDMITX_DVIClock_H_HPD_H)
3281*53ee8cc1Swenshuai.xi         return TRUE;
3282*53ee8cc1Swenshuai.xi     else
3283*53ee8cc1Swenshuai.xi         return FALSE;
3284*53ee8cc1Swenshuai.xi 
3285*53ee8cc1Swenshuai.xi     //return (gbCurRxStatus == E_HDMITX_DVIClock_H_HPD_H)? TRUE : FALSE;
3286*53ee8cc1Swenshuai.xi }
3287*53ee8cc1Swenshuai.xi 
3288*53ee8cc1Swenshuai.xi //**************************************************************************/
3289*53ee8cc1Swenshuai.xi //  [Function Name]:
3290*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_GetFullRxStatus()
3291*53ee8cc1Swenshuai.xi //  [Description]:
3292*53ee8cc1Swenshuai.xi //                  return current HPD and clock status
3293*53ee8cc1Swenshuai.xi //  [Arguments]:
3294*53ee8cc1Swenshuai.xi //			void
3295*53ee8cc1Swenshuai.xi //  [Return]:
3296*53ee8cc1Swenshuai.xi //			[MS_BOOL]
3297*53ee8cc1Swenshuai.xi //
3298*53ee8cc1Swenshuai.xi //**************************************************************************/
MDrv_HDMITx_GetFullRxStatus(void * pInstance)3299*53ee8cc1Swenshuai.xi MsHDMITX_RX_STATUS MDrv_HDMITx_GetFullRxStatus(void* pInstance)
3300*53ee8cc1Swenshuai.xi {
3301*53ee8cc1Swenshuai.xi     MsHDMITX_RX_STATUS enRxStatus = E_HDMITX_DVIClock_L_HPD_L;
3302*53ee8cc1Swenshuai.xi 
3303*53ee8cc1Swenshuai.xi     enRxStatus = MHal_HDMITx_GetRXStatus();
3304*53ee8cc1Swenshuai.xi     return enRxStatus;
3305*53ee8cc1Swenshuai.xi }
3306*53ee8cc1Swenshuai.xi 
3307*53ee8cc1Swenshuai.xi //**************************************************************************/
3308*53ee8cc1Swenshuai.xi //  [Function Name]:
3309*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_GetDeepColorMode()
3310*53ee8cc1Swenshuai.xi //  [Description]:
3311*53ee8cc1Swenshuai.xi //                  return current deep color mode
3312*53ee8cc1Swenshuai.xi //  [Arguments]:
3313*53ee8cc1Swenshuai.xi //			void
3314*53ee8cc1Swenshuai.xi //  [Return]:
3315*53ee8cc1Swenshuai.xi //			[MsHDMITX_VIDEO_COLORDEPTH_VAL]
3316*53ee8cc1Swenshuai.xi //
3317*53ee8cc1Swenshuai.xi //**************************************************************************/
MDrv_HDMITx_GetDeepColorMode(void * pInstance)3318*53ee8cc1Swenshuai.xi MsHDMITX_VIDEO_COLORDEPTH_VAL MDrv_HDMITx_GetDeepColorMode(void* pInstance)
3319*53ee8cc1Swenshuai.xi {
3320*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3321*53ee8cc1Swenshuai.xi     return psHDMITXResPri->stHDMITxInfo.output_colordepth_val;
3322*53ee8cc1Swenshuai.xi }
3323*53ee8cc1Swenshuai.xi 
3324*53ee8cc1Swenshuai.xi //**************************************************************************/
3325*53ee8cc1Swenshuai.xi //  [Function Name]:
3326*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_GetOutputTiming()
3327*53ee8cc1Swenshuai.xi //  [Description]:
3328*53ee8cc1Swenshuai.xi //                  return current output timing
3329*53ee8cc1Swenshuai.xi //  [Arguments]:
3330*53ee8cc1Swenshuai.xi //			void
3331*53ee8cc1Swenshuai.xi //  [Return]:
3332*53ee8cc1Swenshuai.xi //			[MsHDMITX_VIDEO_TIMING]
3333*53ee8cc1Swenshuai.xi //
3334*53ee8cc1Swenshuai.xi //**************************************************************************/
MDrv_HDMITx_GetOutputTiming(void * pInstance)3335*53ee8cc1Swenshuai.xi MsHDMITX_VIDEO_TIMING MDrv_HDMITx_GetOutputTiming(void* pInstance)
3336*53ee8cc1Swenshuai.xi {
3337*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3338*53ee8cc1Swenshuai.xi 
3339*53ee8cc1Swenshuai.xi     return psHDMITXResPri->stHDMITxInfo.output_video_timing;
3340*53ee8cc1Swenshuai.xi }
3341*53ee8cc1Swenshuai.xi 
3342*53ee8cc1Swenshuai.xi //**************************************************************************/
3343*53ee8cc1Swenshuai.xi //  [Function Name]:
3344*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_GetOutputTiming()
3345*53ee8cc1Swenshuai.xi //  [Description]:
3346*53ee8cc1Swenshuai.xi //                  return current output timing
3347*53ee8cc1Swenshuai.xi //  [Arguments]:
3348*53ee8cc1Swenshuai.xi //			void
3349*53ee8cc1Swenshuai.xi //  [Return]:
3350*53ee8cc1Swenshuai.xi //			[MsHDMITX_VIDEO_TIMING]
3351*53ee8cc1Swenshuai.xi //
3352*53ee8cc1Swenshuai.xi //**************************************************************************/
MDrv_HDMITx_GetColorFormat(void * pInstance)3353*53ee8cc1Swenshuai.xi MsHDMITX_VIDEO_COLOR_FORMAT MDrv_HDMITx_GetColorFormat(void* pInstance)
3354*53ee8cc1Swenshuai.xi {
3355*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3356*53ee8cc1Swenshuai.xi 
3357*53ee8cc1Swenshuai.xi     return psHDMITXResPri->stHDMITxInfo.output_color;
3358*53ee8cc1Swenshuai.xi }
3359*53ee8cc1Swenshuai.xi 
3360*53ee8cc1Swenshuai.xi //**************************************************************************/
3361*53ee8cc1Swenshuai.xi //  [Function Name]:
3362*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_GetRxDCInfoFromEDID()
3363*53ee8cc1Swenshuai.xi //  [Description]:
3364*53ee8cc1Swenshuai.xi //                  Get deep color information from EDID
3365*53ee8cc1Swenshuai.xi //  [Arguments]:
3366*53ee8cc1Swenshuai.xi //			void
3367*53ee8cc1Swenshuai.xi //  [Return]:
3368*53ee8cc1Swenshuai.xi //			[HDMITX_VIDEO_COLORDEPTH_VAL]
3369*53ee8cc1Swenshuai.xi //
3370*53ee8cc1Swenshuai.xi //**************************************************************************/
MDrv_HDMITx_GetRxDCInfoFromEDID(void * pInstance)3371*53ee8cc1Swenshuai.xi MsHDMITX_VIDEO_COLORDEPTH_VAL MDrv_HDMITx_GetRxDCInfoFromEDID(void* pInstance)
3372*53ee8cc1Swenshuai.xi {
3373*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3374*53ee8cc1Swenshuai.xi     return psHDMITXResPri->stHDMITxInfo.RxEdidInfo.ColorDepthInfo;
3375*53ee8cc1Swenshuai.xi }
3376*53ee8cc1Swenshuai.xi 
3377*53ee8cc1Swenshuai.xi //**************************************************************************/
3378*53ee8cc1Swenshuai.xi //  [Function Name]:
3379*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_GetEdidRdyFlag()
3380*53ee8cc1Swenshuai.xi //  [Description]:
3381*53ee8cc1Swenshuai.xi //                  return if sink EDID is ready
3382*53ee8cc1Swenshuai.xi //  [Arguments]:
3383*53ee8cc1Swenshuai.xi //			void
3384*53ee8cc1Swenshuai.xi //  [Return]:
3385*53ee8cc1Swenshuai.xi //			[MS_BOOL]
3386*53ee8cc1Swenshuai.xi //
3387*53ee8cc1Swenshuai.xi //**************************************************************************/
MDrv_HDMITx_GetEdidRdyFlag(void * pInstance)3388*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_GetEdidRdyFlag(void* pInstance)
3389*53ee8cc1Swenshuai.xi {
3390*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3391*53ee8cc1Swenshuai.xi     return psHDMITXResPri->stHDMITxInfo.hdmitx_edid_ready;
3392*53ee8cc1Swenshuai.xi }
3393*53ee8cc1Swenshuai.xi 
3394*53ee8cc1Swenshuai.xi //**************************************************************************/
3395*53ee8cc1Swenshuai.xi //  [Function Name]:
3396*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_GetRxVideoFormatFromEDID()
3397*53ee8cc1Swenshuai.xi //  [Description]:
3398*53ee8cc1Swenshuai.xi //                  return short video descriptor content of sink EDID
3399*53ee8cc1Swenshuai.xi //  [Arguments]:
3400*53ee8cc1Swenshuai.xi //                  [MS_U8]* pu8Buffer
3401*53ee8cc1Swenshuai.xi //                  [MS_U8] u8BufSize
3402*53ee8cc1Swenshuai.xi //  [Return]:
3403*53ee8cc1Swenshuai.xi //			void
3404*53ee8cc1Swenshuai.xi //
3405*53ee8cc1Swenshuai.xi //**************************************************************************/
MDrv_HDMITx_GetRxVideoFormatFromEDID(void * pInstance,MS_U8 * pu8Buffer,MS_U8 u8BufSize)3406*53ee8cc1Swenshuai.xi void MDrv_HDMITx_GetRxVideoFormatFromEDID(void* pInstance, MS_U8 *pu8Buffer, MS_U8 u8BufSize)
3407*53ee8cc1Swenshuai.xi {
3408*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3409*53ee8cc1Swenshuai.xi     memcpy(pu8Buffer, psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VideoDataBlk, (u8BufSize > 32) ? 32*sizeof(MS_U8) : u8BufSize*sizeof(MS_U8));
3410*53ee8cc1Swenshuai.xi }
3411*53ee8cc1Swenshuai.xi 
3412*53ee8cc1Swenshuai.xi //**************************************************************************/
3413*53ee8cc1Swenshuai.xi //  [Function Name]:
3414*53ee8cc1Swenshuai.xi //                      MDrv_HDMITx_GetDataBlockLengthFromEDID()
3415*53ee8cc1Swenshuai.xi //  [Description]:
3416*53ee8cc1Swenshuai.xi //                      return length of specific data block
3417*53ee8cc1Swenshuai.xi //  [Arguments]:
3418*53ee8cc1Swenshuai.xi //                  [MS_U8]* pu8Length
3419*53ee8cc1Swenshuai.xi //                  [MS_U8] u8TagCode
3420*53ee8cc1Swenshuai.xi //  [Return]:
3421*53ee8cc1Swenshuai.xi //			void
3422*53ee8cc1Swenshuai.xi //
3423*53ee8cc1Swenshuai.xi //**************************************************************************/
MDrv_HDMITx_GetDataBlockLengthFromEDID(void * pInstance,MS_U8 * pu8Length,MS_U8 u8TagCode)3424*53ee8cc1Swenshuai.xi void MDrv_HDMITx_GetDataBlockLengthFromEDID(void* pInstance, MS_U8 *pu8Length, MS_U8 u8TagCode)
3425*53ee8cc1Swenshuai.xi {
3426*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3427*53ee8cc1Swenshuai.xi     *pu8Length = (u8TagCode < HDMITX_CEA_DAT_BLK_TYPE_NUM) ? psHDMITXResPri->stHDMITxInfo.RxEdidInfo.CEADataBlkLen[u8TagCode] : 0x00;
3428*53ee8cc1Swenshuai.xi }
3429*53ee8cc1Swenshuai.xi 
3430*53ee8cc1Swenshuai.xi //**************************************************************************/
3431*53ee8cc1Swenshuai.xi //  [Function Name]:
3432*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_GetRxAudioFormatFromEDID()
3433*53ee8cc1Swenshuai.xi //  [Description]:
3434*53ee8cc1Swenshuai.xi //                  return short audio descriptor content of sink EDID
3435*53ee8cc1Swenshuai.xi //  [Arguments]:
3436*53ee8cc1Swenshuai.xi //                  [MS_U8]* pu8Buffer
3437*53ee8cc1Swenshuai.xi //                  [MS_U8] u8BufSize
3438*53ee8cc1Swenshuai.xi //  [Return]:
3439*53ee8cc1Swenshuai.xi //			void
3440*53ee8cc1Swenshuai.xi //
3441*53ee8cc1Swenshuai.xi //**************************************************************************/
MDrv_HDMITx_GetRxAudioFormatFromEDID(void * pInstance,MS_U8 * pu8Buffer,MS_U8 u8BufSize)3442*53ee8cc1Swenshuai.xi void MDrv_HDMITx_GetRxAudioFormatFromEDID(void* pInstance, MS_U8 *pu8Buffer, MS_U8 u8BufSize)
3443*53ee8cc1Swenshuai.xi {
3444*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3445*53ee8cc1Swenshuai.xi     if (pu8Buffer != NULL)
3446*53ee8cc1Swenshuai.xi         memcpy(pu8Buffer, psHDMITXResPri->stHDMITxInfo.RxEdidInfo.AudioDataBlk, (u8BufSize > 32) ? 32 : u8BufSize);
3447*53ee8cc1Swenshuai.xi }
3448*53ee8cc1Swenshuai.xi 
3449*53ee8cc1Swenshuai.xi //**************************************************************************/
3450*53ee8cc1Swenshuai.xi //  [Function Name]:
3451*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_EdidGetHDMISupportFlag()
3452*53ee8cc1Swenshuai.xi //  [Description]:
3453*53ee8cc1Swenshuai.xi //                  return flag which indicate if sink EDID support HDMI
3454*53ee8cc1Swenshuai.xi //  [Arguments]:
3455*53ee8cc1Swenshuai.xi //                  void
3456*53ee8cc1Swenshuai.xi //  [Return]:
3457*53ee8cc1Swenshuai.xi //			MS_BOOL
3458*53ee8cc1Swenshuai.xi //
3459*53ee8cc1Swenshuai.xi //**************************************************************************/
MDrv_HDMITx_EdidGetHDMISupportFlag(void * pInstance)3460*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_EdidGetHDMISupportFlag(void* pInstance)
3461*53ee8cc1Swenshuai.xi {
3462*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3463*53ee8cc1Swenshuai.xi     return psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportHdmi;
3464*53ee8cc1Swenshuai.xi }
3465*53ee8cc1Swenshuai.xi 
3466*53ee8cc1Swenshuai.xi //**************************************************************************/
3467*53ee8cc1Swenshuai.xi //  [Function Name]:
3468*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_GetRxIDManufacturerName()
3469*53ee8cc1Swenshuai.xi //  [Description]:
3470*53ee8cc1Swenshuai.xi //                  return flag which indicate if sink EDID support HDMI
3471*53ee8cc1Swenshuai.xi //  [Arguments]:
3472*53ee8cc1Swenshuai.xi //                  [MS_U8] *pu8Buffer
3473*53ee8cc1Swenshuai.xi //  [Return]:
3474*53ee8cc1Swenshuai.xi //			void
3475*53ee8cc1Swenshuai.xi //
3476*53ee8cc1Swenshuai.xi //**************************************************************************/
MDrv_HDMITx_GetRxIDManufacturerName(void * pInstance,MS_U8 * pu8Buffer)3477*53ee8cc1Swenshuai.xi void MDrv_HDMITx_GetRxIDManufacturerName(void* pInstance, MS_U8 *pu8Buffer)
3478*53ee8cc1Swenshuai.xi {
3479*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3480*53ee8cc1Swenshuai.xi     memcpy(pu8Buffer, psHDMITXResPri->stHDMITxInfo.RxEdidInfo.ManufacturerID, sizeof(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.ManufacturerID));
3481*53ee8cc1Swenshuai.xi }
3482*53ee8cc1Swenshuai.xi 
3483*53ee8cc1Swenshuai.xi //**************************************************************************
3484*53ee8cc1Swenshuai.xi //  [Function Name]:
3485*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_GetEDIDData()
3486*53ee8cc1Swenshuai.xi //  [Description]:
3487*53ee8cc1Swenshuai.xi //                  return data content of EDID block
3488*53ee8cc1Swenshuai.xi //  [Arguments]:
3489*53ee8cc1Swenshuai.xi //                  [MS_U8] *pu8Buffer
3490*53ee8cc1Swenshuai.xi //                  [MS_BOOL] BlockIdx
3491*53ee8cc1Swenshuai.xi //  [Return]:
3492*53ee8cc1Swenshuai.xi //			void
3493*53ee8cc1Swenshuai.xi //
3494*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_GetEDIDData(void * pInstance,MS_U8 * pu8Buffer,MS_BOOL BlockIdx)3495*53ee8cc1Swenshuai.xi void MDrv_HDMITx_GetEDIDData(void* pInstance, MS_U8 *pu8Buffer, MS_BOOL BlockIdx)
3496*53ee8cc1Swenshuai.xi {
3497*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3498*53ee8cc1Swenshuai.xi     if (BlockIdx)
3499*53ee8cc1Swenshuai.xi 	{
3500*53ee8cc1Swenshuai.xi 		memcpy(pu8Buffer, psHDMITXResPri->stHDMITxInfo.RxEdidInfo.EdidBlk1, 128*sizeof(MS_U8));
3501*53ee8cc1Swenshuai.xi 	}
3502*53ee8cc1Swenshuai.xi 	else
3503*53ee8cc1Swenshuai.xi 	{
3504*53ee8cc1Swenshuai.xi 		memcpy(pu8Buffer, psHDMITXResPri->stHDMITxInfo.RxEdidInfo.EdidBlk0, 128*sizeof(MS_U8));
3505*53ee8cc1Swenshuai.xi 	}
3506*53ee8cc1Swenshuai.xi }
3507*53ee8cc1Swenshuai.xi 
3508*53ee8cc1Swenshuai.xi //**************************************************************************
3509*53ee8cc1Swenshuai.xi //  [Function Name]:
3510*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_GetRx3DStructureFromEDID()
3511*53ee8cc1Swenshuai.xi //  [Description]:
3512*53ee8cc1Swenshuai.xi //                  return current hdmi output mode value
3513*53ee8cc1Swenshuai.xi //  [Arguments]:
3514*53ee8cc1Swenshuai.xi //                  [MsHDMITX_VIDEO_TIMING] timing
3515*53ee8cc1Swenshuai.xi //                  [MsHDMITX_EDID_3D_STRUCTURE_ALL] *p3DStructure
3516*53ee8cc1Swenshuai.xi //  [Return]:
3517*53ee8cc1Swenshuai.xi //			void
3518*53ee8cc1Swenshuai.xi //
3519*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_GetRx3DStructureFromEDID(void * pInstance,MsHDMITX_VIDEO_TIMING timing,MsHDMITX_EDID_3D_STRUCTURE_ALL * p3DStructure)3520*53ee8cc1Swenshuai.xi void MDrv_HDMITx_GetRx3DStructureFromEDID(void* pInstance, MsHDMITX_VIDEO_TIMING timing, MsHDMITX_EDID_3D_STRUCTURE_ALL *p3DStructure)
3521*53ee8cc1Swenshuai.xi {
3522*53ee8cc1Swenshuai.xi     #if 0
3523*53ee8cc1Swenshuai.xi     MS_U8 i;
3524*53ee8cc1Swenshuai.xi     MsHDMITX_AVI_VIC vic = E_HDMITX_VIC_NOT_AVAILABLE;
3525*53ee8cc1Swenshuai.xi     *p3DStructure = 0; // Default all not support
3526*53ee8cc1Swenshuai.xi 
3527*53ee8cc1Swenshuai.xi     vic = _MDrv_HDMIRx_MapVideoTimingToVIC(timing);
3528*53ee8cc1Swenshuai.xi 
3529*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3530*53ee8cc1Swenshuai.xi 
3531*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support3D_50Hz)
3532*53ee8cc1Swenshuai.xi     {
3533*53ee8cc1Swenshuai.xi         switch(vic)
3534*53ee8cc1Swenshuai.xi         {
3535*53ee8cc1Swenshuai.xi             case E_HDMITX_VIC_1920x1080p_24_16_9:
3536*53ee8cc1Swenshuai.xi                 *p3DStructure |= E_HDMITX_EDID_3D_FramePacking;
3537*53ee8cc1Swenshuai.xi                 *p3DStructure |= E_HDMITX_EDID_3D_TopandBottom;
3538*53ee8cc1Swenshuai.xi                 break;
3539*53ee8cc1Swenshuai.xi             case E_HDMITX_VIC_1280x720p_50_16_9:
3540*53ee8cc1Swenshuai.xi                 *p3DStructure |= E_HDMITX_EDID_3D_FramePacking;
3541*53ee8cc1Swenshuai.xi                 *p3DStructure |= E_HDMITX_EDID_3D_TopandBottom;
3542*53ee8cc1Swenshuai.xi                 break;
3543*53ee8cc1Swenshuai.xi             case E_HDMITX_VIC_1920x1080i_50_16_9:
3544*53ee8cc1Swenshuai.xi             case E_HDMITX_VIC_1920x1080i_50_16_9_1250_total:
3545*53ee8cc1Swenshuai.xi                 *p3DStructure |= E_HDMITX_EDID_3D_SidebySide_Half_horizontal;
3546*53ee8cc1Swenshuai.xi                 break;
3547*53ee8cc1Swenshuai.xi             default:
3548*53ee8cc1Swenshuai.xi                 break;
3549*53ee8cc1Swenshuai.xi         }
3550*53ee8cc1Swenshuai.xi 
3551*53ee8cc1Swenshuai.xi     }
3552*53ee8cc1Swenshuai.xi 
3553*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.Support3D_60Hz)
3554*53ee8cc1Swenshuai.xi     {
3555*53ee8cc1Swenshuai.xi         switch(vic)
3556*53ee8cc1Swenshuai.xi         {
3557*53ee8cc1Swenshuai.xi     		case E_HDMITX_VIC_1920x1080p_24_16_9:
3558*53ee8cc1Swenshuai.xi     			*p3DStructure |= E_HDMITX_EDID_3D_FramePacking;
3559*53ee8cc1Swenshuai.xi     			*p3DStructure |= E_HDMITX_EDID_3D_TopandBottom;
3560*53ee8cc1Swenshuai.xi     			break;
3561*53ee8cc1Swenshuai.xi     		case E_HDMITX_VIC_1280x720p_60_16_9:
3562*53ee8cc1Swenshuai.xi     			*p3DStructure |= E_HDMITX_EDID_3D_FramePacking;
3563*53ee8cc1Swenshuai.xi     			*p3DStructure |= E_HDMITX_EDID_3D_TopandBottom;
3564*53ee8cc1Swenshuai.xi     			break;
3565*53ee8cc1Swenshuai.xi     		case E_HDMITX_VIC_1920x1080i_60_16_9:
3566*53ee8cc1Swenshuai.xi     			*p3DStructure |= E_HDMITX_EDID_3D_SidebySide_Half_horizontal;
3567*53ee8cc1Swenshuai.xi                 break;
3568*53ee8cc1Swenshuai.xi             default:
3569*53ee8cc1Swenshuai.xi                 break;
3570*53ee8cc1Swenshuai.xi         }
3571*53ee8cc1Swenshuai.xi     }
3572*53ee8cc1Swenshuai.xi 
3573*53ee8cc1Swenshuai.xi     for (i=0;i < 32;i++)
3574*53ee8cc1Swenshuai.xi     {
3575*53ee8cc1Swenshuai.xi         if (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[i].VideoTiming == vic)
3576*53ee8cc1Swenshuai.xi         {
3577*53ee8cc1Swenshuai.xi             *p3DStructure |= psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupVidTiming[i].Video3DInfo;
3578*53ee8cc1Swenshuai.xi         }
3579*53ee8cc1Swenshuai.xi     }
3580*53ee8cc1Swenshuai.xi     #endif
3581*53ee8cc1Swenshuai.xi }
3582*53ee8cc1Swenshuai.xi 
3583*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
3584*53ee8cc1Swenshuai.xi /// @brief This routine Get Audio CTS value
3585*53ee8cc1Swenshuai.xi /// @return CTS
3586*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_GetAudioCTS(void)3587*53ee8cc1Swenshuai.xi MS_U32 MDrv_HDMITx_GetAudioCTS(void)
3588*53ee8cc1Swenshuai.xi {
3589*53ee8cc1Swenshuai.xi     return MHal_HDMITx_GetAudioCTS();
3590*53ee8cc1Swenshuai.xi }
3591*53ee8cc1Swenshuai.xi 
3592*53ee8cc1Swenshuai.xi //**************************************************************************
3593*53ee8cc1Swenshuai.xi //  [Function Name]:
3594*53ee8cc1Swenshuai.xi //			    MDrv_HDMITx_GetAVMUTEState()
3595*53ee8cc1Swenshuai.xi //  [Description]:
3596*53ee8cc1Swenshuai.xi //                      return AVMUTE flag
3597*53ee8cc1Swenshuai.xi //  [Arguments]:
3598*53ee8cc1Swenshuai.xi //			    void
3599*53ee8cc1Swenshuai.xi //  [Return]:
3600*53ee8cc1Swenshuai.xi //			    MS_BOOL
3601*53ee8cc1Swenshuai.xi //
3602*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_GetAVMUTEStatus(void * pInstance)3603*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_GetAVMUTEStatus(void* pInstance)
3604*53ee8cc1Swenshuai.xi {
3605*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3606*53ee8cc1Swenshuai.xi     return psHDMITXResPri->stHDMITxInfo.hdmitx_avmute_flag;
3607*53ee8cc1Swenshuai.xi }
3608*53ee8cc1Swenshuai.xi 
3609*53ee8cc1Swenshuai.xi /// Get version (without Mutex protect)
MDrv_HDMITx_GetLibVer(const MSIF_Version ** ppVersion)3610*53ee8cc1Swenshuai.xi MS_BOOL  MDrv_HDMITx_GetLibVer(const MSIF_Version **ppVersion)
3611*53ee8cc1Swenshuai.xi {
3612*53ee8cc1Swenshuai.xi     if (!ppVersion)
3613*53ee8cc1Swenshuai.xi     {
3614*53ee8cc1Swenshuai.xi         return FALSE;
3615*53ee8cc1Swenshuai.xi     }
3616*53ee8cc1Swenshuai.xi 
3617*53ee8cc1Swenshuai.xi     *ppVersion = &_drv_hdmi_tx_version;
3618*53ee8cc1Swenshuai.xi     return TRUE;
3619*53ee8cc1Swenshuai.xi }
3620*53ee8cc1Swenshuai.xi 
MDrv_HDMITx_GetInfo(MS_HDMI_TX_INFO * pInfo)3621*53ee8cc1Swenshuai.xi MS_BOOL  MDrv_HDMITx_GetInfo(MS_HDMI_TX_INFO *pInfo)
3622*53ee8cc1Swenshuai.xi {
3623*53ee8cc1Swenshuai.xi     if (!pInfo)
3624*53ee8cc1Swenshuai.xi     {
3625*53ee8cc1Swenshuai.xi         return FALSE;
3626*53ee8cc1Swenshuai.xi     }
3627*53ee8cc1Swenshuai.xi 
3628*53ee8cc1Swenshuai.xi     memcpy((void*)pInfo, (void*)&_info, sizeof(MS_HDMI_TX_INFO));
3629*53ee8cc1Swenshuai.xi     return TRUE;
3630*53ee8cc1Swenshuai.xi }
3631*53ee8cc1Swenshuai.xi 
MDrv_HDMITx_GetStatus(MS_HDMI_TX_Status * pStatus)3632*53ee8cc1Swenshuai.xi MS_BOOL  MDrv_HDMITx_GetStatus(MS_HDMI_TX_Status *pStatus)
3633*53ee8cc1Swenshuai.xi {
3634*53ee8cc1Swenshuai.xi     if (!pStatus)
3635*53ee8cc1Swenshuai.xi     {
3636*53ee8cc1Swenshuai.xi         return FALSE;
3637*53ee8cc1Swenshuai.xi     }
3638*53ee8cc1Swenshuai.xi 
3639*53ee8cc1Swenshuai.xi     memcpy((void*)pStatus, (void*)&_hdmitx_status, sizeof(MS_HDMI_TX_Status ));
3640*53ee8cc1Swenshuai.xi     return TRUE;
3641*53ee8cc1Swenshuai.xi }
3642*53ee8cc1Swenshuai.xi 
3643*53ee8cc1Swenshuai.xi //**************************************************************************
3644*53ee8cc1Swenshuai.xi //  [Function Name]:
3645*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_SetFSMState()
3646*53ee8cc1Swenshuai.xi //  [Description]:
3647*53ee8cc1Swenshuai.xi //                  set state of hdmi tx FSM
3648*53ee8cc1Swenshuai.xi //  [Arguments]:
3649*53ee8cc1Swenshuai.xi //			[MDrvHDMITX_FSM_STATE] enState
3650*53ee8cc1Swenshuai.xi //  [Return]:
3651*53ee8cc1Swenshuai.xi //			void
3652*53ee8cc1Swenshuai.xi //
3653*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_GetFSMState(void * pInstance)3654*53ee8cc1Swenshuai.xi MDrvHDMITX_FSM_STATE MDrv_HDMITx_GetFSMState(void* pInstance)
3655*53ee8cc1Swenshuai.xi {
3656*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3657*53ee8cc1Swenshuai.xi     return psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_state;
3658*53ee8cc1Swenshuai.xi }
3659*53ee8cc1Swenshuai.xi 
3660*53ee8cc1Swenshuai.xi //**************************************************************************
3661*53ee8cc1Swenshuai.xi //  [Function Name]:
3662*53ee8cc1Swenshuai.xi //			    MDrv_HDMITx_GetEDIDPhyAdr()
3663*53ee8cc1Swenshuai.xi //  [Description]:
3664*53ee8cc1Swenshuai.xi //                      Get sink physical address from EDID
3665*53ee8cc1Swenshuai.xi //  [Arguments]:
3666*53ee8cc1Swenshuai.xi //			    [MS_U8]* pucData
3667*53ee8cc1Swenshuai.xi //  [Return]:
3668*53ee8cc1Swenshuai.xi //			    void
3669*53ee8cc1Swenshuai.xi //
3670*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_GetEDIDPhyAdr(void * pInstance,MS_U8 * pucData)3671*53ee8cc1Swenshuai.xi void MDrv_HDMITx_GetEDIDPhyAdr(void* pInstance, MS_U8* pucData)
3672*53ee8cc1Swenshuai.xi {
3673*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3674*53ee8cc1Swenshuai.xi     memcpy(pucData, psHDMITXResPri->stHDMITxInfo.RxEdidInfo.PhyAddr, 0x02);
3675*53ee8cc1Swenshuai.xi }
3676*53ee8cc1Swenshuai.xi 
3677*53ee8cc1Swenshuai.xi //**************************************************************************
3678*53ee8cc1Swenshuai.xi //  [Function Name]:
3679*53ee8cc1Swenshuai.xi //			    MDrv_HDMITx_GetVICListFromEDID()
3680*53ee8cc1Swenshuai.xi //  [Description]:
3681*53ee8cc1Swenshuai.xi //                      Get VIC list from EDID
3682*53ee8cc1Swenshuai.xi //  [Arguments]:
3683*53ee8cc1Swenshuai.xi //                      [MS_U8] *pu8Buffer,
3684*53ee8cc1Swenshuai.xi //                      [MS_U8] u8BufSize,
3685*53ee8cc1Swenshuai.xi //  [Return]:
3686*53ee8cc1Swenshuai.xi //			    MS_BOOL
3687*53ee8cc1Swenshuai.xi //
3688*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_GetVICListFromEDID(void * pInstance,MS_U8 * pu8Buffer,MS_U8 u8BufSize)3689*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_GetVICListFromEDID(void* pInstance, MS_U8 *pu8Buffer, MS_U8 u8BufSize)
3690*53ee8cc1Swenshuai.xi {
3691*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3692*53ee8cc1Swenshuai.xi     memcpy(pu8Buffer, psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HdmiVICList, (u8BufSize > 7) ? 7 : u8BufSize);
3693*53ee8cc1Swenshuai.xi 
3694*53ee8cc1Swenshuai.xi     return TRUE;
3695*53ee8cc1Swenshuai.xi }
3696*53ee8cc1Swenshuai.xi 
3697*53ee8cc1Swenshuai.xi //**************************************************************************
3698*53ee8cc1Swenshuai.xi //  [Function Name]:
3699*53ee8cc1Swenshuai.xi //			    MDrv_HDMITx_GetColorFormatFromEDID()
3700*53ee8cc1Swenshuai.xi //  [Description]:
3701*53ee8cc1Swenshuai.xi //                      Get color format from EDID
3702*53ee8cc1Swenshuai.xi //  [Arguments]:
3703*53ee8cc1Swenshuai.xi //			    [MS_U8]* pucData
3704*53ee8cc1Swenshuai.xi //  [Return]:
3705*53ee8cc1Swenshuai.xi //			    void
3706*53ee8cc1Swenshuai.xi //
3707*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_GetColorFormatFromEDID(void * pInstance,MsHDMITX_VIDEO_TIMING timing,MsHDMITX_EDID_COLOR_FORMAT * pColorFmt)3708*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_GetColorFormatFromEDID(void* pInstance, MsHDMITX_VIDEO_TIMING timing, MsHDMITX_EDID_COLOR_FORMAT *pColorFmt)
3709*53ee8cc1Swenshuai.xi {
3710*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3711*53ee8cc1Swenshuai.xi 
3712*53ee8cc1Swenshuai.xi     MS_U8 i = 0;
3713*53ee8cc1Swenshuai.xi     MsHDMITX_AVI_VIC enVICCode = (0x01 << E_HDMITX_VIC_NOT_AVAILABLE);
3714*53ee8cc1Swenshuai.xi 
3715*53ee8cc1Swenshuai.xi     enVICCode = _MDrv_HDMIRx_MapVideoTimingToVIC(timing);
3716*53ee8cc1Swenshuai.xi 
3717*53ee8cc1Swenshuai.xi     if ((psHDMITXResPri->stHDMITxInfo.RxEdidInfo.EdidBlk1[0] == 0x02) && (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.EdidBlk1[1] <= 0x04))
3718*53ee8cc1Swenshuai.xi     {
3719*53ee8cc1Swenshuai.xi         //YCbCr 420 only
3720*53ee8cc1Swenshuai.xi         for ( i = 0; i < 32; i++ )
3721*53ee8cc1Swenshuai.xi         {
3722*53ee8cc1Swenshuai.xi             if (enVICCode == psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YCbCr420VidDataBlk[i])
3723*53ee8cc1Swenshuai.xi             {
3724*53ee8cc1Swenshuai.xi                 *pColorFmt = (0x01 << E_HDMITX_VIDEO_COLOR_YUV420);
3725*53ee8cc1Swenshuai.xi                 return TRUE;
3726*53ee8cc1Swenshuai.xi             }
3727*53ee8cc1Swenshuai.xi         }
3728*53ee8cc1Swenshuai.xi 
3729*53ee8cc1Swenshuai.xi         switch (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.EdidBlk1[0x03] & 0x30)
3730*53ee8cc1Swenshuai.xi         {
3731*53ee8cc1Swenshuai.xi             case 0x00:
3732*53ee8cc1Swenshuai.xi                 *pColorFmt |= (0x01 << E_HDMITX_VIDEO_COLOR_RGB444);
3733*53ee8cc1Swenshuai.xi             break;
3734*53ee8cc1Swenshuai.xi 
3735*53ee8cc1Swenshuai.xi             case 0x10:
3736*53ee8cc1Swenshuai.xi                 *pColorFmt |= (0x01 << E_HDMITX_VIDEO_COLOR_RGB444);
3737*53ee8cc1Swenshuai.xi                 *pColorFmt |= (0x01 << E_HDMITX_VIDEO_COLOR_YUV422);
3738*53ee8cc1Swenshuai.xi             break;
3739*53ee8cc1Swenshuai.xi 
3740*53ee8cc1Swenshuai.xi             case 0x20:
3741*53ee8cc1Swenshuai.xi                 *pColorFmt |= (0x01 << E_HDMITX_VIDEO_COLOR_RGB444);
3742*53ee8cc1Swenshuai.xi                 *pColorFmt |= (0x01 << E_HDMITX_VIDEO_COLOR_YUV444);
3743*53ee8cc1Swenshuai.xi             break;
3744*53ee8cc1Swenshuai.xi 
3745*53ee8cc1Swenshuai.xi             case 0x30:
3746*53ee8cc1Swenshuai.xi                 *pColorFmt |= (0x01 << E_HDMITX_VIDEO_COLOR_RGB444);
3747*53ee8cc1Swenshuai.xi                 *pColorFmt |= (0x01 << E_HDMITX_VIDEO_COLOR_YUV444);
3748*53ee8cc1Swenshuai.xi                 *pColorFmt |= (0x01 << E_HDMITX_VIDEO_COLOR_YUV422);
3749*53ee8cc1Swenshuai.xi             break;
3750*53ee8cc1Swenshuai.xi 
3751*53ee8cc1Swenshuai.xi             default:
3752*53ee8cc1Swenshuai.xi                 *pColorFmt |= (0x01 << E_HDMITX_VIDEO_COLOR_RGB444);
3753*53ee8cc1Swenshuai.xi             break;
3754*53ee8cc1Swenshuai.xi         }
3755*53ee8cc1Swenshuai.xi 
3756*53ee8cc1Swenshuai.xi         for ( i = 0; i < sizeof(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VideoDataBlk); i++ )
3757*53ee8cc1Swenshuai.xi         {
3758*53ee8cc1Swenshuai.xi             if (enVICCode == psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VideoDataBlk[i])
3759*53ee8cc1Swenshuai.xi             {
3760*53ee8cc1Swenshuai.xi                 if (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YCbCr420CapMapDataBlk[i >> 3] & (0x01 << (i % 8)))
3761*53ee8cc1Swenshuai.xi                 {
3762*53ee8cc1Swenshuai.xi                     *pColorFmt |= (0x01 << E_HDMITX_VIDEO_COLOR_YUV420);
3763*53ee8cc1Swenshuai.xi                 }
3764*53ee8cc1Swenshuai.xi             }
3765*53ee8cc1Swenshuai.xi         }
3766*53ee8cc1Swenshuai.xi     }
3767*53ee8cc1Swenshuai.xi     else
3768*53ee8cc1Swenshuai.xi     {
3769*53ee8cc1Swenshuai.xi         *pColorFmt |= (0x01 << E_HDMITX_VIDEO_COLOR_RGB444);
3770*53ee8cc1Swenshuai.xi     }
3771*53ee8cc1Swenshuai.xi 
3772*53ee8cc1Swenshuai.xi     return TRUE;
3773*53ee8cc1Swenshuai.xi }
3774*53ee8cc1Swenshuai.xi 
3775*53ee8cc1Swenshuai.xi //**************************************************************************
3776*53ee8cc1Swenshuai.xi //  [Function Name]:
3777*53ee8cc1Swenshuai.xi //			    MDrv_HDMITx_GetAudioDataBlock()
3778*53ee8cc1Swenshuai.xi //  [Description]:
3779*53ee8cc1Swenshuai.xi //                      Get Audio data block from EDID
3780*53ee8cc1Swenshuai.xi //  [Arguments]:
3781*53ee8cc1Swenshuai.xi //                      [MS_U8]* pu8Data: buff to store data block content
3782*53ee8cc1Swenshuai.xi //                      [MS_U32] u32DataLen: buff length
3783*53ee8cc1Swenshuai.xi //                      [MS_U32]* pu32RealLen: real length of edid data block
3784*53ee8cc1Swenshuai.xi //  [Return]:
3785*53ee8cc1Swenshuai.xi //			    void
3786*53ee8cc1Swenshuai.xi //
3787*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_GetAudioDataBlock(void * pInstance,MS_U8 * pu8Data,MS_U32 u32DataLen,MS_U32 * pu32RealLen)3788*53ee8cc1Swenshuai.xi void MDrv_HDMITx_GetAudioDataBlock(void* pInstance, MS_U8* pu8Data, MS_U32 u32DataLen, MS_U32* pu32RealLen)
3789*53ee8cc1Swenshuai.xi {
3790*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3791*53ee8cc1Swenshuai.xi 
3792*53ee8cc1Swenshuai.xi     if (pu8Data != NULL)
3793*53ee8cc1Swenshuai.xi     {
3794*53ee8cc1Swenshuai.xi         memcpy(pu8Data, psHDMITXResPri->stHDMITxInfo.RxEdidInfo.AudioDataBlk, (u32DataLen > 32) ? 32 : u32DataLen);
3795*53ee8cc1Swenshuai.xi         *pu32RealLen = (u32DataLen > 32) ? 32 : u32DataLen;
3796*53ee8cc1Swenshuai.xi     }
3797*53ee8cc1Swenshuai.xi }
3798*53ee8cc1Swenshuai.xi 
3799*53ee8cc1Swenshuai.xi //**************************************************************************
3800*53ee8cc1Swenshuai.xi //  [Function Name]:
3801*53ee8cc1Swenshuai.xi //			    MDrv_HDMITx_GetVideoDataBlock()
3802*53ee8cc1Swenshuai.xi //  [Description]:
3803*53ee8cc1Swenshuai.xi //                      Get video data block from EDID
3804*53ee8cc1Swenshuai.xi //  [Arguments]:
3805*53ee8cc1Swenshuai.xi //                      [MS_U8]* pu8Data: buff to store data block content
3806*53ee8cc1Swenshuai.xi //                      [MS_U32] u32DataLen: buff length
3807*53ee8cc1Swenshuai.xi //                      [MS_U32]* pu32RealLen: real length of edid data block
3808*53ee8cc1Swenshuai.xi //  [Return]:
3809*53ee8cc1Swenshuai.xi //			    void
3810*53ee8cc1Swenshuai.xi //
3811*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_GetVideoDataBlock(void * pInstance,MS_U8 * pu8Data,MS_U32 u32DataLen,MS_U32 * pu32RealLen)3812*53ee8cc1Swenshuai.xi void MDrv_HDMITx_GetVideoDataBlock(void* pInstance, MS_U8* pu8Data, MS_U32 u32DataLen, MS_U32* pu32RealLen)
3813*53ee8cc1Swenshuai.xi {
3814*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3815*53ee8cc1Swenshuai.xi 
3816*53ee8cc1Swenshuai.xi     if (pu8Data != NULL)
3817*53ee8cc1Swenshuai.xi     {
3818*53ee8cc1Swenshuai.xi         memcpy(pu8Data, psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VideoDataBlk, (u32DataLen > 32) ? 32 : u32DataLen);
3819*53ee8cc1Swenshuai.xi         *pu32RealLen = (u32DataLen > 32) ? 32 : u32DataLen;
3820*53ee8cc1Swenshuai.xi     }
3821*53ee8cc1Swenshuai.xi }
3822*53ee8cc1Swenshuai.xi 
3823*53ee8cc1Swenshuai.xi //**************************************************************************
3824*53ee8cc1Swenshuai.xi //  [Function Name]:
3825*53ee8cc1Swenshuai.xi //			    MDrv_HDMITx_GetVSDB()
3826*53ee8cc1Swenshuai.xi //  [Description]:
3827*53ee8cc1Swenshuai.xi //                      Get vendor-specific data block from EDID
3828*53ee8cc1Swenshuai.xi //  [Arguments]:
3829*53ee8cc1Swenshuai.xi //                      [MS_U8]* pu8Data: buff to store data block content
3830*53ee8cc1Swenshuai.xi //                      [MS_U32] u32DataLen: buff length
3831*53ee8cc1Swenshuai.xi //                      [MS_U32]* pu32RealLen: real length of edid data block
3832*53ee8cc1Swenshuai.xi //  [Return]:
3833*53ee8cc1Swenshuai.xi //			    void
3834*53ee8cc1Swenshuai.xi //
3835*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_GetVSDB(void * pInstance,MS_U8 * pu8Data,MS_U32 u32DataLen,MS_U32 * pu32RealLen)3836*53ee8cc1Swenshuai.xi void MDrv_HDMITx_GetVSDB(void* pInstance, MS_U8* pu8Data, MS_U32 u32DataLen, MS_U32* pu32RealLen)
3837*53ee8cc1Swenshuai.xi {
3838*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3839*53ee8cc1Swenshuai.xi 
3840*53ee8cc1Swenshuai.xi     if (pu8Data != NULL)
3841*53ee8cc1Swenshuai.xi     {
3842*53ee8cc1Swenshuai.xi         *pu32RealLen = (u32DataLen > psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HDMI_VSDB_Len) ? psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HDMI_VSDB_Len : u32DataLen;
3843*53ee8cc1Swenshuai.xi         memcpy(pu8Data, psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HDMI_VSDB, *pu32RealLen);
3844*53ee8cc1Swenshuai.xi     }
3845*53ee8cc1Swenshuai.xi }
3846*53ee8cc1Swenshuai.xi 
3847*53ee8cc1Swenshuai.xi //**************************************************************************
3848*53ee8cc1Swenshuai.xi //  [Function Name]:
3849*53ee8cc1Swenshuai.xi //			    MDrv_HDMITx_GetHFVSDB()
3850*53ee8cc1Swenshuai.xi //  [Description]:
3851*53ee8cc1Swenshuai.xi //                      Get vendor-specific data block from EDID
3852*53ee8cc1Swenshuai.xi //  [Arguments]:
3853*53ee8cc1Swenshuai.xi //                      [MS_U8]* pu8Data: buff to store data block content
3854*53ee8cc1Swenshuai.xi //                      [MS_U32] u32DataLen: buff length
3855*53ee8cc1Swenshuai.xi //                      [MS_U32]* pu32RealLen: real length of edid data block
3856*53ee8cc1Swenshuai.xi //  [Return]:
3857*53ee8cc1Swenshuai.xi //			    void
3858*53ee8cc1Swenshuai.xi //
3859*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_GetHFVSDB(void * pInstance,MS_U8 * pu8Data,MS_U32 u32DataLen,MS_U32 * pu32RealLen)3860*53ee8cc1Swenshuai.xi void MDrv_HDMITx_GetHFVSDB(void* pInstance, MS_U8* pu8Data, MS_U32 u32DataLen, MS_U32* pu32RealLen)
3861*53ee8cc1Swenshuai.xi {
3862*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3863*53ee8cc1Swenshuai.xi 
3864*53ee8cc1Swenshuai.xi     if (pu8Data != NULL)
3865*53ee8cc1Swenshuai.xi     {
3866*53ee8cc1Swenshuai.xi         *pu32RealLen = (u32DataLen > psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HF_VSDB_Len) ? psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HF_VSDB_Len : u32DataLen;
3867*53ee8cc1Swenshuai.xi         memcpy(pu8Data, psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HF_VSDB, *pu32RealLen);
3868*53ee8cc1Swenshuai.xi     }
3869*53ee8cc1Swenshuai.xi }
3870*53ee8cc1Swenshuai.xi 
3871*53ee8cc1Swenshuai.xi //**************************************************************************
3872*53ee8cc1Swenshuai.xi //  [Function Name]:
3873*53ee8cc1Swenshuai.xi //			    MDrv_HDMITx_GetColorimetryDataBlock()
3874*53ee8cc1Swenshuai.xi //  [Description]:
3875*53ee8cc1Swenshuai.xi //                      Get colorimetry data block from EDID
3876*53ee8cc1Swenshuai.xi //  [Arguments]:
3877*53ee8cc1Swenshuai.xi //                      [MS_U8]* pu8Data: buff to store data block content
3878*53ee8cc1Swenshuai.xi //                      [MS_U32] u32DataLen: buff length
3879*53ee8cc1Swenshuai.xi //                      [MS_U32]* pu32RealLen: real length of edid data block
3880*53ee8cc1Swenshuai.xi //  [Return]:
3881*53ee8cc1Swenshuai.xi //			    void
3882*53ee8cc1Swenshuai.xi //
3883*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_GetColorimetryDataBlock(void * pInstance,MS_U8 * pu8Data,MS_U32 u32DataLen,MS_U32 * pu32RealLen)3884*53ee8cc1Swenshuai.xi void MDrv_HDMITx_GetColorimetryDataBlock(void* pInstance, MS_U8* pu8Data, MS_U32 u32DataLen, MS_U32* pu32RealLen)
3885*53ee8cc1Swenshuai.xi {
3886*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3887*53ee8cc1Swenshuai.xi 
3888*53ee8cc1Swenshuai.xi     if (pu8Data != NULL)
3889*53ee8cc1Swenshuai.xi     {
3890*53ee8cc1Swenshuai.xi         *pu8Data = psHDMITXResPri->stHDMITxInfo.RxEdidInfo.ExtColorimetry;
3891*53ee8cc1Swenshuai.xi         *pu32RealLen = 0x01;
3892*53ee8cc1Swenshuai.xi     }
3893*53ee8cc1Swenshuai.xi }
3894*53ee8cc1Swenshuai.xi 
3895*53ee8cc1Swenshuai.xi //**************************************************************************
3896*53ee8cc1Swenshuai.xi //  [Function Name]:
3897*53ee8cc1Swenshuai.xi //			    MDrv_HDMITx_GetHDRStaticMetaDataBlock()
3898*53ee8cc1Swenshuai.xi //  [Description]:
3899*53ee8cc1Swenshuai.xi //                      Get HDR static meta data block from EDID
3900*53ee8cc1Swenshuai.xi //  [Arguments]:
3901*53ee8cc1Swenshuai.xi //                      [MS_U8]* pu8Data: buff to store data block content
3902*53ee8cc1Swenshuai.xi //                      [MS_U32] u32DataLen: buff length
3903*53ee8cc1Swenshuai.xi //                      [MS_U32]* pu32RealLen: real length of edid data block
3904*53ee8cc1Swenshuai.xi //  [Return]:
3905*53ee8cc1Swenshuai.xi //			    void
3906*53ee8cc1Swenshuai.xi //
3907*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_GetHDRStaticMetaDataBlock(void * pInstance,MS_U8 * pu8Data,MS_U32 u32DataLen,MS_U32 * pu32RealLen)3908*53ee8cc1Swenshuai.xi void MDrv_HDMITx_GetHDRStaticMetaDataBlock(void* pInstance, MS_U8* pu8Data, MS_U32 u32DataLen, MS_U32* pu32RealLen)
3909*53ee8cc1Swenshuai.xi {
3910*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3911*53ee8cc1Swenshuai.xi 
3912*53ee8cc1Swenshuai.xi     if (pu8Data != NULL)
3913*53ee8cc1Swenshuai.xi     {
3914*53ee8cc1Swenshuai.xi         memcpy(pu8Data, psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HDRStaticDataBlk, (u32DataLen > 32) ? 32 : u32DataLen);
3915*53ee8cc1Swenshuai.xi         *pu32RealLen = (u32DataLen > 32) ? 32 : u32DataLen;
3916*53ee8cc1Swenshuai.xi     }
3917*53ee8cc1Swenshuai.xi }
3918*53ee8cc1Swenshuai.xi 
3919*53ee8cc1Swenshuai.xi //**************************************************************************
3920*53ee8cc1Swenshuai.xi //  [Function Name]:
3921*53ee8cc1Swenshuai.xi //			    MDrv_HDMITx_Get420VideoDataBlock()
3922*53ee8cc1Swenshuai.xi //  [Description]:
3923*53ee8cc1Swenshuai.xi //                      Get YCbCr420 video data block from EDID
3924*53ee8cc1Swenshuai.xi //  [Arguments]:
3925*53ee8cc1Swenshuai.xi //                      [MS_U8]* pu8Data: buff to store data block content
3926*53ee8cc1Swenshuai.xi //                      [MS_U32] u32DataLen: buff length
3927*53ee8cc1Swenshuai.xi //                      [MS_U32]* pu32RealLen: real length of edid data block
3928*53ee8cc1Swenshuai.xi //  [Return]:
3929*53ee8cc1Swenshuai.xi //			    void
3930*53ee8cc1Swenshuai.xi //
3931*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_Get420VideoDataBlock(void * pInstance,MS_U8 * pu8Data,MS_U32 u32DataLen,MS_U32 * pu32RealLen)3932*53ee8cc1Swenshuai.xi void MDrv_HDMITx_Get420VideoDataBlock(void* pInstance, MS_U8* pu8Data, MS_U32 u32DataLen, MS_U32* pu32RealLen)
3933*53ee8cc1Swenshuai.xi {
3934*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3935*53ee8cc1Swenshuai.xi 
3936*53ee8cc1Swenshuai.xi     if (pu8Data != NULL)
3937*53ee8cc1Swenshuai.xi     {
3938*53ee8cc1Swenshuai.xi         memcpy(pu8Data, psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YCbCr420VidDataBlk, (u32DataLen > 32) ? 32 : u32DataLen);
3939*53ee8cc1Swenshuai.xi         *pu32RealLen = (u32DataLen > 32) ? 32 : u32DataLen;
3940*53ee8cc1Swenshuai.xi     }
3941*53ee8cc1Swenshuai.xi }
3942*53ee8cc1Swenshuai.xi 
3943*53ee8cc1Swenshuai.xi //**************************************************************************
3944*53ee8cc1Swenshuai.xi //  [Function Name]:
3945*53ee8cc1Swenshuai.xi //			    MDrv_HDMITx_Get420CapabilityMapDataBlock()
3946*53ee8cc1Swenshuai.xi //  [Description]:
3947*53ee8cc1Swenshuai.xi //                      Get YCbCr420 Capability Map data block from EDID
3948*53ee8cc1Swenshuai.xi //  [Arguments]:
3949*53ee8cc1Swenshuai.xi //                      [MS_U8]* pu8Data: buff to store data block content
3950*53ee8cc1Swenshuai.xi //                      [MS_U32] u32DataLen: buff length
3951*53ee8cc1Swenshuai.xi //                      [MS_U32]* pu32RealLen: real length of edid data block
3952*53ee8cc1Swenshuai.xi //  [Return]:
3953*53ee8cc1Swenshuai.xi //			    void
3954*53ee8cc1Swenshuai.xi //
3955*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_Get420CapabilityMapDataBlock(void * pInstance,MS_U8 * pu8Data,MS_U32 u32DataLen,MS_U32 * pu32RealLen)3956*53ee8cc1Swenshuai.xi void MDrv_HDMITx_Get420CapabilityMapDataBlock(void* pInstance, MS_U8* pu8Data, MS_U32 u32DataLen, MS_U32* pu32RealLen)
3957*53ee8cc1Swenshuai.xi {
3958*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3959*53ee8cc1Swenshuai.xi 
3960*53ee8cc1Swenshuai.xi     if (pu8Data != NULL)
3961*53ee8cc1Swenshuai.xi     {
3962*53ee8cc1Swenshuai.xi         memcpy(pu8Data, psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YCbCr420CapMapDataBlk, (u32DataLen > 32) ? 32 : u32DataLen);
3963*53ee8cc1Swenshuai.xi         *pu32RealLen = (u32DataLen > 32) ? 32 : u32DataLen;
3964*53ee8cc1Swenshuai.xi     }
3965*53ee8cc1Swenshuai.xi }
3966*53ee8cc1Swenshuai.xi 
3967*53ee8cc1Swenshuai.xi //**************************************************************************
3968*53ee8cc1Swenshuai.xi //  [Function Name]:
3969*53ee8cc1Swenshuai.xi //			    MDrv_HDMITx_SetGCPParameter()
3970*53ee8cc1Swenshuai.xi //  [Description]:
3971*53ee8cc1Swenshuai.xi //                      set general control packet content
3972*53ee8cc1Swenshuai.xi //  [Arguments]:
3973*53ee8cc1Swenshuai.xi //			    void
3974*53ee8cc1Swenshuai.xi //  [Return]:
3975*53ee8cc1Swenshuai.xi //			    void
3976*53ee8cc1Swenshuai.xi //
3977*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_SetGCPParameter(void * pInstance)3978*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetGCPParameter(void* pInstance)
3979*53ee8cc1Swenshuai.xi {
3980*53ee8cc1Swenshuai.xi     stGC_PktPara stGCPktPara;
3981*53ee8cc1Swenshuai.xi 
3982*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
3983*53ee8cc1Swenshuai.xi 
3984*53ee8cc1Swenshuai.xi     stGCPktPara.enAVMute = (psHDMITXResPri->stHDMITxInfo.hdmitx_avmute_flag == TRUE) ? E_HDMITX_GCP_SET_AVMUTE : E_HDMITX_GCP_CLEAR_AVMUTE;
3985*53ee8cc1Swenshuai.xi     stGCPktPara.enColorDepInfo = psHDMITXResPri->stHDMITxInfo.output_colordepth_val;
3986*53ee8cc1Swenshuai.xi     MHal_HDMITx_SetGCPParameter(stGCPktPara);
3987*53ee8cc1Swenshuai.xi }
3988*53ee8cc1Swenshuai.xi 
3989*53ee8cc1Swenshuai.xi //**************************************************************************
3990*53ee8cc1Swenshuai.xi //  [Function Name]:
3991*53ee8cc1Swenshuai.xi //			    MDrv_HDMITx_SetAVIInfoPktPara()
3992*53ee8cc1Swenshuai.xi //  [Description]:
3993*53ee8cc1Swenshuai.xi //                      set AVI infoframe packet content
3994*53ee8cc1Swenshuai.xi //  [Arguments]:
3995*53ee8cc1Swenshuai.xi //			    void
3996*53ee8cc1Swenshuai.xi //  [Return]:
3997*53ee8cc1Swenshuai.xi //			    void
3998*53ee8cc1Swenshuai.xi //
3999*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_SetAVIInfoPktPara(void * pInstance)4000*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetAVIInfoPktPara(void* pInstance)
4001*53ee8cc1Swenshuai.xi {
4002*53ee8cc1Swenshuai.xi     stAVIInfo_PktPara stAVIInfoPara;
4003*53ee8cc1Swenshuai.xi 
4004*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4005*53ee8cc1Swenshuai.xi 
4006*53ee8cc1Swenshuai.xi     stAVIInfoPara.enableAFDoverWrite = psHDMITXResPri->stHDMITxInfo.hdmitx_AFD_override_mode;
4007*53ee8cc1Swenshuai.xi 	stAVIInfoPara.A0Value = psHDMITXResPri->stHDMITxInfo.output_activeformat_present;
4008*53ee8cc1Swenshuai.xi     stAVIInfoPara.enColorimetry = psHDMITXResPri->stHDMITxInfo.colorimetry;
4009*53ee8cc1Swenshuai.xi     stAVIInfoPara.enExtColorimetry = psHDMITXResPri->stHDMITxInfo.ext_colorimetry;
4010*53ee8cc1Swenshuai.xi     stAVIInfoPara.enYCCQuantRange = psHDMITXResPri->stHDMITxInfo.enYCCQuantRange;
4011*53ee8cc1Swenshuai.xi 	stAVIInfoPara.enVidTiming = psHDMITXResPri->stHDMITxInfo.output_video_timing;
4012*53ee8cc1Swenshuai.xi 	stAVIInfoPara.enAFDRatio = psHDMITXResPri->stHDMITxInfo.output_afd_ratio;
4013*53ee8cc1Swenshuai.xi 	stAVIInfoPara.enScanInfo = psHDMITXResPri->stHDMITxInfo.output_scan_info;
4014*53ee8cc1Swenshuai.xi 	stAVIInfoPara.enAspectRatio =  psHDMITXResPri->stHDMITxInfo.output_aspect_ratio;
4015*53ee8cc1Swenshuai.xi 
4016*53ee8cc1Swenshuai.xi     if(psHDMITXResPri->stHDMITxInfo.hdmitx_video_flag)
4017*53ee8cc1Swenshuai.xi     {
4018*53ee8cc1Swenshuai.xi         stAVIInfoPara.enColorFmt = psHDMITXResPri->stHDMITxInfo.output_color;
4019*53ee8cc1Swenshuai.xi     }
4020*53ee8cc1Swenshuai.xi     else
4021*53ee8cc1Swenshuai.xi     {
4022*53ee8cc1Swenshuai.xi         if(!MHal_HDMITx_CSC_Support_R2Y(pInstance))
4023*53ee8cc1Swenshuai.xi         {
4024*53ee8cc1Swenshuai.xi             stAVIInfoPara.enColorFmt = E_HDMITX_VIDEO_COLOR_RGB444;
4025*53ee8cc1Swenshuai.xi         }
4026*53ee8cc1Swenshuai.xi         else
4027*53ee8cc1Swenshuai.xi         {
4028*53ee8cc1Swenshuai.xi             stAVIInfoPara.enColorFmt = psHDMITXResPri->stHDMITxInfo.output_color;
4029*53ee8cc1Swenshuai.xi         }
4030*53ee8cc1Swenshuai.xi     }
4031*53ee8cc1Swenshuai.xi 
4032*53ee8cc1Swenshuai.xi     MHal_HDMITx_SetAVIInfoParameter(stAVIInfoPara);
4033*53ee8cc1Swenshuai.xi }
4034*53ee8cc1Swenshuai.xi 
4035*53ee8cc1Swenshuai.xi //**************************************************************************
4036*53ee8cc1Swenshuai.xi //  [Function Name]:
4037*53ee8cc1Swenshuai.xi //			    MDrv_HDMITx_SetAudInfoPktPara()
4038*53ee8cc1Swenshuai.xi //  [Description]:
4039*53ee8cc1Swenshuai.xi //                      Set Audio Infoframe packet content
4040*53ee8cc1Swenshuai.xi //  [Arguments]:
4041*53ee8cc1Swenshuai.xi //			    void
4042*53ee8cc1Swenshuai.xi //  [Return]:
4043*53ee8cc1Swenshuai.xi //			    void
4044*53ee8cc1Swenshuai.xi //
4045*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_SetAudInfoPktPara(void * pInstance)4046*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetAudInfoPktPara(void* pInstance)
4047*53ee8cc1Swenshuai.xi {
4048*53ee8cc1Swenshuai.xi     stAUDInfo_PktPara stAudInfoPara;
4049*53ee8cc1Swenshuai.xi 
4050*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4051*53ee8cc1Swenshuai.xi 
4052*53ee8cc1Swenshuai.xi     stAudInfoPara.enAudChCnt = psHDMITXResPri->stHDMITxInfo.output_audio_channel;
4053*53ee8cc1Swenshuai.xi     stAudInfoPara.enAudFreq = psHDMITXResPri->stHDMITxInfo.output_audio_frequncy;
4054*53ee8cc1Swenshuai.xi     stAudInfoPara.enAudType = psHDMITXResPri->stHDMITxInfo.output_audio_type;
4055*53ee8cc1Swenshuai.xi     MHal_HDMITx_SetAudioInfoParameter(stAudInfoPara);
4056*53ee8cc1Swenshuai.xi     //stAudInfoPara.bChStatus = gHDMITxInfo.output_a
4057*53ee8cc1Swenshuai.xi }
4058*53ee8cc1Swenshuai.xi 
4059*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4060*53ee8cc1Swenshuai.xi /// @brief This routine turn on/off HDMI Tx TMDS signal
4061*53ee8cc1Swenshuai.xi /// @return None
4062*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_SetTMDSOnOff(void * pInstance,MS_BOOL state)4063*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetTMDSOnOff(void* pInstance, MS_BOOL state)
4064*53ee8cc1Swenshuai.xi {
4065*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4066*53ee8cc1Swenshuai.xi 
4067*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_tmds_flag = state;
4068*53ee8cc1Swenshuai.xi 
4069*53ee8cc1Swenshuai.xi     if (!g_bDisableTMDSCtrl)
4070*53ee8cc1Swenshuai.xi     {
4071*53ee8cc1Swenshuai.xi         MHal_HDMITx_SetTMDSOnOff(psHDMITXResPri->stHDMITxInfo.hdmitx_RB_swap_flag, psHDMITXResPri->stHDMITxInfo.hdmitx_tmds_flag);
4072*53ee8cc1Swenshuai.xi     }
4073*53ee8cc1Swenshuai.xi }
4074*53ee8cc1Swenshuai.xi 
4075*53ee8cc1Swenshuai.xi 
4076*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4077*53ee8cc1Swenshuai.xi /// @brief This routine turn on/off HDMI Tx TMDS signal
4078*53ee8cc1Swenshuai.xi /// @return None
4079*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_GetTMDSStatus(void * pInstance)4080*53ee8cc1Swenshuai.xi MS_U32 MDrv_HDMITx_GetTMDSStatus(void* pInstance)
4081*53ee8cc1Swenshuai.xi {
4082*53ee8cc1Swenshuai.xi     MS_U32 u32TMDSStatus = 0;
4083*53ee8cc1Swenshuai.xi     u32TMDSStatus = MHal_HDMITx_GetTMDSStatus();
4084*53ee8cc1Swenshuai.xi     return u32TMDSStatus;
4085*53ee8cc1Swenshuai.xi }
4086*53ee8cc1Swenshuai.xi 
4087*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4088*53ee8cc1Swenshuai.xi /// @brief This routine config HDMI Tx output mode (DVI / HDMI)
4089*53ee8cc1Swenshuai.xi /// @return None
4090*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_SetHDMITxMode(void * pInstance,MsHDMITX_OUTPUT_MODE mode)4091*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetHDMITxMode(void* pInstance, MsHDMITX_OUTPUT_MODE mode)
4092*53ee8cc1Swenshuai.xi {
4093*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4094*53ee8cc1Swenshuai.xi 
4095*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_mode = mode;
4096*53ee8cc1Swenshuai.xi 
4097*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.output_mode & 0x01) // check HDCP
4098*53ee8cc1Swenshuai.xi     {
4099*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SetHDCPFlag(pInstance, TRUE); //gHDMITxInfo.hdmitx_hdcp_flag = TRUE;
4100*53ee8cc1Swenshuai.xi     }
4101*53ee8cc1Swenshuai.xi     else
4102*53ee8cc1Swenshuai.xi     {
4103*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SetHDCPFlag(pInstance, FALSE); //gHDMITxInfo.hdmitx_hdcp_flag = FALSE;
4104*53ee8cc1Swenshuai.xi     }
4105*53ee8cc1Swenshuai.xi 
4106*53ee8cc1Swenshuai.xi     if ( MHal_HDMITx_IsSupportDVIMode() == FALSE)
4107*53ee8cc1Swenshuai.xi     {
4108*53ee8cc1Swenshuai.xi         /***********************************************/
4109*53ee8cc1Swenshuai.xi         //SW Patch,
4110*53ee8cc1Swenshuai.xi         //KAISERIN_CHIP_TOP_BASE DO NOT support YUV2RGB
4111*53ee8cc1Swenshuai.xi         /***********************************************/
4112*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.output_mode = (psHDMITXResPri->stHDMITxInfo.output_mode | BIT1);
4113*53ee8cc1Swenshuai.xi     }
4114*53ee8cc1Swenshuai.xi     // HDMI / DVI
4115*53ee8cc1Swenshuai.xi 
4116*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.hdmitx_force_mode) // AP force output mode
4117*53ee8cc1Swenshuai.xi     {
4118*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.output_mode = psHDMITXResPri->stHDMITxInfo.force_output_mode;
4119*53ee8cc1Swenshuai.xi         if((psHDMITXResPri->stHDMITxInfo.force_output_mode == E_HDMITX_DVI) || (psHDMITXResPri->stHDMITxInfo.force_output_mode == E_HDMITX_DVI_HDCP)) // DVI mode
4120*53ee8cc1Swenshuai.xi         {
4121*53ee8cc1Swenshuai.xi             psHDMITXResPri->stHDMITxInfo.RxEdidInfo.AudSupportAI = FALSE;
4122*53ee8cc1Swenshuai.xi             psHDMITXResPri->stHDMITxInfo.output_color = E_HDMITX_VIDEO_COLOR_RGB444;
4123*53ee8cc1Swenshuai.xi         }
4124*53ee8cc1Swenshuai.xi     }
4125*53ee8cc1Swenshuai.xi 
4126*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.output_mode & BIT1) // HDMI
4127*53ee8cc1Swenshuai.xi     {
4128*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.hdmitx_audio_flag = TRUE;
4129*53ee8cc1Swenshuai.xi         MHal_HDMITx_SetHDMImode(TRUE, psHDMITXResPri->stHDMITxInfo.output_colordepth_val);
4130*53ee8cc1Swenshuai.xi 
4131*53ee8cc1Swenshuai.xi         if ((psHDMITXResPri->stHDMITxInfo.output_colordepth_val) || (psHDMITXResPri->stHDMITxInfo.hdmitx_avmute_flag)) // RX support DC or SET_AVMUTE
4132*53ee8cc1Swenshuai.xi         {
4133*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SendPacket(E_HDMITX_GC_PACKET, E_HDMITX_CYCLIC_PACKET);
4134*53ee8cc1Swenshuai.xi         }
4135*53ee8cc1Swenshuai.xi         else
4136*53ee8cc1Swenshuai.xi         {
4137*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SendPacket(E_HDMITX_GC_PACKET, E_HDMITX_STOP_PACKET);
4138*53ee8cc1Swenshuai.xi         }
4139*53ee8cc1Swenshuai.xi 
4140*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_NULL_PACKET, E_HDMITX_CYCLIC_PACKET);
4141*53ee8cc1Swenshuai.xi         if (g_bDisableVSInfo == TRUE)
4142*53ee8cc1Swenshuai.xi         {
4143*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SendPacket(E_HDMITX_VS_INFOFRAME, E_HDMITX_STOP_PACKET);
4144*53ee8cc1Swenshuai.xi         }
4145*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_SPD_INFOFRAME, E_HDMITX_CYCLIC_PACKET);
4146*53ee8cc1Swenshuai.xi         DBG_HDMITX(printf("MDrv_HDMITx_SetHDMITxMode: HDMI mode = %d \n", psHDMITXResPri->stHDMITxInfo.output_mode));
4147*53ee8cc1Swenshuai.xi     }
4148*53ee8cc1Swenshuai.xi     else // DVI
4149*53ee8cc1Swenshuai.xi     {
4150*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.hdmitx_audio_flag = FALSE;
4151*53ee8cc1Swenshuai.xi         MHal_HDMITx_SetHDMImode(FALSE, psHDMITXResPri->stHDMITxInfo.output_colordepth_val);
4152*53ee8cc1Swenshuai.xi         DBG_HDMITX(printf("MDrv_HDMITx_SetHDMITxMode: DVI mode = %d \n", psHDMITXResPri->stHDMITxInfo.output_mode));
4153*53ee8cc1Swenshuai.xi     }
4154*53ee8cc1Swenshuai.xi }
4155*53ee8cc1Swenshuai.xi 
4156*53ee8cc1Swenshuai.xi //**************************************************************************
4157*53ee8cc1Swenshuai.xi //  [Function Name]:
4158*53ee8cc1Swenshuai.xi //			HDMITx_Handler()
4159*53ee8cc1Swenshuai.xi //  [Description]:
4160*53ee8cc1Swenshuai.xi //                  HDMI TX FSM
4161*53ee8cc1Swenshuai.xi //  [Arguments]:
4162*53ee8cc1Swenshuai.xi //			[MS_U32] u32State
4163*53ee8cc1Swenshuai.xi //  [Return]:
4164*53ee8cc1Swenshuai.xi //			void
4165*53ee8cc1Swenshuai.xi //
4166*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_SetDeepColorMode(void * pInstance,MsHDMITX_VIDEO_COLORDEPTH_VAL enDeepColorMode)4167*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetDeepColorMode(void* pInstance, MsHDMITX_VIDEO_COLORDEPTH_VAL enDeepColorMode)
4168*53ee8cc1Swenshuai.xi {
4169*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4170*53ee8cc1Swenshuai.xi 
4171*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_colordepth_val = enDeepColorMode;
4172*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetGCPParameter(pInstance);
4173*53ee8cc1Swenshuai.xi }
4174*53ee8cc1Swenshuai.xi 
4175*53ee8cc1Swenshuai.xi //**************************************************************************
4176*53ee8cc1Swenshuai.xi //  [Function Name]:
4177*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_SetRBChannelSwap()
4178*53ee8cc1Swenshuai.xi //  [Description]:
4179*53ee8cc1Swenshuai.xi //                  set R, B channel swap flag
4180*53ee8cc1Swenshuai.xi //  [Arguments]:
4181*53ee8cc1Swenshuai.xi //			[MS_BOOL] state
4182*53ee8cc1Swenshuai.xi //  [Return]:
4183*53ee8cc1Swenshuai.xi //			void
4184*53ee8cc1Swenshuai.xi //
4185*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_SetRBChannelSwap(void * pInstance,MS_BOOL state)4186*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetRBChannelSwap(void* pInstance, MS_BOOL state) //wilson@kano
4187*53ee8cc1Swenshuai.xi {
4188*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4189*53ee8cc1Swenshuai.xi 
4190*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_RB_swap_flag = state;
4191*53ee8cc1Swenshuai.xi }
4192*53ee8cc1Swenshuai.xi 
4193*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4194*53ee8cc1Swenshuai.xi /// @brief This routine turn on/off HDMI Tx video output
4195*53ee8cc1Swenshuai.xi /// @return None
4196*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_SetVideoOnOff(void * pInstance,MS_BOOL state)4197*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetVideoOnOff(void* pInstance, MS_BOOL state)
4198*53ee8cc1Swenshuai.xi {
4199*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4200*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_video_flag = state;
4201*53ee8cc1Swenshuai.xi 
4202*53ee8cc1Swenshuai.xi     #if 0
4203*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.hdmitx_video_flag == FALSE) //force RGB color format for pattern gen
4204*53ee8cc1Swenshuai.xi     {
4205*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SetColorFormat(pInstance, psHDMITXResPri->stHDMITxInfo.input_color, E_HDMITX_VIDEO_COLOR_RGB444);
4206*53ee8cc1Swenshuai.xi     }
4207*53ee8cc1Swenshuai.xi     #endif
4208*53ee8cc1Swenshuai.xi 
4209*53ee8cc1Swenshuai.xi     MDrv_HDMITx_ColorandRange_Transform(pInstance, psHDMITXResPri->stHDMITxInfo.input_color, psHDMITXResPri->stHDMITxInfo.output_color, psHDMITXResPri->stHDMITxInfo.input_range, psHDMITXResPri->stHDMITxInfo.output_range);
4210*53ee8cc1Swenshuai.xi 
4211*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.output_video_timing >= E_HDMITX_RES_1280x720p_50Hz)
4212*53ee8cc1Swenshuai.xi         MHal_HDMITx_SetVideoOnOff(psHDMITXResPri->stHDMITxInfo.hdmitx_video_flag, psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag, TRUE);
4213*53ee8cc1Swenshuai.xi     else
4214*53ee8cc1Swenshuai.xi         MHal_HDMITx_SetVideoOnOff(psHDMITXResPri->stHDMITxInfo.hdmitx_video_flag, psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag, FALSE);
4215*53ee8cc1Swenshuai.xi }
4216*53ee8cc1Swenshuai.xi 
4217*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4218*53ee8cc1Swenshuai.xi /// @brief This routine sets video color formatt
4219*53ee8cc1Swenshuai.xi /// @return None
4220*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_SetColorFormat(void * pInstance,MsHDMITX_VIDEO_COLOR_FORMAT enInColor,MsHDMITX_VIDEO_COLOR_FORMAT enOutColor)4221*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetColorFormat(void* pInstance, MsHDMITX_VIDEO_COLOR_FORMAT enInColor, MsHDMITX_VIDEO_COLOR_FORMAT enOutColor)
4222*53ee8cc1Swenshuai.xi {
4223*53ee8cc1Swenshuai.xi     #if 0
4224*53ee8cc1Swenshuai.xi     MS_BOOL bflag = FALSE;
4225*53ee8cc1Swenshuai.xi 
4226*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4227*53ee8cc1Swenshuai.xi 
4228*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.input_color = enInColor;
4229*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_color = enOutColor;
4230*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetAVIInfoPktPara(pInstance);
4231*53ee8cc1Swenshuai.xi 
4232*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.hdmitx_video_flag == FALSE)
4233*53ee8cc1Swenshuai.xi     {
4234*53ee8cc1Swenshuai.xi         MDrv_HDMITx_ColorandRange_Transform(pInstance, psHDMITXResPri->stHDMITxInfo.input_color, psHDMITXResPri->stHDMITxInfo.output_color, psHDMITXResPri->stHDMITxInfo.input_range, psHDMITXResPri->stHDMITxInfo.output_range);
4235*53ee8cc1Swenshuai.xi         return;
4236*53ee8cc1Swenshuai.xi     }
4237*53ee8cc1Swenshuai.xi 
4238*53ee8cc1Swenshuai.xi     // YUV444 -> RGB444
4239*53ee8cc1Swenshuai.xi     if ((enInColor != enOutColor) /*&& (enOutColor == E_HDMITX_VIDEO_COLOR_RGB444)*/)
4240*53ee8cc1Swenshuai.xi     {
4241*53ee8cc1Swenshuai.xi             psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag = TRUE;
4242*53ee8cc1Swenshuai.xi     }
4243*53ee8cc1Swenshuai.xi     else
4244*53ee8cc1Swenshuai.xi     {
4245*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag = FALSE;
4246*53ee8cc1Swenshuai.xi     }
4247*53ee8cc1Swenshuai.xi 
4248*53ee8cc1Swenshuai.xi 
4249*53ee8cc1Swenshuai.xi     bflag = (psHDMITXResPri->stHDMITxInfo.output_color == E_HDMITX_VIDEO_COLOR_YUV422) ? TRUE : FALSE;
4250*53ee8cc1Swenshuai.xi 
4251*53ee8cc1Swenshuai.xi     if(psHDMITXResPri->stHDMITxInfo.input_range != psHDMITXResPri->stHDMITxInfo.output_range)
4252*53ee8cc1Swenshuai.xi     {
4253*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag = TRUE;
4254*53ee8cc1Swenshuai.xi     }
4255*53ee8cc1Swenshuai.xi 
4256*53ee8cc1Swenshuai.xi 	if (psHDMITXResPri->stHDMITxInfo.output_video_timing >= E_HDMITX_RES_1280x720p_50Hz)
4257*53ee8cc1Swenshuai.xi     {
4258*53ee8cc1Swenshuai.xi         MHal_HDMITx_SetColorFormat(psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag, bflag, TRUE);
4259*53ee8cc1Swenshuai.xi     }
4260*53ee8cc1Swenshuai.xi     else
4261*53ee8cc1Swenshuai.xi     {
4262*53ee8cc1Swenshuai.xi         MHal_HDMITx_SetColorFormat(psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag, bflag, FALSE);
4263*53ee8cc1Swenshuai.xi     }
4264*53ee8cc1Swenshuai.xi 
4265*53ee8cc1Swenshuai.xi 	// send packet
4266*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SendPacket(E_HDMITX_AVI_INFOFRAME, E_HDMITX_CYCLIC_PACKET);
4267*53ee8cc1Swenshuai.xi 
4268*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.output_color == E_HDMITX_VIDEO_COLOR_YUV420)
4269*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SetVideoOutputMode(pInstance, psHDMITXResPri->stHDMITxInfo.output_video_timing); //wilson: for 420;
4270*53ee8cc1Swenshuai.xi 
4271*53ee8cc1Swenshuai.xi     printf("A InColor = %x, OutColor = %x\r\n", enInColor, enOutColor);
4272*53ee8cc1Swenshuai.xi     #else
4273*53ee8cc1Swenshuai.xi         _HDMITX_GET_VARIABLE();
4274*53ee8cc1Swenshuai.xi         printf("B InColor = %x, OutColor = %x\r\n", enInColor, enOutColor);
4275*53ee8cc1Swenshuai.xi         MDrv_HDMITx_ColorandRange_Transform(pInstance, enInColor, enOutColor, psHDMITXResPri->stHDMITxInfo.input_range, psHDMITXResPri->stHDMITxInfo.output_range);
4276*53ee8cc1Swenshuai.xi         //MDrv_HDMITx_ColorandRange_Transform(pInstance, enInColor, enOutColor, E_HDMITX_YCC_QUANT_FULL, E_HDMITX_YCC_QUANT_FULL);
4277*53ee8cc1Swenshuai.xi     #endif
4278*53ee8cc1Swenshuai.xi }
4279*53ee8cc1Swenshuai.xi 
4280*53ee8cc1Swenshuai.xi //**************************************************************************
4281*53ee8cc1Swenshuai.xi //  [Function Name]:
4282*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_ColorandRange_Transform()
4283*53ee8cc1Swenshuai.xi //  [Description]:
4284*53ee8cc1Swenshuai.xi //                  This routine sets video color range and format
4285*53ee8cc1Swenshuai.xi //  [Arguments]:
4286*53ee8cc1Swenshuai.xi //			[MsHDMITX_VIDEO_COLOR_FORMAT] Input/Output color format
4287*53ee8cc1Swenshuai.xi //                  [MsHDMITX_VIDEO_COLOR_RANGE] Input/Outpu color range
4288*53ee8cc1Swenshuai.xi //  [Return]:
4289*53ee8cc1Swenshuai.xi //			[MS_BOOL] Color Range Transforming supported or not
4290*53ee8cc1Swenshuai.xi //
4291*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_ColorandRange_Transform(void * pInstance,MsHDMITX_VIDEO_COLOR_FORMAT incolor,MsHDMITX_VIDEO_COLOR_FORMAT outcolor,MsHDMITX_YCC_QUANT_RANGE inange,MsHDMITX_YCC_QUANT_RANGE outrange)4292*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_ColorandRange_Transform(void* pInstance, MsHDMITX_VIDEO_COLOR_FORMAT incolor, MsHDMITX_VIDEO_COLOR_FORMAT outcolor, MsHDMITX_YCC_QUANT_RANGE inange, MsHDMITX_YCC_QUANT_RANGE outrange)
4293*53ee8cc1Swenshuai.xi {
4294*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
4295*53ee8cc1Swenshuai.xi 
4296*53ee8cc1Swenshuai.xi     //_HDMITX_SEMAPHORE_ENTRY(pInstance);
4297*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4298*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.input_color = incolor;
4299*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_color = outcolor;
4300*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.input_range = inange;
4301*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_range = outrange;
4302*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.enYCCQuantRange = outrange;
4303*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetAVIInfoPktPara(pInstance);
4304*53ee8cc1Swenshuai.xi 
4305*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.hdmitx_video_flag == FALSE)
4306*53ee8cc1Swenshuai.xi     {
4307*53ee8cc1Swenshuai.xi         if(!MHal_HDMITx_CSC_Support_R2Y(pInstance))
4308*53ee8cc1Swenshuai.xi         {
4309*53ee8cc1Swenshuai.xi             incolor = E_HDMITX_VIDEO_COLOR_RGB444;
4310*53ee8cc1Swenshuai.xi             outcolor = E_HDMITX_VIDEO_COLOR_RGB444;
4311*53ee8cc1Swenshuai.xi         }
4312*53ee8cc1Swenshuai.xi         else
4313*53ee8cc1Swenshuai.xi         {
4314*53ee8cc1Swenshuai.xi             incolor = E_HDMITX_VIDEO_COLOR_RGB444;
4315*53ee8cc1Swenshuai.xi         }
4316*53ee8cc1Swenshuai.xi     }
4317*53ee8cc1Swenshuai.xi 
4318*53ee8cc1Swenshuai.xi     if( (incolor == E_HDMITX_VIDEO_COLOR_RGB444) && (outcolor != E_HDMITX_VIDEO_COLOR_RGB444) )
4319*53ee8cc1Swenshuai.xi     {
4320*53ee8cc1Swenshuai.xi         //Old chip limited by R2Y
4321*53ee8cc1Swenshuai.xi         if(!MHal_HDMITx_CSC_Support_R2Y(pInstance))
4322*53ee8cc1Swenshuai.xi         {
4323*53ee8cc1Swenshuai.xi             printf("Can not support for R2Y\r\n");
4324*53ee8cc1Swenshuai.xi             return FALSE;
4325*53ee8cc1Swenshuai.xi         }
4326*53ee8cc1Swenshuai.xi     }
4327*53ee8cc1Swenshuai.xi 
4328*53ee8cc1Swenshuai.xi     if(!MDrv_HDMITx_EdidGetHDMISupportFlag(pInstance) && (!psHDMITXResPri->stHDMITxInfo.hdmitx_force_output_color))
4329*53ee8cc1Swenshuai.xi     {
4330*53ee8cc1Swenshuai.xi         if(outcolor != E_HDMITX_VIDEO_COLOR_RGB444)
4331*53ee8cc1Swenshuai.xi         {
4332*53ee8cc1Swenshuai.xi             printf("DVI mode needs RGB only\r\n");
4333*53ee8cc1Swenshuai.xi             return FALSE;
4334*53ee8cc1Swenshuai.xi         }
4335*53ee8cc1Swenshuai.xi     }
4336*53ee8cc1Swenshuai.xi 
4337*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.hdmitx_video_flag == FALSE)
4338*53ee8cc1Swenshuai.xi     {
4339*53ee8cc1Swenshuai.xi         bRet = MHal_HDMITx_ColorandRange_Transform(incolor, outcolor, psHDMITXResPri->stHDMITxInfo.input_range, psHDMITXResPri->stHDMITxInfo.output_range);
4340*53ee8cc1Swenshuai.xi     }
4341*53ee8cc1Swenshuai.xi     else
4342*53ee8cc1Swenshuai.xi     {
4343*53ee8cc1Swenshuai.xi         bRet = MHal_HDMITx_ColorandRange_Transform(psHDMITXResPri->stHDMITxInfo.input_color, psHDMITXResPri->stHDMITxInfo.output_color, psHDMITXResPri->stHDMITxInfo.input_range, psHDMITXResPri->stHDMITxInfo.output_range);
4344*53ee8cc1Swenshuai.xi     }
4345*53ee8cc1Swenshuai.xi 
4346*53ee8cc1Swenshuai.xi     if(inange != outrange)
4347*53ee8cc1Swenshuai.xi     {
4348*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag = TRUE;
4349*53ee8cc1Swenshuai.xi     }
4350*53ee8cc1Swenshuai.xi     else if(outcolor != incolor)
4351*53ee8cc1Swenshuai.xi     {
4352*53ee8cc1Swenshuai.xi         if(MHal_HDMITx_CSC_Support_R2Y(pInstance))
4353*53ee8cc1Swenshuai.xi         {
4354*53ee8cc1Swenshuai.xi             if(outcolor == E_HDMITX_VIDEO_COLOR_RGB444)//Input Y -> Output R
4355*53ee8cc1Swenshuai.xi                 psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag = TRUE;
4356*53ee8cc1Swenshuai.xi             else if(incolor != E_HDMITX_VIDEO_COLOR_RGB444)//Input Y -> Output Y
4357*53ee8cc1Swenshuai.xi                 psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag = FALSE;
4358*53ee8cc1Swenshuai.xi             else//Input R -> Output Y
4359*53ee8cc1Swenshuai.xi                 psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag = TRUE;
4360*53ee8cc1Swenshuai.xi         }
4361*53ee8cc1Swenshuai.xi         else
4362*53ee8cc1Swenshuai.xi         {
4363*53ee8cc1Swenshuai.xi             if(outcolor == E_HDMITX_VIDEO_COLOR_RGB444)//Input Y -> Output R
4364*53ee8cc1Swenshuai.xi                 psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag = TRUE;
4365*53ee8cc1Swenshuai.xi             else if(incolor != E_HDMITX_VIDEO_COLOR_RGB444)//Input Y -> Output Y
4366*53ee8cc1Swenshuai.xi                 psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag = FALSE;
4367*53ee8cc1Swenshuai.xi             else//Input R -> Output Y
4368*53ee8cc1Swenshuai.xi                 psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag = FALSE;
4369*53ee8cc1Swenshuai.xi 
4370*53ee8cc1Swenshuai.xi         }
4371*53ee8cc1Swenshuai.xi     }
4372*53ee8cc1Swenshuai.xi     else
4373*53ee8cc1Swenshuai.xi     {
4374*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag = FALSE;
4375*53ee8cc1Swenshuai.xi     }
4376*53ee8cc1Swenshuai.xi 
4377*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SendPacket(E_HDMITX_AVI_INFOFRAME, E_HDMITX_CYCLIC_PACKET);
4378*53ee8cc1Swenshuai.xi 
4379*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.output_color == E_HDMITX_VIDEO_COLOR_YUV420)
4380*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SetVideoOutputMode(pInstance, psHDMITXResPri->stHDMITxInfo.output_video_timing); //wilson: for 420;
4381*53ee8cc1Swenshuai.xi 
4382*53ee8cc1Swenshuai.xi     return bRet;
4383*53ee8cc1Swenshuai.xi }
4384*53ee8cc1Swenshuai.xi 
4385*53ee8cc1Swenshuai.xi 
4386*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4387*53ee8cc1Swenshuai.xi /// @brief This routine set HDMI Tx AVMUTE
4388*53ee8cc1Swenshuai.xi /// @argument:
4389*53ee8cc1Swenshuai.xi ///              - bflag: True=> SET_AVMUTE, FALSE=>CLEAR_AVMUTE
4390*53ee8cc1Swenshuai.xi ///
4391*53ee8cc1Swenshuai.xi /// @return None
4392*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_SetAVMUTE(void * pInstance,MS_BOOL bflag)4393*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetAVMUTE(void* pInstance, MS_BOOL bflag)
4394*53ee8cc1Swenshuai.xi {
4395*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4396*53ee8cc1Swenshuai.xi 
4397*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_avmute_flag = bflag;
4398*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetGCPParameter(pInstance); //update packet content; wilson@kano
4399*53ee8cc1Swenshuai.xi 
4400*53ee8cc1Swenshuai.xi     if (bflag)
4401*53ee8cc1Swenshuai.xi     {
4402*53ee8cc1Swenshuai.xi         //MDrv_HDMITx_SendPacket(E_HDMITX_GC_PACKET, E_HDMITX_CYCLIC_PACKET|E_HDMITX_GCP_SET_AVMUTE);
4403*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_GC_PACKET, E_HDMITX_CYCLIC_PACKET);
4404*53ee8cc1Swenshuai.xi         DBG_HDMITX(printf("\nMDrv_HDMITx_SetAVMUTE \n"));
4405*53ee8cc1Swenshuai.xi     }
4406*53ee8cc1Swenshuai.xi     else
4407*53ee8cc1Swenshuai.xi     {
4408*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_GC_PACKET, E_HDMITX_CYCLIC_PACKET);
4409*53ee8cc1Swenshuai.xi 
4410*53ee8cc1Swenshuai.xi         MsOS_DelayTask(50);
4411*53ee8cc1Swenshuai.xi 
4412*53ee8cc1Swenshuai.xi         if (psHDMITXResPri->stHDMITxInfo.output_colordepth_val) // RX support DC
4413*53ee8cc1Swenshuai.xi         {
4414*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SendPacket(E_HDMITX_GC_PACKET, E_HDMITX_CYCLIC_PACKET);
4415*53ee8cc1Swenshuai.xi         }
4416*53ee8cc1Swenshuai.xi         else
4417*53ee8cc1Swenshuai.xi         {
4418*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SendPacket(E_HDMITX_GC_PACKET, E_HDMITX_STOP_PACKET);
4419*53ee8cc1Swenshuai.xi         }
4420*53ee8cc1Swenshuai.xi         DBG_HDMITX(printf("\nMDrv_HDMITx_ClearAVMUTE \n"));
4421*53ee8cc1Swenshuai.xi     }
4422*53ee8cc1Swenshuai.xi }
4423*53ee8cc1Swenshuai.xi 
4424*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4425*53ee8cc1Swenshuai.xi /// @brief This routine sets VS infoframe
4426*53ee8cc1Swenshuai.xi /// @return None
4427*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_Set_VS_InfoFrame(void * pInstance,MsHDMITX_VIDEO_VS_FORMAT enVSFmt,MsHDMITX_VIDEO_4k2k_VIC enVid4K2KVic,MsHDMITX_VIDEO_3D_STRUCTURE enVid3DStruct)4428*53ee8cc1Swenshuai.xi void MDrv_HDMITx_Set_VS_InfoFrame(void* pInstance, MsHDMITX_VIDEO_VS_FORMAT enVSFmt, MsHDMITX_VIDEO_4k2k_VIC enVid4K2KVic, MsHDMITX_VIDEO_3D_STRUCTURE enVid3DStruct)
4429*53ee8cc1Swenshuai.xi {
4430*53ee8cc1Swenshuai.xi     stVSInfo_PktPara stVSPara;
4431*53ee8cc1Swenshuai.xi 
4432*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4433*53ee8cc1Swenshuai.xi 
4434*53ee8cc1Swenshuai.xi     stVSPara.enVSFmt = enVSFmt;
4435*53ee8cc1Swenshuai.xi     stVSPara.en4k2kVIC = enVid4K2KVic;
4436*53ee8cc1Swenshuai.xi     stVSPara.en3DStruct = enVid3DStruct;
4437*53ee8cc1Swenshuai.xi 
4438*53ee8cc1Swenshuai.xi     MHal_HDMITx_SetVSInfoParameter(stVSPara);
4439*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SendPacket(E_HDMITX_VS_INFOFRAME, E_HDMITX_CYCLIC_PACKET);
4440*53ee8cc1Swenshuai.xi 
4441*53ee8cc1Swenshuai.xi     //to pass compliance test of 3D output format (test with LG, SAMSUNG, Toshiba and Sony TV)
4442*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetAVMUTE(pInstance, TRUE);
4443*53ee8cc1Swenshuai.xi     MHal_HDMITx_SetTMDSOnOff(psHDMITXResPri->stHDMITxInfo.hdmitx_RB_swap_flag, FALSE);
4444*53ee8cc1Swenshuai.xi 
4445*53ee8cc1Swenshuai.xi     MsOS_DelayTask(20); //delay 1 frame/field interval
4446*53ee8cc1Swenshuai.xi 
4447*53ee8cc1Swenshuai.xi     MHal_HDMITx_SetTMDSOnOff(psHDMITXResPri->stHDMITxInfo.hdmitx_RB_swap_flag, TRUE);
4448*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetAVMUTE(pInstance, FALSE);
4449*53ee8cc1Swenshuai.xi }
4450*53ee8cc1Swenshuai.xi 
4451*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4452*53ee8cc1Swenshuai.xi /// @brief This routine sets video output mode (color/repetition/regen)
4453*53ee8cc1Swenshuai.xi /// @return None
4454*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_SetVideoOutputMode(void * pInstance,MsHDMITX_VIDEO_TIMING enVidTiming)4455*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetVideoOutputMode(void* pInstance, MsHDMITX_VIDEO_TIMING enVidTiming)
4456*53ee8cc1Swenshuai.xi {
4457*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4458*53ee8cc1Swenshuai.xi 
4459*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_video_timing = enVidTiming;
4460*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetAVIInfoPktPara(pInstance);
4461*53ee8cc1Swenshuai.xi 
4462*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.output_video_timing >= E_HDMITX_RES_MAX)
4463*53ee8cc1Swenshuai.xi     {
4464*53ee8cc1Swenshuai.xi         printf("[%s][%d] Unsupport HDMI mode 0x%08x\n", __FUNCTION__, __LINE__, psHDMITXResPri->stHDMITxInfo.output_video_timing);
4465*53ee8cc1Swenshuai.xi         return;
4466*53ee8cc1Swenshuai.xi     }
4467*53ee8cc1Swenshuai.xi 
4468*53ee8cc1Swenshuai.xi     #if 0
4469*53ee8cc1Swenshuai.xi     // 41.6 ms * 128 = 5.324 s, 40 ms * 128 = 5.12 s
4470*53ee8cc1Swenshuai.xi     if( (psHDMITXResPri->stHDMITxInfo.output_video_timing == E_HDMITX_RES_1920x1080p_24Hz) || (psHDMITXResPri->stHDMITxInfo.output_video_timing == E_HDMITX_RES_1920x1080p_25Hz) || (psHDMITXResPri->stHDMITxInfo.output_video_timing == E_HDMITX_RES_1920x2205p_24Hz)
4471*53ee8cc1Swenshuai.xi       ||(psHDMITXResPri->stHDMITxInfo.output_video_timing == E_HDMITX_RES_3840x2160p_24Hz) || (psHDMITXResPri->stHDMITxInfo.output_video_timing == E_HDMITX_RES_3840x2160p_25Hz) || (psHDMITXResPri->stHDMITxInfo.output_video_timing == E_HDMITX_RES_4096x2160p_24Hz)) // 24/25 Hz
4472*53ee8cc1Swenshuai.xi         gHDCPCheckRiTimer = 5400;
4473*53ee8cc1Swenshuai.xi     // 33.3 ms * 128 = 4.26 s
4474*53ee8cc1Swenshuai.xi     else if ((psHDMITXResPri->stHDMITxInfo.output_video_timing == E_HDMITX_RES_1920x1080p_30Hz)||(psHDMITXResPri->stHDMITxInfo.output_video_timing == E_HDMITX_RES_3840x2160p_30Hz)) // 30 Hz
4475*53ee8cc1Swenshuai.xi         gHDCPCheckRiTimer = 4300;
4476*53ee8cc1Swenshuai.xi     // 16.6 ms * 128 = 2.124 s, 20 ms * 128 = 2.56 s
4477*53ee8cc1Swenshuai.xi     else // 50/60 Hz
4478*53ee8cc1Swenshuai.xi         gHDCPCheckRiTimer = HDCP_RiCheck_Timer;//2600;
4479*53ee8cc1Swenshuai.xi     #else
4480*53ee8cc1Swenshuai.xi     // 50/60 Hz
4481*53ee8cc1Swenshuai.xi     gHDCPCheckRiTimer = HDCP_RiCheck_Timer;//2600;
4482*53ee8cc1Swenshuai.xi     #endif
4483*53ee8cc1Swenshuai.xi 
4484*53ee8cc1Swenshuai.xi     MHal_HDMITx_SetVideoOutputMode(psHDMITXResPri->stHDMITxInfo.output_video_timing, psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag, psHDMITXResPri->stHDMITxInfo.output_colordepth_val, &psHDMITXResPri->stHDMITxInfo.analog_setting, psHDMITXResPri->stHDMITxInfo.ubSSCEn);
4485*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SendPacket(E_HDMITX_AVI_INFOFRAME, E_HDMITX_CYCLIC_PACKET);
4486*53ee8cc1Swenshuai.xi }
4487*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4488*53ee8cc1Swenshuai.xi /// @brief This routine sets video output mode by customers' bring in info (color/repetition/regen)
4489*53ee8cc1Swenshuai.xi /// @return None
4490*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_SetVideoOutputModeByCustomer(void * pInstance,MsHDMITX_VIDEO_TIMING enVidTiming,stHDMITX_TIMING_INFO_BY_CUSTOMER stTimingInfo)4491*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetVideoOutputModeByCustomer(void* pInstance, MsHDMITX_VIDEO_TIMING enVidTiming, stHDMITX_TIMING_INFO_BY_CUSTOMER stTimingInfo)
4492*53ee8cc1Swenshuai.xi {
4493*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4494*53ee8cc1Swenshuai.xi     MHal_HDMITx_SetVideoInfoByCustomer(enVidTiming, stTimingInfo);
4495*53ee8cc1Swenshuai.xi }
4496*53ee8cc1Swenshuai.xi 
4497*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4498*53ee8cc1Swenshuai.xi /// @brief This routine sets video aspect ratio
4499*53ee8cc1Swenshuai.xi /// @return None
4500*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_SetVideoOutputAsepctRatio(void * pInstance,MsHDMITX_VIDEO_ASPECT_RATIO enOutputAR)4501*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetVideoOutputAsepctRatio(void* pInstance, MsHDMITX_VIDEO_ASPECT_RATIO enOutputAR)
4502*53ee8cc1Swenshuai.xi {
4503*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4504*53ee8cc1Swenshuai.xi     // send packet
4505*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_aspect_ratio = enOutputAR;
4506*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetAVIInfoPktPara(pInstance);
4507*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SendPacket(E_HDMITX_AVI_INFOFRAME, E_HDMITX_CYCLIC_PACKET);
4508*53ee8cc1Swenshuai.xi     if (enOutputAR == E_HDMITX_VIDEO_AR_21_9)
4509*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_VS_INFOFRAME, E_HDMITX_STOP_PACKET);
4510*53ee8cc1Swenshuai.xi }
4511*53ee8cc1Swenshuai.xi 
4512*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4513*53ee8cc1Swenshuai.xi /// @brief This routine sets video scan info and AFD
4514*53ee8cc1Swenshuai.xi /// @return None
4515*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_SetVideoOutputOverscan_AFD(void * pInstance,MS_U8 ucA0,MS_BOOL bAFDOverwrite,MsHDMITX_VIDEO_SCAN_INFO enScanInfo,MsHDMITX_VIDEO_AFD_RATIO enAFDRatio)4516*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetVideoOutputOverscan_AFD(void* pInstance, MS_U8 ucA0, MS_BOOL bAFDOverwrite, MsHDMITX_VIDEO_SCAN_INFO enScanInfo, MsHDMITX_VIDEO_AFD_RATIO enAFDRatio)
4517*53ee8cc1Swenshuai.xi {
4518*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4519*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_activeformat_present = ucA0;
4520*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_AFD_override_mode = bAFDOverwrite;
4521*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_scan_info = enScanInfo;
4522*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_afd_ratio = enAFDRatio;
4523*53ee8cc1Swenshuai.xi 
4524*53ee8cc1Swenshuai.xi     // send packet
4525*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetAVIInfoPktPara(pInstance);
4526*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SendPacket(E_HDMITX_AVI_INFOFRAME, E_HDMITX_CYCLIC_PACKET);
4527*53ee8cc1Swenshuai.xi }
4528*53ee8cc1Swenshuai.xi 
4529*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4530*53ee8cc1Swenshuai.xi /// @brief This routine turns On/off Audio module
4531*53ee8cc1Swenshuai.xi /// @return None
4532*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_SetAudioOnOff(void * pInstance,MS_BOOL state)4533*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetAudioOnOff(void* pInstance, MS_BOOL state)
4534*53ee8cc1Swenshuai.xi {
4535*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4536*53ee8cc1Swenshuai.xi 
4537*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_audio_flag = state;
4538*53ee8cc1Swenshuai.xi 
4539*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetAudInfoPktPara(pInstance);
4540*53ee8cc1Swenshuai.xi 
4541*53ee8cc1Swenshuai.xi     if(psHDMITXResPri->stHDMITxInfo.hdmitx_audio_flag) // turn on
4542*53ee8cc1Swenshuai.xi     {
4543*53ee8cc1Swenshuai.xi         MHal_HDMITx_SetAudioOnOff(TRUE);
4544*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_ACR_PACKET, E_HDMITX_CYCLIC_PACKET);
4545*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_AS_PACKET, E_HDMITX_CYCLIC_PACKET);
4546*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_AUDIO_INFOFRAME, E_HDMITX_CYCLIC_PACKET);
4547*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_ACP_PACKET, E_HDMITX_STOP_PACKET);
4548*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_ISRC1_PACKET, E_HDMITX_STOP_PACKET);
4549*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_ISRC2_PACKET, E_HDMITX_STOP_PACKET);
4550*53ee8cc1Swenshuai.xi     }
4551*53ee8cc1Swenshuai.xi 
4552*53ee8cc1Swenshuai.xi     else // turn off
4553*53ee8cc1Swenshuai.xi     {
4554*53ee8cc1Swenshuai.xi         MHal_HDMITx_SetAudioOnOff(FALSE);
4555*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_ACR_PACKET, E_HDMITX_STOP_PACKET);
4556*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_AS_PACKET, E_HDMITX_STOP_PACKET);
4557*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_AUDIO_INFOFRAME, E_HDMITX_STOP_PACKET);
4558*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_ACP_PACKET, E_HDMITX_STOP_PACKET);
4559*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_ISRC1_PACKET, E_HDMITX_STOP_PACKET);
4560*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_ISRC2_PACKET, E_HDMITX_STOP_PACKET);
4561*53ee8cc1Swenshuai.xi     }
4562*53ee8cc1Swenshuai.xi }
4563*53ee8cc1Swenshuai.xi 
4564*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4565*53ee8cc1Swenshuai.xi /// @brief This routine sets audio sampling freq.
4566*53ee8cc1Swenshuai.xi /// @return None
4567*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_SetAudioFrequency(void * pInstance,MsHDMITX_AUDIO_FREQUENCY enAudFreq)4568*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetAudioFrequency(void* pInstance, MsHDMITX_AUDIO_FREQUENCY enAudFreq)
4569*53ee8cc1Swenshuai.xi {
4570*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4571*53ee8cc1Swenshuai.xi 
4572*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_audio_frequncy = enAudFreq;
4573*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetAudInfoPktPara(pInstance);
4574*53ee8cc1Swenshuai.xi 
4575*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.hdmitx_audio_flag)
4576*53ee8cc1Swenshuai.xi     {
4577*53ee8cc1Swenshuai.xi         MHal_HDMITx_SetAudioFrequency(psHDMITXResPri->stHDMITxInfo.output_audio_frequncy, psHDMITXResPri->stHDMITxInfo.output_audio_channel, psHDMITXResPri->stHDMITxInfo.output_audio_type);
4578*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_ACR_PACKET, E_HDMITX_CYCLIC_PACKET);
4579*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(E_HDMITX_AUDIO_INFOFRAME, E_HDMITX_CYCLIC_PACKET);
4580*53ee8cc1Swenshuai.xi     }
4581*53ee8cc1Swenshuai.xi }
4582*53ee8cc1Swenshuai.xi 
4583*53ee8cc1Swenshuai.xi //**************************************************************************
4584*53ee8cc1Swenshuai.xi //  [Function Name]:
4585*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_SetAudioChCnt()
4586*53ee8cc1Swenshuai.xi //  [Description]:
4587*53ee8cc1Swenshuai.xi //                  set audio channel number
4588*53ee8cc1Swenshuai.xi //  [Arguments]:
4589*53ee8cc1Swenshuai.xi //			[MsHDMITX_AUDIO_CHANNEL_COUNT] enChCnt
4590*53ee8cc1Swenshuai.xi //  [Return]:
4591*53ee8cc1Swenshuai.xi //			void
4592*53ee8cc1Swenshuai.xi //
4593*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_SetAudioChCnt(void * pInstance,MsHDMITX_AUDIO_CHANNEL_COUNT enChCnt)4594*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetAudioChCnt(void* pInstance, MsHDMITX_AUDIO_CHANNEL_COUNT enChCnt)
4595*53ee8cc1Swenshuai.xi {
4596*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4597*53ee8cc1Swenshuai.xi 
4598*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_audio_channel = enChCnt;
4599*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetAudInfoPktPara(pInstance);
4600*53ee8cc1Swenshuai.xi }
4601*53ee8cc1Swenshuai.xi 
4602*53ee8cc1Swenshuai.xi //**************************************************************************
4603*53ee8cc1Swenshuai.xi //  [Function Name]:
4604*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_SetAudioFmt()
4605*53ee8cc1Swenshuai.xi //  [Description]:
4606*53ee8cc1Swenshuai.xi //                  set audio output format
4607*53ee8cc1Swenshuai.xi //  [Arguments]:
4608*53ee8cc1Swenshuai.xi //			[MsHDMITX_AUDIO_CODING_TYPE] enAudFmt
4609*53ee8cc1Swenshuai.xi //  [Return]:
4610*53ee8cc1Swenshuai.xi //			void
4611*53ee8cc1Swenshuai.xi //
4612*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_SetAudioFmt(void * pInstance,MsHDMITX_AUDIO_CODING_TYPE enAudFmt)4613*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetAudioFmt(void* pInstance, MsHDMITX_AUDIO_CODING_TYPE enAudFmt)
4614*53ee8cc1Swenshuai.xi {
4615*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4616*53ee8cc1Swenshuai.xi 
4617*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.output_audio_type = enAudFmt;
4618*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetAudInfoPktPara(pInstance);
4619*53ee8cc1Swenshuai.xi }
4620*53ee8cc1Swenshuai.xi 
4621*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4622*53ee8cc1Swenshuai.xi /// @brief This routine sets audio source format.
4623*53ee8cc1Swenshuai.xi /// @return None
4624*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_SetAudioSourceFormat(MsHDMITX_AUDIO_SOURCE_FORMAT fmt)4625*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetAudioSourceFormat(MsHDMITX_AUDIO_SOURCE_FORMAT fmt)
4626*53ee8cc1Swenshuai.xi {
4627*53ee8cc1Swenshuai.xi     MHal_HDMITx_SetAudioSourceFormat(fmt);
4628*53ee8cc1Swenshuai.xi }
4629*53ee8cc1Swenshuai.xi 
4630*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4631*53ee8cc1Swenshuai.xi /// @brief This routine sets HDMI Tx HDCP encryption On/Off
4632*53ee8cc1Swenshuai.xi /// @return None
4633*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_SetHDCPOnOff(void * pInstance,MS_BOOL state)4634*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetHDCPOnOff(void* pInstance, MS_BOOL state)
4635*53ee8cc1Swenshuai.xi {
4636*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4637*53ee8cc1Swenshuai.xi 
4638*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_hdcp_flag = state;
4639*53ee8cc1Swenshuai.xi     MHal_HDMITx_SetHDCPOnOff(state, ((psHDMITXResPri->stHDMITxInfo.output_mode & BIT1) ? TRUE:FALSE));
4640*53ee8cc1Swenshuai.xi }
4641*53ee8cc1Swenshuai.xi 
MDrv_HDMITx_SetHDCPFlag(void * pInstance,MS_BOOL bEnableHdcp)4642*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetHDCPFlag(void* pInstance, MS_BOOL bEnableHdcp)
4643*53ee8cc1Swenshuai.xi {
4644*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4645*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_hdcp_flag = bEnableHdcp;
4646*53ee8cc1Swenshuai.xi }
4647*53ee8cc1Swenshuai.xi //**************************************************************************
4648*53ee8cc1Swenshuai.xi //  [Function Name]:
4649*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_SetFSMState()
4650*53ee8cc1Swenshuai.xi //  [Description]:
4651*53ee8cc1Swenshuai.xi //                  set state of hdmi tx FSM
4652*53ee8cc1Swenshuai.xi //  [Arguments]:
4653*53ee8cc1Swenshuai.xi //			[MDrvHDMITX_FSM_STATE] enState
4654*53ee8cc1Swenshuai.xi //  [Return]:
4655*53ee8cc1Swenshuai.xi //			void
4656*53ee8cc1Swenshuai.xi //
4657*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_SetFSMState(void * pInstance,MDrvHDMITX_FSM_STATE enState)4658*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetFSMState(void* pInstance, MDrvHDMITX_FSM_STATE enState)
4659*53ee8cc1Swenshuai.xi {
4660*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4661*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_state = enState;
4662*53ee8cc1Swenshuai.xi }
4663*53ee8cc1Swenshuai.xi 
4664*53ee8cc1Swenshuai.xi ///@brief setdbug level
4665*53ee8cc1Swenshuai.xi ///@u16DbgSwitch  1 means hdmitx only, 2 mean
MDrv_HDMITx_SetDbgLevel(MS_U16 u16DbgSwitch)4666*53ee8cc1Swenshuai.xi MS_BOOL  MDrv_HDMITx_SetDbgLevel(MS_U16 u16DbgSwitch)
4667*53ee8cc1Swenshuai.xi {
4668*53ee8cc1Swenshuai.xi     _u16DbgHDMITXSwitch = u16DbgSwitch;
4669*53ee8cc1Swenshuai.xi     MHal_HDMITx_HdcpDebugEnable(_u16DbgHDMITXSwitch & HDMITX_DBG_HDCP ? TRUE : FALSE);
4670*53ee8cc1Swenshuai.xi     MHal_HDMITx_UtilDebugEnable(_u16DbgHDMITXSwitch & HDMITX_DBG_UTILTX ? TRUE : FALSE);
4671*53ee8cc1Swenshuai.xi 
4672*53ee8cc1Swenshuai.xi     return TRUE;
4673*53ee8cc1Swenshuai.xi }
4674*53ee8cc1Swenshuai.xi 
MDrv_HDMITx_SetHPDGpioPin(MS_U8 u8pin)4675*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetHPDGpioPin(MS_U8 u8pin)
4676*53ee8cc1Swenshuai.xi {
4677*53ee8cc1Swenshuai.xi     MHal_HDMITx_SetHPDGpioPin(u8pin);
4678*53ee8cc1Swenshuai.xi }
4679*53ee8cc1Swenshuai.xi 
4680*53ee8cc1Swenshuai.xi //**************************************************************************
4681*53ee8cc1Swenshuai.xi //  [Function Name]:
4682*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_SetCECOnOff()
4683*53ee8cc1Swenshuai.xi //  [Description]:
4684*53ee8cc1Swenshuai.xi //                  set CEC enable flag
4685*53ee8cc1Swenshuai.xi //  [Arguments]:
4686*53ee8cc1Swenshuai.xi //			[MS_BOOL] bflag
4687*53ee8cc1Swenshuai.xi //  [Return]:
4688*53ee8cc1Swenshuai.xi //			void
4689*53ee8cc1Swenshuai.xi //
4690*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_SetCECOnOff(void * pInstance,MS_BOOL bflag)4691*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetCECOnOff(void* pInstance, MS_BOOL bflag)
4692*53ee8cc1Swenshuai.xi {
4693*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4694*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_CECEnable_flag = bflag;
4695*53ee8cc1Swenshuai.xi }
4696*53ee8cc1Swenshuai.xi 
4697*53ee8cc1Swenshuai.xi //**************************************************************************
4698*53ee8cc1Swenshuai.xi //  [Function Name]:
4699*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_SetAVIInfoExtColorimetry()
4700*53ee8cc1Swenshuai.xi //  [Description]:
4701*53ee8cc1Swenshuai.xi //                  set extended colorimetry field of aviinfoframe packet
4702*53ee8cc1Swenshuai.xi //  [Arguments]:
4703*53ee8cc1Swenshuai.xi //
4704*53ee8cc1Swenshuai.xi //  [Return]:
4705*53ee8cc1Swenshuai.xi //			void
4706*53ee8cc1Swenshuai.xi //
4707*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_SetAVIInfoExtColorimetry(void * pInstance,MsHDMITX_EXT_COLORIMETRY enExtColorimetry,MsHDMITX_YCC_QUANT_RANGE enYccQuantRange)4708*53ee8cc1Swenshuai.xi void MDrv_HDMITx_SetAVIInfoExtColorimetry(void* pInstance, MsHDMITX_EXT_COLORIMETRY enExtColorimetry, MsHDMITX_YCC_QUANT_RANGE enYccQuantRange)
4709*53ee8cc1Swenshuai.xi {
4710*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4711*53ee8cc1Swenshuai.xi 
4712*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.ext_colorimetry = enExtColorimetry;
4713*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.colorimetry = E_HDMITX_COLORIMETRY_EXTEND;
4714*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.enYCCQuantRange = enYccQuantRange;
4715*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetAVIInfoPktPara(pInstance);
4716*53ee8cc1Swenshuai.xi }
4717*53ee8cc1Swenshuai.xi 
4718*53ee8cc1Swenshuai.xi //**************************************************************************
4719*53ee8cc1Swenshuai.xi //  [Function Name]:
4720*53ee8cc1Swenshuai.xi //      MDrv_HDMITx_SetAVIInfoExtColorimetry()
4721*53ee8cc1Swenshuai.xi //  [Description]:
4722*53ee8cc1Swenshuai.xi //      set extended colorimetry field of aviinfoframe packet
4723*53ee8cc1Swenshuai.xi //  [Arguments]:
4724*53ee8cc1Swenshuai.xi //
4725*53ee8cc1Swenshuai.xi //  [Return]:
4726*53ee8cc1Swenshuai.xi //
4727*53ee8cc1Swenshuai.xi //
4728*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_SetAVIInfoColorimetry(void * pInstance,MsHDMITX_COLORIMETRY enColorimetry)4729*53ee8cc1Swenshuai.xi MS_U8 MDrv_HDMITx_SetAVIInfoColorimetry(void* pInstance, MsHDMITX_COLORIMETRY enColorimetry)
4730*53ee8cc1Swenshuai.xi {
4731*53ee8cc1Swenshuai.xi     MS_U8 ubRet = TRUE;
4732*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4733*53ee8cc1Swenshuai.xi 
4734*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.colorimetry = enColorimetry;
4735*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetAVIInfoPktPara(pInstance);
4736*53ee8cc1Swenshuai.xi 
4737*53ee8cc1Swenshuai.xi     if(psHDMITXResPri->stHDMITxInfo.output_color == E_HDMITX_VIDEO_COLOR_RGB444 )
4738*53ee8cc1Swenshuai.xi     {
4739*53ee8cc1Swenshuai.xi         if(psHDMITXResPri->stHDMITxInfo.colorimetry != E_HDMITX_COLORIMETRY_NO_DATA && psHDMITXResPri->stHDMITxInfo.colorimetry != E_HDMITX_COLORIMETRY_MAX)
4740*53ee8cc1Swenshuai.xi         {
4741*53ee8cc1Swenshuai.xi             //ubRet = FALSE;
4742*53ee8cc1Swenshuai.xi         }
4743*53ee8cc1Swenshuai.xi     }
4744*53ee8cc1Swenshuai.xi 
4745*53ee8cc1Swenshuai.xi     return ubRet;
4746*53ee8cc1Swenshuai.xi }
4747*53ee8cc1Swenshuai.xi 
4748*53ee8cc1Swenshuai.xi //**************************************************************************
4749*53ee8cc1Swenshuai.xi //  [Function Name]:
4750*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_GetCECStatus()
4751*53ee8cc1Swenshuai.xi //  [Description]:
4752*53ee8cc1Swenshuai.xi //                  get CEC enable flag
4753*53ee8cc1Swenshuai.xi //  [Arguments]:
4754*53ee8cc1Swenshuai.xi //			void
4755*53ee8cc1Swenshuai.xi //  [Return]:
4756*53ee8cc1Swenshuai.xi //			MS_BOOL
4757*53ee8cc1Swenshuai.xi //
4758*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_GetCECStatus(void * pInstance)4759*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_GetCECStatus(void* pInstance)
4760*53ee8cc1Swenshuai.xi {
4761*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
4762*53ee8cc1Swenshuai.xi 
4763*53ee8cc1Swenshuai.xi     _HDMITX_SEMAPHORE_ENTRY(pInstance);
4764*53ee8cc1Swenshuai.xi 
4765*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4766*53ee8cc1Swenshuai.xi     bRet = psHDMITXResPri->stHDMITxInfo.hdmitx_CECEnable_flag;
4767*53ee8cc1Swenshuai.xi 
4768*53ee8cc1Swenshuai.xi     _HDMITX_SEMAPHORE_RETURN(pInstance);
4769*53ee8cc1Swenshuai.xi 
4770*53ee8cc1Swenshuai.xi     return bRet;
4771*53ee8cc1Swenshuai.xi }
4772*53ee8cc1Swenshuai.xi 
4773*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4774*53ee8cc1Swenshuai.xi /// @brief This routine will power on/off HDMITx clock (power saving)
4775*53ee8cc1Swenshuai.xi /// @return None
4776*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_Power_OnOff(MS_BOOL bEnable)4777*53ee8cc1Swenshuai.xi void MDrv_HDMITx_Power_OnOff(MS_BOOL bEnable)
4778*53ee8cc1Swenshuai.xi {
4779*53ee8cc1Swenshuai.xi     MHal_HDMITx_Power_OnOff(bEnable);
4780*53ee8cc1Swenshuai.xi }
4781*53ee8cc1Swenshuai.xi 
4782*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4783*53ee8cc1Swenshuai.xi /// @brief This routine turn on/off HDMI Tx Module
4784*53ee8cc1Swenshuai.xi /// @return None
4785*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_TurnOnOff(void * pInstance,MS_BOOL state)4786*53ee8cc1Swenshuai.xi void MDrv_HDMITx_TurnOnOff(void *pInstance, MS_BOOL state)
4787*53ee8cc1Swenshuai.xi {
4788*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4789*53ee8cc1Swenshuai.xi 
4790*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_enable_flag = state;
4791*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_tmds_flag = state;
4792*53ee8cc1Swenshuai.xi 
4793*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.hdmitx_enable_flag) // turn on
4794*53ee8cc1Swenshuai.xi     {
4795*53ee8cc1Swenshuai.xi         MDrv_HDCPTx_SetAuthStartFlag(pInstance, FALSE); //wilson@kano
4796*53ee8cc1Swenshuai.xi         MDrv_HDCPTx_SetAuthDoneFlag(pInstance, FALSE); //wilson@kano
4797*53ee8cc1Swenshuai.xi 
4798*53ee8cc1Swenshuai.xi         //MDrv_HDMITx_PLLOnOff();
4799*53ee8cc1Swenshuai.xi     #if HDMITX_ISR_ENABLE
4800*53ee8cc1Swenshuai.xi         MHal_HDMITx_Int_Enable(gHDMITXIRQ);
4801*53ee8cc1Swenshuai.xi     #endif
4802*53ee8cc1Swenshuai.xi         MHal_HDMITx_VideoInit();
4803*53ee8cc1Swenshuai.xi         MHal_HDMITx_AudioInit();
4804*53ee8cc1Swenshuai.xi         //MDrv_HDMITx_SetTMDSOnOff();
4805*53ee8cc1Swenshuai.xi         //MDrv_HDMITx_Exhibit();
4806*53ee8cc1Swenshuai.xi     }
4807*53ee8cc1Swenshuai.xi     else // turn off
4808*53ee8cc1Swenshuai.xi     {
4809*53ee8cc1Swenshuai.xi         MDrv_HDCPTx_SetAuthStartFlag(pInstance, FALSE); //wilson@kano
4810*53ee8cc1Swenshuai.xi         MDrv_HDCPTx_SetAuthDoneFlag(pInstance, FALSE); //wilson@kano
4811*53ee8cc1Swenshuai.xi 
4812*53ee8cc1Swenshuai.xi     #if HDMITX_ISR_ENABLE
4813*53ee8cc1Swenshuai.xi         MHal_HDMITx_Int_Disable(gHDMITXIRQ);
4814*53ee8cc1Swenshuai.xi         MHal_HDMITx_Int_Clear(gHDMITXIRQ);
4815*53ee8cc1Swenshuai.xi     #endif
4816*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SetTMDSOnOff(pInstance, psHDMITXResPri->stHDMITxInfo.hdmitx_tmds_flag);
4817*53ee8cc1Swenshuai.xi 
4818*53ee8cc1Swenshuai.xi          psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_prestate = E_HDMITX_FSM_PENDING;
4819*53ee8cc1Swenshuai.xi          psHDMITXResPri->stHDMITxInfo.hdmitx_preRX_status = E_HDMITX_DVIClock_L_HPD_L;
4820*53ee8cc1Swenshuai.xi          _hdmitx_preRX_status = psHDMITXResPri->stHDMITxInfo.hdmitx_preRX_status;
4821*53ee8cc1Swenshuai.xi 
4822*53ee8cc1Swenshuai.xi         if(_s32CheckRxTimerId > 0)
4823*53ee8cc1Swenshuai.xi             MsOS_StopTimer(_s32CheckRxTimerId);
4824*53ee8cc1Swenshuai.xi     }
4825*53ee8cc1Swenshuai.xi }
4826*53ee8cc1Swenshuai.xi 
4827*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4828*53ee8cc1Swenshuai.xi /// @brief This routine control HDMI packet generation
4829*53ee8cc1Swenshuai.xi /// @return None
4830*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_EnablePacketGen(MS_BOOL bflag)4831*53ee8cc1Swenshuai.xi void MDrv_HDMITx_EnablePacketGen(MS_BOOL bflag)
4832*53ee8cc1Swenshuai.xi {
4833*53ee8cc1Swenshuai.xi     MHal_HDMITx_EnablePacketGen(bflag);
4834*53ee8cc1Swenshuai.xi }
4835*53ee8cc1Swenshuai.xi 
4836*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4837*53ee8cc1Swenshuai.xi /// @brief This function clear settings of user defined packet
4838*53ee8cc1Swenshuai.xi /// @return None
4839*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_PKT_User_Define_Clear(void)4840*53ee8cc1Swenshuai.xi void MDrv_HDMITx_PKT_User_Define_Clear(void)
4841*53ee8cc1Swenshuai.xi {
4842*53ee8cc1Swenshuai.xi     MHal_HDMITx_PKT_User_Define_Clear();
4843*53ee8cc1Swenshuai.xi }
4844*53ee8cc1Swenshuai.xi 
4845*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4846*53ee8cc1Swenshuai.xi /// @brief This function set user defined hdmi packet
4847*53ee8cc1Swenshuai.xi /// @return None
4848*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_PKT_User_Define(MsHDMITX_PACKET_TYPE packet_type,MS_BOOL def_flag,MsHDMITX_PACKET_PROCESS def_process,MS_U8 def_fcnt)4849*53ee8cc1Swenshuai.xi void MDrv_HDMITx_PKT_User_Define(MsHDMITX_PACKET_TYPE packet_type, MS_BOOL def_flag,
4850*53ee8cc1Swenshuai.xi                                  MsHDMITX_PACKET_PROCESS def_process, MS_U8 def_fcnt)
4851*53ee8cc1Swenshuai.xi {
4852*53ee8cc1Swenshuai.xi     MHal_HDMITx_PKT_User_Define(packet_type, def_flag, def_process, def_fcnt);
4853*53ee8cc1Swenshuai.xi 
4854*53ee8cc1Swenshuai.xi     if ((packet_type == E_HDMITX_VS_INFOFRAME) )
4855*53ee8cc1Swenshuai.xi     {
4856*53ee8cc1Swenshuai.xi         if(def_process == E_HDMITX_CYCLIC_PACKET)
4857*53ee8cc1Swenshuai.xi         {
4858*53ee8cc1Swenshuai.xi             g_bDisableVSInfo = FALSE;
4859*53ee8cc1Swenshuai.xi         }
4860*53ee8cc1Swenshuai.xi         else
4861*53ee8cc1Swenshuai.xi         {
4862*53ee8cc1Swenshuai.xi            g_bDisableVSInfo = TRUE;
4863*53ee8cc1Swenshuai.xi         }
4864*53ee8cc1Swenshuai.xi     }
4865*53ee8cc1Swenshuai.xi 
4866*53ee8cc1Swenshuai.xi     if(_hdmitx_status.bIsInitialized) // fix code dump
4867*53ee8cc1Swenshuai.xi     {
4868*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SendPacket(packet_type, def_process);
4869*53ee8cc1Swenshuai.xi     }
4870*53ee8cc1Swenshuai.xi }
4871*53ee8cc1Swenshuai.xi 
4872*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4873*53ee8cc1Swenshuai.xi /// @brief This function set user defined hdmi packet content
4874*53ee8cc1Swenshuai.xi /// @return None
4875*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_PKT_Content_Define(MsHDMITX_PACKET_TYPE packet_type,MS_U8 * data,MS_U8 length)4876*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_PKT_Content_Define(MsHDMITX_PACKET_TYPE packet_type, MS_U8* data, MS_U8 length)
4877*53ee8cc1Swenshuai.xi {
4878*53ee8cc1Swenshuai.xi     return MHal_HDMITx_PKT_Content_Define(packet_type, data, length);
4879*53ee8cc1Swenshuai.xi }
4880*53ee8cc1Swenshuai.xi 
4881*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4882*53ee8cc1Swenshuai.xi /// @brief This routine Mute Audio FIFO
4883*53ee8cc1Swenshuai.xi /// @param[in] bflag: True: mute audio, False: unmute audio
4884*53ee8cc1Swenshuai.xi /// @return None
4885*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_MuteAudioFIFO(MS_BOOL bflag)4886*53ee8cc1Swenshuai.xi void MDrv_HDMITx_MuteAudioFIFO(MS_BOOL bflag)
4887*53ee8cc1Swenshuai.xi {
4888*53ee8cc1Swenshuai.xi     MHal_HDMITx_MuteAudioFIFO(bflag);
4889*53ee8cc1Swenshuai.xi }
4890*53ee8cc1Swenshuai.xi 
4891*53ee8cc1Swenshuai.xi //**************************************************************************
4892*53ee8cc1Swenshuai.xi //  [Function Name]:
4893*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_AnalogTuning()
4894*53ee8cc1Swenshuai.xi //  [Description]:
4895*53ee8cc1Swenshuai.xi //                  loading analog setting
4896*53ee8cc1Swenshuai.xi //  [Arguments]:
4897*53ee8cc1Swenshuai.xi //			[HDMITX_ANALOG_TUNING] *pInfo
4898*53ee8cc1Swenshuai.xi //  [Return]:
4899*53ee8cc1Swenshuai.xi //			void
4900*53ee8cc1Swenshuai.xi //
4901*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_AnalogTuning(void * pInstance,drvHDMITX_ANALOG_TUNING * pInfo)4902*53ee8cc1Swenshuai.xi void MDrv_HDMITx_AnalogTuning(void* pInstance, drvHDMITX_ANALOG_TUNING *pInfo)
4903*53ee8cc1Swenshuai.xi {
4904*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4905*53ee8cc1Swenshuai.xi     memcpy(&psHDMITXResPri->stHDMITxInfo.analog_setting, (drvHDMITX_ANALOG_TUNING*)pInfo, sizeof(drvHDMITX_ANALOG_TUNING));
4906*53ee8cc1Swenshuai.xi }
4907*53ee8cc1Swenshuai.xi 
4908*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4909*53ee8cc1Swenshuai.xi /// @brief This routine turn on/off HDMI Tx output force mode
4910*53ee8cc1Swenshuai.xi /// @argument:
4911*53ee8cc1Swenshuai.xi ///              - bflag: TRUE: force mode, FALSE: auto mode
4912*53ee8cc1Swenshuai.xi ///              - output_mode: E_HDMITX_DVI: DVI, E_HDMITX_HDMI: HDMI
4913*53ee8cc1Swenshuai.xi /// @return None
4914*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_ForceHDMIOutputMode(void * pInstance,MS_BOOL bflag,MsHDMITX_OUTPUT_MODE output_mode)4915*53ee8cc1Swenshuai.xi void MDrv_HDMITx_ForceHDMIOutputMode(void* pInstance, MS_BOOL bflag, MsHDMITX_OUTPUT_MODE output_mode)
4916*53ee8cc1Swenshuai.xi {
4917*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4918*53ee8cc1Swenshuai.xi 
4919*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_force_mode = bflag;
4920*53ee8cc1Swenshuai.xi     if(bflag)
4921*53ee8cc1Swenshuai.xi     {
4922*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.force_output_mode = output_mode;
4923*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.output_mode = psHDMITXResPri->stHDMITxInfo.force_output_mode;
4924*53ee8cc1Swenshuai.xi         if((psHDMITXResPri->stHDMITxInfo.force_output_mode == E_HDMITX_DVI) || (psHDMITXResPri->stHDMITxInfo.force_output_mode == E_HDMITX_DVI_HDCP)) // DVI mode
4925*53ee8cc1Swenshuai.xi         {
4926*53ee8cc1Swenshuai.xi             //gHDMITxInfo.hdmitx_audio_supportAI = FALSE;
4927*53ee8cc1Swenshuai.xi             psHDMITXResPri->stHDMITxInfo.RxEdidInfo.AudSupportAI = FALSE;
4928*53ee8cc1Swenshuai.xi             psHDMITXResPri->stHDMITxInfo.output_color = E_HDMITX_VIDEO_COLOR_RGB444;
4929*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SetAVIInfoPktPara(pInstance);
4930*53ee8cc1Swenshuai.xi         }
4931*53ee8cc1Swenshuai.xi     }
4932*53ee8cc1Swenshuai.xi }
4933*53ee8cc1Swenshuai.xi 
4934*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4935*53ee8cc1Swenshuai.xi /// @brief This routine turn on/off HDMI Tx output force color format
4936*53ee8cc1Swenshuai.xi /// @argument:
4937*53ee8cc1Swenshuai.xi ///              - bflag: TRUE: force output color format, FALSE: auto mode
4938*53ee8cc1Swenshuai.xi ///              - output_mode: HDMITX_VIDEO_COLOR_RGB444: RGB, HDMITX_VIDEO_COLOR_YUV444: YUV
4939*53ee8cc1Swenshuai.xi /// @return Ture: Set force output color format successfully
4940*53ee8cc1Swenshuai.xi ///             FALSE: Fail to set force output color format
4941*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_ForceHDMIOutputColorFormat(void * pInstance,MS_BOOL bflag,MsHDMITX_VIDEO_COLOR_FORMAT output_color)4942*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_ForceHDMIOutputColorFormat(void* pInstance, MS_BOOL bflag, MsHDMITX_VIDEO_COLOR_FORMAT output_color)
4943*53ee8cc1Swenshuai.xi {
4944*53ee8cc1Swenshuai.xi     _HDMITX_SEMAPHORE_ENTRY(pInstance);
4945*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
4946*53ee8cc1Swenshuai.xi 
4947*53ee8cc1Swenshuai.xi     if (bflag)
4948*53ee8cc1Swenshuai.xi     {
4949*53ee8cc1Swenshuai.xi         if((output_color != E_HDMITX_VIDEO_COLOR_RGB444) && (psHDMITXResPri->stHDMITxInfo.output_mode == E_HDMITX_DVI || psHDMITXResPri->stHDMITxInfo.output_mode == E_HDMITX_DVI_HDCP))
4950*53ee8cc1Swenshuai.xi         {
4951*53ee8cc1Swenshuai.xi             printf("Set force output color format failed!\n");
4952*53ee8cc1Swenshuai.xi             _HDMITX_SEMAPHORE_RETURN(pInstance);
4953*53ee8cc1Swenshuai.xi             return FALSE;
4954*53ee8cc1Swenshuai.xi         }
4955*53ee8cc1Swenshuai.xi 
4956*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.hdmitx_force_output_color = bflag;
4957*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.force_output_color = output_color;
4958*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.output_color = psHDMITXResPri->stHDMITxInfo.force_output_color;
4959*53ee8cc1Swenshuai.xi 
4960*53ee8cc1Swenshuai.xi         if( (psHDMITXResPri->stHDMITxInfo.input_color != psHDMITXResPri->stHDMITxInfo.output_color) && (psHDMITXResPri->stHDMITxInfo.output_color == E_HDMITX_VIDEO_COLOR_RGB444) )
4961*53ee8cc1Swenshuai.xi             psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag = TRUE;
4962*53ee8cc1Swenshuai.xi         else // bypass
4963*53ee8cc1Swenshuai.xi             psHDMITXResPri->stHDMITxInfo.hdmitx_csc_flag = FALSE;
4964*53ee8cc1Swenshuai.xi 
4965*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SetAVIInfoPktPara(pInstance);
4966*53ee8cc1Swenshuai.xi     }
4967*53ee8cc1Swenshuai.xi 
4968*53ee8cc1Swenshuai.xi     _HDMITX_SEMAPHORE_RETURN(pInstance);
4969*53ee8cc1Swenshuai.xi     return TRUE;
4970*53ee8cc1Swenshuai.xi }
4971*53ee8cc1Swenshuai.xi 
4972*53ee8cc1Swenshuai.xi //**************************************************************************
4973*53ee8cc1Swenshuai.xi //  [Function Name]:
4974*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_DisableRegWrite()
4975*53ee8cc1Swenshuai.xi //  [Description]:
4976*53ee8cc1Swenshuai.xi //                  set flag which indicate if we are going to disable register write
4977*53ee8cc1Swenshuai.xi //  [Arguments]:
4978*53ee8cc1Swenshuai.xi //			[MS_BOOL] bFlag
4979*53ee8cc1Swenshuai.xi //  [Return]:
4980*53ee8cc1Swenshuai.xi //			void
4981*53ee8cc1Swenshuai.xi //
4982*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_DisableRegWrite(MS_BOOL bFlag)4983*53ee8cc1Swenshuai.xi void MDrv_HDMITx_DisableRegWrite(MS_BOOL bFlag)
4984*53ee8cc1Swenshuai.xi {
4985*53ee8cc1Swenshuai.xi     g_bDisableRegWrite = bFlag;
4986*53ee8cc1Swenshuai.xi }
4987*53ee8cc1Swenshuai.xi 
4988*53ee8cc1Swenshuai.xi //**************************************************************************
4989*53ee8cc1Swenshuai.xi //  [Function Name]:
4990*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_RxBypass_Mode()
4991*53ee8cc1Swenshuai.xi //  [Description]:
4992*53ee8cc1Swenshuai.xi //                  set Rx bypass mode
4993*53ee8cc1Swenshuai.xi //  [Arguments]:
4994*53ee8cc1Swenshuai.xi //                  [MsHDMITX_INPUT_FREQ] freq
4995*53ee8cc1Swenshuai.xi //                  [MS_BOOL] bflag
4996*53ee8cc1Swenshuai.xi //  [Return]:
4997*53ee8cc1Swenshuai.xi //			MS_BOOL
4998*53ee8cc1Swenshuai.xi //
4999*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_RxBypass_Mode(void * pInstance,MsHDMITX_INPUT_FREQ freq,MS_BOOL bflag)5000*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_RxBypass_Mode(void* pInstance, MsHDMITX_INPUT_FREQ freq, MS_BOOL bflag)
5001*53ee8cc1Swenshuai.xi {
5002*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
5003*53ee8cc1Swenshuai.xi 
5004*53ee8cc1Swenshuai.xi     _HDMITX_SEMAPHORE_ENTRY(pInstance);
5005*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
5006*53ee8cc1Swenshuai.xi 
5007*53ee8cc1Swenshuai.xi     if(psHDMITXResPri->stHDMITxInfo.hdmitx_bypass_flag == bflag)
5008*53ee8cc1Swenshuai.xi         return FALSE;
5009*53ee8cc1Swenshuai.xi 
5010*53ee8cc1Swenshuai.xi     MDrv_HDCPTx_SetAuthStartFlag(pInstance, FALSE);
5011*53ee8cc1Swenshuai.xi     MDrv_HDCPTx_SetAuthDoneFlag(pInstance, FALSE);
5012*53ee8cc1Swenshuai.xi #if HDMITX_ISR_ENABLE
5013*53ee8cc1Swenshuai.xi     MHal_HDMITx_Int_Disable(gHDMITXIRQ);
5014*53ee8cc1Swenshuai.xi     MHal_HDMITx_Int_Clear(gHDMITXIRQ);
5015*53ee8cc1Swenshuai.xi #endif
5016*53ee8cc1Swenshuai.xi     //MDrv_HDMITx_SetTMDSOnOff();
5017*53ee8cc1Swenshuai.xi     //MDrv_HDMITx_PLLOnOff();
5018*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_prestate = E_HDMITX_FSM_PENDING;
5019*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_bypass_flag = bflag;
5020*53ee8cc1Swenshuai.xi     if(!bflag)
5021*53ee8cc1Swenshuai.xi     {
5022*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.hdmitx_preRX_status = E_HDMITX_DVIClock_L_HPD_L;
5023*53ee8cc1Swenshuai.xi         _hdmitx_preRX_status = psHDMITXResPri->stHDMITxInfo.hdmitx_preRX_status;
5024*53ee8cc1Swenshuai.xi     }
5025*53ee8cc1Swenshuai.xi 
5026*53ee8cc1Swenshuai.xi     if (_s32CheckRxTimerId > 0)
5027*53ee8cc1Swenshuai.xi         MsOS_StopTimer(_s32CheckRxTimerId);
5028*53ee8cc1Swenshuai.xi 
5029*53ee8cc1Swenshuai.xi     _MDrv_HDCPTx_StopRiTimer();
5030*53ee8cc1Swenshuai.xi 
5031*53ee8cc1Swenshuai.xi     bRet = MHal_HDMITx_RxBypass_Mode(freq, bflag);
5032*53ee8cc1Swenshuai.xi     _HDMITX_SEMAPHORE_RETURN(pInstance);
5033*53ee8cc1Swenshuai.xi 
5034*53ee8cc1Swenshuai.xi     return bRet;
5035*53ee8cc1Swenshuai.xi 
5036*53ee8cc1Swenshuai.xi 
5037*53ee8cc1Swenshuai.xi }
5038*53ee8cc1Swenshuai.xi 
5039*53ee8cc1Swenshuai.xi //**************************************************************************
5040*53ee8cc1Swenshuai.xi //  [Function Name]:
5041*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_Disable_RxBypass()
5042*53ee8cc1Swenshuai.xi //  [Description]:
5043*53ee8cc1Swenshuai.xi //                  disable Rx bypass mode
5044*53ee8cc1Swenshuai.xi //  [Arguments]:
5045*53ee8cc1Swenshuai.xi //                  void
5046*53ee8cc1Swenshuai.xi //  [Return]:
5047*53ee8cc1Swenshuai.xi //			MS_BOOL
5048*53ee8cc1Swenshuai.xi //
5049*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_Disable_RxBypass(void * pInstance)5050*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_Disable_RxBypass(void* pInstance)
5051*53ee8cc1Swenshuai.xi {
5052*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
5053*53ee8cc1Swenshuai.xi 
5054*53ee8cc1Swenshuai.xi #if HDMITX_ISR_ENABLE
5055*53ee8cc1Swenshuai.xi     MHal_HDMITx_Int_Enable(gHDMITXIRQ);
5056*53ee8cc1Swenshuai.xi #endif
5057*53ee8cc1Swenshuai.xi     MHal_HDMITx_VideoInit();
5058*53ee8cc1Swenshuai.xi     MHal_HDMITx_AudioInit();
5059*53ee8cc1Swenshuai.xi     //MDrv_HDMITx_SetTMDSOnOff();
5060*53ee8cc1Swenshuai.xi     _HDMITX_SEMAPHORE_ENTRY(pInstance);
5061*53ee8cc1Swenshuai.xi 
5062*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.hdmitx_bypass_flag = FALSE;
5063*53ee8cc1Swenshuai.xi 
5064*53ee8cc1Swenshuai.xi     MDrv_HDMITx_Exhibit(pInstance);
5065*53ee8cc1Swenshuai.xi 
5066*53ee8cc1Swenshuai.xi     _HDMITX_SEMAPHORE_RETURN(pInstance);
5067*53ee8cc1Swenshuai.xi 
5068*53ee8cc1Swenshuai.xi     return MHal_HDMITx_Disable_RxBypass();
5069*53ee8cc1Swenshuai.xi }
5070*53ee8cc1Swenshuai.xi 
5071*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5072*53ee8cc1Swenshuai.xi /// @brief This routine turn on/off HDMI PLL
5073*53ee8cc1Swenshuai.xi /// @return None
5074*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_PLLOnOff(void)5075*53ee8cc1Swenshuai.xi void MDrv_HDMITx_PLLOnOff(void)
5076*53ee8cc1Swenshuai.xi {
5077*53ee8cc1Swenshuai.xi     //MHal_HDMITx_PLLOnOff(gHDMITxInfo.hdmitx_enable_flag);
5078*53ee8cc1Swenshuai.xi }
5079*53ee8cc1Swenshuai.xi 
5080*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5081*53ee8cc1Swenshuai.xi /// @brief This routine return CHIP capability of DVI mode
5082*53ee8cc1Swenshuai.xi /// @return TRUE, FALSE
5083*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_IsSupportDVIMode(void)5084*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_IsSupportDVIMode(void)
5085*53ee8cc1Swenshuai.xi {
5086*53ee8cc1Swenshuai.xi     return MHal_HDMITx_IsSupportDVIMode();
5087*53ee8cc1Swenshuai.xi }
5088*53ee8cc1Swenshuai.xi 
5089*53ee8cc1Swenshuai.xi //**************************************************************************
5090*53ee8cc1Swenshuai.xi //  [Function Name]:
5091*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_DisableTMDSCtrl()
5092*53ee8cc1Swenshuai.xi //  [Description]:
5093*53ee8cc1Swenshuai.xi //                  set flag which indicate if enable tmds control or not
5094*53ee8cc1Swenshuai.xi //  [Arguments]:
5095*53ee8cc1Swenshuai.xi //			[MS_BOOL] bFlag
5096*53ee8cc1Swenshuai.xi //  [Return]:
5097*53ee8cc1Swenshuai.xi //			void
5098*53ee8cc1Swenshuai.xi //
5099*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_DisableTMDSCtrl(MS_BOOL bFlag)5100*53ee8cc1Swenshuai.xi void MDrv_HDMITx_DisableTMDSCtrl(MS_BOOL bFlag)
5101*53ee8cc1Swenshuai.xi {
5102*53ee8cc1Swenshuai.xi     g_bDisableTMDSCtrl = bFlag;
5103*53ee8cc1Swenshuai.xi }
5104*53ee8cc1Swenshuai.xi 
5105*53ee8cc1Swenshuai.xi //**************************************************************************
5106*53ee8cc1Swenshuai.xi //  [Function Name]:
5107*53ee8cc1Swenshuai.xi //			MDrv_HDMITx_Exhibit()
5108*53ee8cc1Swenshuai.xi //  [Description]:
5109*53ee8cc1Swenshuai.xi //                  setup environment and make HDMI process start
5110*53ee8cc1Swenshuai.xi //  [Arguments]:
5111*53ee8cc1Swenshuai.xi //			void
5112*53ee8cc1Swenshuai.xi //  [Return]:
5113*53ee8cc1Swenshuai.xi //			void
5114*53ee8cc1Swenshuai.xi //
5115*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_Exhibit(void * pInstance)5116*53ee8cc1Swenshuai.xi void MDrv_HDMITx_Exhibit(void* pInstance)
5117*53ee8cc1Swenshuai.xi {
5118*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
5119*53ee8cc1Swenshuai.xi 
5120*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.output_mode & BIT0) // check HDCP
5121*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.hdmitx_hdcp_flag = TRUE;
5122*53ee8cc1Swenshuai.xi     else
5123*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.hdmitx_hdcp_flag = FALSE;
5124*53ee8cc1Swenshuai.xi 
5125*53ee8cc1Swenshuai.xi     if (((MDrv_HDMITx_GetColorFormat(pInstance) != E_HDMITX_VIDEO_COLOR_YUV420) && (MDrv_HDMITx_GetColorFormat(pInstance) != E_HDMITX_VIDEO_COLOR_YUV422)) &&
5126*53ee8cc1Swenshuai.xi         ((MDrv_HDMITx_GetOutputTiming(pInstance) == E_HDMITX_RES_1920x2205p_24Hz) ||
5127*53ee8cc1Swenshuai.xi         (MDrv_HDMITx_GetOutputTiming(pInstance) == E_HDMITX_RES_1280x1470p_50Hz) ||
5128*53ee8cc1Swenshuai.xi         (MDrv_HDMITx_GetOutputTiming(pInstance) == E_HDMITX_RES_1280x1470p_60Hz) ||
5129*53ee8cc1Swenshuai.xi         (MDrv_HDMITx_GetOutputTiming(pInstance) == E_HDMITX_RES_3840x2160p_50Hz) ||
5130*53ee8cc1Swenshuai.xi         (MDrv_HDMITx_GetOutputTiming(pInstance) == E_HDMITX_RES_3840x2160p_60Hz) ||
5131*53ee8cc1Swenshuai.xi         (MDrv_HDMITx_GetOutputTiming(pInstance) == E_HDMITX_RES_4096x2160p_50Hz) ||
5132*53ee8cc1Swenshuai.xi         (MDrv_HDMITx_GetOutputTiming(pInstance) == E_HDMITX_RES_4096x2160p_60Hz)))
5133*53ee8cc1Swenshuai.xi     {
5134*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.output_colordepth_val = E_HDMITX_VIDEO_CD_24Bits;
5135*53ee8cc1Swenshuai.xi     }
5136*53ee8cc1Swenshuai.xi 
5137*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetDeepColorMode(pInstance, psHDMITXResPri->stHDMITxInfo.output_colordepth_val);
5138*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetColorFormat(pInstance, psHDMITXResPri->stHDMITxInfo.input_color, psHDMITXResPri->stHDMITxInfo.output_color);
5139*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetHDMITxMode(pInstance, psHDMITXResPri->stHDMITxInfo.output_mode);
5140*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetVideoOutputMode(pInstance, psHDMITXResPri->stHDMITxInfo.output_video_timing);
5141*53ee8cc1Swenshuai.xi 
5142*53ee8cc1Swenshuai.xi     MDrv_HDMITx_SetAudioFrequency(pInstance, psHDMITXResPri->stHDMITxInfo.output_audio_frequncy);
5143*53ee8cc1Swenshuai.xi 
5144*53ee8cc1Swenshuai.xi     // The 1st HDCP authentication
5145*53ee8cc1Swenshuai.xi     if (MDrv_HDCPTx_GetAuthDoneFlag(pInstance) == FALSE)
5146*53ee8cc1Swenshuai.xi     {
5147*53ee8cc1Swenshuai.xi          if( (!MDrv_HDMITx_GetEdidRdyFlag(pInstance)) || (psHDMITXResPri->stHDMITxInfo.hdmitx_preRX_status != E_HDMITX_DVIClock_H_HPD_H))
5148*53ee8cc1Swenshuai.xi         {
5149*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SetFSMState(pInstance, E_HDMITX_FSM_VALIDATE_EDID);
5150*53ee8cc1Swenshuai.xi             MDrv_HDCPTx_SetRxValid(pInstance, FALSE);
5151*53ee8cc1Swenshuai.xi         }
5152*53ee8cc1Swenshuai.xi         _MDrv_HDCPTx_StopRiTimer();
5153*53ee8cc1Swenshuai.xi 
5154*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.output_video_prevtiming = psHDMITXResPri->stHDMITxInfo.output_video_timing;
5155*53ee8cc1Swenshuai.xi         //psHDMITXResPri->stHDMITxInfo.hdmitx_preRX_status = E_HDMITX_DVIClock_L_HPD_L;
5156*53ee8cc1Swenshuai.xi         //_hdmitx_preRX_status = psHDMITXResPri->stHDMITxInfo.hdmitx_preRX_status;
5157*53ee8cc1Swenshuai.xi 
5158*53ee8cc1Swenshuai.xi         if (psHDMITXResPri->stHDMITxInfo.hdmitx_hdcp_flag)
5159*53ee8cc1Swenshuai.xi         {
5160*53ee8cc1Swenshuai.xi             MDrv_HDCPTx_StartAuth(pInstance, TRUE);
5161*53ee8cc1Swenshuai.xi         }
5162*53ee8cc1Swenshuai.xi 
5163*53ee8cc1Swenshuai.xi         // Create timer for timing monitor
5164*53ee8cc1Swenshuai.xi         if(_s32CheckRxTimerId < 0)
5165*53ee8cc1Swenshuai.xi         {
5166*53ee8cc1Swenshuai.xi             _s32CheckRxTimerId = MsOS_CreateTimer( _MDrv_HDMITX_CheckRx_TimerCallback,
5167*53ee8cc1Swenshuai.xi                                                   CheckRx_Timer,
5168*53ee8cc1Swenshuai.xi                                                   CheckRx_Timer,
5169*53ee8cc1Swenshuai.xi                                                   TRUE,
5170*53ee8cc1Swenshuai.xi                                                   "Check Rx timer");
5171*53ee8cc1Swenshuai.xi 
5172*53ee8cc1Swenshuai.xi             psHDMITXResPri->stHDMITxInfo.bCheckRxTimerIdCreated = TRUE;
5173*53ee8cc1Swenshuai.xi 
5174*53ee8cc1Swenshuai.xi             if(_s32CheckRxTimerId < 0)
5175*53ee8cc1Swenshuai.xi             {
5176*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("MDrv_HDMITX_Init: Create Check Rx timer fail!\n"));
5177*53ee8cc1Swenshuai.xi                 psHDMITXResPri->stHDMITxInfo.bCheckRxTimerIdCreated = FALSE;
5178*53ee8cc1Swenshuai.xi             }
5179*53ee8cc1Swenshuai.xi             DBG_HDMITX(printf("MDrv_HDMITx_Exhibit: Create Check Rx timer success!\n"));
5180*53ee8cc1Swenshuai.xi         }
5181*53ee8cc1Swenshuai.xi         else
5182*53ee8cc1Swenshuai.xi         {
5183*53ee8cc1Swenshuai.xi                 MsOS_StopTimer(_s32CheckRxTimerId);
5184*53ee8cc1Swenshuai.xi                 MsOS_StartTimer(_s32CheckRxTimerId);
5185*53ee8cc1Swenshuai.xi         }
5186*53ee8cc1Swenshuai.xi         //return;
5187*53ee8cc1Swenshuai.xi     }
5188*53ee8cc1Swenshuai.xi 
5189*53ee8cc1Swenshuai.xi     // HDCP re-authentication while timing changed or input source changed
5190*53ee8cc1Swenshuai.xi     //else if((gHDMITxInfo.output_video_prevtiming != gHDMITxInfo.output_video_timing) && gHDMITxInfo.hdmitx_hdcp_flag)
5191*53ee8cc1Swenshuai.xi     else if (psHDMITXResPri->stHDMITxInfo.hdmitx_hdcp_flag)
5192*53ee8cc1Swenshuai.xi     {
5193*53ee8cc1Swenshuai.xi         //MDrv_HDCPTx_SetRxValid(pInstance, FALSE);
5194*53ee8cc1Swenshuai.xi         _MDrv_HDCPTx_StopRiTimer();
5195*53ee8cc1Swenshuai.xi         MDrv_HDCPTx_StartAuth(pInstance, TRUE);
5196*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.output_video_prevtiming = psHDMITXResPri->stHDMITxInfo.output_video_timing;
5197*53ee8cc1Swenshuai.xi 
5198*53ee8cc1Swenshuai.xi         DBG_HDMITX(printf("MDrv_HDMITx_Exhibit: HDCP reauthentication!!\n"));
5199*53ee8cc1Swenshuai.xi     }
5200*53ee8cc1Swenshuai.xi     else // turn off HDCP encryption
5201*53ee8cc1Swenshuai.xi     {
5202*53ee8cc1Swenshuai.xi         MDrv_HDCPTx_StartAuth(pInstance, FALSE);//MDrv_HDCPTx_SetRxValid(pInstance, FALSE);
5203*53ee8cc1Swenshuai.xi         _MDrv_HDCPTx_StopRiTimer();
5204*53ee8cc1Swenshuai.xi 
5205*53ee8cc1Swenshuai.xi         MHal_HDMITx_HdcpSetEncrypt(DISABLE);
5206*53ee8cc1Swenshuai.xi         DBG_HDMITX(printf("MDrv_HDMITx_Exhibit: Turn off HDCP!!\n"));
5207*53ee8cc1Swenshuai.xi     }
5208*53ee8cc1Swenshuai.xi 
5209*53ee8cc1Swenshuai.xi     if (MDrv_HDCPTx_GetAuthDoneFlag(pInstance) == TRUE)
5210*53ee8cc1Swenshuai.xi     {
5211*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SetVideoOnOff(pInstance, psHDMITXResPri->stHDMITxInfo.hdmitx_video_flag);
5212*53ee8cc1Swenshuai.xi         MDrv_HDMITx_SetAudioOnOff(pInstance, psHDMITXResPri->stHDMITxInfo.hdmitx_audio_flag);
5213*53ee8cc1Swenshuai.xi     }
5214*53ee8cc1Swenshuai.xi     //MDrv_HDMITx_SetHDCPOnOff();
5215*53ee8cc1Swenshuai.xi     //MDrv_HDMITx_SetTMDSOnOff();
5216*53ee8cc1Swenshuai.xi 
5217*53ee8cc1Swenshuai.xi     // Fix garbage while turn HDCP ON -> OFF
5218*53ee8cc1Swenshuai.xi     if( ((MDrv_HDCPTx_GetAuthDoneFlag(pInstance) == TRUE)||(MDrv_HDMITx_GetFSMState(pInstance) == E_HDMITX_FSM_DONE)) && (!psHDMITXResPri->stHDMITxInfo.hdmitx_hdcp_flag) )
5219*53ee8cc1Swenshuai.xi     {
5220*53ee8cc1Swenshuai.xi         if (psHDMITXResPri->stHDMITxInfo.hdmitx_avmute_flag)
5221*53ee8cc1Swenshuai.xi         {
5222*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SetAVMUTE(pInstance, FALSE);
5223*53ee8cc1Swenshuai.xi             psHDMITXResPri->stHDMITxInfo.hdmitx_avmute_flag = FALSE;
5224*53ee8cc1Swenshuai.xi         }
5225*53ee8cc1Swenshuai.xi     }
5226*53ee8cc1Swenshuai.xi }
5227*53ee8cc1Swenshuai.xi 
MDrv_HDMITx_CheckOver3G(void * pInstance)5228*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_CheckOver3G(void* pInstance)
5229*53ee8cc1Swenshuai.xi {
5230*53ee8cc1Swenshuai.xi     #if 0
5231*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
5232*53ee8cc1Swenshuai.xi 
5233*53ee8cc1Swenshuai.xi     if ((psHDMITXResPri->stHDMITxInfo.output_color != E_HDMITX_VIDEO_COLOR_YUV420) &&
5234*53ee8cc1Swenshuai.xi         (
5235*53ee8cc1Swenshuai.xi             (psHDMITXResPri->stHDMITxInfo.output_video_timing == E_HDMITX_RES_3840x2160p_50Hz) ||
5236*53ee8cc1Swenshuai.xi             (psHDMITXResPri->stHDMITxInfo.output_video_timing == E_HDMITX_RES_3840x2160p_60Hz) ||
5237*53ee8cc1Swenshuai.xi             (psHDMITXResPri->stHDMITxInfo.output_video_timing == E_HDMITX_RES_4096x2160p_50Hz) ||
5238*53ee8cc1Swenshuai.xi             (psHDMITXResPri->stHDMITxInfo.output_video_timing == E_HDMITX_RES_4096x2160p_60Hz) ||
5239*53ee8cc1Swenshuai.xi             (
5240*53ee8cc1Swenshuai.xi                 (
5241*53ee8cc1Swenshuai.xi                     (psHDMITXResPri->stHDMITxInfo.output_colordepth_val != E_HDMITX_VIDEO_CD_24Bits) && \
5242*53ee8cc1Swenshuai.xi                     (psHDMITXResPri->stHDMITxInfo.output_colordepth_val != E_HDMITX_VIDEO_CD_NoID)
5243*53ee8cc1Swenshuai.xi                 ) &&
5244*53ee8cc1Swenshuai.xi                 (
5245*53ee8cc1Swenshuai.xi                     (psHDMITXResPri->stHDMITxInfo.output_video_timing == E_HDMITX_RES_3840x2160p_24Hz) || \
5246*53ee8cc1Swenshuai.xi                     (psHDMITXResPri->stHDMITxInfo.output_video_timing == E_HDMITX_RES_3840x2160p_25Hz) || \
5247*53ee8cc1Swenshuai.xi                     (psHDMITXResPri->stHDMITxInfo.output_video_timing == E_HDMITX_RES_3840x2160p_30Hz) || \
5248*53ee8cc1Swenshuai.xi                     (psHDMITXResPri->stHDMITxInfo.output_video_timing == E_HDMITX_RES_4096x2160p_24Hz) || \
5249*53ee8cc1Swenshuai.xi                     (psHDMITXResPri->stHDMITxInfo.output_video_timing == E_HDMITX_RES_4096x2160p_25Hz) || \
5250*53ee8cc1Swenshuai.xi                     (psHDMITXResPri->stHDMITxInfo.output_video_timing == E_HDMITX_RES_4096x2160p_30Hz)
5251*53ee8cc1Swenshuai.xi                 )
5252*53ee8cc1Swenshuai.xi             )
5253*53ee8cc1Swenshuai.xi          )
5254*53ee8cc1Swenshuai.xi         )
5255*53ee8cc1Swenshuai.xi         return TRUE;
5256*53ee8cc1Swenshuai.xi     else
5257*53ee8cc1Swenshuai.xi         return FALSE;
5258*53ee8cc1Swenshuai.xi     #else
5259*53ee8cc1Swenshuai.xi     return FALSE;
5260*53ee8cc1Swenshuai.xi     #endif
5261*53ee8cc1Swenshuai.xi }
5262*53ee8cc1Swenshuai.xi 
5263*53ee8cc1Swenshuai.xi //**************************************************************************
5264*53ee8cc1Swenshuai.xi //  [Function Name]:
5265*53ee8cc1Swenshuai.xi //			HDMITx_Handler()
5266*53ee8cc1Swenshuai.xi //  [Description]:
5267*53ee8cc1Swenshuai.xi //                  HDMI TX FSM
5268*53ee8cc1Swenshuai.xi //  [Arguments]:
5269*53ee8cc1Swenshuai.xi //			[MS_U32] u32State
5270*53ee8cc1Swenshuai.xi //  [Return]:
5271*53ee8cc1Swenshuai.xi //			void
5272*53ee8cc1Swenshuai.xi //
5273*53ee8cc1Swenshuai.xi //**************************************************************************
HDMITx_Handler(void * pInstance,MS_U32 u32State)5274*53ee8cc1Swenshuai.xi void HDMITx_Handler(void* pInstance, MS_U32 u32State) //wilson@kano
5275*53ee8cc1Swenshuai.xi {
5276*53ee8cc1Swenshuai.xi     MS_U32 u32IRQStatus;
5277*53ee8cc1Swenshuai.xi 
5278*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
5279*53ee8cc1Swenshuai.xi 
5280*53ee8cc1Swenshuai.xi     if(psHDMITXResPri->stHDMITxInfo.hdmitx_bypass_flag)
5281*53ee8cc1Swenshuai.xi     {
5282*53ee8cc1Swenshuai.xi         //RXTXBypass
5283*53ee8cc1Swenshuai.xi         return;
5284*53ee8cc1Swenshuai.xi     }
5285*53ee8cc1Swenshuai.xi 
5286*53ee8cc1Swenshuai.xi     if (u32State & E_HDMITX_EVENT_RXTIMER)
5287*53ee8cc1Swenshuai.xi     {
5288*53ee8cc1Swenshuai.xi         MsHDMITX_RX_STATUS enCurRxStatus;
5289*53ee8cc1Swenshuai.xi 
5290*53ee8cc1Swenshuai.xi         //enCurRxStatus = MHal_HDMITx_GetRXStatus();
5291*53ee8cc1Swenshuai.xi         enCurRxStatus = gbCurRxStatus;
5292*53ee8cc1Swenshuai.xi 
5293*53ee8cc1Swenshuai.xi         if (psHDMITXResPri->stHDMITxInfo.hdmitx_preRX_status != enCurRxStatus)
5294*53ee8cc1Swenshuai.xi         {
5295*53ee8cc1Swenshuai.xi             DBG_HDMITX(printf("E_HDMITX_FSM_CHECK_HPD:: pre= %d, cur = %d\n", psHDMITXResPri->stHDMITxInfo.hdmitx_preRX_status, enCurRxStatus));
5296*53ee8cc1Swenshuai.xi 
5297*53ee8cc1Swenshuai.xi             MDrv_HDCPTx_SetRxValid(pInstance, FALSE);
5298*53ee8cc1Swenshuai.xi             _MDrv_HDCPTx_StopRiTimer();
5299*53ee8cc1Swenshuai.xi             MHal_HDMITx_HdcpSetEncrypt(DISABLE);
5300*53ee8cc1Swenshuai.xi 
5301*53ee8cc1Swenshuai.xi             if ((enCurRxStatus == E_HDMITX_DVIClock_H_HPD_H) || (enCurRxStatus == E_HDMITX_DVIClock_L_HPD_H))
5302*53ee8cc1Swenshuai.xi             {
5303*53ee8cc1Swenshuai.xi                 // update EDID when (1) HPD L -> H or (2) DVI clock L -> H with HPD always high
5304*53ee8cc1Swenshuai.xi                 bCheckEDID = TRUE;
5305*53ee8cc1Swenshuai.xi                 psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_state = E_HDMITX_FSM_VALIDATE_EDID;
5306*53ee8cc1Swenshuai.xi                 psHDMITXResPri->stHDMITxInfo.hdmitx_edid_ready = FALSE;
5307*53ee8cc1Swenshuai.xi 
5308*53ee8cc1Swenshuai.xi                 if(enCurRxStatus == E_HDMITX_DVIClock_H_HPD_H)
5309*53ee8cc1Swenshuai.xi                 {
5310*53ee8cc1Swenshuai.xi                     psHDMITXResPri->stHDMITxInfo.hdmitx_tmds_flag = TRUE;
5311*53ee8cc1Swenshuai.xi                 }
5312*53ee8cc1Swenshuai.xi             }
5313*53ee8cc1Swenshuai.xi             else
5314*53ee8cc1Swenshuai.xi             {
5315*53ee8cc1Swenshuai.xi                 bCheckEDID = FALSE;
5316*53ee8cc1Swenshuai.xi                 psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_state = E_HDMITX_FSM_PENDING;
5317*53ee8cc1Swenshuai.xi                 //gHDMITxInfo.hdmitx_tmds_flag = FALSE;
5318*53ee8cc1Swenshuai.xi                 psHDMITXResPri->stHDMITxInfo.hdmitx_edid_ready = FALSE;
5319*53ee8cc1Swenshuai.xi 
5320*53ee8cc1Swenshuai.xi                 MHal_HDMITx_HdcpSetEncrypt(DISABLE); // HDCP test
5321*53ee8cc1Swenshuai.xi                 MDrv_HDCPTx_SetAuthDoneFlag(pInstance, FALSE);
5322*53ee8cc1Swenshuai.xi                 MDrv_HDCPTx_SetAuthStartFlag(pInstance, FALSE);
5323*53ee8cc1Swenshuai.xi                 MDrv_HDMITx_SetTMDSOnOff(pInstance, FALSE);
5324*53ee8cc1Swenshuai.xi             }
5325*53ee8cc1Swenshuai.xi 
5326*53ee8cc1Swenshuai.xi             psHDMITXResPri->stHDMITxInfo.hdmitx_preRX_status = enCurRxStatus;
5327*53ee8cc1Swenshuai.xi             _hdmitx_preRX_status = psHDMITXResPri->stHDMITxInfo.hdmitx_preRX_status;
5328*53ee8cc1Swenshuai.xi 
5329*53ee8cc1Swenshuai.xi             MsOS_SetEvent(_s32HDMITxEventId, E_HDMITX_EVENT_RUN);
5330*53ee8cc1Swenshuai.xi         }
5331*53ee8cc1Swenshuai.xi         else // To avoid two events are coming together - HDCP CTS 1A-02
5332*53ee8cc1Swenshuai.xi         {
5333*53ee8cc1Swenshuai.xi             if (u32State & E_HDMITX_EVENT_RUN)
5334*53ee8cc1Swenshuai.xi                 MsOS_SetEvent(_s32HDMITxEventId, E_HDMITX_EVENT_RUN);
5335*53ee8cc1Swenshuai.xi         }
5336*53ee8cc1Swenshuai.xi     }
5337*53ee8cc1Swenshuai.xi     else if (u32State & E_HDMITX_EVENT_RUN)
5338*53ee8cc1Swenshuai.xi     {
5339*53ee8cc1Swenshuai.xi         if ((psHDMITXResPri->stHDMITxInfo.hdmitx_preRX_status == E_HDMITX_DVIClock_H_HPD_H) || (psHDMITXResPri->stHDMITxInfo.hdmitx_preRX_status == E_HDMITX_DVIClock_L_HPD_H)) //rx attached
5340*53ee8cc1Swenshuai.xi         {
5341*53ee8cc1Swenshuai.xi             if (psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_state != psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_prestate)
5342*53ee8cc1Swenshuai.xi                 printf("HDMI handler preState:curState = %d : %d\r\n", psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_prestate, psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_state);
5343*53ee8cc1Swenshuai.xi             psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_prestate = psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_state; //update state
5344*53ee8cc1Swenshuai.xi 
5345*53ee8cc1Swenshuai.xi             switch (psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_state)
5346*53ee8cc1Swenshuai.xi             {
5347*53ee8cc1Swenshuai.xi                 case E_HDMITX_FSM_PENDING: //idle state
5348*53ee8cc1Swenshuai.xi                     {
5349*53ee8cc1Swenshuai.xi                         psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_prestate = E_HDMITX_FSM_PENDING;
5350*53ee8cc1Swenshuai.xi                         psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_state = E_HDMITX_FSM_PENDING;
5351*53ee8cc1Swenshuai.xi                     }
5352*53ee8cc1Swenshuai.xi                 break;
5353*53ee8cc1Swenshuai.xi 
5354*53ee8cc1Swenshuai.xi             	case E_HDMITX_FSM_VALIDATE_EDID:
5355*53ee8cc1Swenshuai.xi                     {
5356*53ee8cc1Swenshuai.xi                         psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_prestate = E_HDMITX_FSM_VALIDATE_EDID;
5357*53ee8cc1Swenshuai.xi                         psHDMITXResPri->stHDMITxInfo.hdmitx_edid_ready = FALSE;
5358*53ee8cc1Swenshuai.xi 
5359*53ee8cc1Swenshuai.xi                         MHal_HDMITx_HdcpSetEncrypt(DISABLE);
5360*53ee8cc1Swenshuai.xi                         MDrv_HDCPTx_SetFSMState(pInstance, HDCP14Tx_MainState_A0, HDCP14Tx_SubFSM_IDLE);
5361*53ee8cc1Swenshuai.xi 
5362*53ee8cc1Swenshuai.xi                         if (MDrv_HDMITx_EdidChecking(pInstance))
5363*53ee8cc1Swenshuai.xi                         {
5364*53ee8cc1Swenshuai.xi                             DBG_HDMITX(printf("\nMDrv_HDMITX_Process()::EDID OK\n"));
5365*53ee8cc1Swenshuai.xi                             Mhal_HDMITx_SetSCDCCapability(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportSCDC);
5366*53ee8cc1Swenshuai.xi 
5367*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHDMITxInfo.hdmitx_edid_ready = TRUE;
5368*53ee8cc1Swenshuai.xi 
5369*53ee8cc1Swenshuai.xi                             //gHDMITxInfo.hdmitx_fsm_state = E_HDMITX_FSM_PRE_TRANSMIT; //for future usage
5370*53ee8cc1Swenshuai.xi                             MDrv_HDMITx_SetVideoOutputMode(pInstance, psHDMITXResPri->stHDMITxInfo.output_video_timing);
5371*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_state = E_HDMITX_FSM_TRANSMIT;
5372*53ee8cc1Swenshuai.xi 
5373*53ee8cc1Swenshuai.xi                             //MDrv_HDCPTx_SetRxValid(pInstance, TRUE);
5374*53ee8cc1Swenshuai.xi                             if (psHDMITXResPri->stHDMITxInfo.hdmitx_hdcp_flag == TRUE) // HDCP off
5375*53ee8cc1Swenshuai.xi                             {
5376*53ee8cc1Swenshuai.xi                                 MDrv_HDCPTx_SetAuthStartFlag(pInstance, TRUE);
5377*53ee8cc1Swenshuai.xi                             }
5378*53ee8cc1Swenshuai.xi                             else
5379*53ee8cc1Swenshuai.xi                             {
5380*53ee8cc1Swenshuai.xi                                 MDrv_HDCPTx_SetAuthStartFlag(pInstance, FALSE);
5381*53ee8cc1Swenshuai.xi                                 _MDrv_HDCPTx_StopRiTimer();
5382*53ee8cc1Swenshuai.xi                             }
5383*53ee8cc1Swenshuai.xi                         }
5384*53ee8cc1Swenshuai.xi                         else //invalid EDID
5385*53ee8cc1Swenshuai.xi                         {
5386*53ee8cc1Swenshuai.xi                             Mhal_HDMITx_SetSCDCCapability(FALSE);
5387*53ee8cc1Swenshuai.xi                             DBG_HDMITX(printf("\nMDrv_HDMITX_Process()::EDID FAIL!!\n"));
5388*53ee8cc1Swenshuai.xi                             MDrv_HDCPTx_SetRxValid(pInstance, FALSE);
5389*53ee8cc1Swenshuai.xi 
5390*53ee8cc1Swenshuai.xi                             psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_state = E_HDMITX_FSM_PENDING;
5391*53ee8cc1Swenshuai.xi                         }
5392*53ee8cc1Swenshuai.xi 
5393*53ee8cc1Swenshuai.xi                         MsOS_SetEvent(_s32HDMITxEventId, E_HDMITX_EVENT_RUN);
5394*53ee8cc1Swenshuai.xi 
5395*53ee8cc1Swenshuai.xi                         //MDrv_HDCPTx_SetRxValid(pInstance, TRUE);
5396*53ee8cc1Swenshuai.xi                         if (psHDMITXResPri->stHDMITxInfo.output_mode & BIT0)
5397*53ee8cc1Swenshuai.xi                         {
5398*53ee8cc1Swenshuai.xi                             MsOS_SetEvent(_s32HDMITxEventId, E_HdcpTX_EVENT_RUN); //start hdcp authentication flow
5399*53ee8cc1Swenshuai.xi                         }
5400*53ee8cc1Swenshuai.xi                     }
5401*53ee8cc1Swenshuai.xi                 break;
5402*53ee8cc1Swenshuai.xi 
5403*53ee8cc1Swenshuai.xi             	case E_HDMITX_FSM_PRE_TRANSMIT:
5404*53ee8cc1Swenshuai.xi                     {
5405*53ee8cc1Swenshuai.xi                         psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_prestate = E_HDMITX_FSM_PRE_TRANSMIT;
5406*53ee8cc1Swenshuai.xi                     }
5407*53ee8cc1Swenshuai.xi                 break;
5408*53ee8cc1Swenshuai.xi 
5409*53ee8cc1Swenshuai.xi             	case E_HDMITX_FSM_TRANSMIT:
5410*53ee8cc1Swenshuai.xi                     {
5411*53ee8cc1Swenshuai.xi                         psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_prestate = E_HDMITX_FSM_TRANSMIT;
5412*53ee8cc1Swenshuai.xi 
5413*53ee8cc1Swenshuai.xi                         MDrv_HDMITx_SetHDMITxMode(pInstance, psHDMITXResPri->stHDMITxInfo.output_mode);
5414*53ee8cc1Swenshuai.xi                         MDrv_HDMITx_SetColorFormat(pInstance, psHDMITXResPri->stHDMITxInfo.input_color, psHDMITXResPri->stHDMITxInfo.output_color);
5415*53ee8cc1Swenshuai.xi                         //MDrv_HDMITx_SetVideoOutputMode(pInstance, psHDMITXResPri->stHDMITxInfo.output_video_timing);
5416*53ee8cc1Swenshuai.xi                         MDrv_HDMITx_SetAudioFrequency(pInstance, psHDMITXResPri->stHDMITxInfo.output_audio_frequncy);
5417*53ee8cc1Swenshuai.xi                         MDrv_HDCPTx_SetRxValid(pInstance, TRUE);
5418*53ee8cc1Swenshuai.xi 
5419*53ee8cc1Swenshuai.xi                         if ((MDrv_HDCPTx_GetUnHdcpControl(pInstance) == E_NORMAL_OUTPUT)
5420*53ee8cc1Swenshuai.xi                                 ||(psHDMITXResPri->stHDMITxInfo.hdmitx_hdcp_flag == FALSE))
5421*53ee8cc1Swenshuai.xi                         {
5422*53ee8cc1Swenshuai.xi                             MDrv_HDMITx_SetVideoOnOff(pInstance, TRUE); //psHDMITXResPri->stHDMITxInfo.hdmitx_video_flag = TRUE;
5423*53ee8cc1Swenshuai.xi                             MDrv_HDMITx_SetAudioOnOff(pInstance, TRUE);
5424*53ee8cc1Swenshuai.xi                         }
5425*53ee8cc1Swenshuai.xi                         else
5426*53ee8cc1Swenshuai.xi                         {
5427*53ee8cc1Swenshuai.xi                             MDrv_HDMITx_SetAVMUTE(pInstance, TRUE);
5428*53ee8cc1Swenshuai.xi                             //Fix Panasonic UITA 2000 HDCP test fail, Video should be show after ENC_EN was detects
5429*53ee8cc1Swenshuai.xi                             MDrv_HDMITx_SetVideoOnOff(pInstance, FALSE); //psHDMITXResPri->stHDMITxInfo.hdmitx_video_flag = FALSE;
5430*53ee8cc1Swenshuai.xi                             MDrv_HDMITx_SetAudioOnOff(pInstance, FALSE);//psHDMITXResPri->stHDMITxInfo.hdmitx_audio_flag = FALSE;
5431*53ee8cc1Swenshuai.xi                         }
5432*53ee8cc1Swenshuai.xi 
5433*53ee8cc1Swenshuai.xi                         MDrv_HDMITx_SetTMDSOnOff(pInstance, TRUE);
5434*53ee8cc1Swenshuai.xi 
5435*53ee8cc1Swenshuai.xi                         if (psHDMITXResPri->stHDMITxInfo.hdmitx_hdcp_flag == FALSE)
5436*53ee8cc1Swenshuai.xi                         {
5437*53ee8cc1Swenshuai.xi                             if (psHDMITXResPri->stHDMITxInfo.hdmitx_avmute_flag == TRUE)
5438*53ee8cc1Swenshuai.xi                             {
5439*53ee8cc1Swenshuai.xi                                 MDrv_HDMITx_SetAVMUTE(pInstance, FALSE);
5440*53ee8cc1Swenshuai.xi                             }
5441*53ee8cc1Swenshuai.xi                         }
5442*53ee8cc1Swenshuai.xi 
5443*53ee8cc1Swenshuai.xi                         psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_state = E_HDMITX_FSM_DONE;
5444*53ee8cc1Swenshuai.xi 
5445*53ee8cc1Swenshuai.xi                         MsOS_SetEvent(_s32HDMITxEventId, E_HDMITX_EVENT_RUN);
5446*53ee8cc1Swenshuai.xi 
5447*53ee8cc1Swenshuai.xi                     }
5448*53ee8cc1Swenshuai.xi                 break;
5449*53ee8cc1Swenshuai.xi 
5450*53ee8cc1Swenshuai.xi             	case E_HDMITX_FSM_DONE:
5451*53ee8cc1Swenshuai.xi                     {
5452*53ee8cc1Swenshuai.xi                         #if 0
5453*53ee8cc1Swenshuai.xi                         MS_U8 ucSCDCStatus = 0x00;
5454*53ee8cc1Swenshuai.xi 
5455*53ee8cc1Swenshuai.xi                         psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_prestate = E_HDMITX_FSM_DONE;
5456*53ee8cc1Swenshuai.xi                         //MDrv_HDCPTx_SetFSMState(pInstance, HDCP14Tx_MainState_A0, HDCP14Tx_SubFSM_IDLE);
5457*53ee8cc1Swenshuai.xi 
5458*53ee8cc1Swenshuai.xi                         //TBD: adding SCDC checking routine here;
5459*53ee8cc1Swenshuai.xi                         if (Mhal_HDMITx_SCDCAccessField(E_SCDC_SCRAMBLE_STAT_IDX, TRUE, &ucSCDCStatus, 0x01))
5460*53ee8cc1Swenshuai.xi                         {
5461*53ee8cc1Swenshuai.xi                             //TBD
5462*53ee8cc1Swenshuai.xi                         }
5463*53ee8cc1Swenshuai.xi                         #endif
5464*53ee8cc1Swenshuai.xi 
5465*53ee8cc1Swenshuai.xi                         MsOS_SetEvent(_s32HDMITxEventId, E_HDMITX_EVENT_RUN);
5466*53ee8cc1Swenshuai.xi                     }
5467*53ee8cc1Swenshuai.xi                 break;
5468*53ee8cc1Swenshuai.xi 
5469*53ee8cc1Swenshuai.xi                 default:
5470*53ee8cc1Swenshuai.xi                 break;
5471*53ee8cc1Swenshuai.xi             }
5472*53ee8cc1Swenshuai.xi         }
5473*53ee8cc1Swenshuai.xi 
5474*53ee8cc1Swenshuai.xi         //MsOS_SetEvent(_s32HDMITxEventId, E_HDMITX_EVENT_RUN);
5475*53ee8cc1Swenshuai.xi 
5476*53ee8cc1Swenshuai.xi     }
5477*53ee8cc1Swenshuai.xi     else if (u32State & E_HDMITX_EVENT_IRQ)
5478*53ee8cc1Swenshuai.xi     {
5479*53ee8cc1Swenshuai.xi         u32IRQStatus = MHal_HDMITx_Int_Status();
5480*53ee8cc1Swenshuai.xi 
5481*53ee8cc1Swenshuai.xi         if (u32IRQStatus & E_HDMITX_IRQ_12) // TMDS hot-plug
5482*53ee8cc1Swenshuai.xi         {
5483*53ee8cc1Swenshuai.xi             DBG_HDMITX(printf("MDrv_HDMITX_Process()::E_HDMITX_IRQ_12\n"));
5484*53ee8cc1Swenshuai.xi             //gHDMITxInfo.hdmitx_fsm_state = E_HDMITX_FSM_CHECK_HPD;
5485*53ee8cc1Swenshuai.xi             MHal_HDMITx_Int_Clear(E_HDMITX_IRQ_12);
5486*53ee8cc1Swenshuai.xi             //MsOS_SetEvent(_s32HDMITxEventId, E_HDMITX_EVENT_RUN);
5487*53ee8cc1Swenshuai.xi         }
5488*53ee8cc1Swenshuai.xi         else if (u32IRQStatus & E_HDMITX_IRQ_10) // Rx disconnection
5489*53ee8cc1Swenshuai.xi         {
5490*53ee8cc1Swenshuai.xi             DBG_HDMITX(printf("MDrv_HDMITX_Process()::E_HDMITX_IRQ_10\n"));
5491*53ee8cc1Swenshuai.xi             //gHDMITxInfo.hdmitx_fsm_state = E_HDMITX_FSM_CHECK_HPD;
5492*53ee8cc1Swenshuai.xi             MHal_HDMITx_Int_Clear(E_HDMITX_IRQ_10);
5493*53ee8cc1Swenshuai.xi             //MsOS_SetEvent(_s32HDMITxEventId, E_HDMITX_EVENT_RUN);
5494*53ee8cc1Swenshuai.xi         }
5495*53ee8cc1Swenshuai.xi     }
5496*53ee8cc1Swenshuai.xi }
5497*53ee8cc1Swenshuai.xi 
5498*53ee8cc1Swenshuai.xi //**************************************************************************
5499*53ee8cc1Swenshuai.xi //  [Function Name]:
5500*53ee8cc1Swenshuai.xi //			()
5501*53ee8cc1Swenshuai.xi //  [Description]:
5502*53ee8cc1Swenshuai.xi //
5503*53ee8cc1Swenshuai.xi //  [Arguments]:
5504*53ee8cc1Swenshuai.xi //
5505*53ee8cc1Swenshuai.xi //  [Return]:
5506*53ee8cc1Swenshuai.xi //
5507*53ee8cc1Swenshuai.xi //
5508*53ee8cc1Swenshuai.xi //**************************************************************************
5509*53ee8cc1Swenshuai.xi #if (defined(MSOS_TYPE_LINUX_KERNEL))
5510*53ee8cc1Swenshuai.xi static INTERFACED void* pu32HDMITxTaskInst = NULL;
5511*53ee8cc1Swenshuai.xi #endif
5512*53ee8cc1Swenshuai.xi 
_HDMITx_Task(void * pInstance)5513*53ee8cc1Swenshuai.xi static void _HDMITx_Task(void* pInstance) //wilson@kano
5514*53ee8cc1Swenshuai.xi {
5515*53ee8cc1Swenshuai.xi     MS_U32                 u32Events = 0;
5516*53ee8cc1Swenshuai.xi 
5517*53ee8cc1Swenshuai.xi     while (g_bHDMITxTask == TRUE)
5518*53ee8cc1Swenshuai.xi     {
5519*53ee8cc1Swenshuai.xi       	#if (defined(MSOS_TYPE_LINUX_KERNEL))
5520*53ee8cc1Swenshuai.xi         if (pu32HDMITxTaskInst == NULL)
5521*53ee8cc1Swenshuai.xi         {
5522*53ee8cc1Swenshuai.xi             if (UtopiaOpen(MODULE_HDMITX, &pu32HDMITxTaskInst, 0, NULL)!= UTOPIA_STATUS_SUCCESS)
5523*53ee8cc1Swenshuai.xi             {
5524*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("%s: Get Task Instance FAIL!\n", __FUNCTION__));
5525*53ee8cc1Swenshuai.xi                 return;
5526*53ee8cc1Swenshuai.xi             }
5527*53ee8cc1Swenshuai.xi         }
5528*53ee8cc1Swenshuai.xi 
5529*53ee8cc1Swenshuai.xi         pInstance = pu32HDMITxTaskInst;
5530*53ee8cc1Swenshuai.xi         #endif
5531*53ee8cc1Swenshuai.xi 
5532*53ee8cc1Swenshuai.xi #if HDMITX_ISR_ENABLE
5533*53ee8cc1Swenshuai.xi         // Task wake up
5534*53ee8cc1Swenshuai.xi         //MsOS_WaitEvent(_s32HDMITxEventId, E_HDMITX_EVENT_RUN|E_HDMITX_EVENT_IRQ, &u32Events, E_OR_CLEAR, MSOS_WAIT_FOREVER);
5535*53ee8cc1Swenshuai.xi         //Loop polling MAD audio sampling rate and config it for HDMI TX
5536*53ee8cc1Swenshuai.xi         MsOS_WaitEvent(_s32HDMITxEventId, E_HDMITX_EVENT_RUN|E_HDMITX_EVENT_IRQ|E_HDMITX_EVENT_RXTIMER|E_HDMITX_EVENT_CECRX | E_HdcpTX_EVENT_RUN | E_HdcpTX_EVENT_IRQ | E_HdcpTX_EVENT_RITIMER, &u32Events, E_OR_CLEAR, 5000);
5537*53ee8cc1Swenshuai.xi 
5538*53ee8cc1Swenshuai.xi         if (1)
5539*53ee8cc1Swenshuai.xi         {
5540*53ee8cc1Swenshuai.xi #endif
5541*53ee8cc1Swenshuai.xi             _HDMITX_SEMAPHORE_ENTRY(pInstance);
5542*53ee8cc1Swenshuai.xi             _HDMITX_GET_VARIABLE();
5543*53ee8cc1Swenshuai.xi 
5544*53ee8cc1Swenshuai.xi             HDMITx_Handler(pInstance, u32Events);
5545*53ee8cc1Swenshuai.xi 
5546*53ee8cc1Swenshuai.xi             if ( (u32Events & E_HdcpTX_EVENT_RUN) | (u32Events & E_HdcpTX_EVENT_IRQ) | (u32Events & E_HdcpTX_EVENT_RITIMER))
5547*53ee8cc1Swenshuai.xi             {
5548*53ee8cc1Swenshuai.xi                 if (MDrv_HDCPTx_GetAuthStartFlag(pInstance) == TRUE)
5549*53ee8cc1Swenshuai.xi                 {
5550*53ee8cc1Swenshuai.xi                     HDCPTx_Handler(pInstance, u32Events);
5551*53ee8cc1Swenshuai.xi                 }
5552*53ee8cc1Swenshuai.xi             }
5553*53ee8cc1Swenshuai.xi 
5554*53ee8cc1Swenshuai.xi #if HDMITX_ISR_ENABLE
5555*53ee8cc1Swenshuai.xi         }
5556*53ee8cc1Swenshuai.xi         else
5557*53ee8cc1Swenshuai.xi         {
5558*53ee8cc1Swenshuai.xi             DBG_HDMITX(printf("%s: obtain mutex failed.\n", __FUNCTION__));
5559*53ee8cc1Swenshuai.xi         }
5560*53ee8cc1Swenshuai.xi 
5561*53ee8cc1Swenshuai.xi         // Even if not E_DMD_EVENT_ENABLE, the interrupt should be enable.
5562*53ee8cc1Swenshuai.xi         MsOS_EnableInterrupt(E_INT_IRQ_HDMI_LEVEL);
5563*53ee8cc1Swenshuai.xi #endif
5564*53ee8cc1Swenshuai.xi 
5565*53ee8cc1Swenshuai.xi         _HDMITX_SEMAPHORE_RETURN(pInstance);
5566*53ee8cc1Swenshuai.xi 
5567*53ee8cc1Swenshuai.xi         MsOS_DelayTask(HDMITX_MONITOR_DELAY);
5568*53ee8cc1Swenshuai.xi     } // Task loop
5569*53ee8cc1Swenshuai.xi }
5570*53ee8cc1Swenshuai.xi 
5571*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5572*53ee8cc1Swenshuai.xi //  Global Functions
5573*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
5574*53ee8cc1Swenshuai.xi // HDMI Tx output is DVI / HDMI mode
5575*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5576*53ee8cc1Swenshuai.xi /// @return None
5577*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_InitSeq(void * pInstance)5578*53ee8cc1Swenshuai.xi void MDrv_HDMITx_InitSeq(void* pInstance)
5579*53ee8cc1Swenshuai.xi {
5580*53ee8cc1Swenshuai.xi     MHal_HDMITx_SetChipVersion((MDrv_SYS_GetChipRev() >= 0x01) ? (MS_U8)0x01 : (MS_U8)0x00); // U01: 0x00; U02: 0x01
5581*53ee8cc1Swenshuai.xi     MHal_HDMITx_InitSeq();
5582*53ee8cc1Swenshuai.xi     MDrv_HDMITx_InitVariable(pInstance);
5583*53ee8cc1Swenshuai.xi }
5584*53ee8cc1Swenshuai.xi 
5585*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5586*53ee8cc1Swenshuai.xi /// @brief This routine initializes HDMI Tx module
5587*53ee8cc1Swenshuai.xi /// @return None
5588*53ee8cc1Swenshuai.xi /// HDMI driver is in @ref E_TASK_PRI_HIGH level
5589*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_Init(void * pInstance)5590*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_Init(void *pInstance)//MS_BOOL MDrv_HDMITx_Init(void)
5591*53ee8cc1Swenshuai.xi {
5592*53ee8cc1Swenshuai.xi     //MS_VIRT u32PMRIUBaseAddress = 0;
5593*53ee8cc1Swenshuai.xi     //MS_PHY u32PMBankSize = 0;
5594*53ee8cc1Swenshuai.xi 
5595*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
5596*53ee8cc1Swenshuai.xi 
5597*53ee8cc1Swenshuai.xi     _hdmitx_status.bIsInitialized = TRUE;
5598*53ee8cc1Swenshuai.xi     _hdmitx_status.bIsRunning     = TRUE;
5599*53ee8cc1Swenshuai.xi 
5600*53ee8cc1Swenshuai.xi     DBG_HDMITX(printf("%s\n", __FUNCTION__));
5601*53ee8cc1Swenshuai.xi 
5602*53ee8cc1Swenshuai.xi     if (!MDrv_MMIO_GetBASE(&psHDMITXResPri->stHDMITxInfo.u32PMRIUBaseAddress, &psHDMITXResPri->stHDMITxInfo.u32PMBankSize, MS_MODULE_PM ))
5603*53ee8cc1Swenshuai.xi     {
5604*53ee8cc1Swenshuai.xi         printf("MApi_XC_Init Get PM BASE failure\n");
5605*53ee8cc1Swenshuai.xi         return FALSE;
5606*53ee8cc1Swenshuai.xi     }
5607*53ee8cc1Swenshuai.xi 
5608*53ee8cc1Swenshuai.xi     #if (defined(MSOS_TYPE_LINUX_KERNEL))
5609*53ee8cc1Swenshuai.xi     {
5610*53ee8cc1Swenshuai.xi         //MS_VIRT u32CoproRIUBase = 0x00;
5611*53ee8cc1Swenshuai.xi         if( !MDrv_MMIO_GetBASE( &psHDMITXResPri->stHDMITxInfo.u32CoproRIUBase, &psHDMITXResPri->stHDMITxInfo.u32PMBankSize, MS_MODULE_HW))
5612*53ee8cc1Swenshuai.xi         {
5613*53ee8cc1Swenshuai.xi             printf("_COPRO_Init: IOMap failure\n");
5614*53ee8cc1Swenshuai.xi         }
5615*53ee8cc1Swenshuai.xi         else
5616*53ee8cc1Swenshuai.xi         {
5617*53ee8cc1Swenshuai.xi             MHal_HDMITx_SetIOMapBase(psHDMITXResPri->stHDMITxInfo.u32PMRIUBaseAddress, psHDMITXResPri->stHDMITxInfo.u32PMRIUBaseAddress, psHDMITXResPri->stHDMITxInfo.u32CoproRIUBase);
5618*53ee8cc1Swenshuai.xi         }
5619*53ee8cc1Swenshuai.xi     }
5620*53ee8cc1Swenshuai.xi     #else
5621*53ee8cc1Swenshuai.xi     DBG_HDMITX(printf("Get IOMAP ID:%u Base:%x!\n", MS_MODULE_PM, psHDMITXResPri->stHDMITxInfo.u32PMRIUBaseAddress));
5622*53ee8cc1Swenshuai.xi     MHal_HDMITx_SetIOMapBase(psHDMITXResPri->stHDMITxInfo.u32PMRIUBaseAddress, psHDMITXResPri->stHDMITxInfo.u32PMRIUBaseAddress);
5623*53ee8cc1Swenshuai.xi     #endif
5624*53ee8cc1Swenshuai.xi 
5625*53ee8cc1Swenshuai.xi     MDrv_HDMITx_Power_OnOff(TRUE);
5626*53ee8cc1Swenshuai.xi 
5627*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->bInit == TRUE)
5628*53ee8cc1Swenshuai.xi         return TRUE;
5629*53ee8cc1Swenshuai.xi 
5630*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.bHDMITxTaskIdCreated) //if (_s32HDMITxTaskId >= 0)
5631*53ee8cc1Swenshuai.xi     {
5632*53ee8cc1Swenshuai.xi         DBG_HDMITX(printf("MDrv_HDMITx_Init: already initialized.\n"));
5633*53ee8cc1Swenshuai.xi         return TRUE;
5634*53ee8cc1Swenshuai.xi     }
5635*53ee8cc1Swenshuai.xi 
5636*53ee8cc1Swenshuai.xi #if HDMITX_ISR_ENABLE
5637*53ee8cc1Swenshuai.xi     MsOS_DisableInterrupt(E_INT_IRQ_HDMI_LEVEL);
5638*53ee8cc1Swenshuai.xi     MsOS_DetachInterrupt(E_INT_IRQ_HDMI_LEVEL);
5639*53ee8cc1Swenshuai.xi 
5640*53ee8cc1Swenshuai.xi     MHal_HDMITx_Int_Disable(gHDMITXIRQ);
5641*53ee8cc1Swenshuai.xi     MHal_HDMITx_Int_Clear(gHDMITXIRQ);
5642*53ee8cc1Swenshuai.xi 
5643*53ee8cc1Swenshuai.xi     if(psHDMITXResPri->stHDMITxInfo.hdmitx_CECEnable_flag)
5644*53ee8cc1Swenshuai.xi     {
5645*53ee8cc1Swenshuai.xi     #if 0 //ENABLE_CEC_INT
5646*53ee8cc1Swenshuai.xi         MsOS_DisableInterrupt(E_INT_IRQ_CEC);
5647*53ee8cc1Swenshuai.xi         MsOS_DetachInterrupt(E_INT_IRQ_CEC);
5648*53ee8cc1Swenshuai.xi     #endif
5649*53ee8cc1Swenshuai.xi     }
5650*53ee8cc1Swenshuai.xi 
5651*53ee8cc1Swenshuai.xi #endif // #if HDMITX_ISR_ENABLE
5652*53ee8cc1Swenshuai.xi 
5653*53ee8cc1Swenshuai.xi     MDrv_HDMITx_InitSeq(pInstance);
5654*53ee8cc1Swenshuai.xi 
5655*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.bHDMITxEventIdCreated == FALSE)
5656*53ee8cc1Swenshuai.xi     {
5657*53ee8cc1Swenshuai.xi         _s32HDMITxEventId = MsOS_CreateEventGroup("HDMITx_Event");
5658*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.bHDMITxEventIdCreated = TRUE;
5659*53ee8cc1Swenshuai.xi     }
5660*53ee8cc1Swenshuai.xi 
5661*53ee8cc1Swenshuai.xi     if (_s32HDMITxEventId < 0)
5662*53ee8cc1Swenshuai.xi     {
5663*53ee8cc1Swenshuai.xi         ///MsOS_DeleteMutex(_s32HDMITxMutexId);
5664*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.bHDMITxEventIdCreated = FALSE;
5665*53ee8cc1Swenshuai.xi         return FALSE;
5666*53ee8cc1Swenshuai.xi     }
5667*53ee8cc1Swenshuai.xi 
5668*53ee8cc1Swenshuai.xi     _pHDMITxTaskStack = _u8HDMITx_StackBuffer;
5669*53ee8cc1Swenshuai.xi     g_bHDMITxTask = TRUE;
5670*53ee8cc1Swenshuai.xi 
5671*53ee8cc1Swenshuai.xi     _HDMITX_SEMAPHORE_RETURN(pInstance);
5672*53ee8cc1Swenshuai.xi     _s32HDMITxTaskId = MsOS_CreateTask((TaskEntry)_HDMITx_Task,
5673*53ee8cc1Swenshuai.xi                                     (MS_VIRT)pInstance,//(MS_U32)pInstance,
5674*53ee8cc1Swenshuai.xi                                     E_TASK_PRI_HIGH,
5675*53ee8cc1Swenshuai.xi                                     TRUE,
5676*53ee8cc1Swenshuai.xi                                     _pHDMITxTaskStack,
5677*53ee8cc1Swenshuai.xi                                     HDMITX_TASK_STACK_SIZE,
5678*53ee8cc1Swenshuai.xi                                     "HDMITx_Task");
5679*53ee8cc1Swenshuai.xi     _HDMITX_SEMAPHORE_ENTRY(pInstance);
5680*53ee8cc1Swenshuai.xi 
5681*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.bHDMITxTaskIdCreated = TRUE;
5682*53ee8cc1Swenshuai.xi 
5683*53ee8cc1Swenshuai.xi     if (_s32HDMITxTaskId < 0)
5684*53ee8cc1Swenshuai.xi     {
5685*53ee8cc1Swenshuai.xi         printf("create hdmi task failed\r\n");
5686*53ee8cc1Swenshuai.xi         MsOS_DeleteEventGroup(_s32HDMITxEventId);
5687*53ee8cc1Swenshuai.xi         ///MsOS_DeleteMutex(_s32HDMITxMutexId);
5688*53ee8cc1Swenshuai.xi         psHDMITXResPri->stHDMITxInfo.bHDMITxTaskIdCreated = FALSE;
5689*53ee8cc1Swenshuai.xi         return FALSE;
5690*53ee8cc1Swenshuai.xi     }
5691*53ee8cc1Swenshuai.xi 
5692*53ee8cc1Swenshuai.xi #if HDMITX_ISR_ENABLE
5693*53ee8cc1Swenshuai.xi     MsOS_AttachInterrupt(E_INT_IRQ_HDMI_LEVEL, _HDMITx_Isr);
5694*53ee8cc1Swenshuai.xi     MsOS_EnableInterrupt(E_INT_IRQ_HDMI_LEVEL);                                    // Enable TSP interrupt
5695*53ee8cc1Swenshuai.xi     //MDrv_HDMITx_Int_Enable();
5696*53ee8cc1Swenshuai.xi 
5697*53ee8cc1Swenshuai.xi     if (psHDMITXResPri->stHDMITxInfo.hdmitx_CECEnable_flag)
5698*53ee8cc1Swenshuai.xi     {
5699*53ee8cc1Swenshuai.xi     }
5700*53ee8cc1Swenshuai.xi #endif // #if HDMITX_ISR_ENABLE
5701*53ee8cc1Swenshuai.xi 
5702*53ee8cc1Swenshuai.xi     return TRUE;
5703*53ee8cc1Swenshuai.xi }
5704*53ee8cc1Swenshuai.xi 
5705*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5706*53ee8cc1Swenshuai.xi /// @brief This routine initializes HDMI + HDCP Tx module
5707*53ee8cc1Swenshuai.xi /// @return None
5708*53ee8cc1Swenshuai.xi /// HDMI, HDCP driver is in @ref E_TASK_PRI_HIGH level
5709*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITxHDCPTx_Init(void * pInstance)5710*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITxHDCPTx_Init(void* pInstance) //wilson@kano
5711*53ee8cc1Swenshuai.xi {
5712*53ee8cc1Swenshuai.xi     printf("start hdmi, hdcp init\r\n");
5713*53ee8cc1Swenshuai.xi     if (MDrv_HDMITx_Init(pInstance) == TRUE)
5714*53ee8cc1Swenshuai.xi     {
5715*53ee8cc1Swenshuai.xi         printf("hdmitx init done\r\n");
5716*53ee8cc1Swenshuai.xi 
5717*53ee8cc1Swenshuai.xi         if (MDrv_HDCPTx_Init(pInstance) == TRUE)
5718*53ee8cc1Swenshuai.xi         {
5719*53ee8cc1Swenshuai.xi             printf("hdcptx init done\r\n");
5720*53ee8cc1Swenshuai.xi             return TRUE;
5721*53ee8cc1Swenshuai.xi         }
5722*53ee8cc1Swenshuai.xi         else
5723*53ee8cc1Swenshuai.xi         {
5724*53ee8cc1Swenshuai.xi             printf("hdcptx init fail\r\n");
5725*53ee8cc1Swenshuai.xi             return FALSE;
5726*53ee8cc1Swenshuai.xi         }
5727*53ee8cc1Swenshuai.xi     }
5728*53ee8cc1Swenshuai.xi     else
5729*53ee8cc1Swenshuai.xi     {
5730*53ee8cc1Swenshuai.xi         printf("hdmitx init fail\r\n");
5731*53ee8cc1Swenshuai.xi         return FALSE;
5732*53ee8cc1Swenshuai.xi     }
5733*53ee8cc1Swenshuai.xi }
5734*53ee8cc1Swenshuai.xi 
5735*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5736*53ee8cc1Swenshuai.xi /// @brief to speed up the process of resume from power saving mode
5737*53ee8cc1Swenshuai.xi /// @return power state
5738*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_SetPowerState(void * pInstance,EN_POWER_MODE u16PowerState)5739*53ee8cc1Swenshuai.xi MS_U32 MDrv_HDMITx_SetPowerState(void* pInstance, EN_POWER_MODE u16PowerState)
5740*53ee8cc1Swenshuai.xi {
5741*53ee8cc1Swenshuai.xi     static EN_POWER_MODE _prev_u16PowerState = E_POWER_MECHANICAL;
5742*53ee8cc1Swenshuai.xi     MS_U32 u32Return = 1;
5743*53ee8cc1Swenshuai.xi 	static MDrvHDMITX_PARAMETER_LIST preHDMITxInfo;
5744*53ee8cc1Swenshuai.xi 
5745*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
5746*53ee8cc1Swenshuai.xi 
5747*53ee8cc1Swenshuai.xi     if ((psHDMITXResPri->stHDMITxInfo.bHDMITxTaskIdCreated == FALSE) ||
5748*53ee8cc1Swenshuai.xi         (psHDMITXResPri->stHDMITxInfo.bHDMITxEventIdCreated == FALSE) ||
5749*53ee8cc1Swenshuai.xi         (psHDMITXResPri->stHDMITxInfo.bCheckRxTimerIdCreated == FALSE))
5750*53ee8cc1Swenshuai.xi     {
5751*53ee8cc1Swenshuai.xi         printf("[%s,%5d] HDMI TX is not initialized!!\r\n", __FUNCTION__, __LINE__);
5752*53ee8cc1Swenshuai.xi         return u32Return;
5753*53ee8cc1Swenshuai.xi     }
5754*53ee8cc1Swenshuai.xi 
5755*53ee8cc1Swenshuai.xi     if (u16PowerState == E_POWER_SUSPEND)
5756*53ee8cc1Swenshuai.xi     {
5757*53ee8cc1Swenshuai.xi         _prev_u16PowerState = u16PowerState;
5758*53ee8cc1Swenshuai.xi 		//store previous state
5759*53ee8cc1Swenshuai.xi        	memcpy(&preHDMITxInfo, &psHDMITXResPri->stHDMITxInfo, sizeof(psHDMITXResPri->stHDMITxInfo));
5760*53ee8cc1Swenshuai.xi 
5761*53ee8cc1Swenshuai.xi 
5762*53ee8cc1Swenshuai.xi         #if HDMITX_ISR_ENABLE
5763*53ee8cc1Swenshuai.xi             MsOS_DisableInterrupt(E_INT_IRQ_HDMI_LEVEL);
5764*53ee8cc1Swenshuai.xi             MsOS_DetachInterrupt(E_INT_IRQ_HDMI_LEVEL);
5765*53ee8cc1Swenshuai.xi 
5766*53ee8cc1Swenshuai.xi             MHal_HDMITx_Int_Disable(gHDMITXIRQ);
5767*53ee8cc1Swenshuai.xi             MHal_HDMITx_Int_Clear(gHDMITXIRQ);
5768*53ee8cc1Swenshuai.xi 
5769*53ee8cc1Swenshuai.xi             if(psHDMITXResPri->stHDMITxInfo.hdmitx_CECEnable_flag)
5770*53ee8cc1Swenshuai.xi             {
5771*53ee8cc1Swenshuai.xi                 #if 0 //ENABLE_CEC_INT
5772*53ee8cc1Swenshuai.xi                 MsOS_DisableInterrupt(E_INT_IRQ_CEC);
5773*53ee8cc1Swenshuai.xi                 MsOS_DetachInterrupt(E_INT_IRQ_CEC);
5774*53ee8cc1Swenshuai.xi                 #endif
5775*53ee8cc1Swenshuai.xi             }
5776*53ee8cc1Swenshuai.xi         #endif // #if HDMITX_ISR_ENABLE
5777*53ee8cc1Swenshuai.xi 
5778*53ee8cc1Swenshuai.xi         MDrv_HDMITx_Power_OnOff(FALSE);
5779*53ee8cc1Swenshuai.xi         u32Return = 0;// UTOPIA_STATUS_SUCCESS;//SUSPEND_OK;
5780*53ee8cc1Swenshuai.xi     }
5781*53ee8cc1Swenshuai.xi     else if (u16PowerState == E_POWER_RESUME)
5782*53ee8cc1Swenshuai.xi     {
5783*53ee8cc1Swenshuai.xi 
5784*53ee8cc1Swenshuai.xi         if (_prev_u16PowerState == E_POWER_SUSPEND)
5785*53ee8cc1Swenshuai.xi         {
5786*53ee8cc1Swenshuai.xi 			//store back tx info
5787*53ee8cc1Swenshuai.xi 			MDrv_HDMITx_Power_OnOff(TRUE);
5788*53ee8cc1Swenshuai.xi             MDrv_HDMITx_InitSeq(pInstance);
5789*53ee8cc1Swenshuai.xi             MDrv_HDCPTx_InitVariable(pInstance);
5790*53ee8cc1Swenshuai.xi 
5791*53ee8cc1Swenshuai.xi             #if HDMITX_ISR_ENABLE
5792*53ee8cc1Swenshuai.xi                 MsOS_AttachInterrupt(E_INT_IRQ_HDMI_LEVEL, _HDMITx_Isr);
5793*53ee8cc1Swenshuai.xi                 MsOS_EnableInterrupt(E_INT_IRQ_HDMI_LEVEL);                                    // Enable TSP interrupt
5794*53ee8cc1Swenshuai.xi                 //MDrv_HDMITx_Int_Enable();
5795*53ee8cc1Swenshuai.xi 
5796*53ee8cc1Swenshuai.xi                 if (psHDMITXResPri->stHDMITxInfo.hdmitx_CECEnable_flag)
5797*53ee8cc1Swenshuai.xi                 {
5798*53ee8cc1Swenshuai.xi                     #if 0 //ENABLE_CEC_INT
5799*53ee8cc1Swenshuai.xi                     DBG_HDMITX(printf("\nEnable CEC INT!!\r\n"));
5800*53ee8cc1Swenshuai.xi                     MsOS_AttachInterrupt(E_INT_IRQ_CEC, _HDMITX_CEC_RxIsr);
5801*53ee8cc1Swenshuai.xi                     MsOS_EnableInterrupt(E_INT_IRQ_CEC);
5802*53ee8cc1Swenshuai.xi                     #endif
5803*53ee8cc1Swenshuai.xi                 }
5804*53ee8cc1Swenshuai.xi             #endif // #if HDMITX_ISR_ENABLE
5805*53ee8cc1Swenshuai.xi 
5806*53ee8cc1Swenshuai.xi 			memcpy(&psHDMITXResPri->stHDMITxInfo, &preHDMITxInfo, sizeof(psHDMITXResPri->stHDMITxInfo));
5807*53ee8cc1Swenshuai.xi 
5808*53ee8cc1Swenshuai.xi             MDrv_HDCPTx_SetAuthStartFlag(pInstance, FALSE);
5809*53ee8cc1Swenshuai.xi             MDrv_HDCPTx_SetAuthDoneFlag(pInstance, FALSE);
5810*53ee8cc1Swenshuai.xi             MDrv_HDMITx_TurnOnOff(pInstance, psHDMITXResPri->stHDMITxInfo.hdmitx_enable_flag);
5811*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SetColorFormat(pInstance, psHDMITXResPri->stHDMITxInfo.input_color, psHDMITXResPri->stHDMITxInfo.output_color);
5812*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SetVideoOnOff(pInstance, psHDMITXResPri->stHDMITxInfo.hdmitx_video_flag);
5813*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SetHDMITxMode(pInstance, psHDMITXResPri->stHDMITxInfo.output_mode);
5814*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SetVideoOutputMode(pInstance, psHDMITXResPri->stHDMITxInfo.output_video_timing);
5815*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SetAudioFrequency(pInstance, psHDMITXResPri->stHDMITxInfo.output_audio_frequncy);
5816*53ee8cc1Swenshuai.xi             MDrv_HDMITx_SetAudioOnOff(pInstance, psHDMITXResPri->stHDMITxInfo.hdmitx_audio_flag);
5817*53ee8cc1Swenshuai.xi             MDrv_HDMITx_Exhibit(pInstance);
5818*53ee8cc1Swenshuai.xi 
5819*53ee8cc1Swenshuai.xi             _prev_u16PowerState = u16PowerState;
5820*53ee8cc1Swenshuai.xi             u32Return = 0;//UTOPIA_STATUS_SUCCESS;//RESUME_OK;
5821*53ee8cc1Swenshuai.xi         }
5822*53ee8cc1Swenshuai.xi         else
5823*53ee8cc1Swenshuai.xi         {
5824*53ee8cc1Swenshuai.xi             u32Return = 1;//UTOPIA_STATUS_FAIL;//SUSPEND_FAILED;
5825*53ee8cc1Swenshuai.xi         }
5826*53ee8cc1Swenshuai.xi     }
5827*53ee8cc1Swenshuai.xi     else
5828*53ee8cc1Swenshuai.xi     {
5829*53ee8cc1Swenshuai.xi         u32Return = 1;//UTOPIA_STATUS_FAIL;
5830*53ee8cc1Swenshuai.xi     }
5831*53ee8cc1Swenshuai.xi 
5832*53ee8cc1Swenshuai.xi     return u32Return;// for success
5833*53ee8cc1Swenshuai.xi }
5834*53ee8cc1Swenshuai.xi 
5835*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5836*53ee8cc1Swenshuai.xi /// @brief to speed up the process of resume from power saving mode
5837*53ee8cc1Swenshuai.xi /// @return power state
5838*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_SSC_Enable(void * pInstance,MS_U8 ubSSCEn)5839*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HDMITx_SSC_Enable(void* pInstance, MS_U8 ubSSCEn)
5840*53ee8cc1Swenshuai.xi {
5841*53ee8cc1Swenshuai.xi     pInstance = pInstance;
5842*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
5843*53ee8cc1Swenshuai.xi     psHDMITXResPri->stHDMITxInfo.ubSSCEn = ubSSCEn;
5844*53ee8cc1Swenshuai.xi 
5845*53ee8cc1Swenshuai.xi     return psHDMITXResPri->stHDMITxInfo.ubSSCEn;
5846*53ee8cc1Swenshuai.xi }
5847*53ee8cc1Swenshuai.xi 
5848*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
5849*53ee8cc1Swenshuai.xi /// @brief Check legitimacy of user setting of timing
5850*53ee8cc1Swenshuai.xi /// @return error code
5851*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HDMITx_CheckLegalTiming(void * pInstance,MsHDMITX_OUTPUT_MODE eOutputMode,MsHDMITX_VIDEO_TIMING idx,MsHDMITX_VIDEO_COLOR_FORMAT incolor_fmt,MsHDMITX_VIDEO_COLOR_FORMAT outcolor_fmt,MsHDMITX_VIDEO_COLORDEPTH_VAL color_depth)5852*53ee8cc1Swenshuai.xi MsHDMITX_TIMING_ERROR MDrv_HDMITx_CheckLegalTiming(void* pInstance, MsHDMITX_OUTPUT_MODE eOutputMode, MsHDMITX_VIDEO_TIMING idx, MsHDMITX_VIDEO_COLOR_FORMAT incolor_fmt, MsHDMITX_VIDEO_COLOR_FORMAT outcolor_fmt, MsHDMITX_VIDEO_COLORDEPTH_VAL color_depth)
5853*53ee8cc1Swenshuai.xi {
5854*53ee8cc1Swenshuai.xi     MS_U32 uiPxlClk = 0;
5855*53ee8cc1Swenshuai.xi     MsHDMITX_AVI_VIC eVIC = E_HDMITX_VIC_NOT_AVAILABLE;
5856*53ee8cc1Swenshuai.xi     MsHDMITX_TIMING_ERROR err = E_HDMITX_TIMING_ERR_NONE;
5857*53ee8cc1Swenshuai.xi 
5858*53ee8cc1Swenshuai.xi     pInstance = pInstance;
5859*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
5860*53ee8cc1Swenshuai.xi 
5861*53ee8cc1Swenshuai.xi     if(psHDMITXResPri->stHDMITxInfo.hdmitx_bypass_flag)
5862*53ee8cc1Swenshuai.xi     {
5863*53ee8cc1Swenshuai.xi         //return E_HDMITX_TIMING_ERR_CFG_ERR;
5864*53ee8cc1Swenshuai.xi         DBG_HDMITX(printf("bypass mode\r\n"));
5865*53ee8cc1Swenshuai.xi         err |= E_HDMITX_TIMING_ERR_CFG_ERR;
5866*53ee8cc1Swenshuai.xi     }
5867*53ee8cc1Swenshuai.xi 
5868*53ee8cc1Swenshuai.xi     if(MHal_HDMITx_GetRXStatus() != E_HDMITX_DVIClock_H_HPD_H)
5869*53ee8cc1Swenshuai.xi     {
5870*53ee8cc1Swenshuai.xi         //return E_HDMITX_TIMING_ERR_CFG_ERR;
5871*53ee8cc1Swenshuai.xi         DBG_HDMITX(printf("RXstatus Low\r\n"));
5872*53ee8cc1Swenshuai.xi         err |= E_HDMITX_TIMING_ERR_CFG_ERR;
5873*53ee8cc1Swenshuai.xi     }
5874*53ee8cc1Swenshuai.xi 
5875*53ee8cc1Swenshuai.xi     if(bCheckEDID)
5876*53ee8cc1Swenshuai.xi     {
5877*53ee8cc1Swenshuai.xi         //if(!MDrv_HDMITx_EdidChecking(pInstance))
5878*53ee8cc1Swenshuai.xi         {
5879*53ee8cc1Swenshuai.xi             //return E_HDMITX_TIMING_ERR_EDID_ERR;
5880*53ee8cc1Swenshuai.xi             DBG_HDMITX(printf("EDID falied\r\n"));
5881*53ee8cc1Swenshuai.xi             err |= E_HDMITX_TIMING_ERR_EDID_ERR;
5882*53ee8cc1Swenshuai.xi         }
5883*53ee8cc1Swenshuai.xi     }
5884*53ee8cc1Swenshuai.xi 
5885*53ee8cc1Swenshuai.xi     if(!psHDMITXResPri->stHDMITxInfo.RxEdidInfo.SupportHdmi)
5886*53ee8cc1Swenshuai.xi     {
5887*53ee8cc1Swenshuai.xi         if( (eOutputMode == E_HDMITX_HDMI) || (eOutputMode == E_HDMITX_HDMI_HDCP) )
5888*53ee8cc1Swenshuai.xi         {
5889*53ee8cc1Swenshuai.xi             err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
5890*53ee8cc1Swenshuai.xi         }
5891*53ee8cc1Swenshuai.xi     }
5892*53ee8cc1Swenshuai.xi 
5893*53ee8cc1Swenshuai.xi     uiPxlClk = MHal_HDMITx_GetPixelClk_ByTiming(idx, outcolor_fmt, color_depth);
5894*53ee8cc1Swenshuai.xi     eVIC = _MDrv_HDMIRx_MapVideoTimingToVIC(idx);
5895*53ee8cc1Swenshuai.xi 
5896*53ee8cc1Swenshuai.xi     err |= MDrv_HDMITx_CheckEDIDTiming(pInstance,eVIC, uiPxlClk, incolor_fmt, outcolor_fmt, color_depth);
5897*53ee8cc1Swenshuai.xi     err |= MDrv_HDMITx_CheckEDIDColorFormat(pInstance, idx, eVIC, incolor_fmt, outcolor_fmt, color_depth);
5898*53ee8cc1Swenshuai.xi     err |= MDrv_HDMITx_CheckEDIDColorDepth(pInstance, outcolor_fmt, color_depth);
5899*53ee8cc1Swenshuai.xi 
5900*53ee8cc1Swenshuai.xi     return err;
5901*53ee8cc1Swenshuai.xi }
5902*53ee8cc1Swenshuai.xi 
MDrv_HDMITx_CheckEDIDTiming(void * pInstance,MsHDMITX_AVI_VIC eVIC,MS_U32 uiPxlClk,MsHDMITX_VIDEO_COLOR_FORMAT incolor_fmt,MsHDMITX_VIDEO_COLOR_FORMAT outcolor_fmt,MsHDMITX_VIDEO_COLORDEPTH_VAL color_depth)5903*53ee8cc1Swenshuai.xi MsHDMITX_TIMING_ERROR MDrv_HDMITx_CheckEDIDTiming(void* pInstance, MsHDMITX_AVI_VIC eVIC, MS_U32 uiPxlClk, MsHDMITX_VIDEO_COLOR_FORMAT incolor_fmt, MsHDMITX_VIDEO_COLOR_FORMAT outcolor_fmt, MsHDMITX_VIDEO_COLORDEPTH_VAL color_depth)
5904*53ee8cc1Swenshuai.xi {
5905*53ee8cc1Swenshuai.xi     MS_U8 i = 0;
5906*53ee8cc1Swenshuai.xi     MS_U8 ubGot = 0;
5907*53ee8cc1Swenshuai.xi     MsHDMITX_TIMING_ERROR err = E_HDMITX_TIMING_ERR_NONE;
5908*53ee8cc1Swenshuai.xi 
5909*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
5910*53ee8cc1Swenshuai.xi 
5911*53ee8cc1Swenshuai.xi     // Check timing
5912*53ee8cc1Swenshuai.xi     {
5913*53ee8cc1Swenshuai.xi         //Check HW Limitation
5914*53ee8cc1Swenshuai.xi         if(uiPxlClk > MHal_HDMITx_GetMaxPixelClk())
5915*53ee8cc1Swenshuai.xi         {
5916*53ee8cc1Swenshuai.xi             err |= E_HDMITX_TIMING_ERR_TIMING;
5917*53ee8cc1Swenshuai.xi             err |= E_HDMITX_TIMING_ERR_HW_LIMIT;
5918*53ee8cc1Swenshuai.xi             DBG_HDMITX(printf("Pixel clock too high\r\n"));
5919*53ee8cc1Swenshuai.xi         }
5920*53ee8cc1Swenshuai.xi 
5921*53ee8cc1Swenshuai.xi         //Check EDID capability
5922*53ee8cc1Swenshuai.xi         {
5923*53ee8cc1Swenshuai.xi             //Check VIC
5924*53ee8cc1Swenshuai.xi             {
5925*53ee8cc1Swenshuai.xi                 for(i = 0; i < psHDMITXResPri->stHDMITxInfo.RxEdidInfo.CEADataBlkLen[CEATag_VideoBlk]; i++)
5926*53ee8cc1Swenshuai.xi                 {
5927*53ee8cc1Swenshuai.xi                     if(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VideoDataBlk[i] < 128)
5928*53ee8cc1Swenshuai.xi                     {
5929*53ee8cc1Swenshuai.xi                         if( (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VideoDataBlk[i] & 0x7F) == eVIC) //7bits VIC
5930*53ee8cc1Swenshuai.xi                         {
5931*53ee8cc1Swenshuai.xi                             ubGot = 1;
5932*53ee8cc1Swenshuai.xi                             break;
5933*53ee8cc1Swenshuai.xi                         }
5934*53ee8cc1Swenshuai.xi                     }
5935*53ee8cc1Swenshuai.xi                     else if( (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VideoDataBlk[i] > 128) && (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VideoDataBlk[i] <= 192) )
5936*53ee8cc1Swenshuai.xi                     {
5937*53ee8cc1Swenshuai.xi                         if( (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VideoDataBlk[i] & 0x7F) == eVIC) //7bits VIC
5938*53ee8cc1Swenshuai.xi                         {
5939*53ee8cc1Swenshuai.xi                             ubGot = 1;
5940*53ee8cc1Swenshuai.xi                             break;
5941*53ee8cc1Swenshuai.xi                         }
5942*53ee8cc1Swenshuai.xi                     }
5943*53ee8cc1Swenshuai.xi                     else
5944*53ee8cc1Swenshuai.xi                     {
5945*53ee8cc1Swenshuai.xi                         switch(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VideoDataBlk[i])
5946*53ee8cc1Swenshuai.xi                         {
5947*53ee8cc1Swenshuai.xi                             case 0:
5948*53ee8cc1Swenshuai.xi                             case 128:
5949*53ee8cc1Swenshuai.xi                             case 254:
5950*53ee8cc1Swenshuai.xi                             case 255:
5951*53ee8cc1Swenshuai.xi                             break;
5952*53ee8cc1Swenshuai.xi 
5953*53ee8cc1Swenshuai.xi                             default:
5954*53ee8cc1Swenshuai.xi                             {
5955*53ee8cc1Swenshuai.xi                                 if( (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VideoDataBlk[i] & 0xFF) == eVIC) //8bits VIC
5956*53ee8cc1Swenshuai.xi                                 {
5957*53ee8cc1Swenshuai.xi                                     ubGot = 1;
5958*53ee8cc1Swenshuai.xi                                     break;
5959*53ee8cc1Swenshuai.xi                                 }
5960*53ee8cc1Swenshuai.xi                             }
5961*53ee8cc1Swenshuai.xi                             break;
5962*53ee8cc1Swenshuai.xi                         }
5963*53ee8cc1Swenshuai.xi                     }
5964*53ee8cc1Swenshuai.xi                 }
5965*53ee8cc1Swenshuai.xi 
5966*53ee8cc1Swenshuai.xi                 //Check VIC in 420 VideoDataBlock
5967*53ee8cc1Swenshuai.xi                 if(!ubGot)
5968*53ee8cc1Swenshuai.xi                 {
5969*53ee8cc1Swenshuai.xi                     if(outcolor_fmt == E_HDMITX_VIDEO_COLOR_YUV420)
5970*53ee8cc1Swenshuai.xi                     {
5971*53ee8cc1Swenshuai.xi                         for ( i = 0; i < 32; i++ )
5972*53ee8cc1Swenshuai.xi                         {
5973*53ee8cc1Swenshuai.xi                             if (eVIC == psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YCbCr420VidDataBlk[i])
5974*53ee8cc1Swenshuai.xi                             {
5975*53ee8cc1Swenshuai.xi                                 ubGot = 1;
5976*53ee8cc1Swenshuai.xi                                 break;
5977*53ee8cc1Swenshuai.xi                             }
5978*53ee8cc1Swenshuai.xi                         }
5979*53ee8cc1Swenshuai.xi                     }
5980*53ee8cc1Swenshuai.xi                 }
5981*53ee8cc1Swenshuai.xi 
5982*53ee8cc1Swenshuai.xi                 if(!ubGot)
5983*53ee8cc1Swenshuai.xi                 {
5984*53ee8cc1Swenshuai.xi                     if(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HdmiVICLen == 0)
5985*53ee8cc1Swenshuai.xi                     {
5986*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_TIMING;
5987*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
5988*53ee8cc1Swenshuai.xi                         DBG_HDMITX(printf("No 4K VIC\r\n"));
5989*53ee8cc1Swenshuai.xi                     }
5990*53ee8cc1Swenshuai.xi                     else
5991*53ee8cc1Swenshuai.xi                     {
5992*53ee8cc1Swenshuai.xi                         //Check HDMI_VIC
5993*53ee8cc1Swenshuai.xi                         switch(eVIC)
5994*53ee8cc1Swenshuai.xi                         {
5995*53ee8cc1Swenshuai.xi                             case E_HDMITX_VIC_3840x2160p_24_16_9:
5996*53ee8cc1Swenshuai.xi                             case E_HDMITX_VIC_3840x2160p_24_64_27:
5997*53ee8cc1Swenshuai.xi                             {
5998*53ee8cc1Swenshuai.xi                                 for(i = 0; i < psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HdmiVICLen; i++)
5999*53ee8cc1Swenshuai.xi                                 {
6000*53ee8cc1Swenshuai.xi                                     if(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HdmiVICList[i] == 1)
6001*53ee8cc1Swenshuai.xi                                     {
6002*53ee8cc1Swenshuai.xi                                         ubGot = 1;
6003*53ee8cc1Swenshuai.xi                                         break;
6004*53ee8cc1Swenshuai.xi                                     }
6005*53ee8cc1Swenshuai.xi                                 }
6006*53ee8cc1Swenshuai.xi                             }
6007*53ee8cc1Swenshuai.xi                             break;
6008*53ee8cc1Swenshuai.xi 
6009*53ee8cc1Swenshuai.xi                             case E_HDMITX_VIC_3840x2160p_25_16_9:
6010*53ee8cc1Swenshuai.xi                             case E_HDMITX_VIC_3840x2160p_25_64_27:
6011*53ee8cc1Swenshuai.xi                             {
6012*53ee8cc1Swenshuai.xi                                 for(i = 0; i < psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HdmiVICLen; i++)
6013*53ee8cc1Swenshuai.xi                                 {
6014*53ee8cc1Swenshuai.xi                                     if(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HdmiVICList[i] == 2)
6015*53ee8cc1Swenshuai.xi                                     {
6016*53ee8cc1Swenshuai.xi                                         ubGot = 1;
6017*53ee8cc1Swenshuai.xi                                         break;
6018*53ee8cc1Swenshuai.xi                                     }
6019*53ee8cc1Swenshuai.xi                                 }
6020*53ee8cc1Swenshuai.xi                             }
6021*53ee8cc1Swenshuai.xi                             break;
6022*53ee8cc1Swenshuai.xi 
6023*53ee8cc1Swenshuai.xi                             case E_HDMITX_VIC_3840x2160p_30_16_9:
6024*53ee8cc1Swenshuai.xi                             case E_HDMITX_VIC_3840x2160p_30_64_27:
6025*53ee8cc1Swenshuai.xi                             {
6026*53ee8cc1Swenshuai.xi                                 for(i = 0; i < psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HdmiVICLen; i++)
6027*53ee8cc1Swenshuai.xi                                 {
6028*53ee8cc1Swenshuai.xi                                     if(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HdmiVICList[i] == 3)
6029*53ee8cc1Swenshuai.xi                                     {
6030*53ee8cc1Swenshuai.xi                                         ubGot = 1;
6031*53ee8cc1Swenshuai.xi                                         break;
6032*53ee8cc1Swenshuai.xi                                     }
6033*53ee8cc1Swenshuai.xi                                 }
6034*53ee8cc1Swenshuai.xi                             }
6035*53ee8cc1Swenshuai.xi                             break;
6036*53ee8cc1Swenshuai.xi 
6037*53ee8cc1Swenshuai.xi                             case E_HDMITX_VIC_4096x2160p_24_256_135:
6038*53ee8cc1Swenshuai.xi                             {
6039*53ee8cc1Swenshuai.xi                                 for(i = 0; i < psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HdmiVICLen; i++)
6040*53ee8cc1Swenshuai.xi                                 {
6041*53ee8cc1Swenshuai.xi                                     if(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HdmiVICList[i] == 4)
6042*53ee8cc1Swenshuai.xi                                     {
6043*53ee8cc1Swenshuai.xi                                         ubGot = 1;
6044*53ee8cc1Swenshuai.xi                                         break;
6045*53ee8cc1Swenshuai.xi                                     }
6046*53ee8cc1Swenshuai.xi                                 }
6047*53ee8cc1Swenshuai.xi                             }
6048*53ee8cc1Swenshuai.xi                             break;
6049*53ee8cc1Swenshuai.xi 
6050*53ee8cc1Swenshuai.xi                             default:
6051*53ee8cc1Swenshuai.xi                             {
6052*53ee8cc1Swenshuai.xi                                 ubGot = 0;
6053*53ee8cc1Swenshuai.xi                             }
6054*53ee8cc1Swenshuai.xi                             break;
6055*53ee8cc1Swenshuai.xi                         }
6056*53ee8cc1Swenshuai.xi 
6057*53ee8cc1Swenshuai.xi                         if(!ubGot)
6058*53ee8cc1Swenshuai.xi                         {
6059*53ee8cc1Swenshuai.xi                             err |= E_HDMITX_TIMING_ERR_TIMING;
6060*53ee8cc1Swenshuai.xi                             err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
6061*53ee8cc1Swenshuai.xi                             DBG_HDMITX(printf("Timing not supported\r\n"));
6062*53ee8cc1Swenshuai.xi                         }
6063*53ee8cc1Swenshuai.xi                     }
6064*53ee8cc1Swenshuai.xi                 }
6065*53ee8cc1Swenshuai.xi             }
6066*53ee8cc1Swenshuai.xi 
6067*53ee8cc1Swenshuai.xi             //Check VSDB and HFVSDB
6068*53ee8cc1Swenshuai.xi             {
6069*53ee8cc1Swenshuai.xi                 if(psHDMITXResPri->stHDMITxInfo.RxEdidInfo.MaxTmdsCharRate != 0)
6070*53ee8cc1Swenshuai.xi                 {
6071*53ee8cc1Swenshuai.xi                     if(uiPxlClk > psHDMITXResPri->stHDMITxInfo.RxEdidInfo.MaxTmdsCharRate * 5 *1000)
6072*53ee8cc1Swenshuai.xi                     {
6073*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_TIMING;
6074*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
6075*53ee8cc1Swenshuai.xi                         DBG_HDMITX(printf("Clock hihger than sink\r\n"));
6076*53ee8cc1Swenshuai.xi                     }
6077*53ee8cc1Swenshuai.xi                 }
6078*53ee8cc1Swenshuai.xi             }
6079*53ee8cc1Swenshuai.xi 
6080*53ee8cc1Swenshuai.xi             //Check SW LIMMIT
6081*53ee8cc1Swenshuai.xi             {
6082*53ee8cc1Swenshuai.xi                 //Check 6.6G
6083*53ee8cc1Swenshuai.xi             }
6084*53ee8cc1Swenshuai.xi 
6085*53ee8cc1Swenshuai.xi             //Check BT2020 for 4K/8K
6086*53ee8cc1Swenshuai.xi             {
6087*53ee8cc1Swenshuai.xi 
6088*53ee8cc1Swenshuai.xi             }
6089*53ee8cc1Swenshuai.xi         }
6090*53ee8cc1Swenshuai.xi     }
6091*53ee8cc1Swenshuai.xi 
6092*53ee8cc1Swenshuai.xi     return err;
6093*53ee8cc1Swenshuai.xi }
6094*53ee8cc1Swenshuai.xi 
MDrv_HDMITx_CheckEDIDColorFormat(void * pInstance,MsHDMITX_VIDEO_TIMING idx,MsHDMITX_AVI_VIC eVIC,MsHDMITX_VIDEO_COLOR_FORMAT incolor_fmt,MsHDMITX_VIDEO_COLOR_FORMAT outcolor_fmt,MsHDMITX_VIDEO_COLORDEPTH_VAL color_depth)6095*53ee8cc1Swenshuai.xi MsHDMITX_TIMING_ERROR MDrv_HDMITx_CheckEDIDColorFormat(void* pInstance, MsHDMITX_VIDEO_TIMING idx, MsHDMITX_AVI_VIC eVIC, MsHDMITX_VIDEO_COLOR_FORMAT incolor_fmt, MsHDMITX_VIDEO_COLOR_FORMAT outcolor_fmt, MsHDMITX_VIDEO_COLORDEPTH_VAL color_depth)
6096*53ee8cc1Swenshuai.xi {
6097*53ee8cc1Swenshuai.xi     MS_U8 i = 0;
6098*53ee8cc1Swenshuai.xi     MS_U8 ub420Supported = 0;
6099*53ee8cc1Swenshuai.xi     MsHDMITX_TIMING_ERROR err = E_HDMITX_TIMING_ERR_NONE;
6100*53ee8cc1Swenshuai.xi 
6101*53ee8cc1Swenshuai.xi     pInstance = pInstance;
6102*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
6103*53ee8cc1Swenshuai.xi 
6104*53ee8cc1Swenshuai.xi     //Check color format
6105*53ee8cc1Swenshuai.xi     {
6106*53ee8cc1Swenshuai.xi         //Check R2Y supported
6107*53ee8cc1Swenshuai.xi         if(!MHal_HDMITx_CSC_Support_R2Y(pInstance))
6108*53ee8cc1Swenshuai.xi         {
6109*53ee8cc1Swenshuai.xi             if( (incolor_fmt == E_HDMITX_VIDEO_COLOR_RGB444) && (outcolor_fmt != E_HDMITX_VIDEO_COLOR_RGB444) )
6110*53ee8cc1Swenshuai.xi             {
6111*53ee8cc1Swenshuai.xi                 err |= E_HDMITX_TIMING_ERR_COLOR_FMT;
6112*53ee8cc1Swenshuai.xi                 err |= E_HDMITX_TIMING_ERR_HW_LIMIT;
6113*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("HW not supporting R2Y\r\n"));
6114*53ee8cc1Swenshuai.xi             }
6115*53ee8cc1Swenshuai.xi         }
6116*53ee8cc1Swenshuai.xi 
6117*53ee8cc1Swenshuai.xi         //Check EDID
6118*53ee8cc1Swenshuai.xi         if(outcolor_fmt != E_HDMITX_VIDEO_COLOR_YUV420)
6119*53ee8cc1Swenshuai.xi         {
6120*53ee8cc1Swenshuai.xi             switch (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.EdidBlk1[0x03] & 0x30)
6121*53ee8cc1Swenshuai.xi             {
6122*53ee8cc1Swenshuai.xi                 case 0x00: //RGB
6123*53ee8cc1Swenshuai.xi                 {
6124*53ee8cc1Swenshuai.xi                     if(outcolor_fmt != E_HDMITX_VIDEO_COLOR_RGB444)
6125*53ee8cc1Swenshuai.xi                     {
6126*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_COLOR_FMT;
6127*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
6128*53ee8cc1Swenshuai.xi                         DBG_HDMITX(printf("Sink RGB only\r\n"));
6129*53ee8cc1Swenshuai.xi                     }
6130*53ee8cc1Swenshuai.xi                 }
6131*53ee8cc1Swenshuai.xi                 break;
6132*53ee8cc1Swenshuai.xi 
6133*53ee8cc1Swenshuai.xi                 case 0x10: //422
6134*53ee8cc1Swenshuai.xi                 {
6135*53ee8cc1Swenshuai.xi                     if(outcolor_fmt == E_HDMITX_VIDEO_COLOR_YUV444)
6136*53ee8cc1Swenshuai.xi                     {
6137*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_COLOR_FMT;
6138*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
6139*53ee8cc1Swenshuai.xi                         DBG_HDMITX(printf("Sink 422 only\r\n"));
6140*53ee8cc1Swenshuai.xi                     }
6141*53ee8cc1Swenshuai.xi                 }
6142*53ee8cc1Swenshuai.xi                 break;
6143*53ee8cc1Swenshuai.xi 
6144*53ee8cc1Swenshuai.xi                 case 0x20: //444
6145*53ee8cc1Swenshuai.xi                 {
6146*53ee8cc1Swenshuai.xi                     if(outcolor_fmt == E_HDMITX_VIDEO_COLOR_YUV422)
6147*53ee8cc1Swenshuai.xi                     {
6148*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_COLOR_FMT;
6149*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
6150*53ee8cc1Swenshuai.xi                         DBG_HDMITX(printf("Sink 444 only\r\n"));
6151*53ee8cc1Swenshuai.xi                     }
6152*53ee8cc1Swenshuai.xi                 }
6153*53ee8cc1Swenshuai.xi                 break;
6154*53ee8cc1Swenshuai.xi 
6155*53ee8cc1Swenshuai.xi                 case 0x30:
6156*53ee8cc1Swenshuai.xi                 {
6157*53ee8cc1Swenshuai.xi                     //RGB YUV444 YUV422 OK
6158*53ee8cc1Swenshuai.xi                 }
6159*53ee8cc1Swenshuai.xi                 break;
6160*53ee8cc1Swenshuai.xi 
6161*53ee8cc1Swenshuai.xi                 default:
6162*53ee8cc1Swenshuai.xi                 {
6163*53ee8cc1Swenshuai.xi                 }
6164*53ee8cc1Swenshuai.xi                 break;
6165*53ee8cc1Swenshuai.xi             }
6166*53ee8cc1Swenshuai.xi 
6167*53ee8cc1Swenshuai.xi             for ( i = 0; i < 32; i++ )
6168*53ee8cc1Swenshuai.xi             {
6169*53ee8cc1Swenshuai.xi                 if (eVIC == psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YCbCr420VidDataBlk[i])
6170*53ee8cc1Swenshuai.xi                 {
6171*53ee8cc1Swenshuai.xi                     if(outcolor_fmt != E_HDMITX_VIDEO_COLOR_YUV420)
6172*53ee8cc1Swenshuai.xi                     {
6173*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_COLOR_FMT;
6174*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
6175*53ee8cc1Swenshuai.xi                         DBG_HDMITX(printf("Sink 420 only 1\r\n"));
6176*53ee8cc1Swenshuai.xi                     }
6177*53ee8cc1Swenshuai.xi                     else
6178*53ee8cc1Swenshuai.xi                     {
6179*53ee8cc1Swenshuai.xi                         ub420Supported = 1;
6180*53ee8cc1Swenshuai.xi                     }
6181*53ee8cc1Swenshuai.xi 
6182*53ee8cc1Swenshuai.xi                     break;
6183*53ee8cc1Swenshuai.xi                 }
6184*53ee8cc1Swenshuai.xi             }
6185*53ee8cc1Swenshuai.xi         }
6186*53ee8cc1Swenshuai.xi         else if(outcolor_fmt == E_HDMITX_VIDEO_COLOR_YUV420)
6187*53ee8cc1Swenshuai.xi         {
6188*53ee8cc1Swenshuai.xi             //420 checking
6189*53ee8cc1Swenshuai.xi             for ( i = 0; i < 32; i++ )
6190*53ee8cc1Swenshuai.xi             {
6191*53ee8cc1Swenshuai.xi                 if (eVIC == psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YCbCr420VidDataBlk[i])
6192*53ee8cc1Swenshuai.xi                 {
6193*53ee8cc1Swenshuai.xi                     if(outcolor_fmt != E_HDMITX_VIDEO_COLOR_YUV420)
6194*53ee8cc1Swenshuai.xi                     {
6195*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_COLOR_FMT;
6196*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
6197*53ee8cc1Swenshuai.xi                         DBG_HDMITX(printf("Sink 420 only 2\r\n"));
6198*53ee8cc1Swenshuai.xi                     }
6199*53ee8cc1Swenshuai.xi                     else
6200*53ee8cc1Swenshuai.xi                     {
6201*53ee8cc1Swenshuai.xi                         ub420Supported = 1;
6202*53ee8cc1Swenshuai.xi                     }
6203*53ee8cc1Swenshuai.xi 
6204*53ee8cc1Swenshuai.xi                     break;
6205*53ee8cc1Swenshuai.xi                 }
6206*53ee8cc1Swenshuai.xi             }
6207*53ee8cc1Swenshuai.xi 
6208*53ee8cc1Swenshuai.xi             if( (outcolor_fmt == E_HDMITX_VIDEO_COLOR_YUV420) && (!ub420Supported) )
6209*53ee8cc1Swenshuai.xi             {
6210*53ee8cc1Swenshuai.xi                 for ( i = 0; i < psHDMITXResPri->stHDMITxInfo.RxEdidInfo.CEADataBlkLen[CEATag_VideoBlk]; i++ )
6211*53ee8cc1Swenshuai.xi                 {
6212*53ee8cc1Swenshuai.xi                     if (eVIC == psHDMITXResPri->stHDMITxInfo.RxEdidInfo.VideoDataBlk[i])
6213*53ee8cc1Swenshuai.xi                     {
6214*53ee8cc1Swenshuai.xi                         if (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YCbCr420CapMapDataBlk[i >> 3] & (0x01 << (i % 8)))
6215*53ee8cc1Swenshuai.xi                         {
6216*53ee8cc1Swenshuai.xi                             ub420Supported = 1;
6217*53ee8cc1Swenshuai.xi                         }
6218*53ee8cc1Swenshuai.xi 
6219*53ee8cc1Swenshuai.xi                         break;
6220*53ee8cc1Swenshuai.xi                     }
6221*53ee8cc1Swenshuai.xi                 }
6222*53ee8cc1Swenshuai.xi 
6223*53ee8cc1Swenshuai.xi                 if(!ub420Supported)
6224*53ee8cc1Swenshuai.xi                 {
6225*53ee8cc1Swenshuai.xi                     err |= E_HDMITX_TIMING_ERR_COLOR_FMT;
6226*53ee8cc1Swenshuai.xi                     err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
6227*53ee8cc1Swenshuai.xi                     DBG_HDMITX(printf("420 not supported\r\n"));
6228*53ee8cc1Swenshuai.xi                 }
6229*53ee8cc1Swenshuai.xi             }
6230*53ee8cc1Swenshuai.xi 
6231*53ee8cc1Swenshuai.xi             #if 0
6232*53ee8cc1Swenshuai.xi             switch(idx)
6233*53ee8cc1Swenshuai.xi             {
6234*53ee8cc1Swenshuai.xi                 case E_HDMITX_RES_3840x2160p_24Hz:
6235*53ee8cc1Swenshuai.xi                 case E_HDMITX_RES_3840x2160p_25Hz:
6236*53ee8cc1Swenshuai.xi                 case E_HDMITX_RES_3840x2160p_30Hz:
6237*53ee8cc1Swenshuai.xi                 case E_HDMITX_RES_3840x2160p_50Hz:
6238*53ee8cc1Swenshuai.xi                 case E_HDMITX_RES_3840x2160p_60Hz:
6239*53ee8cc1Swenshuai.xi                 case E_HDMITX_RES_4096x2160p_24Hz:
6240*53ee8cc1Swenshuai.xi                 case E_HDMITX_RES_4096x2160p_25Hz:
6241*53ee8cc1Swenshuai.xi                 case E_HDMITX_RES_4096x2160p_30Hz:
6242*53ee8cc1Swenshuai.xi                 case E_HDMITX_RES_4096x2160p_50Hz:
6243*53ee8cc1Swenshuai.xi                 case E_HDMITX_RES_4096x2160p_60Hz:
6244*53ee8cc1Swenshuai.xi 
6245*53ee8cc1Swenshuai.xi                 break;
6246*53ee8cc1Swenshuai.xi                 default:
6247*53ee8cc1Swenshuai.xi                 {
6248*53ee8cc1Swenshuai.xi                     err |= E_HDMITX_TIMING_ERR_COLOR_FMT;
6249*53ee8cc1Swenshuai.xi                     err |= E_HDMITX_TIMING_ERR_SW_LIMIT;
6250*53ee8cc1Swenshuai.xi                 }
6251*53ee8cc1Swenshuai.xi                 break;
6252*53ee8cc1Swenshuai.xi             }
6253*53ee8cc1Swenshuai.xi             #else
6254*53ee8cc1Swenshuai.xi             #endif
6255*53ee8cc1Swenshuai.xi         }
6256*53ee8cc1Swenshuai.xi     }
6257*53ee8cc1Swenshuai.xi 
6258*53ee8cc1Swenshuai.xi     return err;
6259*53ee8cc1Swenshuai.xi }
6260*53ee8cc1Swenshuai.xi 
MDrv_HDMITx_CheckEDIDColorDepth(void * pInstance,MsHDMITX_VIDEO_COLOR_FORMAT outcolor_fmt,MsHDMITX_VIDEO_COLORDEPTH_VAL color_depth)6261*53ee8cc1Swenshuai.xi MsHDMITX_TIMING_ERROR MDrv_HDMITx_CheckEDIDColorDepth(void* pInstance, MsHDMITX_VIDEO_COLOR_FORMAT outcolor_fmt, MsHDMITX_VIDEO_COLORDEPTH_VAL color_depth)
6262*53ee8cc1Swenshuai.xi {
6263*53ee8cc1Swenshuai.xi     MS_U8 ubCDSupported = 0;
6264*53ee8cc1Swenshuai.xi     MsHDMITX_TIMING_ERROR err = E_HDMITX_TIMING_ERR_NONE;
6265*53ee8cc1Swenshuai.xi 
6266*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
6267*53ee8cc1Swenshuai.xi 
6268*53ee8cc1Swenshuai.xi     //Color Depth
6269*53ee8cc1Swenshuai.xi     {
6270*53ee8cc1Swenshuai.xi         if( (outcolor_fmt == E_HDMITX_VIDEO_COLOR_YUV422) && (color_depth != E_HDMITX_VIDEO_CD_NoID) )
6271*53ee8cc1Swenshuai.xi         {
6272*53ee8cc1Swenshuai.xi             err |= E_HDMITX_TIMING_ERR_COLOR_DEPTH;
6273*53ee8cc1Swenshuai.xi             DBG_HDMITX(printf("422 wrong color depth\r\n"));
6274*53ee8cc1Swenshuai.xi         }
6275*53ee8cc1Swenshuai.xi 
6276*53ee8cc1Swenshuai.xi         if( (color_depth != E_HDMITX_VIDEO_CD_NoID) && (color_depth != E_HDMITX_VIDEO_CD_24Bits) )
6277*53ee8cc1Swenshuai.xi         {
6278*53ee8cc1Swenshuai.xi             ubCDSupported = psHDMITXResPri->stHDMITxInfo.RxEdidInfo.HDMI_VSDB[5] & 0x78;
6279*53ee8cc1Swenshuai.xi 
6280*53ee8cc1Swenshuai.xi             if(outcolor_fmt == E_HDMITX_VIDEO_COLOR_YUV444)
6281*53ee8cc1Swenshuai.xi             {
6282*53ee8cc1Swenshuai.xi                 if( (ubCDSupported & 0x08) == 0)
6283*53ee8cc1Swenshuai.xi                 {
6284*53ee8cc1Swenshuai.xi                     err |= E_HDMITX_TIMING_ERR_COLOR_DEPTH;
6285*53ee8cc1Swenshuai.xi                     err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
6286*53ee8cc1Swenshuai.xi                     DBG_HDMITX(printf("YUV no color depth\r\n"));
6287*53ee8cc1Swenshuai.xi                 }
6288*53ee8cc1Swenshuai.xi 
6289*53ee8cc1Swenshuai.xi                 if(color_depth == E_HDMITX_VIDEO_CD_48Bits)
6290*53ee8cc1Swenshuai.xi                 {
6291*53ee8cc1Swenshuai.xi                     if( (ubCDSupported & 0x40) == 0)
6292*53ee8cc1Swenshuai.xi                     {
6293*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_COLOR_DEPTH;
6294*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
6295*53ee8cc1Swenshuai.xi                         DBG_HDMITX(printf("YUV no 16bits\r\n"));
6296*53ee8cc1Swenshuai.xi                     }
6297*53ee8cc1Swenshuai.xi                 }
6298*53ee8cc1Swenshuai.xi 
6299*53ee8cc1Swenshuai.xi                 if(color_depth == E_HDMITX_VIDEO_CD_36Bits)
6300*53ee8cc1Swenshuai.xi                 {
6301*53ee8cc1Swenshuai.xi                     if( (ubCDSupported & 0x20) == 0)
6302*53ee8cc1Swenshuai.xi                     {
6303*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_COLOR_DEPTH;
6304*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
6305*53ee8cc1Swenshuai.xi                         DBG_HDMITX(printf("YUV no 12bits\r\n"));
6306*53ee8cc1Swenshuai.xi                     }
6307*53ee8cc1Swenshuai.xi                 }
6308*53ee8cc1Swenshuai.xi 
6309*53ee8cc1Swenshuai.xi                 if(color_depth == E_HDMITX_VIDEO_CD_30Bits)
6310*53ee8cc1Swenshuai.xi                 {
6311*53ee8cc1Swenshuai.xi                     if( (ubCDSupported & 0x10) == 0)
6312*53ee8cc1Swenshuai.xi                     {
6313*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_COLOR_DEPTH;
6314*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
6315*53ee8cc1Swenshuai.xi                         DBG_HDMITX(printf("YUV no 10bits\r\n"));
6316*53ee8cc1Swenshuai.xi                     }
6317*53ee8cc1Swenshuai.xi                 }
6318*53ee8cc1Swenshuai.xi             }
6319*53ee8cc1Swenshuai.xi             else if(outcolor_fmt == E_HDMITX_VIDEO_COLOR_RGB444)
6320*53ee8cc1Swenshuai.xi             {
6321*53ee8cc1Swenshuai.xi                 if(color_depth == E_HDMITX_VIDEO_CD_48Bits)
6322*53ee8cc1Swenshuai.xi                 {
6323*53ee8cc1Swenshuai.xi                     if( (ubCDSupported & 0x40) == 0)
6324*53ee8cc1Swenshuai.xi                     {
6325*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_COLOR_DEPTH;
6326*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
6327*53ee8cc1Swenshuai.xi                         DBG_HDMITX(printf("RGB no 16bits\r\n"));
6328*53ee8cc1Swenshuai.xi                     }
6329*53ee8cc1Swenshuai.xi                 }
6330*53ee8cc1Swenshuai.xi 
6331*53ee8cc1Swenshuai.xi                 if(color_depth == E_HDMITX_VIDEO_CD_36Bits)
6332*53ee8cc1Swenshuai.xi                 {
6333*53ee8cc1Swenshuai.xi                     if( (ubCDSupported & 0x20) == 0)
6334*53ee8cc1Swenshuai.xi                     {
6335*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_COLOR_DEPTH;
6336*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
6337*53ee8cc1Swenshuai.xi                         DBG_HDMITX(printf("RGB no 12bits\r\n"));
6338*53ee8cc1Swenshuai.xi                     }
6339*53ee8cc1Swenshuai.xi                 }
6340*53ee8cc1Swenshuai.xi 
6341*53ee8cc1Swenshuai.xi                 if(color_depth == E_HDMITX_VIDEO_CD_30Bits)
6342*53ee8cc1Swenshuai.xi                 {
6343*53ee8cc1Swenshuai.xi                     if( (ubCDSupported & 0x10) == 0)
6344*53ee8cc1Swenshuai.xi                     {
6345*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_COLOR_DEPTH;
6346*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
6347*53ee8cc1Swenshuai.xi                         DBG_HDMITX(printf("RGB no 10bits\r\n"));
6348*53ee8cc1Swenshuai.xi                     }
6349*53ee8cc1Swenshuai.xi                 }
6350*53ee8cc1Swenshuai.xi             }
6351*53ee8cc1Swenshuai.xi             else if(outcolor_fmt == E_HDMITX_VIDEO_COLOR_YUV420)
6352*53ee8cc1Swenshuai.xi             {
6353*53ee8cc1Swenshuai.xi                 if(color_depth == E_HDMITX_VIDEO_CD_48Bits)
6354*53ee8cc1Swenshuai.xi                 {
6355*53ee8cc1Swenshuai.xi                     if( (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YUV420DeepColorInfo & 0x04) == 0)
6356*53ee8cc1Swenshuai.xi                     {
6357*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_COLOR_DEPTH;
6358*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
6359*53ee8cc1Swenshuai.xi                         DBG_HDMITX(printf("420 no 16bits\r\n"));
6360*53ee8cc1Swenshuai.xi                     }
6361*53ee8cc1Swenshuai.xi                 }
6362*53ee8cc1Swenshuai.xi 
6363*53ee8cc1Swenshuai.xi                 if(color_depth == E_HDMITX_VIDEO_CD_36Bits)
6364*53ee8cc1Swenshuai.xi                 {
6365*53ee8cc1Swenshuai.xi                     if( (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YUV420DeepColorInfo & 0x02) == 0)
6366*53ee8cc1Swenshuai.xi                     {
6367*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_COLOR_DEPTH;
6368*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
6369*53ee8cc1Swenshuai.xi                         DBG_HDMITX(printf("420 no 12bits\r\n"));
6370*53ee8cc1Swenshuai.xi                     }
6371*53ee8cc1Swenshuai.xi                 }
6372*53ee8cc1Swenshuai.xi 
6373*53ee8cc1Swenshuai.xi                 if(color_depth == E_HDMITX_VIDEO_CD_30Bits)
6374*53ee8cc1Swenshuai.xi                 {
6375*53ee8cc1Swenshuai.xi                     if( (psHDMITXResPri->stHDMITxInfo.RxEdidInfo.YUV420DeepColorInfo & 0x01) == 0)
6376*53ee8cc1Swenshuai.xi                     {
6377*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_COLOR_DEPTH;
6378*53ee8cc1Swenshuai.xi                         err |= E_HDMITX_TIMING_ERR_SINK_LIMIT;
6379*53ee8cc1Swenshuai.xi                         DBG_HDMITX(printf("420 no 10bits\r\n"));
6380*53ee8cc1Swenshuai.xi                     }
6381*53ee8cc1Swenshuai.xi                 }
6382*53ee8cc1Swenshuai.xi             }
6383*53ee8cc1Swenshuai.xi         }
6384*53ee8cc1Swenshuai.xi     }
6385*53ee8cc1Swenshuai.xi 
6386*53ee8cc1Swenshuai.xi     return err;
6387*53ee8cc1Swenshuai.xi }
6388*53ee8cc1Swenshuai.xi 
6389*53ee8cc1Swenshuai.xi #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
6390*53ee8cc1Swenshuai.xi //**************************************************************************
6391*53ee8cc1Swenshuai.xi //  [Function Name]:
6392*53ee8cc1Swenshuai.xi //                  mdrv_mhl_MDCMDEchoCommand()
6393*53ee8cc1Swenshuai.xi //  [Description]
6394*53ee8cc1Swenshuai.xi //                  MHL MDCMD echo command function
6395*53ee8cc1Swenshuai.xi //  [Arguments]:
6396*53ee8cc1Swenshuai.xi //
6397*53ee8cc1Swenshuai.xi //  [Return]:
6398*53ee8cc1Swenshuai.xi //
6399*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_MDCMDEchoCommand(void * pInstance,MS_U64 * u64ReqHdl,char * pcCmdLine)6400*53ee8cc1Swenshuai.xi void MDrv_HDMITx_MDCMDEchoCommand(void* pInstance, MS_U64* u64ReqHdl, char* pcCmdLine)
6401*53ee8cc1Swenshuai.xi {
6402*53ee8cc1Swenshuai.xi     char pch[] = "=,";
6403*53ee8cc1Swenshuai.xi     char* psep;
6404*53ee8cc1Swenshuai.xi 
6405*53ee8cc1Swenshuai.xi     MdbPrint(u64ReqHdl, "LINE:%d, MDBCMD_CMDLINE\n", __LINE__);
6406*53ee8cc1Swenshuai.xi     MdbPrint(u64ReqHdl, "pcCmdLine: %s\n", pcCmdLine);
6407*53ee8cc1Swenshuai.xi 
6408*53ee8cc1Swenshuai.xi     psep = strsep(&pcCmdLine, pch);
6409*53ee8cc1Swenshuai.xi 
6410*53ee8cc1Swenshuai.xi     if(strncmp("HDMITXOn", psep, 8) == 0)
6411*53ee8cc1Swenshuai.xi     {
6412*53ee8cc1Swenshuai.xi 
6413*53ee8cc1Swenshuai.xi     }
6414*53ee8cc1Swenshuai.xi }
6415*53ee8cc1Swenshuai.xi 
6416*53ee8cc1Swenshuai.xi //**************************************************************************
6417*53ee8cc1Swenshuai.xi //  [Function Name]:
6418*53ee8cc1Swenshuai.xi //                  mdrv_mhl_MDCMDGetInfo()
6419*53ee8cc1Swenshuai.xi //  [Description]
6420*53ee8cc1Swenshuai.xi //                  MHL MDCMD get info function
6421*53ee8cc1Swenshuai.xi //  [Arguments]:
6422*53ee8cc1Swenshuai.xi //
6423*53ee8cc1Swenshuai.xi //  [Return]:
6424*53ee8cc1Swenshuai.xi //
6425*53ee8cc1Swenshuai.xi //**************************************************************************
MDrv_HDMITx_MDCMDGetInfo(void * pInstance,MS_U64 * u64ReqHdl)6426*53ee8cc1Swenshuai.xi void MDrv_HDMITx_MDCMDGetInfo(void* pInstance, MS_U64* u64ReqHdl)
6427*53ee8cc1Swenshuai.xi {
6428*53ee8cc1Swenshuai.xi     int i = 0;
6429*53ee8cc1Swenshuai.xi     _HDMITX_GET_VARIABLE();
6430*53ee8cc1Swenshuai.xi 
6431*53ee8cc1Swenshuai.xi     {
6432*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "LINE:%d, MDBCMD_GETINFO\n", __LINE__);
6433*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "----------------  Mstar HDMITx Info -----------------\n");
6434*53ee8cc1Swenshuai.xi         //Basic Status
6435*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx Dis_TMDSCtrl=%d\n",   g_bDisableTMDSCtrl );
6436*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx Dis_RegCtrl=%d\n",  g_bDisableRegWrite);
6437*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx RxStatus: Real = %d, Flag=%d\n", MHal_HDMITx_GetRXStatus(), gbCurRxStatus);
6438*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx TMDS Status: Real=%d, Flag=%d\n", MHal_HDMITx_GetTMDSStatus(), psHDMITXResPri->stHDMITxInfo.hdmitx_tmds_flag);
6439*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx FSM=%d\n",  psHDMITXResPri->stHDMITxInfo.hdmitx_fsm_state);
6440*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx TxRxByPass=%d\n",   psHDMITXResPri->stHDMITxInfo.hdmitx_bypass_flag);
6441*53ee8cc1Swenshuai.xi 
6442*53ee8cc1Swenshuai.xi         //Video
6443*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "----------------  Mstar HDMITx Video Info -----------\n");
6444*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx OutputMode=%d\n",   psHDMITXResPri->stHDMITxInfo.output_mode);
6445*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx OutputTiming=%d\n",   psHDMITXResPri->stHDMITxInfo.output_video_timing);
6446*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx InColor=%d, OutColor=%d\n",  psHDMITXResPri->stHDMITxInfo.input_color, psHDMITXResPri->stHDMITxInfo.output_color);
6447*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx InRange=%d, OutRange=%d\n",  psHDMITXResPri->stHDMITxInfo.input_range, psHDMITXResPri->stHDMITxInfo.output_range);
6448*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx ColorDepth=%d\n",   psHDMITXResPri->stHDMITxInfo.output_colordepth_val);
6449*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx Colorimetry=%d, ExtColorimetry=%d\n",  psHDMITXResPri->stHDMITxInfo.colorimetry, psHDMITXResPri->stHDMITxInfo.ext_colorimetry);
6450*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx AVMute=%d\n",   psHDMITXResPri->stHDMITxInfo.hdmitx_avmute_flag);
6451*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx TxPatternOn=%d\n",   psHDMITXResPri->stHDMITxInfo.hdmitx_video_flag);
6452*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx ACTIVFMT_PRESENT=%d\n",   psHDMITXResPri->stHDMITxInfo.output_activeformat_present );
6453*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx AFDOverWrite=%d\n",   psHDMITXResPri->stHDMITxInfo.hdmitx_AFD_override_mode);
6454*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx ScanInfo=%d\n",   psHDMITXResPri->stHDMITxInfo.output_scan_info);
6455*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx AFDRatio=%d\n",   psHDMITXResPri->stHDMITxInfo.output_afd_ratio);
6456*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx AspectRation=%d\n",   psHDMITXResPri->stHDMITxInfo.output_aspect_ratio);
6457*53ee8cc1Swenshuai.xi 
6458*53ee8cc1Swenshuai.xi         //Audio
6459*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "----------------  Mstar HDMITx Audio Info -----------\n");
6460*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx AudioOn=%d\n",   psHDMITXResPri->stHDMITxInfo.hdmitx_audio_flag);
6461*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx AudioSampleRate=%d\n",   psHDMITXResPri->stHDMITxInfo.output_audio_frequncy);
6462*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx AudioChannelCnt=%d\n",   psHDMITXResPri->stHDMITxInfo.output_audio_channel);
6463*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx AudioNon-PCM=%d\n",   psHDMITXResPri->stHDMITxInfo.output_audio_type);
6464*53ee8cc1Swenshuai.xi 
6465*53ee8cc1Swenshuai.xi         //EDID
6466*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "----------------  Mstar HDMITx EDID Info ------------\n");
6467*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "HDMITx EDID Valid=%d\n",   psHDMITXResPri->stHDMITxInfo.hdmitx_edid_ready);
6468*53ee8cc1Swenshuai.xi 
6469*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "**********       HDMITx EDID0       ***********\n");
6470*53ee8cc1Swenshuai.xi         for(i = 0; i < HDMITX_EDID_BLK_SIZE; i ++)
6471*53ee8cc1Swenshuai.xi         {
6472*53ee8cc1Swenshuai.xi             MdbPrint(u64ReqHdl, "0x%02x, \n", psHDMITXResPri->stHDMITxInfo.RxEdidInfo.EdidBlk0[i]);
6473*53ee8cc1Swenshuai.xi 
6474*53ee8cc1Swenshuai.xi             if ( (i+1)%16 == 0 )
6475*53ee8cc1Swenshuai.xi             {
6476*53ee8cc1Swenshuai.xi                 MdbPrint(u64ReqHdl, "\n");
6477*53ee8cc1Swenshuai.xi             }
6478*53ee8cc1Swenshuai.xi         }
6479*53ee8cc1Swenshuai.xi 
6480*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "**********       HDMITx EDID1       ***********\n");
6481*53ee8cc1Swenshuai.xi         for(i = 0; i < HDMITX_EDID_BLK_SIZE; i ++)
6482*53ee8cc1Swenshuai.xi         {
6483*53ee8cc1Swenshuai.xi             MdbPrint(u64ReqHdl, "0x%02x, \n", psHDMITXResPri->stHDMITxInfo.RxEdidInfo.EdidBlk1[i]);
6484*53ee8cc1Swenshuai.xi 
6485*53ee8cc1Swenshuai.xi             if ( (i+1)%16 == 0 )
6486*53ee8cc1Swenshuai.xi             {
6487*53ee8cc1Swenshuai.xi                 MdbPrint(u64ReqHdl, "\n");
6488*53ee8cc1Swenshuai.xi             }
6489*53ee8cc1Swenshuai.xi         }
6490*53ee8cc1Swenshuai.xi 
6491*53ee8cc1Swenshuai.xi         //HDCPTx
6492*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "----------------  Mstar REE HDCPTx Info -------------\n");
6493*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "REE HDCPTx START=%d\n",  psHDMITXResPri->stHdcpTxInfo.hdmitx_HdcpStartAuth_flag);
6494*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "REE HDCPTx On=%d\n",  psHDMITXResPri->stHDMITxInfo.hdmitx_hdcp_flag);
6495*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "REE HDCPTx FSM: Main=%d, Sub=%d\n",  psHDMITXResPri->stHdcpTxInfo.hdcp14tx_MainState, psHDMITXResPri->stHdcpTxInfo.hdcp14tx_SubState);
6496*53ee8cc1Swenshuai.xi         MdbPrint(u64ReqHdl, "REE HDCPTx TVHDCP14Cap=%d\n",   psHDMITXResPri->stHdcpTxInfo.hdcp_Rx_valid);
6497*53ee8cc1Swenshuai.xi 
6498*53ee8cc1Swenshuai.xi     }
6499*53ee8cc1Swenshuai.xi }
6500*53ee8cc1Swenshuai.xi 
6501*53ee8cc1Swenshuai.xi #endif
6502*53ee8cc1Swenshuai.xi 
6503*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6504*53ee8cc1Swenshuai.xi /// HDCP SRM DSA Signature Verification
6505*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6506*53ee8cc1Swenshuai.xi #if 0
6507*53ee8cc1Swenshuai.xi void    _dsa_init(dsa_context *dsa)
6508*53ee8cc1Swenshuai.xi {
6509*53ee8cc1Swenshuai.xi     dsa->p = bdNew();
6510*53ee8cc1Swenshuai.xi     dsa->q = bdNew();
6511*53ee8cc1Swenshuai.xi     dsa->g = bdNew();
6512*53ee8cc1Swenshuai.xi     dsa->x = bdNew();
6513*53ee8cc1Swenshuai.xi     dsa->y = bdNew();
6514*53ee8cc1Swenshuai.xi }
6515*53ee8cc1Swenshuai.xi 
6516*53ee8cc1Swenshuai.xi void    _dsa_clear(dsa_context *dsa)
6517*53ee8cc1Swenshuai.xi {
6518*53ee8cc1Swenshuai.xi     bdFree(&dsa->p);
6519*53ee8cc1Swenshuai.xi     bdFree(&dsa->q);
6520*53ee8cc1Swenshuai.xi     bdFree(&dsa->g);
6521*53ee8cc1Swenshuai.xi     bdFree(&dsa->x);
6522*53ee8cc1Swenshuai.xi     bdFree(&dsa->y);
6523*53ee8cc1Swenshuai.xi }
6524*53ee8cc1Swenshuai.xi 
6525*53ee8cc1Swenshuai.xi //
6526*53ee8cc1Swenshuai.xi // FUNCTION dsa_verify
6527*53ee8cc1Swenshuai.xi //
6528*53ee8cc1Swenshuai.xi // m: H(m), hash of the message, in general this is SHA-1
6529*53ee8cc1Swenshuai.xi // r: signature
6530*53ee8cc1Swenshuai.xi // s: signature
6531*53ee8cc1Swenshuai.xi //
6532*53ee8cc1Swenshuai.xi // verify method:
6533*53ee8cc1Swenshuai.xi // v = ( (g^u1 * y^u2) % p ) % q
6534*53ee8cc1Swenshuai.xi // check v = r
6535*53ee8cc1Swenshuai.xi //
6536*53ee8cc1Swenshuai.xi MS_S8 _dsa_verify(dsa_context *dsa, BIGD m, BIGD r, BIGD s)
6537*53ee8cc1Swenshuai.xi {
6538*53ee8cc1Swenshuai.xi     BIGD w;
6539*53ee8cc1Swenshuai.xi     BIGD u1;
6540*53ee8cc1Swenshuai.xi     BIGD u2;
6541*53ee8cc1Swenshuai.xi     BIGD v;
6542*53ee8cc1Swenshuai.xi     BIGD tmp1, tmp2, tmp3;
6543*53ee8cc1Swenshuai.xi     MS_S8      result;
6544*53ee8cc1Swenshuai.xi 
6545*53ee8cc1Swenshuai.xi     w    = bdNew();
6546*53ee8cc1Swenshuai.xi     u1   = bdNew();
6547*53ee8cc1Swenshuai.xi     u2   = bdNew();
6548*53ee8cc1Swenshuai.xi     v    = bdNew();
6549*53ee8cc1Swenshuai.xi     tmp1 = bdNew();
6550*53ee8cc1Swenshuai.xi     tmp2 = bdNew();
6551*53ee8cc1Swenshuai.xi     tmp3 = bdNew();
6552*53ee8cc1Swenshuai.xi 
6553*53ee8cc1Swenshuai.xi     bdModInv(w,s,dsa->q);        // w = inv(s) % q
6554*53ee8cc1Swenshuai.xi     bdModMult(u1,m,w,dsa->q);        // u1 = m*w % q
6555*53ee8cc1Swenshuai.xi     bdModMult(u2,r,w,dsa->q);        // u2 = r*w % q
6556*53ee8cc1Swenshuai.xi     bdModExp(tmp1,dsa->g,u1,dsa->p);    // tmp1 = (g^u1) % p
6557*53ee8cc1Swenshuai.xi     bdModExp(tmp2,dsa->y,u2,dsa->p);    // tmp2 = (y^u2) % p
6558*53ee8cc1Swenshuai.xi     bdModMult(tmp3,tmp1,tmp2,dsa->p);    // tmp3 = (g^u1 % p) * (y^u2 % p)
6559*53ee8cc1Swenshuai.xi     bdModulo(v,tmp3,dsa->q);        // v = tmp3 % q
6560*53ee8cc1Swenshuai.xi     result = bdCompare(v,r);        // compare (v, r)
6561*53ee8cc1Swenshuai.xi 
6562*53ee8cc1Swenshuai.xi     printf("@@SRM- W= ");
6563*53ee8cc1Swenshuai.xi     bdPrint(w, BD_PRINT_TRIM | BD_PRINT_NL);
6564*53ee8cc1Swenshuai.xi #if 0
6565*53ee8cc1Swenshuai.xi     printf("@@SRM- u1= ");
6566*53ee8cc1Swenshuai.xi     bdPrint(u1, BD_PRINT_TRIM | BD_PRINT_NL);
6567*53ee8cc1Swenshuai.xi     printf("@@SRM- u2= ");
6568*53ee8cc1Swenshuai.xi     bdPrint(u2, BD_PRINT_TRIM | BD_PRINT_NL);
6569*53ee8cc1Swenshuai.xi     printf("@@SRM- G^u1= ");
6570*53ee8cc1Swenshuai.xi     bdPrint(tmp1, BD_PRINT_TRIM | BD_PRINT_NL);
6571*53ee8cc1Swenshuai.xi     printf("@@SRM- Y^u2= ");
6572*53ee8cc1Swenshuai.xi     bdPrint(tmp2, BD_PRINT_TRIM | BD_PRINT_NL);
6573*53ee8cc1Swenshuai.xi     printf("@@SRM- Product= ");
6574*53ee8cc1Swenshuai.xi     bdPrint(tmp3, BD_PRINT_TRIM | BD_PRINT_NL);
6575*53ee8cc1Swenshuai.xi #endif
6576*53ee8cc1Swenshuai.xi     printf("@@SRM- V= ");
6577*53ee8cc1Swenshuai.xi     bdPrint(v, BD_PRINT_TRIM | BD_PRINT_NL);
6578*53ee8cc1Swenshuai.xi 
6579*53ee8cc1Swenshuai.xi     bdFree(&w);
6580*53ee8cc1Swenshuai.xi     bdFree(&u1);
6581*53ee8cc1Swenshuai.xi     bdFree(&u2);
6582*53ee8cc1Swenshuai.xi     bdFree(&v);
6583*53ee8cc1Swenshuai.xi     bdFree(&tmp1);
6584*53ee8cc1Swenshuai.xi     bdFree(&tmp2);
6585*53ee8cc1Swenshuai.xi     bdFree(&tmp3);
6586*53ee8cc1Swenshuai.xi 
6587*53ee8cc1Swenshuai.xi     return result;            // 0: verified, non-zero: failed to verify
6588*53ee8cc1Swenshuai.xi }
6589*53ee8cc1Swenshuai.xi 
6590*53ee8cc1Swenshuai.xi #endif
6591*53ee8cc1Swenshuai.xi 
6592*53ee8cc1Swenshuai.xi 
6593