xref: /utopia/UTPA2-700.0.x/modules/hdmi/hal/maxim/hdmitx/halHDMITx.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) 2008-2009 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 #define  MHAL_HDMITX_C
96*53ee8cc1Swenshuai.xi 
97*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
98*53ee8cc1Swenshuai.xi //  Include Files
99*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
100*53ee8cc1Swenshuai.xi // Common Definition
101*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
102*53ee8cc1Swenshuai.xi #include <linux/string.h>
103*53ee8cc1Swenshuai.xi #else
104*53ee8cc1Swenshuai.xi #include <string.h>
105*53ee8cc1Swenshuai.xi #endif
106*53ee8cc1Swenshuai.xi 
107*53ee8cc1Swenshuai.xi #include "MsCommon.h"
108*53ee8cc1Swenshuai.xi 
109*53ee8cc1Swenshuai.xi // Internal Definition
110*53ee8cc1Swenshuai.xi #include "regHDMITx.h"
111*53ee8cc1Swenshuai.xi #include "halHDMIUtilTx.h"
112*53ee8cc1Swenshuai.xi #include "halHDMITx.h"
113*53ee8cc1Swenshuai.xi #include "drvHDMITx.h"
114*53ee8cc1Swenshuai.xi 
115*53ee8cc1Swenshuai.xi // External Definition
116*53ee8cc1Swenshuai.xi #include "drvGPIO.h"
117*53ee8cc1Swenshuai.xi #include "drvSYS.h"
118*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
119*53ee8cc1Swenshuai.xi //  Driver Compiler Options
120*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
121*53ee8cc1Swenshuai.xi 
122*53ee8cc1Swenshuai.xi 
123*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
124*53ee8cc1Swenshuai.xi //  Local Defines
125*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
126*53ee8cc1Swenshuai.xi 
127*53ee8cc1Swenshuai.xi #define GENERAL_PKT_NUM		0x0BU //wilson@kano
128*53ee8cc1Swenshuai.xi #define INFOFRM_PKT_NUM		0x08U //for HDR packet ID = 0x87;  0x06U //wilson@kano
129*53ee8cc1Swenshuai.xi 
130*53ee8cc1Swenshuai.xi 
131*53ee8cc1Swenshuai.xi #define HDMITX_VS_INFO_PKT_VER				0x01U
132*53ee8cc1Swenshuai.xi #define HDMITX_VS_INFO_PKT_LEN				0x1BU
133*53ee8cc1Swenshuai.xi 
134*53ee8cc1Swenshuai.xi #define HDMITX_AVI_INFO_PKT_VER				0x02U
135*53ee8cc1Swenshuai.xi #define HDMITX_AVI_INFO_PKT_LEN				0x0DU
136*53ee8cc1Swenshuai.xi 
137*53ee8cc1Swenshuai.xi #define HDMITX_SPD_INFO_PKT_VER				0x01U
138*53ee8cc1Swenshuai.xi #define HDMITX_SPD_INFO_PKT_LEN				0x19U
139*53ee8cc1Swenshuai.xi 
140*53ee8cc1Swenshuai.xi #define HDMITX_AUD_INFO_PKT_VER				0x01U
141*53ee8cc1Swenshuai.xi #define HDMITX_AUD_INFO_PKT_LEN				0x0AU
142*53ee8cc1Swenshuai.xi 
143*53ee8cc1Swenshuai.xi #define HDMITX_HDR_INFO_PKT_VER             0x01U
144*53ee8cc1Swenshuai.xi #define HDMITX_HDR_INFO_PKT_LEN             0x1BU //wilson@kano: temp solution
145*53ee8cc1Swenshuai.xi 
146*53ee8cc1Swenshuai.xi 
147*53ee8cc1Swenshuai.xi 
148*53ee8cc1Swenshuai.xi #define     IS_STOP_PKT(_X_)            ( (_X_ & E_HDMITX_STOP_PACKET) ? 1 : 0 )
149*53ee8cc1Swenshuai.xi #define     IS_CYCLIC_PKT(_X_)          ( (_X_ & E_HDMITX_CYCLIC_PACKET) ? 1 : 0 )
150*53ee8cc1Swenshuai.xi 
151*53ee8cc1Swenshuai.xi // HDMI packet cyclic frame count
152*53ee8cc1Swenshuai.xi #define HDMITX_PACKET_NULL_FCNT         0U           ///< 0 ~ 31
153*53ee8cc1Swenshuai.xi #define HDMITX_PACKET_ACR_FCNT          0U           ///< 0 ~ 15
154*53ee8cc1Swenshuai.xi #define HDMITX_PACKET_GC_FCNT           0U           ///< 0 ~ 1
155*53ee8cc1Swenshuai.xi #define HDMITX_PACKET_ACP_FCNT          15U          ///< 0 ~ 31
156*53ee8cc1Swenshuai.xi #define HDMITX_PACKET_ISRC_FCNT         15U          ///< 0 ~ 31
157*53ee8cc1Swenshuai.xi 
158*53ee8cc1Swenshuai.xi #define HDMITX_PACKET_VS_FCNT           0U          ///< 0 ~ 31
159*53ee8cc1Swenshuai.xi #define HDMITX_PACKET_AVI_FCNT          0U           ///< 0 ~ 31
160*53ee8cc1Swenshuai.xi #define HDMITX_PACKET_SPD_FCNT          1U          ///< 0 ~ 31
161*53ee8cc1Swenshuai.xi #define HDMITX_PACKET_AUD_FCNT          0U           ///< 0 ~ 31
162*53ee8cc1Swenshuai.xi #define HDMITX_PACKET_HDR_FCNT          0U
163*53ee8cc1Swenshuai.xi 
164*53ee8cc1Swenshuai.xi #define HDMITX_PACKET_SPD_SDI           1U   // Digital STB
165*53ee8cc1Swenshuai.xi #define HDMITX_CSC_SUPPORT_R2Y          1U
166*53ee8cc1Swenshuai.xi #define HDMITX_SUPPORT_P2I              1U
167*53ee8cc1Swenshuai.xi #define HDMITX_SUPPORT_444TO420         1U
168*53ee8cc1Swenshuai.xi #define HDMITX_MAX_PIXEL_CLK            597000000   //Max cupported pixel clock
169*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
170*53ee8cc1Swenshuai.xi //  Local Structures
171*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
172*53ee8cc1Swenshuai.xi 
173*53ee8cc1Swenshuai.xi //*********************//
174*53ee8cc1Swenshuai.xi //             Video   //
175*53ee8cc1Swenshuai.xi //*********************//
176*53ee8cc1Swenshuai.xi 
177*53ee8cc1Swenshuai.xi typedef enum
178*53ee8cc1Swenshuai.xi {
179*53ee8cc1Swenshuai.xi     E_HDMITX_VIDEO_INTERLACE_MODE     = 0,
180*53ee8cc1Swenshuai.xi     E_HDMITX_VIDEO_PROGRESSIVE_MODE = 1,
181*53ee8cc1Swenshuai.xi } MDrv_HDMITx_VIDEO_MODE;
182*53ee8cc1Swenshuai.xi 
183*53ee8cc1Swenshuai.xi typedef enum
184*53ee8cc1Swenshuai.xi {
185*53ee8cc1Swenshuai.xi     E_HDMITX_VIDEO_POLARITY_HIGH  = 0,
186*53ee8cc1Swenshuai.xi     E_HDMITX_VIDEO_POLARITY_LOW = 1,
187*53ee8cc1Swenshuai.xi } MDrv_HDMITx_VIDEO_POLARITY;
188*53ee8cc1Swenshuai.xi 
189*53ee8cc1Swenshuai.xi typedef struct
190*53ee8cc1Swenshuai.xi {
191*53ee8cc1Swenshuai.xi     MDrv_HDMITx_VIDEO_MODE          i_p_mode;         // interlace / progressive mode
192*53ee8cc1Swenshuai.xi     MDrv_HDMITx_VIDEO_POLARITY   h_polarity;        // Hsync polarity
193*53ee8cc1Swenshuai.xi     MDrv_HDMITx_VIDEO_POLARITY   v_polarity;        // Vsync polarity
194*53ee8cc1Swenshuai.xi     MS_U16                                            vs_width;          // Vsync pulse width
195*53ee8cc1Swenshuai.xi     MS_U16                                            vs_bporch;        // Vsync back-porch
196*53ee8cc1Swenshuai.xi     MS_U16                                            vde_width;        // Vde active width
197*53ee8cc1Swenshuai.xi     MS_U16                                            vs_delayline;    // Vsync line delay
198*53ee8cc1Swenshuai.xi     MS_U16                                            vs_delaypixel;  // Vsync pixel delay
199*53ee8cc1Swenshuai.xi     MS_U16                                            hs_width;          // Hsync pulse width
200*53ee8cc1Swenshuai.xi     MS_U16                                            hs_bporch;        // Hsync back-porch
201*53ee8cc1Swenshuai.xi     MS_U16                                            hde_width;        // Hde active width
202*53ee8cc1Swenshuai.xi     MS_U16                                            hs_delay;          // Hsync delay
203*53ee8cc1Swenshuai.xi     MS_U16                                            vtotal;               // Vsync total
204*53ee8cc1Swenshuai.xi     MS_U16                                            htotal;	         // Hsync total
205*53ee8cc1Swenshuai.xi     MS_U16                                            frame_rate;       // Frame Rate
206*53ee8cc1Swenshuai.xi     MS_U32                                            pixel_clk;        //pixel clock
207*53ee8cc1Swenshuai.xi } MDrv_HDMITx_VIDEO_MODE_INFO_TYPE;
208*53ee8cc1Swenshuai.xi 
209*53ee8cc1Swenshuai.xi //*********************//
210*53ee8cc1Swenshuai.xi //             Packet  //
211*53ee8cc1Swenshuai.xi //*********************//
212*53ee8cc1Swenshuai.xi 
213*53ee8cc1Swenshuai.xi typedef enum
214*53ee8cc1Swenshuai.xi {
215*53ee8cc1Swenshuai.xi     E_HDMITX_ACT_GCP_CMD    = 0,
216*53ee8cc1Swenshuai.xi     E_HDMITX_ACT_ACR_CMD    = 1,
217*53ee8cc1Swenshuai.xi     E_HDMITX_ACT_AVI_CMD    = 2,
218*53ee8cc1Swenshuai.xi     E_HDMITX_ACT_AUD_CMD    = 3,
219*53ee8cc1Swenshuai.xi     E_HDMITX_ACT_SPD_CMD    = 4,
220*53ee8cc1Swenshuai.xi     E_HDMITX_ACT_MPG_CMD    = 5,
221*53ee8cc1Swenshuai.xi     E_HDMITX_ACT_VSP_CMD    = 6,
222*53ee8cc1Swenshuai.xi     E_HDMITX_ACT_NUL_CMD    = 7,
223*53ee8cc1Swenshuai.xi     E_HDMITX_ACT_ACP_CMD    = 8,
224*53ee8cc1Swenshuai.xi     E_HDMITX_ACT_ISRC_CMD    = 9,
225*53ee8cc1Swenshuai.xi     E_HDMITX_ACT_GCP_DC_CMD    = 10, // GCP with non-zero CD
226*53ee8cc1Swenshuai.xi     E_HDMITX_ACT_GMP_CMD    = 11, // Gamut Metadata packet
227*53ee8cc1Swenshuai.xi } MDrvHDMITX_PKTS_ACT_CMD;
228*53ee8cc1Swenshuai.xi 
229*53ee8cc1Swenshuai.xi typedef struct PKT
230*53ee8cc1Swenshuai.xi {
231*53ee8cc1Swenshuai.xi     MS_BOOL User_Define;
232*53ee8cc1Swenshuai.xi     MsHDMITX_PACKET_PROCESS Define_Process;
233*53ee8cc1Swenshuai.xi     MS_U8 Define_FCnt;
234*53ee8cc1Swenshuai.xi }PKT_Behavior;
235*53ee8cc1Swenshuai.xi //*********************//
236*53ee8cc1Swenshuai.xi //             Audio   //
237*53ee8cc1Swenshuai.xi //*********************//
238*53ee8cc1Swenshuai.xi typedef struct
239*53ee8cc1Swenshuai.xi {
240*53ee8cc1Swenshuai.xi     MS_U8     CH_Status3;
241*53ee8cc1Swenshuai.xi     MS_U32   NcodeValue;
242*53ee8cc1Swenshuai.xi } MDrv_HDMITx_AUDIO_FREQ_TYPE;
243*53ee8cc1Swenshuai.xi 
244*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
245*53ee8cc1Swenshuai.xi //  Global Variables
246*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
247*53ee8cc1Swenshuai.xi MS_U8     gDivider = 0x00;
248*53ee8cc1Swenshuai.xi MS_BOOL   gDivFlag = FALSE;
249*53ee8cc1Swenshuai.xi static MS_U8 gu8ChipVerNum = 0x00;
250*53ee8cc1Swenshuai.xi MS_BOOL     g_bSupportSCDC = FALSE;
251*53ee8cc1Swenshuai.xi 
252*53ee8cc1Swenshuai.xi stHDMITx_PKT_ATTRIBUTE gbGeneralPktList[GENERAL_PKT_NUM]; //wilson@kano
253*53ee8cc1Swenshuai.xi stHDMITx_PKT_ATTRIBUTE gbInfoFrmPktList[INFOFRM_PKT_NUM]; //wilson@kano
254*53ee8cc1Swenshuai.xi 
255*53ee8cc1Swenshuai.xi // User defined packet behavior
256*53ee8cc1Swenshuai.xi PKT_Behavior NULL_PACKET = {FALSE, E_HDMITX_STOP_PACKET, 0};
257*53ee8cc1Swenshuai.xi PKT_Behavior ACR_PACKET = {FALSE, E_HDMITX_STOP_PACKET, 0};
258*53ee8cc1Swenshuai.xi PKT_Behavior AS_PACKET = {FALSE, E_HDMITX_STOP_PACKET, 0};
259*53ee8cc1Swenshuai.xi PKT_Behavior GC_PACKET = {FALSE, E_HDMITX_STOP_PACKET, 0};
260*53ee8cc1Swenshuai.xi PKT_Behavior ACP_PACKET = {FALSE, E_HDMITX_STOP_PACKET, 0};
261*53ee8cc1Swenshuai.xi PKT_Behavior ISRC1_PACKET = {FALSE, E_HDMITX_STOP_PACKET, 0};
262*53ee8cc1Swenshuai.xi PKT_Behavior ISRC2_PACKET = {FALSE, E_HDMITX_STOP_PACKET, 0};
263*53ee8cc1Swenshuai.xi PKT_Behavior DSD_PACKET = {FALSE, E_HDMITX_STOP_PACKET, 0};
264*53ee8cc1Swenshuai.xi PKT_Behavior HBR_PACKET = {FALSE, E_HDMITX_STOP_PACKET, 0};
265*53ee8cc1Swenshuai.xi PKT_Behavior GM_PACKET = {FALSE, E_HDMITX_STOP_PACKET, 0};
266*53ee8cc1Swenshuai.xi 
267*53ee8cc1Swenshuai.xi PKT_Behavior VS_INFORAME = {FALSE, E_HDMITX_STOP_PACKET, 0};
268*53ee8cc1Swenshuai.xi PKT_Behavior AVI_INFORAME = {FALSE, E_HDMITX_STOP_PACKET, 0};
269*53ee8cc1Swenshuai.xi PKT_Behavior SPD_INFORAME = {FALSE, E_HDMITX_STOP_PACKET, 0};
270*53ee8cc1Swenshuai.xi PKT_Behavior AUDIO_INFORAME = {FALSE, E_HDMITX_STOP_PACKET, 0};
271*53ee8cc1Swenshuai.xi PKT_Behavior MPEG_INFORAME = {FALSE, E_HDMITX_STOP_PACKET, 0};
272*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
273*53ee8cc1Swenshuai.xi //  Local Variables
274*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
275*53ee8cc1Swenshuai.xi 
276*53ee8cc1Swenshuai.xi //*********************//
277*53ee8cc1Swenshuai.xi //             Video   //
278*53ee8cc1Swenshuai.xi //*********************//
279*53ee8cc1Swenshuai.xi 
280*53ee8cc1Swenshuai.xi // It should be mapped with MsHDMITX_VIDEO_TIMING structure in drvHDMITx.h
281*53ee8cc1Swenshuai.xi MDrv_HDMITx_VIDEO_MODE_INFO_TYPE HDMITxVideoModeTbl[E_HDMITX_RES_MAX]=
282*53ee8cc1Swenshuai.xi {
283*53ee8cc1Swenshuai.xi     //IorPMode;                                             PolarityH;                                          PolarityV;                               VSW;      VbckP;   VDe;       VSDel;  VSDelP;  HSW;      HbckP;   HDe;      HSDel;    VSTotal; HSTotal;
284*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_LOW,    E_HDMITX_VIDEO_POLARITY_LOW,    0x0002, 0x0021, 0x01E0, 0x000A,     0, 0x0060, 0x0030, 0x0280, 0x0010, 0x020D, 0x0320,  60, 25175000},  // 0: 640x480p
285*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_INTERLACE_MODE,     E_HDMITX_VIDEO_POLARITY_LOW,    E_HDMITX_VIDEO_POLARITY_LOW,    0x0003, 0x000F, 0x01E0, 0x0004,     0, 0x007C, 0x0072, 0x05A0, 0x0026, 0x020D, 0x06B4,  60, 27000000},  // 1: 720x480i
286*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_INTERLACE_MODE,     E_HDMITX_VIDEO_POLARITY_LOW,    E_HDMITX_VIDEO_POLARITY_LOW,    0x0003, 0x0013, 0x0240, 0x0002,     0, 0x007E, 0x008A, 0x05A0, 0x0018, 0x0271, 0x06C0,  50, 27000000},  // 2: 720x576i
287*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_LOW,    E_HDMITX_VIDEO_POLARITY_LOW,    0x0006, 0x001E, 0x01E0, 0x0009,     0, 0x003E, 0x003C, 0x02D0, 0x0010, 0x020D, 0x035A,  60, 27000000},  // 3: 720x480p
288*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_LOW,    E_HDMITX_VIDEO_POLARITY_LOW,    0x0005, 0x0027, 0x0240, 0x0005,     0, 0x0040, 0x0044, 0x02D0, 0x000C, 0x0271, 0x0360,  50, 27000000},  // 4: 720x576p
289*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x0005, 0x0014, 0x02D0, 0x0005,     0, 0x0028, 0x00DC, 0x0500, 0x01B8, 0x02EE, 0x07BC,  50, 74250000},  // 5: 1280x720p_50Hz
290*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x0005, 0x0014, 0x02D0, 0x0005,     0, 0x0028, 0x00DC, 0x0500, 0x006E, 0x02EE, 0x0672,  60, 74250000},  // 6: 1280x720p_60Hz
291*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_INTERLACE_MODE,     E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x0005, 0x000F, 0x0438, 0x0002,     0, 0x002C, 0x0094, 0x0780, 0x0210, 0x0465, 0x0A50,  50, 74250000},  // 7: 1920x1080i_50Hz
292*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_INTERLACE_MODE,     E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x0005, 0x000F, 0x0438, 0x0002,     0, 0x002C, 0x0094, 0x0780, 0x0058, 0x0465, 0x0898,  60, 74250000},  // 8: 1920x1080i_60Hz
293*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x0005, 0x0024, 0x0438, 0x0004,     0, 0x002C, 0x0094, 0x0780, 0x027E, 0x0465, 0x0ABE,  24, 74250000},  // 9: 1920x1080p_24Hz
294*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x0005, 0x0024, 0x0438, 0x0004,     0, 0x002C, 0x0094, 0x0780, 0x0210, 0x0465, 0x0A50,  25, 74250000},  // 10: 1920x1080p_25Hz
295*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x0005, 0x0024, 0x0438, 0x0004,     0, 0x002C, 0x0094, 0x0780, 0x0058, 0x0465, 0x0898,  30, 74250000},  // 11: 1920x1080p_30Hz
296*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x0005, 0x0024, 0x0438, 0x0004,     0, 0x002C, 0x0094, 0x0780, 0x0210, 0x0465, 0x0A50,  50, 148500000},  // 12: 1920x1080p_50Hz
297*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x0005, 0x0024, 0x0438, 0x0004,     0, 0x002C, 0x0094, 0x0780, 0x0058, 0x0465, 0x0898,  60, 148500000},  // 13: 1920x1080p_60Hz
298*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x0005, 0x0024, 0x089D, 0x0004,     0, 0x002C, 0x0094, 0x0780, 0x027E, 0x08CA, 0x0ABE,  24, 148500000},  // 14: 1920x2205p_24Hz //3D: 1920x1080p_24Hz x2
299*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x0005, 0x0014, 0x05BE, 0x0005,     0, 0x0028, 0x00DC, 0x0500, 0x01B8, 0x05DC, 0x07BC,  50, 148500000},  // 15: 1280x1470p_50Hz //3D: 1280x720_50Hz x2
300*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x0005, 0x0014, 0x05BE, 0x0005,     0, 0x0028, 0x00DC, 0x0500, 0x006E, 0x05DC, 0x0672,  60, 148500000},  // 16: 1280x1470p_60Hz //3D: 1280x720_60Hz x2
301*53ee8cc1Swenshuai.xi 
302*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x000A, 0x0048, 0x0870, 0x0008,     0, 0x0058, 0x0128, 0x0F00, 0x04FC, 0x08CA, 0x157C,  24, 297000000},  // 17:93: 3840x2160p_24Hz
303*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x000A, 0x0048, 0x0870, 0x0008,     0, 0x0058, 0x0128, 0x0F00, 0x0420, 0x08CA, 0x14A0,  25, 297000000},  // 18:94: 3840x2160p_25Hz
304*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x000A, 0x0048, 0x0870, 0x0008,     0, 0x0058, 0x0128, 0x0F00, 0x00B0, 0x08CA, 0x1130,  30, 297000000},  // 19:95: 3840x2160p_30Hz
305*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x000A, 0x0048, 0x0870, 0x0008,     0, 0x0058, 0x0128, 0x0F00, 0x0420, 0x08CA, 0x14A0,  50, 594000000},  // 20:96: 3840x2160p_50Hz
306*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x000A, 0x0048, 0x0870, 0x0008,     0, 0x0058, 0x0128, 0x0F00, 0x00B0, 0x08CA, 0x1130,  60, 594000000},  // 21:97: 3840x2160p_60Hz
307*53ee8cc1Swenshuai.xi 
308*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x000A, 0x0048, 0x0870, 0x0008,     0, 0x0058, 0x0128, 0x1000, 0x03FC, 0x08CA, 0x157C,  24, 297000000},  // 22:98: 4096x2160p_24Hz
309*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x000A, 0x0048, 0x0870, 0x0008,     0, 0x0058, 0x0080, 0x1000, 0x03C8, 0x08CA, 0x14A0,  25, 297000000},  // 23:99: 4096x2160p_25Hz
310*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x000A, 0x0048, 0x0870, 0x0008,     0, 0x0058, 0x0080, 0x1000, 0x0058, 0x08CA, 0x1130,  30, 297000000},  // 24:100: 4096x2160p_30Hz
311*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x000A, 0x0048, 0x0870, 0x0008,     0, 0x0058, 0x0080, 0x1000, 0x03C8, 0x08CA, 0x14A0,  50, 594000000},  // 25:101: 4096x2160p_50Hz
312*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x000A, 0x0048, 0x0870, 0x0008, 	0, 0x0058, 0x0080, 0x1000, 0x0058, 0x08CA, 0x1130,  60, 594000000},  // 26:102: 4096x2160p_60Hz
313*53ee8cc1Swenshuai.xi 
314*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x0003, 0x002E, 0x04B0, 0x0001,     0, 0x00C0, 0x0130, 0x0640, 0x0040, 0x04E2, 0x0870,  60, 162000000},  // 27: 1600x1200p_60Hz
315*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x0006, 0x0019, 0x0384, 0x0003,     0, 0x0098, 0x00E8, 0x05A0, 0x0050, 0x03A6, 0x0770,  60, 106500000},  // 28: 1440x900p_60Hz
316*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x0003, 0x0026, 0x0400, 0x0001,     0, 0x0070, 0x00F8, 0x0500, 0x0030, 0x042A, 0x0698,  60, 108000000},  // 29: 1280x1024p_60Hz
317*53ee8cc1Swenshuai.xi     {E_HDMITX_VIDEO_PROGRESSIVE_MODE,   E_HDMITX_VIDEO_POLARITY_HIGH,   E_HDMITX_VIDEO_POLARITY_HIGH,   0x0006, 0x001D, 0x0300, 0x0003,     0, 0x0088, 0x00A0, 0x0400, 0x0024, 0x0326, 0x0540,  60, 65000000},   // 30: 1024x768p_60Hz
318*53ee8cc1Swenshuai.xi };
319*53ee8cc1Swenshuai.xi 
320*53ee8cc1Swenshuai.xi //atop setting
321*53ee8cc1Swenshuai.xi stHDMITx_ATOP_SETTING HDMITxVideoAtopSetting[HDMITX_COLOR_DEPTH_TYPE_NUM][E_HDMITX_RES_MAX] =
322*53ee8cc1Swenshuai.xi {
323*53ee8cc1Swenshuai.xi     //color depth = 8bit
324*53ee8cc1Swenshuai.xi     {
325*53ee8cc1Swenshuai.xi         {0x03, 0x03, 0x00, 0x03, 0x14, 0x0F, 0x400000},  // 0: 640x480p
326*53ee8cc1Swenshuai.xi         {0x03, 0x03, 0x00, 0x03, 0x14, 0x0F, 0x400000},  // 1: 720x480i
327*53ee8cc1Swenshuai.xi         {0x03, 0x03, 0x00, 0x03, 0x14, 0x0F, 0x400000},  // 2: 720x576i
328*53ee8cc1Swenshuai.xi         {0x03, 0x03, 0x00, 0x03, 0x14, 0x0F, 0x400000},  // 3: 720x480p
329*53ee8cc1Swenshuai.xi         {0x03, 0x03, 0x00, 0x03, 0x14, 0x0F, 0x400000},  // 4: 720x576p
330*53ee8cc1Swenshuai.xi // 74Mhz
331*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x00, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 5: 1280x720p_50Hz
332*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x00, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 6: 1280x720p_60Hz
333*53ee8cc1Swenshuai.xi         #if (defined(HDMITX_SUPPORT_P2I) && (HDMITX_SUPPORT_P2I == 1))
334*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x00, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 7: 1920x1080i_50Hz
335*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x00, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 8: 1920x1080i_60Hz
336*53ee8cc1Swenshuai.xi         #else
337*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x00, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 7: 1920x1080i_50Hz
338*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x00, 0x03, 0x14, 0x0F, 0x2E978D},  // 8: 1920x1080i_60Hz
339*53ee8cc1Swenshuai.xi         #endif
340*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x00, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 9: 1920x1080p_24Hz
341*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x00, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 10: 1920x1080p_25Hz
342*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x00, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 11: 1920x1080p_30Hz
343*53ee8cc1Swenshuai.xi // 148Mhz
344*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x00, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 12: 1920x1080p_50Hz
345*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x00, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 13: 1920x1080p_60Hz
346*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x00, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 14: 1920x2205p_24Hz
347*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x00, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 15: 1280x1470p_50Hz
348*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x00, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 16: 1280x1470p_60Hz
349*53ee8cc1Swenshuai.xi         // the following is 4k2k timing list, if not support, default is 3840x2160p@30
350*53ee8cc1Swenshuai.xi // 300Mhz
351*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x00, 0x0C, 0x38, 0x08, 0x1745D1},  // 17:93: 3840x2160p_24Hz
352*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x00, 0x0C, 0x38, 0x08, 0x1745D1},  // 18:94: 3840x2160p_25Hz
353*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x00, 0x0C, 0x38, 0x08, 0x1745D1},  // 19:95: 3840x2160p_30Hz
354*53ee8cc1Swenshuai.xi // 600Mhz
355*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x00, 0x0C, 0x38, 0x08, 0x1745D1},  // 20:96: 3840x2160p_50Hz
356*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x00, 0x0C, 0x38, 0x08, 0x1745D1},  // 21:97: 3840x2160p_60Hz
357*53ee8cc1Swenshuai.xi // 300Mhz
358*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x00, 0x0C, 0x38, 0x08, 0x1745D1},  // 22:98: 4096x2160p_24Hz
359*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x00, 0x0C, 0x38, 0x08, 0x1745D1},  // 23:99: 4096x2160p_25Hz
360*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x00, 0x0C, 0x38, 0x08, 0x1745D1},  // 24:100: 4096x2160p_30Hz
361*53ee8cc1Swenshuai.xi // 600Mhz
362*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x00, 0x0C, 0x38, 0x08, 0x1745D1},  // 25:101: 4096x2160p_50Hz
363*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x00, 0x0C, 0x38, 0x08, 0x1745D1},  // 26:102: 4096x2160p_60Hz
364*53ee8cc1Swenshuai.xi 
365*53ee8cc1Swenshuai.xi // 150MHz
366*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x00, 0x0C, 0x38, 0x08, 0x2AAAAA},  // 27: 1600x1200p_60Hz
367*53ee8cc1Swenshuai.xi // 106.5MHz
368*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x00, 0x03, 0x14, 0x0F, 0x40EB71},  // 28: 1440x900p_60Hz
369*53ee8cc1Swenshuai.xi // 108MHz
370*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x00, 0x03, 0x14, 0x0F, 0x400000},  // 29: 1280x1024p_60Hz
371*53ee8cc1Swenshuai.xi // 65MHz
372*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x00, 0x03, 0x14, 0x0F, 0x352B52},  // 30: 1024x768p_60Hz
373*53ee8cc1Swenshuai.xi     },
374*53ee8cc1Swenshuai.xi 
375*53ee8cc1Swenshuai.xi     //color depth  = 10 bit
376*53ee8cc1Swenshuai.xi     {
377*53ee8cc1Swenshuai.xi         {0x03, 0x03, 0x01, 0x03, 0x14, 0x0F, 0x333333},  // 0: 640x480p
378*53ee8cc1Swenshuai.xi         {0x03, 0x03, 0x01, 0x03, 0x14, 0x0F, 0x333333},  // 1: 720x480i
379*53ee8cc1Swenshuai.xi         {0x03, 0x03, 0x01, 0x03, 0x14, 0x0F, 0x333333},  // 2: 720x576i
380*53ee8cc1Swenshuai.xi         {0x03, 0x03, 0x01, 0x03, 0x14, 0x0F, 0x333333},  // 3: 720x480p
381*53ee8cc1Swenshuai.xi         {0x03, 0x03, 0x01, 0x03, 0x14, 0x0F, 0x333333},  // 4: 720x576p
382*53ee8cc1Swenshuai.xi // 74Mhz
383*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x01, 0x03, 0x14, 0x0F, 0x253C82},  // 5: 1280x720p_50Hz
384*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x01, 0x03, 0x14, 0x0F, 0x253C82},  // 6: 1280x720p_60Hz
385*53ee8cc1Swenshuai.xi         #if (defined(HDMITX_SUPPORT_P2I) && (HDMITX_SUPPORT_P2I == 1))
386*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x01, 0x03, 0x14, 0x0F, 0x253C82},  // 7: 1920x1080i_50Hz
387*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x01, 0x03, 0x14, 0x0F, 0x253C82},  // 8: 1920x1080i_60Hz
388*53ee8cc1Swenshuai.xi         #else
389*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x01, 0x03, 0x14, 0x0F, 0x253C82},  // 7: 1920x1080i_50Hz
390*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x01, 0x03, 0x14, 0x0F, 0x25460A},  // 8: 1920x1080i_60Hz
391*53ee8cc1Swenshuai.xi         #endif
392*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x01, 0x03, 0x14, 0x0F, 0x253C82},  // 9: 1920x1080p_24Hz
393*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x01, 0x03, 0x14, 0x0F, 0x253C82},  // 10: 1920x1080p_25Hz
394*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x01, 0x03, 0x14, 0x0F, 0x253C82},  // 11: 1920x1080p_30Hz
395*53ee8cc1Swenshuai.xi // 148Mhz
396*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x01, 0x03, 0x14, 0x0F, 0x253C82},  // 12: 1920x1080p_50Hz
397*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x01, 0x03, 0x14, 0x0F, 0x253C82},  // 13: 1920x1080p_60Hz
398*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x01, 0x03, 0x14, 0x0F, 0x253C82},  // 14: 1920x2205p_24Hz
399*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x01, 0x03, 0x14, 0x0F, 0x253C82},  // 15: 1280x1470p_50Hz
400*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x01, 0x03, 0x14, 0x0F, 0x253C82},  // 16: 1280x1470p_60Hz
401*53ee8cc1Swenshuai.xi         // the following is 4k2k timing list, if not support, default is 3840x2160p@30
402*53ee8cc1Swenshuai.xi 
403*53ee8cc1Swenshuai.xi // 300Mhz
404*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x01, 0x0C, 0x38, 0x08, 0x253C82},  // 17:93: 3840x2160p_24Hz
405*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x01, 0x0C, 0x38, 0x08, 0x253C82},  // 18:94: 3840x2160p_25Hz
406*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x01, 0x0C, 0x38, 0x08, 0x253C82},  // 19:95: 3840x2160p_30Hz
407*53ee8cc1Swenshuai.xi // 600Mhz ==> not support !!!
408*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x01, 0x0C, 0x38, 0x08, 0x253C82},  // 20:96: 3840x2160p_50Hz
409*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x01, 0x0C, 0x38, 0x08, 0x253C82},  // 21:97: 3840x2160p_60Hz
410*53ee8cc1Swenshuai.xi // 300Mhz
411*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x01, 0x0C, 0x38, 0x08, 0x253C82},  // 22:98: 4096x2160p_24Hz
412*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x01, 0x0C, 0x38, 0x08, 0x253C82},  // 23:99: 4096x2160p_25Hz
413*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x01, 0x0C, 0x38, 0x08, 0x253C82},  // 24:100: 4096x2160p_30Hz
414*53ee8cc1Swenshuai.xi // 600Mhz ==> not support !!!
415*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x01, 0x0C, 0x38, 0x08, 0x253C82},  // 25:101: 4096x2160p_50Hz
416*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x01, 0x0C, 0x38, 0x08, 0x253C82},  // 26:102: 4096x2160p_60Hz
417*53ee8cc1Swenshuai.xi 
418*53ee8cc1Swenshuai.xi // 150MHz
419*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x01, 0x03, 0x14, 0x0F, 0x222222},  // 27: 1600x1200p_60Hz
420*53ee8cc1Swenshuai.xi // 106.5MHz
421*53ee8cc1Swenshuai.xi         //{0x02, 0x02, 0x01, 0x03, 0x14, 0x0F, 0x33EBCE},  // 28: 1440x900p_60Hz
422*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x01, 0x03, 0x14, 0x0F, 0x33EF8D},
423*53ee8cc1Swenshuai.xi // 108MHz
424*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x01, 0x03, 0x14, 0x0F, 0x333333},  // 29: 1280x1024p_60Hz
425*53ee8cc1Swenshuai.xi // 65MHz
426*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x01, 0x03, 0x14, 0x0F, 0x2A890E},  // 30: 1024x768p_60Hz
427*53ee8cc1Swenshuai.xi     },
428*53ee8cc1Swenshuai.xi 
429*53ee8cc1Swenshuai.xi     //color depth = 12 bit
430*53ee8cc1Swenshuai.xi     {
431*53ee8cc1Swenshuai.xi         {0x03, 0x03, 0x02, 0x03, 0x14, 0x0F, 0x2AAAAA},  // 0: 640x480p
432*53ee8cc1Swenshuai.xi         {0x03, 0x03, 0x02, 0x03, 0x14, 0x0F, 0x2AAAAA},  // 1: 720x480i
433*53ee8cc1Swenshuai.xi         {0x03, 0x03, 0x02, 0x03, 0x14, 0x0F, 0x2AAAAA},  // 2: 720x576i
434*53ee8cc1Swenshuai.xi         {0x03, 0x03, 0x02, 0x03, 0x14, 0x0F, 0x2AAAAA},  // 3: 720x480p
435*53ee8cc1Swenshuai.xi         {0x03, 0x03, 0x02, 0x03, 0x14, 0x0F, 0x2AAAAA},  // 4: 720x576p
436*53ee8cc1Swenshuai.xi // 74Mhz
437*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x02, 0x03, 0x14, 0x0F, 0x1F07C1},  // 5: 1280x720p_50Hz
438*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x02, 0x03, 0x14, 0x0F, 0x1F07C1},  // 6: 1280x720p_60Hz
439*53ee8cc1Swenshuai.xi         #if (defined(HDMITX_SUPPORT_P2I) && (HDMITX_SUPPORT_P2I == 1))
440*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x02, 0x0C, 0x38, 0x08, 0x1F07C1},  // 7: 1920x1080i_50Hz
441*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x02, 0x0C, 0x38, 0x08, 0x1F07C1},  // 8: 1920x1080i_60Hz
442*53ee8cc1Swenshuai.xi         #else
443*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x02, 0x03, 0x14, 0x0F, 0x1F07C1},  // 7: 1920x1080i_50Hz
444*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x02, 0x03, 0x14, 0x0F, 0x1F0FB3},  // 8: 1920x1080i_60Hz
445*53ee8cc1Swenshuai.xi         #endif
446*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x02, 0x03, 0x14, 0x0F, 0x1F07C1},  // 9: 1920x1080p_24Hz
447*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x02, 0x03, 0x14, 0x0F, 0x1F07C1},  // 10: 1920x1080p_25Hz
448*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x02, 0x03, 0x14, 0x0F, 0x1F07C1},  // 11: 1920x1080p_30Hz
449*53ee8cc1Swenshuai.xi // 148Mhz
450*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x02, 0x0C, 0x38, 0x08, 0x1F07C1},  // 12: 1920x1080p_50Hz
451*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x02, 0x0C, 0x38, 0x08, 0x1F07C1},  // 13: 1920x1080p_60Hz
452*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x02, 0x0C, 0x38, 0x08, 0x1F07C1},  // 14: 1920x2205p_24Hz
453*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x02, 0x0C, 0x38, 0x08, 0x1F07C1},  // 15: 1280x1470p_50Hz
454*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x02, 0x0C, 0x38, 0x08, 0x1F07C1},  // 16: 1280x1470p_60Hz
455*53ee8cc1Swenshuai.xi         // the following is 4k2k timing list, if not support, default is 3840x2160p@30
456*53ee8cc1Swenshuai.xi 
457*53ee8cc1Swenshuai.xi // 300Mhz
458*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x02, 0x0C, 0x38, 0x08, 0x1F07C1},  // 17:93: 3840x2160p_24Hz
459*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x02, 0x0C, 0x38, 0x08, 0x1F07C1},  // 18:94: 3840x2160p_25Hz
460*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x02, 0x0C, 0x38, 0x08, 0x1F07C1},  // 19:95: 3840x2160p_30Hz
461*53ee8cc1Swenshuai.xi // 600Mhz ==> not support !!!
462*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x02, 0x0C, 0x38, 0x08, 0x1F07C1},  // 20:96: 3840x2160p_50Hz
463*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x02, 0x0C, 0x38, 0x08, 0x1F07C1},  // 21:97: 3840x2160p_60Hz
464*53ee8cc1Swenshuai.xi // 300Mhz
465*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x02, 0x0C, 0x38, 0x08, 0x1F07C1},  // 22:98: 4096x2160p_24Hz
466*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x02, 0x0C, 0x38, 0x08, 0x1F07C1},  // 23:99: 4096x2160p_25Hz
467*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x02, 0x0C, 0x38, 0x08, 0x1F07C1},  // 24:100: 4096x2160p_30Hz
468*53ee8cc1Swenshuai.xi // 600Mhz ==> not support !!!
469*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x02, 0x0C, 0x38, 0x08, 0x1F07C1},  // 25:101: 4096x2160p_50Hz
470*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x02, 0x0C, 0x38, 0x08, 0x1F07C1},  // 26:102: 4096x2160p_60Hz
471*53ee8cc1Swenshuai.xi 
472*53ee8cc1Swenshuai.xi // 150MHz
473*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x02, 0x0C, 0x38, 0x04, 0x1C71C7},  // 27: 1600x1200p_60Hz
474*53ee8cc1Swenshuai.xi // 106.5MHz
475*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x02, 0x0C, 0x38, 0x08, 0x2B47A0},  // 28: 1440x900p_60Hz
476*53ee8cc1Swenshuai.xi // 108MHz
477*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x02, 0x0C, 0x38, 0x08, 0x2AAAAA},  // 29: 1280x1024p_60Hz
478*53ee8cc1Swenshuai.xi // 65MHz
479*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x02, 0x03, 0x14, 0x0F, 0x237237},  // 30: 1024x768p_60Hz
480*53ee8cc1Swenshuai.xi     },
481*53ee8cc1Swenshuai.xi 
482*53ee8cc1Swenshuai.xi     //color depth = 16 bit
483*53ee8cc1Swenshuai.xi     {
484*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x03, 0x03, 0x14, 0x0F, 0x400000},  // 0: 640x480p
485*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x03, 0x03, 0x14, 0x0F, 0x400000},  // 1: 720x480i
486*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x03, 0x03, 0x14, 0x0F, 0x400000},  // 2: 720x576i
487*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x03, 0x03, 0x14, 0x0F, 0x400000},  // 3: 720x480p
488*53ee8cc1Swenshuai.xi         {0x02, 0x02, 0x03, 0x03, 0x14, 0x0F, 0x400000},  // 4: 720x576p
489*53ee8cc1Swenshuai.xi // 74Mhz
490*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x03, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 5: 1280x720p_50Hz
491*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x03, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 6: 1280x720p_60Hz
492*53ee8cc1Swenshuai.xi         #if (defined(HDMITX_SUPPORT_P2I) && (HDMITX_SUPPORT_P2I == 1))
493*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x2E8BA2},  // 7: 1920x1080i_50Hz
494*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x2E8BA2},  // 8: 1920x1080i_60Hz
495*53ee8cc1Swenshuai.xi         #else
496*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x03, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 7: 1920x1080i_50Hz
497*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x03, 0x03, 0x14, 0x0F, 0x2E978D},  // 8: 1920x1080i_60Hz
498*53ee8cc1Swenshuai.xi         #endif
499*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x03, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 9: 1920x1080p_24Hz
500*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x03, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 10: 1920x1080p_25Hz
501*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x03, 0x03, 0x14, 0x0F, 0x2E8BA2},  // 11: 1920x1080p_30Hz
502*53ee8cc1Swenshuai.xi // 148Mhz
503*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x2E8BA2},  // 12: 1920x1080p_50Hz
504*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x2E8BA2},  // 13: 1920x1080p_60Hz
505*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x2E8BA2},  // 14: 1920x2205p_24Hz
506*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x2E8BA2},  // 15: 1280x1470p_50Hz
507*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x2E8BA2},  // 16: 1280x1470p_60Hz
508*53ee8cc1Swenshuai.xi         // the following is 4k2k timing list, if not support, default is 3840x2160p@30
509*53ee8cc1Swenshuai.xi 
510*53ee8cc1Swenshuai.xi // 300Mhz
511*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x1745D1},  // 17:93: 3840x2160p_24Hz
512*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x1745D1},  // 18:94: 3840x2160p_25Hz
513*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x1745D1},  // 19:95: 3840x2160p_30Hz
514*53ee8cc1Swenshuai.xi // 600Mhz ==> Not support !!!
515*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x1745D1},  // 20:96: 3840x2160p_50Hz
516*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x1745D1},  // 21:97: 3840x2160p_60Hz
517*53ee8cc1Swenshuai.xi // 300Mhz
518*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x1745D1},  // 22:98: 4096x2160p_24Hz
519*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x1745D1},  // 23:99: 4096x2160p_25Hz
520*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x1745D1},  // 24:100: 4096x2160p_30Hz
521*53ee8cc1Swenshuai.xi // 600Mhz ==> Not support !!!
522*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x1745D1},  // 25:101: 4096x2160p_50Hz
523*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x1745D1},  // 26:102: 4096x2160p_60Hz
524*53ee8cc1Swenshuai.xi 
525*53ee8cc1Swenshuai.xi // 150MHz
526*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x04, 0x2AAAAA},  // 27: 1600x1200p_60Hz
527*53ee8cc1Swenshuai.xi // 106.5MHz
528*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x40EB71},  // 28: 1440x900p_60Hz
529*53ee8cc1Swenshuai.xi // 108MHz
530*53ee8cc1Swenshuai.xi         {0x00, 0x00, 0x03, 0x0C, 0x38, 0x08, 0x400000},  // 29: 1280x1024p_60Hz
531*53ee8cc1Swenshuai.xi // 65MHz
532*53ee8cc1Swenshuai.xi         {0x01, 0x01, 0x03, 0x03, 0x14, 0x0F, 0x352B52},  // 30: 1024x768p_60Hz
533*53ee8cc1Swenshuai.xi     },
534*53ee8cc1Swenshuai.xi };
535*53ee8cc1Swenshuai.xi 
536*53ee8cc1Swenshuai.xi #if( defined(HDMITX_SUPPORT_444TO420) && (HDMITX_SUPPORT_444TO420 == 1) )
537*53ee8cc1Swenshuai.xi //For Maxim 420 and Interlace Only HDMITXPHY_0x15[14:12]
538*53ee8cc1Swenshuai.xi MS_U8 HDMITxVideo_OTMDS_ODATA_Ratio[HDMITX_COLOR_DEPTH_TYPE_NUM][E_HDMITX_RES_MAX] =
539*53ee8cc1Swenshuai.xi {
540*53ee8cc1Swenshuai.xi     //color depth = 8bit
541*53ee8cc1Swenshuai.xi     {
542*53ee8cc1Swenshuai.xi         0x03,  // 0: 640x480p
543*53ee8cc1Swenshuai.xi         0x03,  // 1: 720x480i
544*53ee8cc1Swenshuai.xi         0x03,  // 2: 720x576i
545*53ee8cc1Swenshuai.xi         0x03,  // 3: 720x480p
546*53ee8cc1Swenshuai.xi         0x03,  // 4: 720x576p
547*53ee8cc1Swenshuai.xi // 74Mhz
548*53ee8cc1Swenshuai.xi         0x02,  // 5: 1280x720p_50Hz
549*53ee8cc1Swenshuai.xi         0x02,  // 6: 1280x720p_60Hz
550*53ee8cc1Swenshuai.xi         0x02,  // 7: 1920x1080i_50Hz
551*53ee8cc1Swenshuai.xi         0x02,  // 8: 1920x1080i_60Hz
552*53ee8cc1Swenshuai.xi         0x02,  // 9: 1920x1080p_24Hz
553*53ee8cc1Swenshuai.xi         0x02,  // 10: 1920x1080p_25Hz
554*53ee8cc1Swenshuai.xi         0x02,  // 11: 1920x1080p_30Hz
555*53ee8cc1Swenshuai.xi // 148Mhz
556*53ee8cc1Swenshuai.xi         0x02,  // 12: 1920x1080p_50Hz
557*53ee8cc1Swenshuai.xi         0x02,  // 13: 1920x1080p_60Hz
558*53ee8cc1Swenshuai.xi         0x02,  // 14: 1920x2205p_24Hz
559*53ee8cc1Swenshuai.xi         0x02,  // 15: 1280x1470p_50Hz
560*53ee8cc1Swenshuai.xi         0x02,  // 16: 1280x1470p_60Hz
561*53ee8cc1Swenshuai.xi         // the following is 4k2k timing list, if not support, default is 3840x2160p@30
562*53ee8cc1Swenshuai.xi // 300Mhz
563*53ee8cc1Swenshuai.xi         0x02,  // 17:93: 3840x2160p_24Hz
564*53ee8cc1Swenshuai.xi         0x02,  // 18:94: 3840x2160p_25Hz
565*53ee8cc1Swenshuai.xi         0x02,  // 19:95: 3840x2160p_30Hz
566*53ee8cc1Swenshuai.xi // 600Mhz
567*53ee8cc1Swenshuai.xi         0x01,  // 20:96: 3840x2160p_50Hz
568*53ee8cc1Swenshuai.xi         0x01,  // 21:97: 3840x2160p_60Hz
569*53ee8cc1Swenshuai.xi // 300Mhz
570*53ee8cc1Swenshuai.xi         0x02,  // 22:98: 4096x2160p_24Hz
571*53ee8cc1Swenshuai.xi         0x02,  // 23:99: 4096x2160p_25Hz
572*53ee8cc1Swenshuai.xi         0x02,  // 24:100: 4096x2160p_30Hz
573*53ee8cc1Swenshuai.xi // 600Mhz
574*53ee8cc1Swenshuai.xi         0x01,  // 25:101: 4096x2160p_50Hz
575*53ee8cc1Swenshuai.xi         0x01,  // 26:102: 4096x2160p_60Hz
576*53ee8cc1Swenshuai.xi     },
577*53ee8cc1Swenshuai.xi 
578*53ee8cc1Swenshuai.xi     //color depth  = 10 bit
579*53ee8cc1Swenshuai.xi     {
580*53ee8cc1Swenshuai.xi         0x03,  // 0: 640x480p
581*53ee8cc1Swenshuai.xi         0x03,  // 1: 720x480i
582*53ee8cc1Swenshuai.xi         0x03,  // 2: 720x576i
583*53ee8cc1Swenshuai.xi         0x03,  // 3: 720x480p
584*53ee8cc1Swenshuai.xi         0x03,  // 4: 720x576p
585*53ee8cc1Swenshuai.xi // 74Mhz
586*53ee8cc1Swenshuai.xi         0x02,  // 5: 1280x720p_50Hz
587*53ee8cc1Swenshuai.xi         0x02,  // 6: 1280x720p_60Hz
588*53ee8cc1Swenshuai.xi         0x02,  // 7: 1920x1080i_50Hz
589*53ee8cc1Swenshuai.xi         0x02,  // 8: 1920x1080i_60Hz
590*53ee8cc1Swenshuai.xi         0x02,  // 9: 1920x1080p_24Hz
591*53ee8cc1Swenshuai.xi         0x02,  // 10: 1920x1080p_25Hz
592*53ee8cc1Swenshuai.xi         0x02,  // 11: 1920x1080p_30Hz
593*53ee8cc1Swenshuai.xi // 148Mhz
594*53ee8cc1Swenshuai.xi         0x02,  // 12: 1920x1080p_50Hz
595*53ee8cc1Swenshuai.xi         0x02,  // 13: 1920x1080p_60Hz
596*53ee8cc1Swenshuai.xi         0x02,  // 14: 1920x2205p_24Hz
597*53ee8cc1Swenshuai.xi         0x02,  // 15: 1280x1470p_50Hz
598*53ee8cc1Swenshuai.xi         0x02,  // 16: 1280x1470p_60Hz
599*53ee8cc1Swenshuai.xi         // the following is 4k2k timing list, if not support, default is 3840x2160p@30
600*53ee8cc1Swenshuai.xi // 300Mhz
601*53ee8cc1Swenshuai.xi         0x02,  // 17:93: 3840x2160p_24Hz
602*53ee8cc1Swenshuai.xi         0x02,  // 18:94: 3840x2160p_25Hz
603*53ee8cc1Swenshuai.xi         0x02,  // 19:95: 3840x2160p_30Hz
604*53ee8cc1Swenshuai.xi // 600Mhz ==> not support !!!
605*53ee8cc1Swenshuai.xi         0x00,  // 20:96: 3840x2160p_50Hz
606*53ee8cc1Swenshuai.xi         0x00,  // 21:97: 3840x2160p_60Hz
607*53ee8cc1Swenshuai.xi // 300Mhz
608*53ee8cc1Swenshuai.xi         0x02,  // 22:98: 4096x2160p_24Hz
609*53ee8cc1Swenshuai.xi         0x02,  // 23:99: 4096x2160p_25Hz
610*53ee8cc1Swenshuai.xi         0x02,  // 24:100: 4096x2160p_30Hz
611*53ee8cc1Swenshuai.xi // 600Mhz ==> not support !!!
612*53ee8cc1Swenshuai.xi         0x00,  // 25:101: 4096x2160p_50Hz
613*53ee8cc1Swenshuai.xi         0x00,  // 26:102: 4096x2160p_60Hz
614*53ee8cc1Swenshuai.xi     },
615*53ee8cc1Swenshuai.xi 
616*53ee8cc1Swenshuai.xi     //color depth = 12 bit
617*53ee8cc1Swenshuai.xi     {
618*53ee8cc1Swenshuai.xi         0x03,  // 0: 640x480p
619*53ee8cc1Swenshuai.xi         0x03,  // 1: 720x480i
620*53ee8cc1Swenshuai.xi         0x03,  // 2: 720x576i
621*53ee8cc1Swenshuai.xi         0x03,  // 3: 720x480p
622*53ee8cc1Swenshuai.xi         0x03,  // 4: 720x576p
623*53ee8cc1Swenshuai.xi // 74Mhz
624*53ee8cc1Swenshuai.xi         0x02,  // 5: 1280x720p_50Hz
625*53ee8cc1Swenshuai.xi         0x02,  // 6: 1280x720p_60Hz
626*53ee8cc1Swenshuai.xi         0x02,  // 7: 1920x1080i_50Hz
627*53ee8cc1Swenshuai.xi         0x02,  // 8: 1920x1080i_60Hz
628*53ee8cc1Swenshuai.xi         0x02,  // 9: 1920x1080p_24Hz
629*53ee8cc1Swenshuai.xi         0x02,  // 10: 1920x1080p_25Hz
630*53ee8cc1Swenshuai.xi         0x02,  // 11: 1920x1080p_30Hz
631*53ee8cc1Swenshuai.xi // 148Mhz
632*53ee8cc1Swenshuai.xi         0x02,  // 12: 1920x1080p_50Hz
633*53ee8cc1Swenshuai.xi         0x02,  // 13: 1920x1080p_60Hz
634*53ee8cc1Swenshuai.xi         0x02,  // 14: 1920x2205p_24Hz
635*53ee8cc1Swenshuai.xi         0x02,  // 15: 1280x1470p_50Hz
636*53ee8cc1Swenshuai.xi         0x02,  // 16: 1280x1470p_60Hz
637*53ee8cc1Swenshuai.xi         // the following is 4k2k timing list, if not support, default is 3840x2160p@30
638*53ee8cc1Swenshuai.xi // 300Mhz
639*53ee8cc1Swenshuai.xi         0x02,  // 17:93: 3840x2160p_24Hz
640*53ee8cc1Swenshuai.xi         0x02,  // 18:94: 3840x2160p_25Hz
641*53ee8cc1Swenshuai.xi         0x02,  // 19:95: 3840x2160p_30Hz
642*53ee8cc1Swenshuai.xi // 600Mhz ==> not support !!!
643*53ee8cc1Swenshuai.xi         0x00,  // 20:96: 3840x2160p_50Hz
644*53ee8cc1Swenshuai.xi         0x00,  // 21:97: 3840x2160p_60Hz
645*53ee8cc1Swenshuai.xi // 300Mhz
646*53ee8cc1Swenshuai.xi         0x02,  // 22:98: 4096x2160p_24Hz
647*53ee8cc1Swenshuai.xi         0x02,  // 23:99: 4096x2160p_25Hz
648*53ee8cc1Swenshuai.xi         0x02,  // 24:100: 4096x2160p_30Hz
649*53ee8cc1Swenshuai.xi // 600Mhz ==> not support !!!
650*53ee8cc1Swenshuai.xi         0x00,  // 25:101: 4096x2160p_50Hz
651*53ee8cc1Swenshuai.xi         0x00,  // 26:102: 4096x2160p_60Hz
652*53ee8cc1Swenshuai.xi     },
653*53ee8cc1Swenshuai.xi 
654*53ee8cc1Swenshuai.xi     //color depth = 16 bit
655*53ee8cc1Swenshuai.xi     {
656*53ee8cc1Swenshuai.xi         0x02,  // 0: 640x480p
657*53ee8cc1Swenshuai.xi         0x02,  // 1: 720x480i
658*53ee8cc1Swenshuai.xi         0x02,  // 2: 720x576i
659*53ee8cc1Swenshuai.xi         0x02,  // 3: 720x480p
660*53ee8cc1Swenshuai.xi         0x02,  // 4: 720x576p
661*53ee8cc1Swenshuai.xi // 74Mhz
662*53ee8cc1Swenshuai.xi         0x01,  // 5: 1280x720p_50Hz
663*53ee8cc1Swenshuai.xi         0x01,  // 6: 1280x720p_60Hz
664*53ee8cc1Swenshuai.xi         0x01,  // 7: 1920x1080i_50Hz
665*53ee8cc1Swenshuai.xi         0x01,  // 8: 1920x1080i_60Hz
666*53ee8cc1Swenshuai.xi         0x01,  // 9: 1920x1080p_24Hz
667*53ee8cc1Swenshuai.xi         0x01,  // 10: 1920x1080p_25Hz
668*53ee8cc1Swenshuai.xi         0x01,  // 11: 1920x1080p_30Hz
669*53ee8cc1Swenshuai.xi // 148Mhz
670*53ee8cc1Swenshuai.xi         0x01,  // 12: 1920x1080p_50Hz
671*53ee8cc1Swenshuai.xi         0x01,  // 13: 1920x1080p_60Hz
672*53ee8cc1Swenshuai.xi         0x01,  // 14: 1920x2205p_24Hz
673*53ee8cc1Swenshuai.xi         0x01,  // 15: 1280x1470p_50Hz
674*53ee8cc1Swenshuai.xi         0x01,  // 16: 1280x1470p_60Hz
675*53ee8cc1Swenshuai.xi         // the following is 4k2k timing list, if not support, default is 3840x2160p@30
676*53ee8cc1Swenshuai.xi // 300Mhz
677*53ee8cc1Swenshuai.xi         0x01,  // 17:93: 3840x2160p_24Hz
678*53ee8cc1Swenshuai.xi         0x01,  // 18:94: 3840x2160p_25Hz
679*53ee8cc1Swenshuai.xi         0x01,  // 19:95: 3840x2160p_30Hz
680*53ee8cc1Swenshuai.xi // 600Mhz ==> Not support !!!
681*53ee8cc1Swenshuai.xi         0x00,  // 20:96: 3840x2160p_50Hz
682*53ee8cc1Swenshuai.xi         0x00,  // 21:97: 3840x2160p_60Hz
683*53ee8cc1Swenshuai.xi // 300Mhz
684*53ee8cc1Swenshuai.xi         0x01,  // 22:98: 4096x2160p_24Hz
685*53ee8cc1Swenshuai.xi         0x01,  // 23:99: 4096x2160p_25Hz
686*53ee8cc1Swenshuai.xi         0x01,  // 24:100: 4096x2160p_30Hz
687*53ee8cc1Swenshuai.xi // 600Mhz ==> Not support !!!
688*53ee8cc1Swenshuai.xi         0x00,  // 25:101: 4096x2160p_50Hz
689*53ee8cc1Swenshuai.xi         0x00,  // 26:102: 4096x2160p_60Hz
690*53ee8cc1Swenshuai.xi     },
691*53ee8cc1Swenshuai.xi };
692*53ee8cc1Swenshuai.xi #endif
693*53ee8cc1Swenshuai.xi 
694*53ee8cc1Swenshuai.xi //*********************//
695*53ee8cc1Swenshuai.xi //             Audio   //
696*53ee8cc1Swenshuai.xi //*********************//
697*53ee8cc1Swenshuai.xi 
698*53ee8cc1Swenshuai.xi MSTHDMITX_REG_TYPE HDMITxAudioOnTbl[] =
699*53ee8cc1Swenshuai.xi {
700*53ee8cc1Swenshuai.xi     {HDMITX_AUDIO_REG_BASE, REG_AE_CONFIG_05, 0x1087, 0x1086}, //[12]: CH status swap[7:0], [7]: enable audio FIFO, [2]:enable CTS Gen, [1]: automatically block start, [0]: audio FIFO not flush
701*53ee8cc1Swenshuai.xi };
702*53ee8cc1Swenshuai.xi 
703*53ee8cc1Swenshuai.xi MSTHDMITX_REG_TYPE HDMITxAudioOffTbl[] =
704*53ee8cc1Swenshuai.xi {
705*53ee8cc1Swenshuai.xi     {HDMITX_AUDIO_REG_BASE, REG_AE_CONFIG_05, 0x1087, 0x1003}, //[12]: CH status swap[7:0], [7]: disable audio FIFO, [2]:disable CTS Gen, [1]: automatically block start, [0]: audio FIFO flush
706*53ee8cc1Swenshuai.xi };
707*53ee8cc1Swenshuai.xi 
708*53ee8cc1Swenshuai.xi MSTHDMITX_REG_TYPE HDMITxAudioInitTbl[] =
709*53ee8cc1Swenshuai.xi {
710*53ee8cc1Swenshuai.xi     {HDMITX_AUDIO_REG_BASE, REG_AE_CONFIG_05, 0x1087, 0x1003}, //[12]: CH status swap[7:0], [7]: disable audio FIFO, [2]:disable CTS Gen, [1]: automatically block start, [0]: audio FIFO flush
711*53ee8cc1Swenshuai.xi };
712*53ee8cc1Swenshuai.xi 
713*53ee8cc1Swenshuai.xi MDrv_HDMITx_AUDIO_FREQ_TYPE TxAudioFreqTbl[E_HDMITX_AUDIO_FREQ_MAX_NUM] =
714*53ee8cc1Swenshuai.xi {
715*53ee8cc1Swenshuai.xi     {0x02, 0x001800},  // No signal, set to 48 KHz
716*53ee8cc1Swenshuai.xi     {0x03, 0x001000},  // 0 ~(32)~ 38 KHz,  4096
717*53ee8cc1Swenshuai.xi     {0x00, 0x001880},  // 38 ~(44.1)~ 46 KHz, 6272
718*53ee8cc1Swenshuai.xi     {0x02, 0x001800},  // 46 ~(48)~ 60 KHz, 6144
719*53ee8cc1Swenshuai.xi     {0x08, 0x003100}, //  60 ~(88.2)~ 92 KHz, 12544
720*53ee8cc1Swenshuai.xi     {0x0a, 0x003000}, //  92 ~(96)~ 140 KHz, 12288
721*53ee8cc1Swenshuai.xi     {0x0c, 0x006200}, //  140 ~(176.4)~ 180 KHz, 25088
722*53ee8cc1Swenshuai.xi     {0x0e, 0x006000},  //  180 ~(192)~ ~~ KHz, 24576
723*53ee8cc1Swenshuai.xi };
724*53ee8cc1Swenshuai.xi 
725*53ee8cc1Swenshuai.xi //*********************//
726*53ee8cc1Swenshuai.xi //             Packet  //
727*53ee8cc1Swenshuai.xi //*********************//
728*53ee8cc1Swenshuai.xi 
729*53ee8cc1Swenshuai.xi MS_U8 HDMITX_AviCmrTbl[E_HDMITX_RES_MAX] =
730*53ee8cc1Swenshuai.xi {
731*53ee8cc1Swenshuai.xi     0x48, 0x48, 0x48, 0x48, 0x48, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,            // SDTV C=01(601),M=00(no data) ,R=1000(same)
732*53ee8cc1Swenshuai.xi     0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0x48,
733*53ee8cc1Swenshuai.xi     0xA8, 0x48, 0x48,
734*53ee8cc1Swenshuai.xi };
735*53ee8cc1Swenshuai.xi 
736*53ee8cc1Swenshuai.xi MS_U8 HDMITX_AviVicTbl[E_HDMITX_RES_MAX] =
737*53ee8cc1Swenshuai.xi {
738*53ee8cc1Swenshuai.xi     1,  6,  21, 2,  17, 19, 4,  20, 5,  32, 33,  34,  31,  16,           // SDTV 480i60,576i50,480p60,576p50,720p50,720p60,1080i50,1080i60,1080p24,1080p25,1080p30, 1080p50, 1080p60
739*53ee8cc1Swenshuai.xi     32, 19, 4,  0,  0,  0,  96, 97, 0,  99, 100, 101, 102,  0,
740*53ee8cc1Swenshuai.xi     0,  0,  0,
741*53ee8cc1Swenshuai.xi };
742*53ee8cc1Swenshuai.xi 
743*53ee8cc1Swenshuai.xi MS_U8 HDMITX_VendorName[8] =
744*53ee8cc1Swenshuai.xi {
745*53ee8cc1Swenshuai.xi     "MStar   "
746*53ee8cc1Swenshuai.xi };
747*53ee8cc1Swenshuai.xi 
748*53ee8cc1Swenshuai.xi MS_U8 HDMITX_ProductName[16] =
749*53ee8cc1Swenshuai.xi {
750*53ee8cc1Swenshuai.xi     "HDMI Tx Demo",
751*53ee8cc1Swenshuai.xi };
752*53ee8cc1Swenshuai.xi 
753*53ee8cc1Swenshuai.xi MS_U8 _gHPDGpioPin = 0;
754*53ee8cc1Swenshuai.xi 
755*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
756*53ee8cc1Swenshuai.xi //  Debug Functions
757*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
758*53ee8cc1Swenshuai.xi 
759*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
760*53ee8cc1Swenshuai.xi #define DBG_HDMITX(_f)                  (_f)
761*53ee8cc1Swenshuai.xi #else
762*53ee8cc1Swenshuai.xi #define DBG_HDMITX(_f)
763*53ee8cc1Swenshuai.xi #endif
764*53ee8cc1Swenshuai.xi 
765*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
766*53ee8cc1Swenshuai.xi //  Local Functions
767*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
768*53ee8cc1Swenshuai.xi 
769*53ee8cc1Swenshuai.xi 
770*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
771*53ee8cc1Swenshuai.xi //  Global Functions
772*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
773*53ee8cc1Swenshuai.xi /*********************************************************************/
774*53ee8cc1Swenshuai.xi /*                                                                                                                     */
775*53ee8cc1Swenshuai.xi /*                                         HDCP22 Relative                                                    */
776*53ee8cc1Swenshuai.xi /*                                                                                                                     */
777*53ee8cc1Swenshuai.xi /*********************************************************************/
MHal_HDMITx_HDCP2TxInit(MS_BOOL bEnable)778*53ee8cc1Swenshuai.xi void MHal_HDMITx_HDCP2TxInit(MS_BOOL bEnable)
779*53ee8cc1Swenshuai.xi {
780*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_HDCP2TX_BASE, 0x0000, 0x11, bEnable ? 0x11 : 0x00); // bit 0: enable hdcp22; bit 4: enable EESS
781*53ee8cc1Swenshuai.xi     if (bEnable)
782*53ee8cc1Swenshuai.xi     {
783*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_HDCP2TX_BASE, 0x0000, 0x02, 0x02); //reset hdcp22 FSM
784*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_HDCP2TX_BASE, 0x0000, 0x02, 0x00);
785*53ee8cc1Swenshuai.xi     }
786*53ee8cc1Swenshuai.xi }
787*53ee8cc1Swenshuai.xi 
MHal_HDMITx_HDCP2TxEnableEncryptEnable(MS_BOOL bEnable)788*53ee8cc1Swenshuai.xi void MHal_HDMITx_HDCP2TxEnableEncryptEnable(MS_BOOL bEnable)
789*53ee8cc1Swenshuai.xi {
790*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_HDCP2TX_BASE, 0x0000, 0x04, bEnable ? 0x04 : 0x00); //bit 2: authentication pass
791*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_HDCP2TX_BASE, 0x0000, 0x08, bEnable ? 0x08 : 0x00); //bit 3: enable hdcp22 to issue encryption enable signal
792*53ee8cc1Swenshuai.xi }
793*53ee8cc1Swenshuai.xi 
MHal_HDMITx_HDCP2TxFillCipherKey(MS_U8 * pu8Riv,MS_U8 * pu8KsXORLC128)794*53ee8cc1Swenshuai.xi void MHal_HDMITx_HDCP2TxFillCipherKey(MS_U8 *pu8Riv, MS_U8 *pu8KsXORLC128)
795*53ee8cc1Swenshuai.xi {
796*53ee8cc1Swenshuai.xi #define DEF_HDCP2CIPHER_DBG 0
797*53ee8cc1Swenshuai.xi #define SIZE_OF_KSXORLC128  16
798*53ee8cc1Swenshuai.xi #define SIZE_OF_RIV         8
799*53ee8cc1Swenshuai.xi 
800*53ee8cc1Swenshuai.xi     MS_U8 cnt = 0;
801*53ee8cc1Swenshuai.xi 
802*53ee8cc1Swenshuai.xi #if (DEF_HDCP2CIPHER_DBG == 1)
803*53ee8cc1Swenshuai.xi     printf("Ks^LC128:\r\n");
804*53ee8cc1Swenshuai.xi     for ( cnt = 0; cnt < SIZE_OF_KSXORLC128; cnt++ )
805*53ee8cc1Swenshuai.xi     {
806*53ee8cc1Swenshuai.xi         printf("0x%02X ", *(pu8KsXORLC128 + cnt));
807*53ee8cc1Swenshuai.xi     }
808*53ee8cc1Swenshuai.xi     printf("\r\n");
809*53ee8cc1Swenshuai.xi 
810*53ee8cc1Swenshuai.xi     printf("Riv:\r\n");
811*53ee8cc1Swenshuai.xi     for ( cnt = 0; cnt < SIZE_OF_RIV; cnt++ )
812*53ee8cc1Swenshuai.xi     {
813*53ee8cc1Swenshuai.xi         printf("0x%02X ", *(pu8Riv + cnt));
814*53ee8cc1Swenshuai.xi     }
815*53ee8cc1Swenshuai.xi     printf("\r\n");
816*53ee8cc1Swenshuai.xi #endif
817*53ee8cc1Swenshuai.xi 
818*53ee8cc1Swenshuai.xi #undef DEF_HDCP2CIPHER_DBG
819*53ee8cc1Swenshuai.xi     //MHal_HDMITx_Mask_Write(0x172F00, 0x01, 0x0020, 0x0020); //reverse order of cihper key
820*53ee8cc1Swenshuai.xi     //MHal_HDMITx_Mask_Write(0x172B00, 0x01, 0x8000, 0x0000); //disable hdcp 1.4 module
821*53ee8cc1Swenshuai.xi 
822*53ee8cc1Swenshuai.xi     for ( cnt = 0; cnt < (SIZE_OF_KSXORLC128>>1); cnt++)
823*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_SECUTZPC_BASE, 0x60 + (SIZE_OF_KSXORLC128 >> 1) - 1 - cnt, *(pu8KsXORLC128 + cnt*2 + 1)|(*(pu8KsXORLC128 + cnt*2)<<8));
824*53ee8cc1Swenshuai.xi 
825*53ee8cc1Swenshuai.xi     for ( cnt = 0; cnt < (SIZE_OF_RIV>>1); cnt++)
826*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_SECUTZPC_BASE, 0x68 + (SIZE_OF_RIV >> 1) - 1 - cnt, *(pu8Riv + cnt*2 + 1)|(*(pu8Riv + cnt*2)<<8));
827*53ee8cc1Swenshuai.xi }
828*53ee8cc1Swenshuai.xi 
Mhal_HDMITx_SetSCDCCapability(MS_BOOL bFlag)829*53ee8cc1Swenshuai.xi void Mhal_HDMITx_SetSCDCCapability(MS_BOOL bFlag)
830*53ee8cc1Swenshuai.xi {
831*53ee8cc1Swenshuai.xi     g_bSupportSCDC = bFlag;
832*53ee8cc1Swenshuai.xi }
833*53ee8cc1Swenshuai.xi 
MHal_HDMITx_SetChipVersion(MS_U8 u8ChipVer)834*53ee8cc1Swenshuai.xi void MHal_HDMITx_SetChipVersion(MS_U8 u8ChipVer)
835*53ee8cc1Swenshuai.xi {
836*53ee8cc1Swenshuai.xi     gu8ChipVerNum = u8ChipVer;
837*53ee8cc1Swenshuai.xi }
838*53ee8cc1Swenshuai.xi 
839*53ee8cc1Swenshuai.xi // HPD: GPIO_PM[11] -> external interrupt[11], register 0x000E00[14]
840*53ee8cc1Swenshuai.xi // DVI disconnet: must power down clock termination resistor: TM_REG[0] = 1, TM_REG[16:15] = 00, TM_REG[35:34] = 00.
841*53ee8cc1Swenshuai.xi // Interrupt helper functoins
842*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
843*53ee8cc1Swenshuai.xi /// @brief Disable interrupt
844*53ee8cc1Swenshuai.xi /// @param[in] u32Int interrupter value
845*53ee8cc1Swenshuai.xi /// @return None
846*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_Int_Disable(MS_U32 u32Int)847*53ee8cc1Swenshuai.xi void MHal_HDMITx_Int_Disable(MS_U32 u32Int)
848*53ee8cc1Swenshuai.xi {
849*53ee8cc1Swenshuai.xi     //MS_U16 u16reg_val = 0;
850*53ee8cc1Swenshuai.xi 
851*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_0C, (MS_U16)u32Int, (MS_U16)u32Int);
852*53ee8cc1Swenshuai.xi     // [9]: mask FIQ, [8]: mask IRQ
853*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_STATUS_0D, (MS_U16)(u32Int>>16), (MS_U16)(u32Int>>16) );
854*53ee8cc1Swenshuai.xi 
855*53ee8cc1Swenshuai.xi #if 0 // K1 HPD pin doesn't have interrupt function
856*53ee8cc1Swenshuai.xi     if(_gHPDGpioPin != 0xC4) // HPD != I2S_GPIO4
857*53ee8cc1Swenshuai.xi     {
858*53ee8cc1Swenshuai.xi         u16reg_val = (_gHPDGpioPin > 10) ? (1<<(_gHPDGpioPin+4)) : (1<<_gHPDGpioPin);
859*53ee8cc1Swenshuai.xi         if(u32Int & E_HDMITX_IRQ_12) // HPD IRQ is move to PM_Sleep bank
860*53ee8cc1Swenshuai.xi         {
861*53ee8cc1Swenshuai.xi             MHal_HDMITxPM_Mask_Write(PMBK_PMSLEEP_REG_BASE, 0x00, u16reg_val, u16reg_val); // GPIO_PM mask
862*53ee8cc1Swenshuai.xi         }
863*53ee8cc1Swenshuai.xi     }
864*53ee8cc1Swenshuai.xi #endif
865*53ee8cc1Swenshuai.xi }
866*53ee8cc1Swenshuai.xi 
867*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
868*53ee8cc1Swenshuai.xi /// @brief Enable interrupt
869*53ee8cc1Swenshuai.xi /// @param[in] u32Int interrupter value
870*53ee8cc1Swenshuai.xi /// @return None
871*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_Int_Enable(MS_U32 u32Int)872*53ee8cc1Swenshuai.xi void MHal_HDMITx_Int_Enable(MS_U32 u32Int)
873*53ee8cc1Swenshuai.xi {
874*53ee8cc1Swenshuai.xi     //MS_U16 u16reg_val = 0;
875*53ee8cc1Swenshuai.xi 
876*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_0C, 0xFFFF, ~u32Int);
877*53ee8cc1Swenshuai.xi     // [9]: mask FIQ, [8]: unmask IRQ
878*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_STATUS_0D, 0xFFFF, (~u32Int)>>16 );
879*53ee8cc1Swenshuai.xi 
880*53ee8cc1Swenshuai.xi #if 0 // K1 HPD pin doesn't have interrupt function
881*53ee8cc1Swenshuai.xi     if(_gHPDGpioPin != 0xC4) // HPD != I2S_GPIO4
882*53ee8cc1Swenshuai.xi     {
883*53ee8cc1Swenshuai.xi         u16reg_val = (_gHPDGpioPin > 10) ? (1<<(_gHPDGpioPin+4)) : (1<<_gHPDGpioPin);
884*53ee8cc1Swenshuai.xi         if(u32Int & E_HDMITX_IRQ_12)
885*53ee8cc1Swenshuai.xi         {
886*53ee8cc1Swenshuai.xi             MHal_HDMITxPM_Mask_Write(PMBK_PMSLEEP_REG_BASE, 0x0F, 1<<_gHPDGpioPin, 1<<_gHPDGpioPin); // GPIO_PM output disable
887*53ee8cc1Swenshuai.xi             MHal_HDMITxPM_Mask_Write(PMBK_PMSLEEP_REG_BASE, 0x00, u16reg_val, 0); // GPIO_PM non-mask
888*53ee8cc1Swenshuai.xi         }
889*53ee8cc1Swenshuai.xi     }
890*53ee8cc1Swenshuai.xi #endif
891*53ee8cc1Swenshuai.xi }
892*53ee8cc1Swenshuai.xi 
893*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
894*53ee8cc1Swenshuai.xi /// @brief MHal_HDMITx_Int_Clear
895*53ee8cc1Swenshuai.xi /// @param[in] u32Int interrupter value
896*53ee8cc1Swenshuai.xi /// @return None
897*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_Int_Clear(MS_U32 u32Int)898*53ee8cc1Swenshuai.xi void MHal_HDMITx_Int_Clear(MS_U32 u32Int)
899*53ee8cc1Swenshuai.xi {
900*53ee8cc1Swenshuai.xi     //MS_U16 u16reg_val = 0;
901*53ee8cc1Swenshuai.xi 
902*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_MISC_REG_BASE, REG_MISC_STATUS_0E, u32Int);
903*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_MISC_REG_BASE, REG_MISC_STATUS_0F, (u32Int>>16));
904*53ee8cc1Swenshuai.xi 
905*53ee8cc1Swenshuai.xi #if 0 // K1 HPD pin doesn't have interrupt function
906*53ee8cc1Swenshuai.xi     if(_gHPDGpioPin != 0xC4) // HPD != I2S_GPIO4
907*53ee8cc1Swenshuai.xi     {
908*53ee8cc1Swenshuai.xi         u16reg_val = (_gHPDGpioPin > 10) ? (1<<(_gHPDGpioPin+4)) : (1<<_gHPDGpioPin);
909*53ee8cc1Swenshuai.xi         if(u32Int & E_HDMITX_IRQ_12)
910*53ee8cc1Swenshuai.xi         {
911*53ee8cc1Swenshuai.xi             MHal_HDMITxPM_Mask_Write(PMBK_PMSLEEP_REG_BASE, 0x04, u16reg_val, u16reg_val);
912*53ee8cc1Swenshuai.xi             MHal_HDMITxPM_Mask_Write(PMBK_PMSLEEP_REG_BASE, 0x04, u16reg_val, 0);
913*53ee8cc1Swenshuai.xi         }
914*53ee8cc1Swenshuai.xi     }
915*53ee8cc1Swenshuai.xi #endif
916*53ee8cc1Swenshuai.xi }
917*53ee8cc1Swenshuai.xi 
918*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
919*53ee8cc1Swenshuai.xi /// @brief MHal_HDMITx_Int_Status
920*53ee8cc1Swenshuai.xi /// @param[in] u32Int interrupter value
921*53ee8cc1Swenshuai.xi /// @return None
922*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_Int_Status(void)923*53ee8cc1Swenshuai.xi MS_U32 MHal_HDMITx_Int_Status(void)
924*53ee8cc1Swenshuai.xi {
925*53ee8cc1Swenshuai.xi     //MS_U16 u16reg_val = 0;
926*53ee8cc1Swenshuai.xi     MS_U32 reg_value=0;
927*53ee8cc1Swenshuai.xi 
928*53ee8cc1Swenshuai.xi     reg_value |= MHal_HDMITx_Read(HDMITX_MISC_REG_BASE, REG_MISC_STATUS_0E);
929*53ee8cc1Swenshuai.xi     reg_value |= (MHal_HDMITx_Read(HDMITX_MISC_REG_BASE, REG_MISC_STATUS_0F)<<16);
930*53ee8cc1Swenshuai.xi 
931*53ee8cc1Swenshuai.xi #if 0 // K1 HPD pin doesn't have interrupt function
932*53ee8cc1Swenshuai.xi     if(_gHPDGpioPin != 0xC4) // HPD = I2S_GPIO4
933*53ee8cc1Swenshuai.xi     {
934*53ee8cc1Swenshuai.xi         u16reg_val = (_gHPDGpioPin > 10) ? (1<<(_gHPDGpioPin+4)) : (1<<_gHPDGpioPin);
935*53ee8cc1Swenshuai.xi         reg_value = ((MHal_HDMITxPM_Read(PMBK_PMSLEEP_REG_BASE, 0x0A) & u16reg_val) ? (reg_value|E_HDMITX_IRQ_12):(reg_value&(~E_HDMITX_IRQ_12)));
936*53ee8cc1Swenshuai.xi     }
937*53ee8cc1Swenshuai.xi #endif
938*53ee8cc1Swenshuai.xi     return reg_value;
939*53ee8cc1Swenshuai.xi }
940*53ee8cc1Swenshuai.xi 
941*53ee8cc1Swenshuai.xi 
942*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
943*53ee8cc1Swenshuai.xi /// @brief This routine is to get HDMI receiver DVI clock and HPD status.
944*53ee8cc1Swenshuai.xi /// @return MsHDMITX_RX_STATUS
945*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_GetRXStatus(void)946*53ee8cc1Swenshuai.xi MsHDMITX_RX_STATUS MHal_HDMITx_GetRXStatus(void)
947*53ee8cc1Swenshuai.xi {
948*53ee8cc1Swenshuai.xi     MS_BOOL dviclock_s, hpd_s = FALSE;
949*53ee8cc1Swenshuai.xi     MsHDMITX_RX_STATUS state;
950*53ee8cc1Swenshuai.xi 
951*53ee8cc1Swenshuai.xi     dviclock_s = MHal_HDMITx_Read(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_3F) & BIT0 ? FALSE : TRUE;
952*53ee8cc1Swenshuai.xi 
953*53ee8cc1Swenshuai.xi     hpd_s = mdrv_gpio_get_level(_gHPDGpioPin);
954*53ee8cc1Swenshuai.xi 
955*53ee8cc1Swenshuai.xi     if((dviclock_s == FALSE) && (hpd_s == FALSE))
956*53ee8cc1Swenshuai.xi         state = E_HDMITX_DVIClock_L_HPD_L;
957*53ee8cc1Swenshuai.xi     else if((dviclock_s == FALSE) && (hpd_s == TRUE))
958*53ee8cc1Swenshuai.xi         state = E_HDMITX_DVIClock_L_HPD_H;
959*53ee8cc1Swenshuai.xi     else if((dviclock_s == TRUE) && (hpd_s == FALSE))
960*53ee8cc1Swenshuai.xi         state = E_HDMITX_DVIClock_H_HPD_L;
961*53ee8cc1Swenshuai.xi     else
962*53ee8cc1Swenshuai.xi         state = E_HDMITX_DVIClock_H_HPD_H;
963*53ee8cc1Swenshuai.xi 
964*53ee8cc1Swenshuai.xi     return state;
965*53ee8cc1Swenshuai.xi }
966*53ee8cc1Swenshuai.xi 
967*53ee8cc1Swenshuai.xi 
968*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
969*53ee8cc1Swenshuai.xi /// @brief MHal_HDMITX_SetHDCPConfig
970*53ee8cc1Swenshuai.xi /// @param[in] u32Int HDCP mode
971*53ee8cc1Swenshuai.xi /// @return None
972*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITX_SetHDCPConfig(MS_U8 HDCP_mode)973*53ee8cc1Swenshuai.xi void MHal_HDMITX_SetHDCPConfig(MS_U8 HDCP_mode)
974*53ee8cc1Swenshuai.xi {
975*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_HDCP_REG_BASE, REG_HDCP_TX_MODE_01, 0x0E00, HDCP_mode << 8);
976*53ee8cc1Swenshuai.xi }
977*53ee8cc1Swenshuai.xi 
978*53ee8cc1Swenshuai.xi 
979*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
980*53ee8cc1Swenshuai.xi /// @brief MHal_HDMITX_GetM02Bytes
981*53ee8cc1Swenshuai.xi /// @param[in] u16Int index
982*53ee8cc1Swenshuai.xi /// @return M0 2 bytes
983*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITX_GetM02Bytes(MS_U16 idx)984*53ee8cc1Swenshuai.xi MS_U16 MHal_HDMITX_GetM02Bytes(MS_U16 idx)
985*53ee8cc1Swenshuai.xi {
986*53ee8cc1Swenshuai.xi     return (MHal_HDMITx_Read(HDMITX_HDCP_REG_BASE, REG_HDCP_TX_MI_0C + idx));
987*53ee8cc1Swenshuai.xi }
988*53ee8cc1Swenshuai.xi 
989*53ee8cc1Swenshuai.xi 
990*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
991*53ee8cc1Swenshuai.xi /// @brief MHal_HDMITx_InitSeq
992*53ee8cc1Swenshuai.xi /// @param[in] None
993*53ee8cc1Swenshuai.xi /// @return None
994*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_InitSeq(void)995*53ee8cc1Swenshuai.xi void MHal_HDMITx_InitSeq(void)
996*53ee8cc1Swenshuai.xi {
997*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(CLKGEN1_REG_BASE, REG_CKG_HDMITx_CLK_28, 0); // enable clk_hdmi_tx_p
998*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(CLKGEN0_REG_BASE, REG_CKG0_ODCLK_SOURCE, 0x0010, 0x0010); //ODCLK source from HDMITx, MST253B Only
999*53ee8cc1Swenshuai.xi 
1000*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_40, 0x0001, 0x0001);//MST253B Only
1001*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_3D, 0x0400, 0x0400);//MST253B Only
1002*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_01, 0x0001, 0x0001);//MST253B Only
1003*53ee8cc1Swenshuai.xi     //MHal_HDMITx_Mask_Write(0x000E00U, 0x72U, 0x1000, 0x1000);//MST253B Only for HPD
1004*53ee8cc1Swenshuai.xi     //MHal_HDMITx_Mask_Write(0x101E00U, 0x6EU, 0x0004, 0x0004);//MST253B Only for DDC
1005*53ee8cc1Swenshuai.xi 
1006*53ee8cc1Swenshuai.xi     //set at mboot
1007*53ee8cc1Swenshuai.xi     //MHal_HDMITx_Mask_Write(0x101E00, 0x0B, BIT12, BIT12); //enable hdmitx DDC
1008*53ee8cc1Swenshuai.xi 
1009*53ee8cc1Swenshuai.xi     //MAC setting
1010*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1C, 0x0000);
1011*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1D, 0x0000);
1012*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1E, 0xFFFF);
1013*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1F, 0x0000);
1014*53ee8cc1Swenshuai.xi 
1015*53ee8cc1Swenshuai.xi     //sw reset modules
1016*53ee8cc1Swenshuai.xi     if(MHal_HDMITx_Read(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_2E) & 0xE800)
1017*53ee8cc1Swenshuai.xi     {
1018*53ee8cc1Swenshuai.xi         //MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_2E, 0xEA00, 0x0200);
1019*53ee8cc1Swenshuai.xi     }
1020*53ee8cc1Swenshuai.xi     else
1021*53ee8cc1Swenshuai.xi     {
1022*53ee8cc1Swenshuai.xi         //disable power down
1023*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_39, 0xFFFF, 0xFFFF);
1024*53ee8cc1Swenshuai.xi         //[9]:pixel clock [11]:tmds clock [15..13]:enable data out
1025*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_2E, 0xEA00, 0x0200);
1026*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_00, 0x0017, 0x0017);
1027*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_00, 0x0017, 0x0000);
1028*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_0F, 0x001F, 0x001F);
1029*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_0F, 0x001F, 0x0000);
1030*53ee8cc1Swenshuai.xi     }
1031*53ee8cc1Swenshuai.xi 
1032*53ee8cc1Swenshuai.xi     //MHal_HDMITx_Write(HDMITX_REG_BASE, REG_HPLL_LOCK_CNT_53, 0x0300); // HPLL lock counter
1033*53ee8cc1Swenshuai.xi 
1034*53ee8cc1Swenshuai.xi     //enable PHY setting
1035*53ee8cc1Swenshuai.xi     //[0]:enable synth clock; [4]:enable synth clock to a top; [8]:enable tmds clock; [12]: enable atop 40 bit clock
1036*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_10, 0x1101, 0x1101);
1037*53ee8cc1Swenshuai.xi     //[9]:pixel clock [11]:tmds clock [15..13]:enable data out
1038*53ee8cc1Swenshuai.xi     //MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_2E, 0xEA00, 0xEA00);
1039*53ee8cc1Swenshuai.xi 
1040*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_3F, 0x0010, 0x0010); //reg_atop_nodie_en_disc
1041*53ee8cc1Swenshuai.xi 
1042*53ee8cc1Swenshuai.xi     //disable power down
1043*53ee8cc1Swenshuai.xi     //MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_39, 0xFFFF, 0xF000);
1044*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_3A, 0x0070, 0x0000);
1045*53ee8cc1Swenshuai.xi 
1046*53ee8cc1Swenshuai.xi     //rterm set by Mboot according to data of EFUSE, rterm 50 Ohm
1047*53ee8cc1Swenshuai.xi     //MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_38, 0x01F0, 0x0000);
1048*53ee8cc1Swenshuai.xi 
1049*53ee8cc1Swenshuai.xi     //txpll input div 1
1050*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_3C, 0x03F3, 0x0051);
1051*53ee8cc1Swenshuai.xi 
1052*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_3D, 0x030F, 0x0003); //REG_TXPLL_SEL_CLKIN, REG_TXPLL_ICP_ICTRL
1053*53ee8cc1Swenshuai.xi     //MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_34, 0x003F, 0x0003); //REG_ICTRL_PREDRV_MAIN_CLK
1054*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_34, 0x003F, 0x0000); //REG_ICTRL_PREDRV_MAIN_CLK
1055*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_30, 0x003F, 0x0010); //REG_ICTRL_DRV_MAIN_CLK
1056*53ee8cc1Swenshuai.xi 
1057*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_32, 0x3F3F, 0x0000);
1058*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_36, 0x3F3F, 0x0000);
1059*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_37, 0x3F3F, 0x0000);
1060*53ee8cc1Swenshuai.xi 
1061*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_11, BIT0, 0x0000); //tmds clock div 2;
1062*53ee8cc1Swenshuai.xi 
1063*53ee8cc1Swenshuai.xi     //lane fifo setting
1064*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_16, 0x0007, 0x0004);
1065*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_17, 0x0007, 0x0005);
1066*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_18, 0x0007, 0x0006);
1067*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_19, 0x0007, 0x0007);
1068*53ee8cc1Swenshuai.xi 
1069*53ee8cc1Swenshuai.xi     //timing field regen enable (due to scaler can't guarantee field signal and even/odd frame is asynchronize)
1070*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_00, 0x0010, 0x0010);
1071*53ee8cc1Swenshuai.xi 
1072*53ee8cc1Swenshuai.xi     //for U02: QD980 CTS compatibility issue
1073*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_ACT_HDMI_PKTS_CMD_01, 0x8000, 0x8000);
1074*53ee8cc1Swenshuai.xi 
1075*53ee8cc1Swenshuai.xi }
1076*53ee8cc1Swenshuai.xi 
1077*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1078*53ee8cc1Swenshuai.xi /// @brief This routine is the initialization for Video module.
1079*53ee8cc1Swenshuai.xi /// @return None
1080*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_VideoInit(void)1081*53ee8cc1Swenshuai.xi void MHal_HDMITx_VideoInit(void)
1082*53ee8cc1Swenshuai.xi {
1083*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_01, BIT4, BIT4); //enable video engine fifo r/w pointer
1084*53ee8cc1Swenshuai.xi     //MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_12, 0x000F, BIT3); // [3]: manual mode of pixel-repetition enable
1085*53ee8cc1Swenshuai.xi }
1086*53ee8cc1Swenshuai.xi 
1087*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1088*53ee8cc1Swenshuai.xi /// @brief This routine is the initialization for Audio module.
1089*53ee8cc1Swenshuai.xi /// @return None
1090*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_AudioInit(void)1091*53ee8cc1Swenshuai.xi void MHal_HDMITx_AudioInit(void)
1092*53ee8cc1Swenshuai.xi {
1093*53ee8cc1Swenshuai.xi     int num;
1094*53ee8cc1Swenshuai.xi 
1095*53ee8cc1Swenshuai.xi     num = sizeof(HDMITxAudioInitTbl) / sizeof(MSTHDMITX_REG_TYPE);
1096*53ee8cc1Swenshuai.xi     MHal_HDMITx_RegsTbl_Write(HDMITxAudioInitTbl, num);
1097*53ee8cc1Swenshuai.xi }
1098*53ee8cc1Swenshuai.xi 
1099*53ee8cc1Swenshuai.xi 
1100*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1101*53ee8cc1Swenshuai.xi /// @brief This routine turn on/off HDMI PLL
1102*53ee8cc1Swenshuai.xi /// @return None
1103*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_PLLOnOff(MS_BOOL bflag)1104*53ee8cc1Swenshuai.xi void MHal_HDMITx_PLLOnOff(MS_BOOL bflag)
1105*53ee8cc1Swenshuai.xi {
1106*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_3A, 0x0070, bflag ? 0x0000 : 0x0010);
1107*53ee8cc1Swenshuai.xi }
1108*53ee8cc1Swenshuai.xi 
1109*53ee8cc1Swenshuai.xi 
MHal_HDMITx_PKT_User_Define_Clear(void)1110*53ee8cc1Swenshuai.xi void MHal_HDMITx_PKT_User_Define_Clear(void)
1111*53ee8cc1Swenshuai.xi {
1112*53ee8cc1Swenshuai.xi     MS_U8 i = 0;
1113*53ee8cc1Swenshuai.xi 
1114*53ee8cc1Swenshuai.xi     for ( i = 0; i < GENERAL_PKT_NUM; i++ )
1115*53ee8cc1Swenshuai.xi     {
1116*53ee8cc1Swenshuai.xi         gbGeneralPktList[i].EnableUserDef = FALSE;
1117*53ee8cc1Swenshuai.xi         gbGeneralPktList[i].FrmCntNum = 0x00;
1118*53ee8cc1Swenshuai.xi         gbGeneralPktList[i].enPktCtrl = E_HDMITX_STOP_PACKET;
1119*53ee8cc1Swenshuai.xi         memset(&gbGeneralPktList[i].PktPara, 0x00, sizeof(gbGeneralPktList[i].PktPara));
1120*53ee8cc1Swenshuai.xi     }
1121*53ee8cc1Swenshuai.xi 
1122*53ee8cc1Swenshuai.xi     for ( i = 0; i < INFOFRM_PKT_NUM; i++ )
1123*53ee8cc1Swenshuai.xi     {
1124*53ee8cc1Swenshuai.xi         gbInfoFrmPktList[i].EnableUserDef = FALSE;
1125*53ee8cc1Swenshuai.xi         gbInfoFrmPktList[i].FrmCntNum = 0x00;
1126*53ee8cc1Swenshuai.xi         gbInfoFrmPktList[i].enPktCtrl = E_HDMITX_STOP_PACKET;
1127*53ee8cc1Swenshuai.xi         memset(&gbInfoFrmPktList[i].PktPara, 0x00, sizeof(gbInfoFrmPktList[i].PktPara));
1128*53ee8cc1Swenshuai.xi     }
1129*53ee8cc1Swenshuai.xi }
1130*53ee8cc1Swenshuai.xi 
MHal_HDMITx_PKT_User_Define(MsHDMITX_PACKET_TYPE packet_type,MS_BOOL def_flag,MsHDMITX_PACKET_PROCESS def_process,MS_U8 def_fcnt)1131*53ee8cc1Swenshuai.xi void MHal_HDMITx_PKT_User_Define(MsHDMITX_PACKET_TYPE packet_type, MS_BOOL def_flag,
1132*53ee8cc1Swenshuai.xi         MsHDMITX_PACKET_PROCESS def_process, MS_U8 def_fcnt)
1133*53ee8cc1Swenshuai.xi {
1134*53ee8cc1Swenshuai.xi     if (packet_type & 0x80) //infoframe packet type
1135*53ee8cc1Swenshuai.xi 	{
1136*53ee8cc1Swenshuai.xi 		gbInfoFrmPktList[packet_type & (~0x80)].EnableUserDef = def_flag;
1137*53ee8cc1Swenshuai.xi 		gbInfoFrmPktList[packet_type & (~0x80)].FrmCntNum = def_fcnt;
1138*53ee8cc1Swenshuai.xi 		gbInfoFrmPktList[packet_type & (~0x80)].enPktCtrl = def_process;
1139*53ee8cc1Swenshuai.xi 	}
1140*53ee8cc1Swenshuai.xi 	else
1141*53ee8cc1Swenshuai.xi 	{
1142*53ee8cc1Swenshuai.xi 		gbGeneralPktList[packet_type].EnableUserDef = def_flag;
1143*53ee8cc1Swenshuai.xi 		gbGeneralPktList[packet_type].FrmCntNum = def_fcnt;
1144*53ee8cc1Swenshuai.xi 		gbGeneralPktList[packet_type].enPktCtrl = def_process;
1145*53ee8cc1Swenshuai.xi 	}
1146*53ee8cc1Swenshuai.xi }
1147*53ee8cc1Swenshuai.xi 
MHal_HDMITx_PKT_Content_Define(MsHDMITX_PACKET_TYPE packet_type,MS_U8 * data,MS_U8 length)1148*53ee8cc1Swenshuai.xi MS_BOOL MHal_HDMITx_PKT_Content_Define(MsHDMITX_PACKET_TYPE packet_type, MS_U8* data, MS_U8 length)
1149*53ee8cc1Swenshuai.xi {
1150*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
1151*53ee8cc1Swenshuai.xi     MS_U8 i, j, *ptr;
1152*53ee8cc1Swenshuai.xi 	ptr = data;
1153*53ee8cc1Swenshuai.xi 
1154*53ee8cc1Swenshuai.xi     switch(packet_type)
1155*53ee8cc1Swenshuai.xi 	{
1156*53ee8cc1Swenshuai.xi 	    case E_HDMITX_VS_INFOFRAME:
1157*53ee8cc1Swenshuai.xi             for (i=0; i < length; i++)
1158*53ee8cc1Swenshuai.xi             {
1159*53ee8cc1Swenshuai.xi                 j = i>>1;
1160*53ee8cc1Swenshuai.xi 
1161*53ee8cc1Swenshuai.xi                 if ((REG_PKT_VS_1_27+j > REG_PKT_VS_14_34) || ((REG_PKT_VS_1_27+j == REG_PKT_VS_14_34) && (i % 2 == 1)))
1162*53ee8cc1Swenshuai.xi                 {
1163*53ee8cc1Swenshuai.xi                     //Packet over size, last VS packet PB register is REG_PKT_VS_14_34[7:0]
1164*53ee8cc1Swenshuai.xi                     DBG_HDMITX(printf("VS packet over size, length = %d \n", length));
1165*53ee8cc1Swenshuai.xi                     break;
1166*53ee8cc1Swenshuai.xi                 }
1167*53ee8cc1Swenshuai.xi 
1168*53ee8cc1Swenshuai.xi                 if((i%2)==0)
1169*53ee8cc1Swenshuai.xi 			        MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_VS_1_27+j, 0x00FF, *(ptr+i));
1170*53ee8cc1Swenshuai.xi 				else
1171*53ee8cc1Swenshuai.xi 			        MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_VS_1_27+j, 0xFF00, (*(ptr+i))<<8);
1172*53ee8cc1Swenshuai.xi             }
1173*53ee8cc1Swenshuai.xi 		break;
1174*53ee8cc1Swenshuai.xi 	    case E_HDMITX_SPD_INFOFRAME:
1175*53ee8cc1Swenshuai.xi             for(i=0;i<length;i++)
1176*53ee8cc1Swenshuai.xi             {
1177*53ee8cc1Swenshuai.xi                 j = i>>1;
1178*53ee8cc1Swenshuai.xi 
1179*53ee8cc1Swenshuai.xi                 if((REG_PKT_SPD_1_15+j > REG_PKT_SPD_13_21) || ((REG_PKT_SPD_1_15+j == REG_PKT_SPD_13_21) && (i % 2 == 1)))
1180*53ee8cc1Swenshuai.xi                 {
1181*53ee8cc1Swenshuai.xi                     //Packet over size, last SPD packet PB register is REG_PKT_SPD_13_21[7:0]
1182*53ee8cc1Swenshuai.xi                     DBG_HDMITX(printf("VS packet over size, length = %d \n", length));
1183*53ee8cc1Swenshuai.xi                     break;
1184*53ee8cc1Swenshuai.xi                 }
1185*53ee8cc1Swenshuai.xi 
1186*53ee8cc1Swenshuai.xi                 if((i%2)==0)
1187*53ee8cc1Swenshuai.xi 			        MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_SPD_1_15+j, 0x00FF, *(ptr+i));
1188*53ee8cc1Swenshuai.xi 				else
1189*53ee8cc1Swenshuai.xi 			        MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_SPD_1_15+j, 0xFF00, (*(ptr+i))<<8);
1190*53ee8cc1Swenshuai.xi             }
1191*53ee8cc1Swenshuai.xi 		break;
1192*53ee8cc1Swenshuai.xi 
1193*53ee8cc1Swenshuai.xi         case E_HDMITX_AVI_INFOFRAME:
1194*53ee8cc1Swenshuai.xi             for ( i = 0; i < length; i++ )
1195*53ee8cc1Swenshuai.xi             {
1196*53ee8cc1Swenshuai.xi                 j = i >> 1;
1197*53ee8cc1Swenshuai.xi 
1198*53ee8cc1Swenshuai.xi                 if (((REG_PKT_AVI_1_09 + j) > REG_PKT_AVI_7_0F) || (((REG_PKT_AVI_1_09 + j) == REG_PKT_AVI_7_0F) && (i % 2 == 1)))
1199*53ee8cc1Swenshuai.xi                 {
1200*53ee8cc1Swenshuai.xi                     DBG_HDMITX(printf("AVI packet over size, length = %d \n", length));
1201*53ee8cc1Swenshuai.xi                     break;
1202*53ee8cc1Swenshuai.xi                 }
1203*53ee8cc1Swenshuai.xi 
1204*53ee8cc1Swenshuai.xi                 if ((i % 2) == 0)
1205*53ee8cc1Swenshuai.xi                     MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_1_09 + j, 0x00FF, *(ptr+i));
1206*53ee8cc1Swenshuai.xi                 else
1207*53ee8cc1Swenshuai.xi                     MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_1_09 + j, 0xFF00, *(ptr+i) << 8);
1208*53ee8cc1Swenshuai.xi             }
1209*53ee8cc1Swenshuai.xi         break;
1210*53ee8cc1Swenshuai.xi 
1211*53ee8cc1Swenshuai.xi         //wilson@kano HDR packet
1212*53ee8cc1Swenshuai.xi         case E_HDMITX_HDR_INFOFRAME:
1213*53ee8cc1Swenshuai.xi             //first 3 bytes will follow spec, (1) type code (2) version (3) length, and reamins will be content
1214*53ee8cc1Swenshuai.xi             length = (length > (HDMITX_HDR_INFO_PKT_LEN + 3)) ? (HDMITX_HDR_INFO_PKT_LEN + 3) : length;
1215*53ee8cc1Swenshuai.xi             //fill length and version
1216*53ee8cc1Swenshuai.xi             MHal_HDMITx_Write(HDMITX_2_REG_BASE, REG_HDMI_2_CONFIG_1F,(*(ptr+2) << 8) | *(ptr+1));
1217*53ee8cc1Swenshuai.xi 
1218*53ee8cc1Swenshuai.xi 	    if (length >= 3)
1219*53ee8cc1Swenshuai.xi             {
1220*53ee8cc1Swenshuai.xi                 for ( i = 0; i < (length-3); i++ )
1221*53ee8cc1Swenshuai.xi                 {
1222*53ee8cc1Swenshuai.xi                     j = i >> 1;
1223*53ee8cc1Swenshuai.xi 
1224*53ee8cc1Swenshuai.xi                     if ( ((REG_HDMI_2_CONFIG_10 + j) > REG_HDMI_2_CONFIG_1D) || (((REG_HDMI_2_CONFIG_10 + j) == REG_HDMI_2_CONFIG_1D) && (i % 2 == 1)) )
1225*53ee8cc1Swenshuai.xi                     {
1226*53ee8cc1Swenshuai.xi                         DBG_HDMITX(printf("HDR packet over size, length = %d \n", length));
1227*53ee8cc1Swenshuai.xi                         break;
1228*53ee8cc1Swenshuai.xi                     }
1229*53ee8cc1Swenshuai.xi 
1230*53ee8cc1Swenshuai.xi                     if ((i % 2) == 0)
1231*53ee8cc1Swenshuai.xi                     {
1232*53ee8cc1Swenshuai.xi                         MHal_HDMITx_Mask_Write(HDMITX_2_REG_BASE, (REG_HDMI_2_CONFIG_10 + j), 0x00FF, *(ptr+i+3));
1233*53ee8cc1Swenshuai.xi                     }
1234*53ee8cc1Swenshuai.xi                     else
1235*53ee8cc1Swenshuai.xi                     {
1236*53ee8cc1Swenshuai.xi                         MHal_HDMITx_Mask_Write(HDMITX_2_REG_BASE, (REG_HDMI_2_CONFIG_10 + j), 0xFF00, (*(ptr+i+3))<<8);
1237*53ee8cc1Swenshuai.xi                     }
1238*53ee8cc1Swenshuai.xi                 }
1239*53ee8cc1Swenshuai.xi             }
1240*53ee8cc1Swenshuai.xi         break;
1241*53ee8cc1Swenshuai.xi 
1242*53ee8cc1Swenshuai.xi         case E_HDMITX_AUDIO_INFOFRAME:
1243*53ee8cc1Swenshuai.xi             {
1244*53ee8cc1Swenshuai.xi                 //total length should be 192 bits *2 = 384 bits = 48 bytes;
1245*53ee8cc1Swenshuai.xi 
1246*53ee8cc1Swenshuai.xi                 length = (length < ((192>>3)<<1) ) ? length : ((192>>3)<<1);
1247*53ee8cc1Swenshuai.xi 
1248*53ee8cc1Swenshuai.xi                 for ( i = 0; i < length; i++ )
1249*53ee8cc1Swenshuai.xi                 {
1250*53ee8cc1Swenshuai.xi                     j = i >> 1;
1251*53ee8cc1Swenshuai.xi 
1252*53ee8cc1Swenshuai.xi                     if ((i % 2) == 0)
1253*53ee8cc1Swenshuai.xi                     {
1254*53ee8cc1Swenshuai.xi                         MHal_HDMITx_Mask_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CH_STATUS0_0A + j, 0x00FF, *(ptr+i));
1255*53ee8cc1Swenshuai.xi                     }
1256*53ee8cc1Swenshuai.xi                     else
1257*53ee8cc1Swenshuai.xi                     {
1258*53ee8cc1Swenshuai.xi                         MHal_HDMITx_Mask_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CH_STATUS0_0A + j, 0xFF00, (*(ptr+i) << 8));
1259*53ee8cc1Swenshuai.xi                     }
1260*53ee8cc1Swenshuai.xi                 }
1261*53ee8cc1Swenshuai.xi             }
1262*53ee8cc1Swenshuai.xi         break;
1263*53ee8cc1Swenshuai.xi 
1264*53ee8cc1Swenshuai.xi 	    default:
1265*53ee8cc1Swenshuai.xi 		    i = 0;
1266*53ee8cc1Swenshuai.xi 			j = 0;
1267*53ee8cc1Swenshuai.xi             bRet = FALSE;
1268*53ee8cc1Swenshuai.xi             DBG_HDMITX(printf("Not implemented, packet type = %u\n", packet_type));
1269*53ee8cc1Swenshuai.xi 	    break;
1270*53ee8cc1Swenshuai.xi     }
1271*53ee8cc1Swenshuai.xi 
1272*53ee8cc1Swenshuai.xi     return bRet;
1273*53ee8cc1Swenshuai.xi }
1274*53ee8cc1Swenshuai.xi 
1275*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1276*53ee8cc1Swenshuai.xi /// @brief This routine turn on/off HDMI Tx TMDS signal
1277*53ee8cc1Swenshuai.xi /// @param[in] bRB_Swap: R/B swap; bTMDS: TMDS flag
1278*53ee8cc1Swenshuai.xi /// @return None
1279*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_SetTMDSOnOff(MS_BOOL bRB_Swap,MS_BOOL bTMDS)1280*53ee8cc1Swenshuai.xi void MHal_HDMITx_SetTMDSOnOff(MS_BOOL bRB_Swap, MS_BOOL bTMDS)
1281*53ee8cc1Swenshuai.xi {
1282*53ee8cc1Swenshuai.xi     if(bRB_Swap) // R/B channel swap
1283*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_00, BIT13, BIT13);
1284*53ee8cc1Swenshuai.xi     else
1285*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_00, BIT13, 0);
1286*53ee8cc1Swenshuai.xi 
1287*53ee8cc1Swenshuai.xi     //reg_atop_en_data_out[13..15]:  Enable data channel data output
1288*53ee8cc1Swenshuai.xi     if (bTMDS == TRUE)
1289*53ee8cc1Swenshuai.xi     {
1290*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_39, 0xFFFF, 0xF000);
1291*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_2E, 0xE800, 0xE800);
1292*53ee8cc1Swenshuai.xi         //TBD: turn off tmds clock
1293*53ee8cc1Swenshuai.xi 
1294*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CONFIG_05, 0x0001, 0x0001); //flush audio fifo
1295*53ee8cc1Swenshuai.xi         MsOS_DelayTask(10);
1296*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CONFIG_05, 0x0001, 0x0000);
1297*53ee8cc1Swenshuai.xi     }
1298*53ee8cc1Swenshuai.xi     else
1299*53ee8cc1Swenshuai.xi     {
1300*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_39, 0xFFFF, 0xFFFF);
1301*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_2E, 0xE800, 0x0000);
1302*53ee8cc1Swenshuai.xi         //TBD: turn off tmds clock
1303*53ee8cc1Swenshuai.xi     }
1304*53ee8cc1Swenshuai.xi }
1305*53ee8cc1Swenshuai.xi 
1306*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1307*53ee8cc1Swenshuai.xi /// @brief This routine return on/off status of HDMI Tx TMDS signal
1308*53ee8cc1Swenshuai.xi /// @return On/Off
1309*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_GetTMDSStatus(void)1310*53ee8cc1Swenshuai.xi MS_U32 MHal_HDMITx_GetTMDSStatus(void)
1311*53ee8cc1Swenshuai.xi {
1312*53ee8cc1Swenshuai.xi     MS_U16 usTMDSOutput = 0;
1313*53ee8cc1Swenshuai.xi     MS_U16 usTMDSPD = 0;
1314*53ee8cc1Swenshuai.xi     MS_U32 uiTMDSOn = 0;
1315*53ee8cc1Swenshuai.xi 
1316*53ee8cc1Swenshuai.xi     usTMDSOutput = MHal_HDMITx_Read(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_2E);
1317*53ee8cc1Swenshuai.xi     usTMDSPD = MHal_HDMITx_Read(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_39);
1318*53ee8cc1Swenshuai.xi 
1319*53ee8cc1Swenshuai.xi     if( ((usTMDSOutput&0xE800) == 0xE800) && ((usTMDSPD &0x0FFF) == 0x0000) )
1320*53ee8cc1Swenshuai.xi     {
1321*53ee8cc1Swenshuai.xi         uiTMDSOn = TRUE;
1322*53ee8cc1Swenshuai.xi     }
1323*53ee8cc1Swenshuai.xi     else
1324*53ee8cc1Swenshuai.xi     {
1325*53ee8cc1Swenshuai.xi         uiTMDSOn = FALSE;
1326*53ee8cc1Swenshuai.xi     }
1327*53ee8cc1Swenshuai.xi 
1328*53ee8cc1Swenshuai.xi     return uiTMDSOn;
1329*53ee8cc1Swenshuai.xi }
1330*53ee8cc1Swenshuai.xi 
1331*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1332*53ee8cc1Swenshuai.xi /// @brief This routine turn on/off HDMI Tx video output
1333*53ee8cc1Swenshuai.xi /// @param[in] bVideo: Video flag; bCSC: CSC flag, b709format = BT.709-5
1334*53ee8cc1Swenshuai.xi /// @return None
1335*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_SetVideoOnOff(MS_BOOL bVideo,MS_BOOL bCSC,MS_BOOL b709format)1336*53ee8cc1Swenshuai.xi void MHal_HDMITx_SetVideoOnOff(MS_BOOL bVideo, MS_BOOL bCSC, MS_BOOL b709format)
1337*53ee8cc1Swenshuai.xi {
1338*53ee8cc1Swenshuai.xi     if (bVideo == TRUE)
1339*53ee8cc1Swenshuai.xi     {
1340*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_30, BIT0, 0x0000); // disable test pattern
1341*53ee8cc1Swenshuai.xi     }
1342*53ee8cc1Swenshuai.xi     else
1343*53ee8cc1Swenshuai.xi     {
1344*53ee8cc1Swenshuai.xi         MS_U8 i = 0x00;
1345*53ee8cc1Swenshuai.xi 
1346*53ee8cc1Swenshuai.xi         DBG_HDMITX(printf("MDrv_HDMITx_SetVideoOnOff: csc flag= %d \n", bCSC));
1347*53ee8cc1Swenshuai.xi 
1348*53ee8cc1Swenshuai.xi         // enable test pattern
1349*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_3A, 0x0000);
1350*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_3B, 0x0000);
1351*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_3C, 0x03FF); // whole-blue
1352*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_30, BIT0|BIT1, BIT0|BIT1);
1353*53ee8cc1Swenshuai.xi 
1354*53ee8cc1Swenshuai.xi         for ( i = 0; i < 6; i++ )
1355*53ee8cc1Swenshuai.xi             MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_3D + i, 0x0000);
1356*53ee8cc1Swenshuai.xi     }
1357*53ee8cc1Swenshuai.xi }
1358*53ee8cc1Swenshuai.xi 
1359*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1360*53ee8cc1Swenshuai.xi /// @brief This routine sets video color formatt
1361*53ee8cc1Swenshuai.xi /// @param[in] bCSC: CSC flag, YUV422 12 bit, b709format = BT.709-5
1362*53ee8cc1Swenshuai.xi /// @return None
1363*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_SetColorFormat(MS_BOOL bCSC,MS_BOOL bHdmi422b12,MS_BOOL b709format)1364*53ee8cc1Swenshuai.xi void MHal_HDMITx_SetColorFormat(MS_BOOL bCSC, MS_BOOL bHdmi422b12, MS_BOOL b709format)
1365*53ee8cc1Swenshuai.xi {
1366*53ee8cc1Swenshuai.xi     if (bCSC) // YUV -> RGB
1367*53ee8cc1Swenshuai.xi     {
1368*53ee8cc1Swenshuai.xi         DBG_HDMITX(printf("YUV -> RGB \n"));
1369*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, BIT0, BIT0); //bypass
1370*53ee8cc1Swenshuai.xi     }
1371*53ee8cc1Swenshuai.xi     else // bypass
1372*53ee8cc1Swenshuai.xi     {
1373*53ee8cc1Swenshuai.xi         DBG_HDMITX(printf("bypass YUV -> RGB \n"));
1374*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, BIT0, 0x00); //bypass
1375*53ee8cc1Swenshuai.xi     }
1376*53ee8cc1Swenshuai.xi 
1377*53ee8cc1Swenshuai.xi     // YUV422 12 bits output
1378*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_17, BIT15, bHdmi422b12 ? BIT15 : 0x00);
1379*53ee8cc1Swenshuai.xi }
1380*53ee8cc1Swenshuai.xi 
1381*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1382*53ee8cc1Swenshuai.xi /// @brief This routine get CSC capability
1383*53ee8cc1Swenshuai.xi /// @param[in]
1384*53ee8cc1Swenshuai.xi /// @return False : not support R2Y. Ture : ok.
1385*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_CSC_Support_R2Y(void * pDatatIn)1386*53ee8cc1Swenshuai.xi MS_BOOL MHal_HDMITx_CSC_Support_R2Y(void* pDatatIn)
1387*53ee8cc1Swenshuai.xi {
1388*53ee8cc1Swenshuai.xi     pDatatIn = pDatatIn;
1389*53ee8cc1Swenshuai.xi     return HDMITX_CSC_SUPPORT_R2Y;
1390*53ee8cc1Swenshuai.xi }
1391*53ee8cc1Swenshuai.xi 
1392*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1393*53ee8cc1Swenshuai.xi /// @brief This routine sets color domain and color range transform
1394*53ee8cc1Swenshuai.xi /// @param[in]
1395*53ee8cc1Swenshuai.xi /// @return False : not support this command. Ture : ok.
1396*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_ColorandRange_Transform(MsHDMITX_VIDEO_COLOR_FORMAT incolor,MsHDMITX_VIDEO_COLOR_FORMAT outcolor,MsHDMITX_YCC_QUANT_RANGE inrange,MsHDMITX_YCC_QUANT_RANGE outrange)1397*53ee8cc1Swenshuai.xi MS_BOOL MHal_HDMITx_ColorandRange_Transform(MsHDMITX_VIDEO_COLOR_FORMAT incolor, MsHDMITX_VIDEO_COLOR_FORMAT outcolor, MsHDMITX_YCC_QUANT_RANGE inrange, MsHDMITX_YCC_QUANT_RANGE outrange)
1398*53ee8cc1Swenshuai.xi {
1399*53ee8cc1Swenshuai.xi     MS_BOOL bReturn = FALSE;
1400*53ee8cc1Swenshuai.xi 
1401*53ee8cc1Swenshuai.xi     if( (incolor == outcolor) && (inrange == outrange) )
1402*53ee8cc1Swenshuai.xi     {
1403*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0000);
1404*53ee8cc1Swenshuai.xi         bReturn = TRUE;
1405*53ee8cc1Swenshuai.xi         DBG_HDMITX(printf("Input equals output \n"));
1406*53ee8cc1Swenshuai.xi     }
1407*53ee8cc1Swenshuai.xi     else if(incolor == E_HDMITX_VIDEO_COLOR_RGB444)
1408*53ee8cc1Swenshuai.xi     {
1409*53ee8cc1Swenshuai.xi         if(inrange == E_HDMITX_YCC_QUANT_LIMIT)//LR
1410*53ee8cc1Swenshuai.xi         {
1411*53ee8cc1Swenshuai.xi             if(((outcolor == E_HDMITX_VIDEO_COLOR_YUV444)||(outcolor == E_HDMITX_VIDEO_COLOR_YUV422)) && (outrange == E_HDMITX_YCC_QUANT_LIMIT))
1412*53ee8cc1Swenshuai.xi             { //LR -> LY
1413*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x7FFF, 0x00A0);
1414*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_21, 0x1FFF, 0x020C);
1415*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_22, 0x1FFF, 0x1E24);
1416*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_23, 0x1FFF, 0x1FD0);
1417*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_24, 0x1FFF, 0x00DA);
1418*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_25, 0x1FFF, 0x02DC);
1419*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_26, 0x1FFF, 0x004A);
1420*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_27, 0x1FFF, 0x1F88);
1421*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_28, 0x1FFF, 0x1E6C);
1422*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_29, 0x1FFF, 0x020C);
1423*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0001);
1424*53ee8cc1Swenshuai.xi                 bReturn = TRUE;
1425*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("LR->LY! \n"));
1426*53ee8cc1Swenshuai.xi             }
1427*53ee8cc1Swenshuai.xi             else if(((outcolor == E_HDMITX_VIDEO_COLOR_YUV444)||(outcolor == E_HDMITX_VIDEO_COLOR_YUV422)) && (outrange == E_HDMITX_YCC_QUANT_FULL))
1428*53ee8cc1Swenshuai.xi             { //LR -> FY
1429*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x7FFF, 0x0CB0);
1430*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_21, 0x1FFF, 0x0256);
1431*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_22, 0x1FFF, 0x1DE1);
1432*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_23, 0x1FFF, 0x1FC9);
1433*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_24, 0x1FFF, 0x00FE);
1434*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_25, 0x1FFF, 0x0357);
1435*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_26, 0x1FFF, 0x0056);
1436*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_27, 0x1FFF, 0x1F77);
1437*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_28, 0x1FFF, 0x1E33);
1438*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_29, 0x1FFF, 0x0256);
1439*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0001);
1440*53ee8cc1Swenshuai.xi                 bReturn = TRUE;
1441*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("LR->FY! \n"));
1442*53ee8cc1Swenshuai.xi             }
1443*53ee8cc1Swenshuai.xi             else if((outcolor == E_HDMITX_VIDEO_COLOR_RGB444)&& (outrange == E_HDMITX_YCC_QUANT_FULL))
1444*53ee8cc1Swenshuai.xi             { //LR -> FR
1445*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x7FFF, 0x0C10);
1446*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_21, 0x1FFF, 0x04AC);
1447*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_22, 0x1FFF, 0x0000);
1448*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_23, 0x1FFF, 0x0000);
1449*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_24, 0x1FFF, 0x0000);
1450*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_25, 0x1FFF, 0x04AC);
1451*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_26, 0x1FFF, 0x0000);
1452*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_27, 0x1FFF, 0x0000);
1453*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_28, 0x1FFF, 0x0000);
1454*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_29, 0x1FFF, 0x04AC);
1455*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0001);
1456*53ee8cc1Swenshuai.xi                 bReturn = TRUE;
1457*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("LR->FR! \n"));
1458*53ee8cc1Swenshuai.xi             }
1459*53ee8cc1Swenshuai.xi             else
1460*53ee8cc1Swenshuai.xi             {
1461*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("LR->LR! \n"));
1462*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0000);
1463*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("In/Out Same Color! \n"));
1464*53ee8cc1Swenshuai.xi                 bReturn = TRUE;
1465*53ee8cc1Swenshuai.xi             }
1466*53ee8cc1Swenshuai.xi 
1467*53ee8cc1Swenshuai.xi         }
1468*53ee8cc1Swenshuai.xi         else if(inrange == E_HDMITX_YCC_QUANT_FULL)//FR
1469*53ee8cc1Swenshuai.xi         {
1470*53ee8cc1Swenshuai.xi             if(((outcolor == E_HDMITX_VIDEO_COLOR_YUV444)||(outcolor == E_HDMITX_VIDEO_COLOR_YUV422)) && (outrange == E_HDMITX_YCC_QUANT_LIMIT))
1471*53ee8cc1Swenshuai.xi             { //FR -> LY
1472*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x7FFF, 0x00E0);
1473*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_21, 0x1FFF, 0x01C0);
1474*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_22, 0x1FFF, 0x1E69);
1475*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_23, 0x1FFF, 0x1FD7);
1476*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_24, 0x1FFF, 0x00BA);
1477*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_25, 0x1FFF, 0x0273);
1478*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_26, 0x1FFF, 0x003F);
1479*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_27, 0x1FFF, 0x1F99);
1480*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_28, 0x1FFF, 0x1EA6);
1481*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_29, 0x1FFF, 0x01C0);
1482*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0001);
1483*53ee8cc1Swenshuai.xi                 bReturn = TRUE;
1484*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("FR->LY! \n"));
1485*53ee8cc1Swenshuai.xi             }
1486*53ee8cc1Swenshuai.xi             else if(((outcolor == E_HDMITX_VIDEO_COLOR_YUV444)||(outcolor == E_HDMITX_VIDEO_COLOR_YUV422)) && (outrange == E_HDMITX_YCC_QUANT_FULL))
1487*53ee8cc1Swenshuai.xi             { //FR -> FY
1488*53ee8cc1Swenshuai.xi                 //MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x7FFF, 0x00A1);
1489*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x7FFF, 0x00A0);
1490*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_21, 0x1FFF, 0x0200);
1491*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_22, 0x1FFF, 0x1E2F);
1492*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_23, 0x1FFF, 0x1FD1);
1493*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_24, 0x1FFF, 0x00DA);
1494*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_25, 0x1FFF, 0x02DC);
1495*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_26, 0x1FFF, 0x004A);
1496*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_27, 0x1FFF, 0x1F8B);
1497*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_28, 0x1FFF, 0x1E75);
1498*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_29, 0x1FFF, 0x0200);
1499*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0001);
1500*53ee8cc1Swenshuai.xi                 bReturn = TRUE;
1501*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("FR->FY! \n"));
1502*53ee8cc1Swenshuai.xi             }
1503*53ee8cc1Swenshuai.xi             else if((outcolor == E_HDMITX_VIDEO_COLOR_RGB444)&& (outrange == E_HDMITX_YCC_QUANT_LIMIT))
1504*53ee8cc1Swenshuai.xi             { //FR -> LR
1505*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x7FFF, 0x5040);
1506*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_21, 0x1FFF, 0x0381);
1507*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_22, 0x1FFF, 0x0000);
1508*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_23, 0x1FFF, 0x0000);
1509*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_24, 0x1FFF, 0x0000);
1510*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_25, 0x1FFF, 0x036D);
1511*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_26, 0x1FFF, 0x0000);
1512*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_27, 0x1FFF, 0x0000);
1513*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_28, 0x1FFF, 0x0000);
1514*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_29, 0x1FFF, 0x0381);
1515*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0001);
1516*53ee8cc1Swenshuai.xi                 bReturn = TRUE;
1517*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("FR->LR! \n"));
1518*53ee8cc1Swenshuai.xi             }
1519*53ee8cc1Swenshuai.xi             else
1520*53ee8cc1Swenshuai.xi             {
1521*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("FR->FR! \n"));
1522*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0000);
1523*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("In/Out Same Color! \n"));
1524*53ee8cc1Swenshuai.xi                 bReturn = TRUE;
1525*53ee8cc1Swenshuai.xi             }
1526*53ee8cc1Swenshuai.xi         }
1527*53ee8cc1Swenshuai.xi         else
1528*53ee8cc1Swenshuai.xi         {
1529*53ee8cc1Swenshuai.xi             //MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0000);
1530*53ee8cc1Swenshuai.xi             DBG_HDMITX(printf("Not Support This! \n"));
1531*53ee8cc1Swenshuai.xi         }
1532*53ee8cc1Swenshuai.xi     }
1533*53ee8cc1Swenshuai.xi     else if((incolor == E_HDMITX_VIDEO_COLOR_YUV444) || (incolor == E_HDMITX_VIDEO_COLOR_YUV422))
1534*53ee8cc1Swenshuai.xi     {
1535*53ee8cc1Swenshuai.xi         if(inrange == E_HDMITX_YCC_QUANT_LIMIT)//LY
1536*53ee8cc1Swenshuai.xi         {
1537*53ee8cc1Swenshuai.xi             if((outcolor == E_HDMITX_VIDEO_COLOR_RGB444) && (outrange == E_HDMITX_YCC_QUANT_FULL))
1538*53ee8cc1Swenshuai.xi             {//LY->FR
1539*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x7FFF, 0x001A);
1540*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_21, 0x1FFF, 0x0731);
1541*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_22, 0x1FFF, 0x04AC);
1542*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_23, 0x1FFF, 0x0000);
1543*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_24, 0x1FFF, 0x1DDD);
1544*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_25, 0x1FFF, 0x04AC);
1545*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_26, 0x1FFF, 0x1F25);
1546*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_27, 0x1FFF, 0x0000);
1547*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_28, 0x1FFF, 0x04AC);
1548*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_29, 0x1FFF, 0x0879);
1549*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0001);
1550*53ee8cc1Swenshuai.xi                 bReturn = TRUE;
1551*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("LY->FR! \n"));
1552*53ee8cc1Swenshuai.xi             }
1553*53ee8cc1Swenshuai.xi             else if((outcolor == E_HDMITX_VIDEO_COLOR_RGB444) && (outrange == E_HDMITX_YCC_QUANT_LIMIT))
1554*53ee8cc1Swenshuai.xi             {//LY->LR
1555*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x7FFF, 0x000A);
1556*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_21, 0x1FFF, 0x0629);
1557*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_22, 0x1FFF, 0x0400);
1558*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_23, 0x1FFF, 0x0000);
1559*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_24, 0x1FFF, 0x1E2B);
1560*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_25, 0x1FFF, 0x0400);
1561*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_26, 0x1FFF, 0x1F44);
1562*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_27, 0x1FFF, 0x0000);
1563*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_28, 0x1FFF, 0x0400);
1564*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_29, 0x1FFF, 0x0742);
1565*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0001);
1566*53ee8cc1Swenshuai.xi                 bReturn = TRUE;
1567*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("May over range! \n"));
1568*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("LY->LR! \n"));
1569*53ee8cc1Swenshuai.xi             }
1570*53ee8cc1Swenshuai.xi             else if(((outcolor == E_HDMITX_VIDEO_COLOR_YUV444)||(outcolor == E_HDMITX_VIDEO_COLOR_YUV422)) && (outrange == E_HDMITX_YCC_QUANT_FULL))
1571*53ee8cc1Swenshuai.xi             {//LY->FY
1572*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x7FFF, 0x00BA);
1573*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_21, 0x1FFF, 0x0491);
1574*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_22, 0x1FFF, 0x0000);
1575*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_23, 0x1FFF, 0x0000);
1576*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_24, 0x1FFF, 0x0000);
1577*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_25, 0x1FFF, 0x04AC);
1578*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_26, 0x1FFF, 0x0000);
1579*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_27, 0x1FFF, 0x0000);
1580*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_28, 0x1FFF, 0x0000);
1581*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_29, 0x1FFF, 0x0491);
1582*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0001);
1583*53ee8cc1Swenshuai.xi                 bReturn = TRUE;
1584*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("LY->FY! \n"));
1585*53ee8cc1Swenshuai.xi             }
1586*53ee8cc1Swenshuai.xi             else
1587*53ee8cc1Swenshuai.xi             {
1588*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0000);
1589*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("In/Out Same Color! \n"));
1590*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("LY->LY! \n"));
1591*53ee8cc1Swenshuai.xi                 bReturn = TRUE;
1592*53ee8cc1Swenshuai.xi             }
1593*53ee8cc1Swenshuai.xi 
1594*53ee8cc1Swenshuai.xi         }
1595*53ee8cc1Swenshuai.xi         else if(inrange == E_HDMITX_YCC_QUANT_FULL)//FY
1596*53ee8cc1Swenshuai.xi         {
1597*53ee8cc1Swenshuai.xi             if((outcolor == E_HDMITX_VIDEO_COLOR_RGB444) && (outrange == E_HDMITX_YCC_QUANT_FULL))
1598*53ee8cc1Swenshuai.xi             {//FY->FR
1599*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x7FFF, 0x000A);
1600*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_21, 0x1FFF, 0x064D);
1601*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_22, 0x1FFF, 0x0400);
1602*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_23, 0x1FFF, 0x0000);
1603*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_24, 0x1FFF, 0x1E21);
1604*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_25, 0x1FFF, 0x0400);
1605*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_26, 0x1FFF, 0x1F40);
1606*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_27, 0x1FFF, 0x0000);
1607*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_28, 0x1FFF, 0x0400);
1608*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_29, 0x1FFF, 0x076C);
1609*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0001);
1610*53ee8cc1Swenshuai.xi                 bReturn = TRUE;
1611*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("FY->FR! \n"));
1612*53ee8cc1Swenshuai.xi             }
1613*53ee8cc1Swenshuai.xi             else if((outcolor == E_HDMITX_VIDEO_COLOR_RGB444) && (outrange == E_HDMITX_YCC_QUANT_LIMIT))
1614*53ee8cc1Swenshuai.xi             {//FY->LR
1615*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x7FFF, 0x504A);
1616*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_21, 0x1FFF, 0x0565);
1617*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_22, 0x1FFF, 0x036D);
1618*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_23, 0x1FFF, 0x0000);
1619*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_24, 0x1FFF, 0x1E66);
1620*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_25, 0x1FFF, 0x036D);
1621*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_26, 0x1FFF, 0x1F5C);
1622*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_27, 0x1FFF, 0x0000);
1623*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_28, 0x1FFF, 0x036D);
1624*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_29, 0x1FFF, 0x065B);
1625*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0001);
1626*53ee8cc1Swenshuai.xi                 bReturn = TRUE;
1627*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("FY->LR! \n"));
1628*53ee8cc1Swenshuai.xi             }
1629*53ee8cc1Swenshuai.xi             else if(((outcolor == E_HDMITX_VIDEO_COLOR_YUV444)||(outcolor == E_HDMITX_VIDEO_COLOR_YUV422)) && (outrange == E_HDMITX_YCC_QUANT_LIMIT))
1630*53ee8cc1Swenshuai.xi             {//FY->LY
1631*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x7FFF, 0x00EA);
1632*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_21, 0x1FFF, 0x04AC);
1633*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_22, 0x1FFF, 0x0000);
1634*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_23, 0x1FFF, 0x0000);
1635*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_24, 0x1FFF, 0x0000);
1636*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_25, 0x1FFF, 0x04AC);
1637*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_26, 0x1FFF, 0x0000);
1638*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_27, 0x1FFF, 0x0000);
1639*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_28, 0x1FFF, 0x0000);
1640*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_29, 0x1FFF, 0x04AC);
1641*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0001);
1642*53ee8cc1Swenshuai.xi                 bReturn = TRUE;
1643*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("FY->LY! \n"));
1644*53ee8cc1Swenshuai.xi             }
1645*53ee8cc1Swenshuai.xi             else
1646*53ee8cc1Swenshuai.xi             {
1647*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0000);
1648*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("In/Out Same Color! \n"));
1649*53ee8cc1Swenshuai.xi                 DBG_HDMITX(printf("FY->FY! \n"));
1650*53ee8cc1Swenshuai.xi                 bReturn = TRUE;
1651*53ee8cc1Swenshuai.xi             }
1652*53ee8cc1Swenshuai.xi         }
1653*53ee8cc1Swenshuai.xi         else
1654*53ee8cc1Swenshuai.xi         {
1655*53ee8cc1Swenshuai.xi             //MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0000);
1656*53ee8cc1Swenshuai.xi             DBG_HDMITX(printf("Not Support This! \n"));
1657*53ee8cc1Swenshuai.xi         }
1658*53ee8cc1Swenshuai.xi     }
1659*53ee8cc1Swenshuai.xi     else
1660*53ee8cc1Swenshuai.xi     {
1661*53ee8cc1Swenshuai.xi         //MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_20, 0x0001, 0x0000);
1662*53ee8cc1Swenshuai.xi         DBG_HDMITX(printf("Not Support This! \n"));
1663*53ee8cc1Swenshuai.xi     }
1664*53ee8cc1Swenshuai.xi 
1665*53ee8cc1Swenshuai.xi     //if(bReturn == TRUE)
1666*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_17, BIT15, (outcolor == E_HDMITX_VIDEO_COLOR_YUV422) ? BIT15 : 0);
1667*53ee8cc1Swenshuai.xi 
1668*53ee8cc1Swenshuai.xi     return bReturn;
1669*53ee8cc1Swenshuai.xi }
1670*53ee8cc1Swenshuai.xi 
1671*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1672*53ee8cc1Swenshuai.xi /// @brief This routine will set or stop all HDMI packet generation
1673*53ee8cc1Swenshuai.xi /// @param[in] bflag  True: Enable packet gen, False : Disable packet gen
1674*53ee8cc1Swenshuai.xi /// @return None
1675*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_EnablePacketGen(MS_BOOL bflag)1676*53ee8cc1Swenshuai.xi void MHal_HDMITx_EnablePacketGen(MS_BOOL bflag)
1677*53ee8cc1Swenshuai.xi {
1678*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_HDMI_CONFIG1_00, BIT2, bflag ? BIT2:0);
1679*53ee8cc1Swenshuai.xi }
1680*53ee8cc1Swenshuai.xi 
1681*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1682*53ee8cc1Swenshuai.xi /// @brief This routine sets HDMI/DVI mode
1683*53ee8cc1Swenshuai.xi /// @param[in] bflag
1684*53ee8cc1Swenshuai.xi /// @return None
1685*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_SetHDMImode(MS_BOOL bflag,MsHDMITX_VIDEO_COLORDEPTH_VAL cd_val)1686*53ee8cc1Swenshuai.xi void MHal_HDMITx_SetHDMImode(MS_BOOL bflag, MsHDMITX_VIDEO_COLORDEPTH_VAL cd_val)
1687*53ee8cc1Swenshuai.xi {
1688*53ee8cc1Swenshuai.xi     MS_U8 ucRegVal = 0x00;
1689*53ee8cc1Swenshuai.xi 
1690*53ee8cc1Swenshuai.xi     DBG_HDMITX(printf("[%s][%d]HDMI mode = %d, Color Depth = %d \n", __FUNCTION__, __LINE__, bflag, bflag));
1691*53ee8cc1Swenshuai.xi 
1692*53ee8cc1Swenshuai.xi     if (bflag) // HDMI mode
1693*53ee8cc1Swenshuai.xi     {
1694*53ee8cc1Swenshuai.xi         switch(cd_val)
1695*53ee8cc1Swenshuai.xi         {
1696*53ee8cc1Swenshuai.xi             case E_HDMITX_VIDEO_CD_NoID:
1697*53ee8cc1Swenshuai.xi             case E_HDMITX_VIDEO_CD_24Bits:
1698*53ee8cc1Swenshuai.xi             default:
1699*53ee8cc1Swenshuai.xi                 ucRegVal = 0x00;
1700*53ee8cc1Swenshuai.xi             break;
1701*53ee8cc1Swenshuai.xi 
1702*53ee8cc1Swenshuai.xi             case E_HDMITX_VIDEO_CD_30Bits:
1703*53ee8cc1Swenshuai.xi                 ucRegVal = 0x40;
1704*53ee8cc1Swenshuai.xi             break;
1705*53ee8cc1Swenshuai.xi 
1706*53ee8cc1Swenshuai.xi             case E_HDMITX_VIDEO_CD_36Bits:
1707*53ee8cc1Swenshuai.xi                 ucRegVal = 0x80;
1708*53ee8cc1Swenshuai.xi             break;
1709*53ee8cc1Swenshuai.xi 
1710*53ee8cc1Swenshuai.xi             case E_HDMITX_VIDEO_CD_48Bits:
1711*53ee8cc1Swenshuai.xi                 ucRegVal = 0xC0;
1712*53ee8cc1Swenshuai.xi             break;
1713*53ee8cc1Swenshuai.xi         }
1714*53ee8cc1Swenshuai.xi 
1715*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_HDMI_CONFIG1_00, 0x00FF, ucRegVal|BIT2); // [7:6]: DC_mode, [2]: packet enable, [0]: HDMI/DVI
1716*53ee8cc1Swenshuai.xi     }
1717*53ee8cc1Swenshuai.xi     else // DVI
1718*53ee8cc1Swenshuai.xi     {
1719*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_HDMI_CONFIG1_00, 0x00FF, BIT0); // [7:6]: DC_mode, [2]: packet enable, [0]: HDMI/DVI
1720*53ee8cc1Swenshuai.xi     }
1721*53ee8cc1Swenshuai.xi }
1722*53ee8cc1Swenshuai.xi 
1723*53ee8cc1Swenshuai.xi 
1724*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1725*53ee8cc1Swenshuai.xi /// @brief This routine sets audio on/off
1726*53ee8cc1Swenshuai.xi /// @param[in] bflag
1727*53ee8cc1Swenshuai.xi /// @return None
1728*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_SetAudioOnOff(MS_BOOL bflag)1729*53ee8cc1Swenshuai.xi void MHal_HDMITx_SetAudioOnOff(MS_BOOL bflag)
1730*53ee8cc1Swenshuai.xi {
1731*53ee8cc1Swenshuai.xi     MS_U8 num;
1732*53ee8cc1Swenshuai.xi 
1733*53ee8cc1Swenshuai.xi     if(bflag) // audio on
1734*53ee8cc1Swenshuai.xi     {
1735*53ee8cc1Swenshuai.xi         num = sizeof(HDMITxAudioOnTbl)/sizeof(MSTHDMITX_REG_TYPE);
1736*53ee8cc1Swenshuai.xi         MHal_HDMITx_RegsTbl_Write(HDMITxAudioOnTbl, num);
1737*53ee8cc1Swenshuai.xi     }
1738*53ee8cc1Swenshuai.xi     else // audio off
1739*53ee8cc1Swenshuai.xi     {
1740*53ee8cc1Swenshuai.xi         num = sizeof(HDMITxAudioOffTbl)/sizeof(MSTHDMITX_REG_TYPE);
1741*53ee8cc1Swenshuai.xi         MHal_HDMITx_RegsTbl_Write(HDMITxAudioOffTbl, num);
1742*53ee8cc1Swenshuai.xi     }
1743*53ee8cc1Swenshuai.xi }
1744*53ee8cc1Swenshuai.xi 
1745*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1746*53ee8cc1Swenshuai.xi /// @brief This routine sets audio sampling freq.
1747*53ee8cc1Swenshuai.xi /// @return None
1748*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_SetAudioFrequency(MsHDMITX_AUDIO_FREQUENCY afidx,MsHDMITX_AUDIO_CHANNEL_COUNT achidx,MsHDMITX_AUDIO_CODING_TYPE actidx)1749*53ee8cc1Swenshuai.xi void MHal_HDMITx_SetAudioFrequency(MsHDMITX_AUDIO_FREQUENCY afidx,
1750*53ee8cc1Swenshuai.xi         MsHDMITX_AUDIO_CHANNEL_COUNT achidx, MsHDMITX_AUDIO_CODING_TYPE actidx
1751*53ee8cc1Swenshuai.xi )
1752*53ee8cc1Swenshuai.xi {
1753*53ee8cc1Swenshuai.xi     // HDMI audio channel setting
1754*53ee8cc1Swenshuai.xi     if(achidx == E_HDMITX_AUDIO_CH_2) // 2 channels
1755*53ee8cc1Swenshuai.xi     {
1756*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CONFIG_05, BIT4|BIT5|BIT6, BIT5|BIT6); //[6:5]: audio FIFO depth ch1234, [4]=1'b0: 2 channels
1757*53ee8cc1Swenshuai.xi     }
1758*53ee8cc1Swenshuai.xi     else // 8 channels
1759*53ee8cc1Swenshuai.xi     {
1760*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CONFIG_05, BIT4, BIT4); //[4]=1'b1: 8 channels
1761*53ee8cc1Swenshuai.xi     }
1762*53ee8cc1Swenshuai.xi 
1763*53ee8cc1Swenshuai.xi     // Audio channel status
1764*53ee8cc1Swenshuai.xi     #if 1 //NOTE:: kano: move channel status from address 0x00 to  address 0x0A
1765*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CH_STATUS0_0A, ((actidx == E_HDMITX_AUDIO_PCM) ? 0 : BIT1) ); // [1]: PCM / non-PCM
1766*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CH_STATUS1_0B, (TxAudioFreqTbl[afidx].CH_Status3 << 8) | (achidx << 4)); //[11:8]: audio sampling frequncy; [7:4]: audio channel count
1767*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CH_STATUS2_0C, 0x0000);
1768*53ee8cc1Swenshuai.xi     #else
1769*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CH_STATUS0_00, ((actidx == E_HDMITX_AUDIO_PCM) ? 0 : BIT1) ); // [1]: PCM / non-PCM
1770*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CH_STATUS1_01, 0);
1771*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CH_STATUS2_02, (achidx<<4)); // [7:4]: audio channel count
1772*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CH_STATUS3_03, TxAudioFreqTbl[afidx].CH_Status3); // [3:0]: audio sampling frequncy
1773*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CH_STATUS4_04, 0);
1774*53ee8cc1Swenshuai.xi     #endif
1775*53ee8cc1Swenshuai.xi     // ACR N code
1776*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_ACR_2_06, 0x0F00, (TxAudioFreqTbl[afidx].NcodeValue & 0x0F0000));
1777*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_ACR_3_07, 0xFFFF, (TxAudioFreqTbl[afidx].NcodeValue & 0x00FFFF));
1778*53ee8cc1Swenshuai.xi 
1779*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_N_PKT_61, 0x000F, (TxAudioFreqTbl[afidx].NcodeValue & 0x0F0000) >> 8);
1780*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_N_PKT_60, 0xFFFF, (TxAudioFreqTbl[afidx].NcodeValue & 0x00FFFF));
1781*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_ACR_CFG_08, 0x0100, 0x0100); //enable cts * 2
1782*53ee8cc1Swenshuai.xi }
1783*53ee8cc1Swenshuai.xi 
1784*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1785*53ee8cc1Swenshuai.xi /// @brief This routine sets audio source format.
1786*53ee8cc1Swenshuai.xi /// @return None
1787*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_SetAudioSourceFormat(MsHDMITX_AUDIO_SOURCE_FORMAT fmt)1788*53ee8cc1Swenshuai.xi void MHal_HDMITx_SetAudioSourceFormat(MsHDMITX_AUDIO_SOURCE_FORMAT fmt)
1789*53ee8cc1Swenshuai.xi {
1790*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CONFIG_05, BIT9|BIT8, fmt << 8);
1791*53ee8cc1Swenshuai.xi }
1792*53ee8cc1Swenshuai.xi 
1793*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1794*53ee8cc1Swenshuai.xi /// @brief This routine Get Audio CTS value
1795*53ee8cc1Swenshuai.xi /// @return CTS
1796*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_GetAudioCTS(void)1797*53ee8cc1Swenshuai.xi MS_U32 MHal_HDMITx_GetAudioCTS(void)
1798*53ee8cc1Swenshuai.xi {
1799*53ee8cc1Swenshuai.xi     MS_U32 ret;
1800*53ee8cc1Swenshuai.xi 
1801*53ee8cc1Swenshuai.xi     ret = ((MHal_HDMITx_Read(HDMITX_REG_BASE, REG_PKT_ACR_2_06) & 0x000F) << 16) | MHal_HDMITx_Read(HDMITX_REG_BASE, REG_PKT_ACR_1_05);
1802*53ee8cc1Swenshuai.xi     return ret;
1803*53ee8cc1Swenshuai.xi }
1804*53ee8cc1Swenshuai.xi 
1805*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1806*53ee8cc1Swenshuai.xi /// @brief This routine Mute Audio FIFO
1807*53ee8cc1Swenshuai.xi /// @param[in] bflag: True: mute audio, False: unmute audio
1808*53ee8cc1Swenshuai.xi /// @return None
1809*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_MuteAudioFIFO(MS_BOOL bflag)1810*53ee8cc1Swenshuai.xi void MHal_HDMITx_MuteAudioFIFO(MS_BOOL bflag)
1811*53ee8cc1Swenshuai.xi {
1812*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CONFIG_05, 0x0001, (MS_U16)bflag);
1813*53ee8cc1Swenshuai.xi }
1814*53ee8cc1Swenshuai.xi 
1815*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1816*53ee8cc1Swenshuai.xi /// @brief This routine sets HDMI Tx HDCP encryption On/Off
1817*53ee8cc1Swenshuai.xi /// @return None
1818*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_SetHDCPOnOff(MS_BOOL hdcp_flag,MS_BOOL hdmi_flag)1819*53ee8cc1Swenshuai.xi void MHal_HDMITx_SetHDCPOnOff(MS_BOOL hdcp_flag, MS_BOOL hdmi_flag)
1820*53ee8cc1Swenshuai.xi {
1821*53ee8cc1Swenshuai.xi     if(hdcp_flag) // HDCP on
1822*53ee8cc1Swenshuai.xi     {
1823*53ee8cc1Swenshuai.xi         if (hdmi_flag) // HDMI EESS
1824*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_HDCP_REG_BASE, REG_HDCP_TX_MODE_01, 0x0C00, 0x0400);
1825*53ee8cc1Swenshuai.xi         else // DVI OESS
1826*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_HDCP_REG_BASE, REG_HDCP_TX_MODE_01, 0x0C00, 0x0000);
1827*53ee8cc1Swenshuai.xi         // HDCP encryption
1828*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_HDCP_REG_BASE, REG_HDCP_TX_COMMAND_02, 0x0008, 0x0008);
1829*53ee8cc1Swenshuai.xi     }
1830*53ee8cc1Swenshuai.xi     else // HDCP off
1831*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_HDCP_REG_BASE, REG_HDCP_TX_COMMAND_02, 0x0008, 0x0000);
1832*53ee8cc1Swenshuai.xi }
1833*53ee8cc1Swenshuai.xi 
1834*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1835*53ee8cc1Swenshuai.xi /// @brief This routine calculate check sum of infoframes.
1836*53ee8cc1Swenshuai.xi /// @param[in] packet_type packet type
1837*53ee8cc1Swenshuai.xi /// @return checksum
1838*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_InfoFrameCheckSum(MsHDMITX_PACKET_TYPE packet_type)1839*53ee8cc1Swenshuai.xi MS_U8 MHal_HDMITx_InfoFrameCheckSum(MsHDMITX_PACKET_TYPE packet_type)
1840*53ee8cc1Swenshuai.xi {
1841*53ee8cc1Swenshuai.xi     MS_U8 ucSumVal = 0;
1842*53ee8cc1Swenshuai.xi     MS_U8 i = 0;
1843*53ee8cc1Swenshuai.xi     MS_U8 j = 0;
1844*53ee8cc1Swenshuai.xi     MS_U16 wRegVal = 0;
1845*53ee8cc1Swenshuai.xi 
1846*53ee8cc1Swenshuai.xi     switch (packet_type)
1847*53ee8cc1Swenshuai.xi     {
1848*53ee8cc1Swenshuai.xi         case E_HDMITX_VS_INFOFRAME:
1849*53ee8cc1Swenshuai.xi             ucSumVal += (E_HDMITX_VS_INFOFRAME + HDMITX_VS_INFO_PKT_VER + HDMITX_VS_INFO_PKT_LEN);
1850*53ee8cc1Swenshuai.xi 
1851*53ee8cc1Swenshuai.xi             for ( i = 0; i < (HDMITX_VS_INFO_PKT_LEN + 1) >> 1; i++ )
1852*53ee8cc1Swenshuai.xi             {
1853*53ee8cc1Swenshuai.xi                 wRegVal = MHal_HDMITx_Read(HDMITX_REG_BASE, REG_PKT_VS_1_27 + i);
1854*53ee8cc1Swenshuai.xi 
1855*53ee8cc1Swenshuai.xi                 for ( j = 0; j < 2; j++ )
1856*53ee8cc1Swenshuai.xi                 {
1857*53ee8cc1Swenshuai.xi                     if ((i == 13) && (j==1))
1858*53ee8cc1Swenshuai.xi                     {
1859*53ee8cc1Swenshuai.xi                         ucSumVal += 0x00;
1860*53ee8cc1Swenshuai.xi                     }
1861*53ee8cc1Swenshuai.xi                     else
1862*53ee8cc1Swenshuai.xi                     {
1863*53ee8cc1Swenshuai.xi                         ucSumVal += (j % 2 == 0) ? ((MS_U8)(wRegVal & 0x00FF)) : ((MS_U8)((wRegVal & 0xFF00) >> 8));
1864*53ee8cc1Swenshuai.xi                     }
1865*53ee8cc1Swenshuai.xi                 }
1866*53ee8cc1Swenshuai.xi             }
1867*53ee8cc1Swenshuai.xi         break;
1868*53ee8cc1Swenshuai.xi 
1869*53ee8cc1Swenshuai.xi         case E_HDMITX_AVI_INFOFRAME:
1870*53ee8cc1Swenshuai.xi             ucSumVal += (E_HDMITX_AVI_INFOFRAME + HDMITX_AVI_INFO_PKT_VER + HDMITX_AVI_INFO_PKT_LEN);
1871*53ee8cc1Swenshuai.xi 
1872*53ee8cc1Swenshuai.xi             for ( i = 0; i < ((HDMITX_AVI_INFO_PKT_LEN + 1) >> 1); i++ )
1873*53ee8cc1Swenshuai.xi             {
1874*53ee8cc1Swenshuai.xi                 wRegVal = MHal_HDMITx_Read(HDMITX_REG_BASE, REG_PKT_AVI_1_09 + i);
1875*53ee8cc1Swenshuai.xi 
1876*53ee8cc1Swenshuai.xi                 for ( j = 0; j < 2; j++ )
1877*53ee8cc1Swenshuai.xi                 {
1878*53ee8cc1Swenshuai.xi                     if ((i == 1) && (j == 0)) // SC[1:0]
1879*53ee8cc1Swenshuai.xi                     {
1880*53ee8cc1Swenshuai.xi                         ucSumVal += (HDMITX_AVI_INFO_PKT_VER >= 0x02U) ? ((MS_U8)(wRegVal & 0x00FF)) : ((MS_U8)(wRegVal & 0x00FF) & 0x03);
1881*53ee8cc1Swenshuai.xi                     }
1882*53ee8cc1Swenshuai.xi                     else if ((i == 1) && (j == 1)) // VIC[6:0]
1883*53ee8cc1Swenshuai.xi                     {
1884*53ee8cc1Swenshuai.xi                         ucSumVal += ((HDMITX_AVI_INFO_PKT_VER >= 0x02U) ? ((MS_U8)((wRegVal & 0xFF00) >> 8) & 0x7F) : 0x00);
1885*53ee8cc1Swenshuai.xi                     }
1886*53ee8cc1Swenshuai.xi                     else if ((i == 2) && (j == 0)) // PR[3:0]
1887*53ee8cc1Swenshuai.xi                     {
1888*53ee8cc1Swenshuai.xi                         ucSumVal += (MS_U8)(wRegVal & 0x00FF); //bit 4:7 used for HDR; //ucSumVal += ((MS_U8)(wRegVal & 0x00FF) & 0x0F);
1889*53ee8cc1Swenshuai.xi                     }
1890*53ee8cc1Swenshuai.xi                     #if 0 //not resevered byte anymore; should be counted
1891*53ee8cc1Swenshuai.xi                     else if ((i == 2) && (j == 1)) // reserved
1892*53ee8cc1Swenshuai.xi                     {
1893*53ee8cc1Swenshuai.xi                         ucSumVal += 0x00;
1894*53ee8cc1Swenshuai.xi                     }
1895*53ee8cc1Swenshuai.xi                     #endif
1896*53ee8cc1Swenshuai.xi                     else if (( i == ((HDMITX_AVI_INFO_PKT_LEN + 1) >> 1) - 1)&&(j == 1))
1897*53ee8cc1Swenshuai.xi                     {
1898*53ee8cc1Swenshuai.xi                         ucSumVal += 0x00;
1899*53ee8cc1Swenshuai.xi                     }
1900*53ee8cc1Swenshuai.xi                     else
1901*53ee8cc1Swenshuai.xi                     {
1902*53ee8cc1Swenshuai.xi                         ucSumVal += (j % 2 == 0) ? ((MS_U8)(wRegVal & 0x00FF)) : ((MS_U8)((wRegVal & 0xFF00) >> 8));
1903*53ee8cc1Swenshuai.xi                     }
1904*53ee8cc1Swenshuai.xi                 }
1905*53ee8cc1Swenshuai.xi             }
1906*53ee8cc1Swenshuai.xi         break;
1907*53ee8cc1Swenshuai.xi 
1908*53ee8cc1Swenshuai.xi         case E_HDMITX_SPD_INFOFRAME:
1909*53ee8cc1Swenshuai.xi             ucSumVal += (E_HDMITX_SPD_INFOFRAME + HDMITX_SPD_INFO_PKT_VER + HDMITX_SPD_INFO_PKT_LEN);
1910*53ee8cc1Swenshuai.xi 
1911*53ee8cc1Swenshuai.xi             for ( i = 0; i < ((HDMITX_SPD_INFO_PKT_LEN+ 1) >> 1); i++ )
1912*53ee8cc1Swenshuai.xi             {
1913*53ee8cc1Swenshuai.xi                 wRegVal = MHal_HDMITx_Read(HDMITX_REG_BASE, REG_PKT_SPD_1_15 + i);
1914*53ee8cc1Swenshuai.xi 
1915*53ee8cc1Swenshuai.xi                 for ( j = 0; j < 2; j++ )
1916*53ee8cc1Swenshuai.xi                 {
1917*53ee8cc1Swenshuai.xi                     if ((i == 12) && (j == 0))
1918*53ee8cc1Swenshuai.xi                     {
1919*53ee8cc1Swenshuai.xi                         ucSumVal += (MS_U8)(wRegVal & 0x00FF);
1920*53ee8cc1Swenshuai.xi                     }
1921*53ee8cc1Swenshuai.xi                     else if ((i == 12) && (j == 1)) //reserved
1922*53ee8cc1Swenshuai.xi                     {
1923*53ee8cc1Swenshuai.xi                         ucSumVal += 0x00;
1924*53ee8cc1Swenshuai.xi                     }
1925*53ee8cc1Swenshuai.xi                     else
1926*53ee8cc1Swenshuai.xi                     {
1927*53ee8cc1Swenshuai.xi                         ucSumVal += (j % 2 == 0) ? ((MS_U8)(wRegVal & 0x00FF)) : ((MS_U8)((wRegVal & 0xFF00) >> 8));
1928*53ee8cc1Swenshuai.xi                     }
1929*53ee8cc1Swenshuai.xi                 }
1930*53ee8cc1Swenshuai.xi             }
1931*53ee8cc1Swenshuai.xi         break;
1932*53ee8cc1Swenshuai.xi 
1933*53ee8cc1Swenshuai.xi         case E_HDMITX_AUDIO_INFOFRAME:
1934*53ee8cc1Swenshuai.xi             ucSumVal += (E_HDMITX_AUDIO_INFOFRAME + HDMITX_AUD_INFO_PKT_VER + HDMITX_AUD_INFO_PKT_LEN);
1935*53ee8cc1Swenshuai.xi 
1936*53ee8cc1Swenshuai.xi             for ( i = 0; i < (((HDMITX_AUD_INFO_PKT_LEN >> 1) + 1) >> 1); i++ )
1937*53ee8cc1Swenshuai.xi             {
1938*53ee8cc1Swenshuai.xi                 wRegVal = MHal_HDMITx_Read(HDMITX_REG_BASE, REG_PKT_AUD_1_11 + i);
1939*53ee8cc1Swenshuai.xi 
1940*53ee8cc1Swenshuai.xi                 if (i == 1)
1941*53ee8cc1Swenshuai.xi                 {
1942*53ee8cc1Swenshuai.xi                     for ( j = 0; j < 2; j++ )
1943*53ee8cc1Swenshuai.xi                         ucSumVal += (j % 2 == 0) ? ((MS_U8)(wRegVal & 0x00FF)) : ((MS_U8)((wRegVal & 0xFF00) >> 8));
1944*53ee8cc1Swenshuai.xi                 }
1945*53ee8cc1Swenshuai.xi 
1946*53ee8cc1Swenshuai.xi                 if (i == 0)
1947*53ee8cc1Swenshuai.xi                 {
1948*53ee8cc1Swenshuai.xi                     for ( j = 0; j < 2; j++ )
1949*53ee8cc1Swenshuai.xi                         ucSumVal += ( (j % 2 == 0) ? ((MS_U8)(wRegVal & 0x00FF) & 0xF7) : (((MS_U8)(wRegVal & 0xFF00) >> 8) & 0x1F));
1950*53ee8cc1Swenshuai.xi                 }
1951*53ee8cc1Swenshuai.xi 
1952*53ee8cc1Swenshuai.xi                 if (i == 2)
1953*53ee8cc1Swenshuai.xi                 {
1954*53ee8cc1Swenshuai.xi                     for ( j = 0; j < 2; j++ )
1955*53ee8cc1Swenshuai.xi                         ucSumVal +=  ((j % 2 == 0) ? ((MS_U8)(wRegVal & 0x00FF) & 0xFB) : 0x00);
1956*53ee8cc1Swenshuai.xi                 }
1957*53ee8cc1Swenshuai.xi             }
1958*53ee8cc1Swenshuai.xi         break;
1959*53ee8cc1Swenshuai.xi 
1960*53ee8cc1Swenshuai.xi         case E_HDMITX_MPEG_INFOFRAME:
1961*53ee8cc1Swenshuai.xi             //TBD
1962*53ee8cc1Swenshuai.xi         break;
1963*53ee8cc1Swenshuai.xi 
1964*53ee8cc1Swenshuai.xi         case E_HDMITX_HDR_INFOFRAME:
1965*53ee8cc1Swenshuai.xi             {
1966*53ee8cc1Swenshuai.xi                 MS_U8 u8PktLen = 0x00;
1967*53ee8cc1Swenshuai.xi 
1968*53ee8cc1Swenshuai.xi                 u8PktLen = (MHal_HDMITx_Read(HDMITX_2_REG_BASE, REG_HDMI_2_CONFIG_1F) & 0xFF00) >> 8;
1969*53ee8cc1Swenshuai.xi                 ucSumVal += (E_HDMITX_HDR_INFOFRAME + (MS_U8)(MHal_HDMITx_Read(HDMITX_2_REG_BASE, REG_HDMI_2_CONFIG_1F) & 0x00FF) + u8PktLen);
1970*53ee8cc1Swenshuai.xi 
1971*53ee8cc1Swenshuai.xi                 for ( i = 0; i < ((u8PktLen + 1) >> 1); i++ )
1972*53ee8cc1Swenshuai.xi                 {
1973*53ee8cc1Swenshuai.xi                     wRegVal = MHal_HDMITx_Read(HDMITX_2_REG_BASE, REG_HDMI_2_CONFIG_10 + i);
1974*53ee8cc1Swenshuai.xi 
1975*53ee8cc1Swenshuai.xi                     for ( j = 0; j < 2; j++ )
1976*53ee8cc1Swenshuai.xi                     {
1977*53ee8cc1Swenshuai.xi                         if ((i == 0x0D) && (j % 2 == 0x00))
1978*53ee8cc1Swenshuai.xi                             ucSumVal += (j % 2 == 0) ? (MS_U8)(wRegVal & 0x00FF) : 0x00;
1979*53ee8cc1Swenshuai.xi                         else
1980*53ee8cc1Swenshuai.xi                             ucSumVal += (j % 2 == 0) ? ((MS_U8)(wRegVal & 0x00FF)) : ((MS_U8)((wRegVal & 0xFF00) >> 8));
1981*53ee8cc1Swenshuai.xi                     }
1982*53ee8cc1Swenshuai.xi                 }
1983*53ee8cc1Swenshuai.xi             }
1984*53ee8cc1Swenshuai.xi         break;
1985*53ee8cc1Swenshuai.xi 
1986*53ee8cc1Swenshuai.xi         default:
1987*53ee8cc1Swenshuai.xi         break;
1988*53ee8cc1Swenshuai.xi     }
1989*53ee8cc1Swenshuai.xi 
1990*53ee8cc1Swenshuai.xi     return (MS_U8)((~ucSumVal) + 0x01);
1991*53ee8cc1Swenshuai.xi 
1992*53ee8cc1Swenshuai.xi }
1993*53ee8cc1Swenshuai.xi 
1994*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1995*53ee8cc1Swenshuai.xi /// @brief This routine sets video output mode (color/repetition/regen)
1996*53ee8cc1Swenshuai.xi /// @param[in] idx: gHDMITxInfo.output_video_timing
1997*53ee8cc1Swenshuai.xi /// @return None
1998*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_SetVideoOutputMode(MsHDMITX_VIDEO_TIMING idx,MS_BOOL bflag,MsHDMITX_VIDEO_COLORDEPTH_VAL cd_val,MsHDMITX_ANALOG_TUNING * pInfo,MS_U8 ubSSCEn)1999*53ee8cc1Swenshuai.xi void MHal_HDMITx_SetVideoOutputMode(MsHDMITX_VIDEO_TIMING idx, MS_BOOL bflag, MsHDMITX_VIDEO_COLORDEPTH_VAL cd_val, MsHDMITX_ANALOG_TUNING *pInfo, MS_U8 ubSSCEn)
2000*53ee8cc1Swenshuai.xi {
2001*53ee8cc1Swenshuai.xi     //MS_U16 reg_value=0;
2002*53ee8cc1Swenshuai.xi     MS_U8 ubTimingChanged = TRUE;
2003*53ee8cc1Swenshuai.xi     MS_U8 ucCDIdx = 0;
2004*53ee8cc1Swenshuai.xi     MS_U16 wHfront = 0;
2005*53ee8cc1Swenshuai.xi     MS_U16 wVfront = 0;
2006*53ee8cc1Swenshuai.xi     MS_BOOL bIsHDMI20 = FALSE;
2007*53ee8cc1Swenshuai.xi     MS_BOOL bIs420Fmt = FALSE;
2008*53ee8cc1Swenshuai.xi     MS_BOOL bIsRPMode = FALSE;
2009*53ee8cc1Swenshuai.xi     MsHDMITX_VIDEO_TIMING eSize_idx = idx;
2010*53ee8cc1Swenshuai.xi     MS_U32 uiTMDSCLK = 0;
2011*53ee8cc1Swenshuai.xi 
2012*53ee8cc1Swenshuai.xi //wilson@kano:TBD
2013*53ee8cc1Swenshuai.xi     printf("video idx = 0x%X, color depth = 0x%X\r\n", idx, cd_val);
2014*53ee8cc1Swenshuai.xi     // Deep color FIFO reset
2015*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_HDMI_CONFIG1_00, BIT10, BIT10);
2016*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_HDMI_CONFIG1_00, BIT10, 0);
2017*53ee8cc1Swenshuai.xi     MsOS_DelayTask(10);
2018*53ee8cc1Swenshuai.xi 
2019*53ee8cc1Swenshuai.xi 
2020*53ee8cc1Swenshuai.xi 
2021*53ee8cc1Swenshuai.xi     ucCDIdx = (cd_val == 0)? 0x00 : (cd_val - 4);
2022*53ee8cc1Swenshuai.xi 
2023*53ee8cc1Swenshuai.xi     // Interlace mode
2024*53ee8cc1Swenshuai.xi     #if (defined(HDMITX_SUPPORT_P2I) && (HDMITX_SUPPORT_P2I == 1))
2025*53ee8cc1Swenshuai.xi     if (HDMITxVideoModeTbl[idx].i_p_mode == E_HDMITX_VIDEO_INTERLACE_MODE)
2026*53ee8cc1Swenshuai.xi     {
2027*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_2D, 0x0008, 0x0008);
2028*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_00, 0x017F, 0x005F);
2029*53ee8cc1Swenshuai.xi         //MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_17, 0x4000, 0x4000); //reg_interlace_mode_sel
2030*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_30, 0x0004, 0x0004); // PG interlace enable
2031*53ee8cc1Swenshuai.xi 
2032*53ee8cc1Swenshuai.xi         if(idx == E_HDMITX_RES_720x480i)
2033*53ee8cc1Swenshuai.xi         {
2034*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1B, 0x0040, 0x0040); //video clock div 2
2035*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_11, 0x0001, 0x0000); //PHY tmds clock div 2
2036*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_15, 0x7000, HDMITxVideo_OTMDS_ODATA_Ratio[ucCDIdx][idx] << 12);
2037*53ee8cc1Swenshuai.xi         }
2038*53ee8cc1Swenshuai.xi         else if(idx == E_HDMITX_RES_720x576i)
2039*53ee8cc1Swenshuai.xi         {
2040*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1B, 0x0040, 0x0040); //video clock div 2
2041*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_11, 0x0001, 0x0000); //PHY tmds clock div 2
2042*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_15, 0x7000, HDMITxVideo_OTMDS_ODATA_Ratio[ucCDIdx][idx] << 12);
2043*53ee8cc1Swenshuai.xi         }
2044*53ee8cc1Swenshuai.xi         else if(idx == E_HDMITX_RES_1920x1080i_50Hz)
2045*53ee8cc1Swenshuai.xi         {
2046*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1B, 0x01C0, 0x01C0); //video,pixel,tmds clock div 2
2047*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_11, 0x0001, 0x0001); //PHY tmds clock div 2
2048*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_15, 0x7000, HDMITxVideo_OTMDS_ODATA_Ratio[ucCDIdx][idx] << 12);
2049*53ee8cc1Swenshuai.xi         }
2050*53ee8cc1Swenshuai.xi         else if(idx == E_HDMITX_RES_1920x1080i_60Hz)
2051*53ee8cc1Swenshuai.xi         {
2052*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1B, 0x01C0, 0x01C0); //video,pixel,tmds clock div 2
2053*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_11, 0x0001, 0x0001); //PHY tmds clock div 2
2054*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_15, 0x7000, HDMITxVideo_OTMDS_ODATA_Ratio[ucCDIdx][idx] << 12);
2055*53ee8cc1Swenshuai.xi         }
2056*53ee8cc1Swenshuai.xi     }
2057*53ee8cc1Swenshuai.xi     else
2058*53ee8cc1Swenshuai.xi     {
2059*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_2D, 0x0008, 0x0008);
2060*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_00, 0x017F, 0x004E);
2061*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_17, 0x4000, 0x0000); //reg_interlace_mode_sel
2062*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_30, 0x0004, 0x0000); // PG interlace disable
2063*53ee8cc1Swenshuai.xi 
2064*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1B, 0x01C0, 0x0000); //video clock div 2
2065*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_11, 0x0001, 0x0000); //PHY tmds clock div 2
2066*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_15, 0x7000, HDMITxVideoAtopSetting[ucCDIdx][idx].TXPLL_DIVSEL_POST << 12);
2067*53ee8cc1Swenshuai.xi     }
2068*53ee8cc1Swenshuai.xi     #else
2069*53ee8cc1Swenshuai.xi     if (HDMITxVideoModeTbl[idx].i_p_mode == E_HDMITX_VIDEO_INTERLACE_MODE)
2070*53ee8cc1Swenshuai.xi     {
2071*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_00, 0x017F, 0x005F);
2072*53ee8cc1Swenshuai.xi         //MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_17, 0x4000, 0x4000); //reg_interlace_mode_sel
2073*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1B, 0x0040, 0x0040); //video clock div 2
2074*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_30, 0x0004, 0x0004); // PG interlace enable
2075*53ee8cc1Swenshuai.xi     }
2076*53ee8cc1Swenshuai.xi     else
2077*53ee8cc1Swenshuai.xi     {
2078*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_00, 0x017F, 0x004E);
2079*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_17, 0x4000, 0x0000); //reg_interlace_mode_sel
2080*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1B, 0x0040, 0x0000); //video clock div 2
2081*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_30, 0x0004, 0x0000); // PG interlace disable
2082*53ee8cc1Swenshuai.xi     }
2083*53ee8cc1Swenshuai.xi     #endif
2084*53ee8cc1Swenshuai.xi 
2085*53ee8cc1Swenshuai.xi     if ((gbInfoFrmPktList[E_HDMITX_AVI_INFOFRAME &(~0x80)].PktPara.AVIInfoPktPara.enColorFmt != E_HDMITX_VIDEO_COLOR_YUV420) &&
2086*53ee8cc1Swenshuai.xi         (
2087*53ee8cc1Swenshuai.xi             (idx == E_HDMITX_RES_3840x2160p_60Hz) || (idx == E_HDMITX_RES_3840x2160p_50Hz) || \
2088*53ee8cc1Swenshuai.xi             (idx == E_HDMITX_RES_4096x2160p_50Hz) || (idx == E_HDMITX_RES_4096x2160p_60Hz) || \
2089*53ee8cc1Swenshuai.xi             (
2090*53ee8cc1Swenshuai.xi                 (
2091*53ee8cc1Swenshuai.xi                     (idx == E_HDMITX_RES_1280x1470p_60Hz) || \
2092*53ee8cc1Swenshuai.xi                     (idx == E_HDMITX_RES_3840x2160p_24Hz) || \
2093*53ee8cc1Swenshuai.xi                     (idx == E_HDMITX_RES_3840x2160p_25Hz) || \
2094*53ee8cc1Swenshuai.xi                     (idx == E_HDMITX_RES_3840x2160p_30Hz) || \
2095*53ee8cc1Swenshuai.xi                     (idx == E_HDMITX_RES_4096x2160p_24Hz) || \
2096*53ee8cc1Swenshuai.xi                     (idx == E_HDMITX_RES_4096x2160p_25Hz) || \
2097*53ee8cc1Swenshuai.xi                     (idx == E_HDMITX_RES_4096x2160p_30Hz)
2098*53ee8cc1Swenshuai.xi 
2099*53ee8cc1Swenshuai.xi                 ) &&
2100*53ee8cc1Swenshuai.xi                 (
2101*53ee8cc1Swenshuai.xi                     (cd_val != E_HDMITX_VIDEO_CD_24Bits) && (cd_val != E_HDMITX_VIDEO_CD_NoID)
2102*53ee8cc1Swenshuai.xi                 )
2103*53ee8cc1Swenshuai.xi             )
2104*53ee8cc1Swenshuai.xi          ))
2105*53ee8cc1Swenshuai.xi         bIsHDMI20 = TRUE;
2106*53ee8cc1Swenshuai.xi 
2107*53ee8cc1Swenshuai.xi     if ((gbInfoFrmPktList[E_HDMITX_AVI_INFOFRAME &(~0x80)].PktPara.AVIInfoPktPara.enColorFmt == E_HDMITX_VIDEO_COLOR_YUV420) &&
2108*53ee8cc1Swenshuai.xi         ((idx == E_HDMITX_RES_3840x2160p_60Hz) || (idx == E_HDMITX_RES_3840x2160p_50Hz) || (idx == E_HDMITX_RES_4096x2160p_50Hz) || (idx == E_HDMITX_RES_4096x2160p_60Hz)) &&
2109*53ee8cc1Swenshuai.xi         (cd_val != E_HDMITX_VIDEO_CD_24Bits) && (cd_val != E_HDMITX_VIDEO_CD_NoID))
2110*53ee8cc1Swenshuai.xi         bIsHDMI20 = TRUE;
2111*53ee8cc1Swenshuai.xi 
2112*53ee8cc1Swenshuai.xi     if (g_bSupportSCDC == TRUE)
2113*53ee8cc1Swenshuai.xi     {
2114*53ee8cc1Swenshuai.xi         //for 2.0
2115*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_46, 0x0100, bIsHDMI20 ? 0x0100 : 0x00);
2116*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_52, BIT0, bIsHDMI20 ? BIT0 : 0x00);
2117*53ee8cc1Swenshuai.xi 
2118*53ee8cc1Swenshuai.xi         //scdc
2119*53ee8cc1Swenshuai.xi         if (bIsHDMI20 == TRUE)
2120*53ee8cc1Swenshuai.xi             Mhal_HDMITx_SCDCSetTmdsConfig(TRUE, TRUE);
2121*53ee8cc1Swenshuai.xi         else
2122*53ee8cc1Swenshuai.xi             Mhal_HDMITx_SCDCSetTmdsConfig(FALSE, FALSE);
2123*53ee8cc1Swenshuai.xi     }
2124*53ee8cc1Swenshuai.xi     else
2125*53ee8cc1Swenshuai.xi     {
2126*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_46, 0x0100, 0x00);
2127*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_52, BIT0, 0x00);
2128*53ee8cc1Swenshuai.xi     }
2129*53ee8cc1Swenshuai.xi 
2130*53ee8cc1Swenshuai.xi 
2131*53ee8cc1Swenshuai.xi     uiTMDSCLK = MHal_HDMITx_GetPixelClk_ByTiming(idx, gbInfoFrmPktList[E_HDMITX_AVI_INFOFRAME &(~0x80)].PktPara.AVIInfoPktPara.enColorFmt, cd_val);
2132*53ee8cc1Swenshuai.xi     uiTMDSCLK /= 1000;
2133*53ee8cc1Swenshuai.xi 
2134*53ee8cc1Swenshuai.xi     #if (defined(HDMITX_SUPPORT_444TO420) && (HDMITX_SUPPORT_444TO420 == 1))
2135*53ee8cc1Swenshuai.xi     if (gbInfoFrmPktList[E_HDMITX_AVI_INFOFRAME &(~0x80)].PktPara.AVIInfoPktPara.enColorFmt == E_HDMITX_VIDEO_COLOR_YUV420)
2136*53ee8cc1Swenshuai.xi     {
2137*53ee8cc1Swenshuai.xi         if(cd_val > E_HDMITX_VIDEO_CD_24Bits)
2138*53ee8cc1Swenshuai.xi         {
2139*53ee8cc1Swenshuai.xi             switch (idx)
2140*53ee8cc1Swenshuai.xi             {
2141*53ee8cc1Swenshuai.xi                 case E_HDMITX_RES_3840x2160p_50Hz:
2142*53ee8cc1Swenshuai.xi                     idx = E_HDMITX_RES_3840x2160p_25Hz;
2143*53ee8cc1Swenshuai.xi                     MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1B, 0x01C0, 0x0000); //video, pixel,tmds clock div 2 for 420
2144*53ee8cc1Swenshuai.xi                     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_11, 0x0001, 0x0000); //PHY tmds clock div 2
2145*53ee8cc1Swenshuai.xi                     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_15, 0x7000, HDMITxVideoAtopSetting[ucCDIdx][idx].TXPLL_DIVSEL_POST << 12);
2146*53ee8cc1Swenshuai.xi                 break;
2147*53ee8cc1Swenshuai.xi 
2148*53ee8cc1Swenshuai.xi                 case E_HDMITX_RES_3840x2160p_60Hz:
2149*53ee8cc1Swenshuai.xi                     idx = E_HDMITX_RES_3840x2160p_30Hz;
2150*53ee8cc1Swenshuai.xi                     MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1B, 0x01C0, 0x0000); //video, pixel,tmds clock div 2 for 420
2151*53ee8cc1Swenshuai.xi                     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_11, 0x0001, 0x0000); //PHY tmds clock div 2
2152*53ee8cc1Swenshuai.xi                     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_15, 0x7000, HDMITxVideoAtopSetting[ucCDIdx][idx].TXPLL_DIVSEL_POST << 12);
2153*53ee8cc1Swenshuai.xi                 break;
2154*53ee8cc1Swenshuai.xi 
2155*53ee8cc1Swenshuai.xi                 case E_HDMITX_RES_4096x2160p_50Hz:
2156*53ee8cc1Swenshuai.xi                     idx = E_HDMITX_RES_4096x2160p_25Hz;
2157*53ee8cc1Swenshuai.xi                     MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1B, 0x01C0, 0x0000); //video, pixel,tmds clock div 2 for 420
2158*53ee8cc1Swenshuai.xi                     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_11, 0x0001, 0x0000); //PHY tmds clock div 2
2159*53ee8cc1Swenshuai.xi                     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_15, 0x7000, HDMITxVideoAtopSetting[ucCDIdx][idx].TXPLL_DIVSEL_POST << 12);
2160*53ee8cc1Swenshuai.xi                 break;
2161*53ee8cc1Swenshuai.xi 
2162*53ee8cc1Swenshuai.xi                 case E_HDMITX_RES_4096x2160p_60Hz:
2163*53ee8cc1Swenshuai.xi                     idx = E_HDMITX_RES_4096x2160p_30Hz;
2164*53ee8cc1Swenshuai.xi                     MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1B, 0x01C0, 0x0000); //video, pixel,tmds clock div 2 for 420
2165*53ee8cc1Swenshuai.xi                     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_11, 0x0001, 0x0000); //PHY tmds clock div 2
2166*53ee8cc1Swenshuai.xi                     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_15, 0x7000, HDMITxVideoAtopSetting[ucCDIdx][idx].TXPLL_DIVSEL_POST << 12);
2167*53ee8cc1Swenshuai.xi                 break;
2168*53ee8cc1Swenshuai.xi 
2169*53ee8cc1Swenshuai.xi                 default:
2170*53ee8cc1Swenshuai.xi                     if( idx < E_HDMITX_RES_1920x1080p_50Hz)
2171*53ee8cc1Swenshuai.xi                     {
2172*53ee8cc1Swenshuai.xi                         printf("[HDMITX] Invalid Combination of Color Format & Video Timing, Keep Origional Timing Setting!!\r\n");
2173*53ee8cc1Swenshuai.xi                     }
2174*53ee8cc1Swenshuai.xi                     else
2175*53ee8cc1Swenshuai.xi                     {
2176*53ee8cc1Swenshuai.xi                         MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1B, 0x01C0, 0x01C0); //video, pixel,tmds clock div 2 for 420
2177*53ee8cc1Swenshuai.xi                         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_11, 0x0001, 0x0001); //PHY tmds clock div 2
2178*53ee8cc1Swenshuai.xi                         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_15, 0x7000, HDMITxVideo_OTMDS_ODATA_Ratio[ucCDIdx][idx] << 12);
2179*53ee8cc1Swenshuai.xi                     }
2180*53ee8cc1Swenshuai.xi                 break;
2181*53ee8cc1Swenshuai.xi             }
2182*53ee8cc1Swenshuai.xi         }
2183*53ee8cc1Swenshuai.xi         else
2184*53ee8cc1Swenshuai.xi         {
2185*53ee8cc1Swenshuai.xi             if( idx < E_HDMITX_RES_1920x1080p_50Hz)
2186*53ee8cc1Swenshuai.xi             {
2187*53ee8cc1Swenshuai.xi                 printf("[HDMITX] Invalid Combination of Color Format & Video Timing, Keep Origional Timing Setting!!\r\n");
2188*53ee8cc1Swenshuai.xi             }
2189*53ee8cc1Swenshuai.xi             else
2190*53ee8cc1Swenshuai.xi             {
2191*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1B, 0x01C0, 0x01C0); //video, pixel,tmds clock div 2 for 420
2192*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_11, 0x0001, 0x0001); //PHY tmds clock div 2
2193*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_15, 0x7000, HDMITxVideo_OTMDS_ODATA_Ratio[ucCDIdx][idx] << 12);
2194*53ee8cc1Swenshuai.xi             }
2195*53ee8cc1Swenshuai.xi         }
2196*53ee8cc1Swenshuai.xi 
2197*53ee8cc1Swenshuai.xi         bIs420Fmt = TRUE;
2198*53ee8cc1Swenshuai.xi         //MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1B, 0x0040, 0x0040); //video clock div 2 for 420
2199*53ee8cc1Swenshuai.xi 
2200*53ee8cc1Swenshuai.xi     }
2201*53ee8cc1Swenshuai.xi     else if (HDMITxVideoModeTbl[idx].i_p_mode != E_HDMITX_VIDEO_INTERLACE_MODE)//Not 420
2202*53ee8cc1Swenshuai.xi     {
2203*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1B, 0x01C0, 0x0000); //video, pixel,tmds clock div 2 for 420
2204*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_11, 0x0001, 0x0000); //PHY tmds clock div 2
2205*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_15, 0x7000, HDMITxVideoAtopSetting[ucCDIdx][idx].TXPLL_DIVSEL_POST << 12);
2206*53ee8cc1Swenshuai.xi     }
2207*53ee8cc1Swenshuai.xi     #else
2208*53ee8cc1Swenshuai.xi     if (gbInfoFrmPktList[E_HDMITX_AVI_INFOFRAME &(~0x80)].PktPara.AVIInfoPktPara.enColorFmt == E_HDMITX_VIDEO_COLOR_YUV420)
2209*53ee8cc1Swenshuai.xi     {
2210*53ee8cc1Swenshuai.xi         switch (idx)
2211*53ee8cc1Swenshuai.xi         {
2212*53ee8cc1Swenshuai.xi             case E_HDMITX_RES_3840x2160p_50Hz:
2213*53ee8cc1Swenshuai.xi                 idx = E_HDMITX_RES_3840x2160p_25Hz;
2214*53ee8cc1Swenshuai.xi             break;
2215*53ee8cc1Swenshuai.xi 
2216*53ee8cc1Swenshuai.xi             case E_HDMITX_RES_3840x2160p_60Hz:
2217*53ee8cc1Swenshuai.xi                 idx = E_HDMITX_RES_3840x2160p_30Hz;
2218*53ee8cc1Swenshuai.xi             break;
2219*53ee8cc1Swenshuai.xi 
2220*53ee8cc1Swenshuai.xi             case E_HDMITX_RES_4096x2160p_50Hz:
2221*53ee8cc1Swenshuai.xi                 idx = E_HDMITX_RES_4096x2160p_25Hz;
2222*53ee8cc1Swenshuai.xi             break;
2223*53ee8cc1Swenshuai.xi 
2224*53ee8cc1Swenshuai.xi             case E_HDMITX_RES_4096x2160p_60Hz:
2225*53ee8cc1Swenshuai.xi                 idx = E_HDMITX_RES_4096x2160p_30Hz;
2226*53ee8cc1Swenshuai.xi             break;
2227*53ee8cc1Swenshuai.xi 
2228*53ee8cc1Swenshuai.xi             default:
2229*53ee8cc1Swenshuai.xi                 printf("[HDMITX] Invalid Combination of Color Format & Video Timing, Keep Origional Timing Setting!!\r\n");
2230*53ee8cc1Swenshuai.xi             break;
2231*53ee8cc1Swenshuai.xi         }
2232*53ee8cc1Swenshuai.xi 
2233*53ee8cc1Swenshuai.xi         bIs420Fmt = TRUE;
2234*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_1B, 0x0040, 0x0040); //video clock div 2 for 420
2235*53ee8cc1Swenshuai.xi     }
2236*53ee8cc1Swenshuai.xi     #endif
2237*53ee8cc1Swenshuai.xi 
2238*53ee8cc1Swenshuai.xi     //Timing Changed Judgement
2239*53ee8cc1Swenshuai.xi     if( (MHal_HDMITx_Read(HDMITX_VIDEO_REG_BASE, REG_VE_STATUS_15) & 0x3FFF) == HDMITxVideoModeTbl[idx].vtotal)
2240*53ee8cc1Swenshuai.xi     {
2241*53ee8cc1Swenshuai.xi         if( MHal_HDMITx_Read(HDMITX_VIDEO_REG_BASE, REG_VE_STATUS_16) == HDMITxVideoModeTbl[idx].htotal)
2242*53ee8cc1Swenshuai.xi         {
2243*53ee8cc1Swenshuai.xi             MS_U32 uiSynthSet = 0;
2244*53ee8cc1Swenshuai.xi             uiSynthSet |= (MHal_HDMITx_Read(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_03) & 0x0FFF);
2245*53ee8cc1Swenshuai.xi             uiSynthSet = uiSynthSet << 16;
2246*53ee8cc1Swenshuai.xi             uiSynthSet |= MHal_HDMITx_Read(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_02);
2247*53ee8cc1Swenshuai.xi 
2248*53ee8cc1Swenshuai.xi 
2249*53ee8cc1Swenshuai.xi             if(uiSynthSet == HDMITxVideoAtopSetting[ucCDIdx][idx].SynthSSCSet)
2250*53ee8cc1Swenshuai.xi             {
2251*53ee8cc1Swenshuai.xi                 ubTimingChanged = FALSE;
2252*53ee8cc1Swenshuai.xi             }
2253*53ee8cc1Swenshuai.xi         }
2254*53ee8cc1Swenshuai.xi     }
2255*53ee8cc1Swenshuai.xi 
2256*53ee8cc1Swenshuai.xi     if((idx == E_HDMITX_RES_720x480i) || (idx == E_HDMITX_RES_720x576i))
2257*53ee8cc1Swenshuai.xi     {
2258*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_39, 0x00FF, 0x008B);
2259*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(CLKGEN0_REG_BASE, REG_CKG0_ODCLK_SOURCE, 0x000F, 0x0001);//Repetition times
2260*53ee8cc1Swenshuai.xi 
2261*53ee8cc1Swenshuai.xi         bIsRPMode = TRUE;
2262*53ee8cc1Swenshuai.xi     }
2263*53ee8cc1Swenshuai.xi     else
2264*53ee8cc1Swenshuai.xi     {
2265*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_39, 0x00FF, 0x00AC);
2266*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(CLKGEN0_REG_BASE, REG_CKG0_ODCLK_SOURCE, 0x000F, 0x0000);//Repetition times
2267*53ee8cc1Swenshuai.xi 
2268*53ee8cc1Swenshuai.xi         bIsRPMode = FALSE;
2269*53ee8cc1Swenshuai.xi     }
2270*53ee8cc1Swenshuai.xi 
2271*53ee8cc1Swenshuai.xi     //enable H, VSync regen
2272*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_01, 0x8001, 0x8001);
2273*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_01, 0x0002, HDMITxVideoModeTbl[idx].h_polarity ? 0x0002 : 0x0000);
2274*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_01, 0x0004, HDMITxVideoModeTbl[idx].v_polarity ? 0x0004 : 0x0000);
2275*53ee8cc1Swenshuai.xi 
2276*53ee8cc1Swenshuai.xi     //deep color setting
2277*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_HDMI_CONFIG1_00, 0x00C0, ucCDIdx << 6);
2278*53ee8cc1Swenshuai.xi 
2279*53ee8cc1Swenshuai.xi     //HDMITx phy clock
2280*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_10, 0xCC0C, 0x0000);
2281*53ee8cc1Swenshuai.xi 
2282*53ee8cc1Swenshuai.xi     #if( (!(defined(HDMITX_SUPPORT_444TO420) && (HDMITX_SUPPORT_444TO420 == 1))) && (!(defined(HDMITX_SUPPORT_P2I) && (HDMITX_SUPPORT_P2I == 1))) )
2283*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_15, 0x7000, HDMITxVideoAtopSetting[ucCDIdx][idx].TXPLL_DIVSEL_POST << 12);
2284*53ee8cc1Swenshuai.xi     #endif
2285*53ee8cc1Swenshuai.xi 
2286*53ee8cc1Swenshuai.xi     //sythesizer setting
2287*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_02, (MS_U16)(HDMITxVideoAtopSetting[ucCDIdx][idx].SynthSSCSet & 0x0000FFFF));
2288*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_03, 0x0FFF, (MS_U16)((HDMITxVideoAtopSetting[ucCDIdx][idx].SynthSSCSet & 0x0FFF0000) >> 16));
2289*53ee8cc1Swenshuai.xi 
2290*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_79, 0x1003, 0x0000);
2291*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_26, 0x0100, 0x0000);
2292*53ee8cc1Swenshuai.xi 
2293*53ee8cc1Swenshuai.xi     //atop
2294*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_38, 0x0003, HDMITxVideoAtopSetting[ucCDIdx][idx].MUX_DIVSEL_POST);
2295*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_3C, 0xC000, HDMITxVideoAtopSetting[ucCDIdx][idx].TXPLL_DIVSEL_POST << 14);
2296*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_3C, 0x3000, HDMITxVideoAtopSetting[ucCDIdx][idx].TXPLL_DIVSEL_PIXEL << 12);
2297*53ee8cc1Swenshuai.xi 
2298*53ee8cc1Swenshuai.xi #if 0
2299*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_34, 0x3F00, HDMITxVideoAtopSetting[ucCDIdx][idx].ICTRL_PREDRV_MAIN_L012 << 8);
2300*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_35, 0x3F00, HDMITxVideoAtopSetting[ucCDIdx][idx].ICTRL_PREDRV_MAIN_L012 << 8);
2301*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_35, 0x003F, HDMITxVideoAtopSetting[ucCDIdx][idx].ICTRL_PREDRV_MAIN_L012);
2302*53ee8cc1Swenshuai.xi #else //RD suggestion
2303*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_34, 0x3F00, 0x0000);
2304*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_35, 0x3F00, 0x0000);
2305*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_35, 0x003F, 0x0000);
2306*53ee8cc1Swenshuai.xi #endif
2307*53ee8cc1Swenshuai.xi 
2308*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_30, 0x3F00, HDMITxVideoAtopSetting[ucCDIdx][idx].ICTRL_DRV_MAIN_L012 << 8);
2309*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_31, 0x3F00, HDMITxVideoAtopSetting[ucCDIdx][idx].ICTRL_DRV_MAIN_L012 << 8);
2310*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_31, 0x003F, HDMITxVideoAtopSetting[ucCDIdx][idx].ICTRL_DRV_MAIN_L012);
2311*53ee8cc1Swenshuai.xi 
2312*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_3A, 0x000F, HDMITxVideoAtopSetting[ucCDIdx][idx].PD_RT);
2313*53ee8cc1Swenshuai.xi 
2314*53ee8cc1Swenshuai.xi 
2315*53ee8cc1Swenshuai.xi     // Timing regeneration
2316*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_17, BIT10|BIT13, 0x0000/*BIT10|BIT13*/); // 0: delay from DE end; 1: delay from end of h, v sync
2317*53ee8cc1Swenshuai.xi 
2318*53ee8cc1Swenshuai.xi     #if( (!(defined(HDMITX_SUPPORT_444TO420) && (HDMITX_SUPPORT_444TO420 == 1))) && (!(defined(HDMITX_SUPPORT_P2I) && (HDMITX_SUPPORT_P2I == 1))) )
2319*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_02, HDMITxVideoModeTbl[idx].vs_width);
2320*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_05, HDMITxVideoModeTbl[idx].vs_delayline);
2321*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_06, HDMITxVideoModeTbl[idx].vs_delaypixel);
2322*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_07, HDMITxVideoModeTbl[idx].hs_width >> (bIs420Fmt ? 0x01 : 0x00));
2323*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_0A, HDMITxVideoModeTbl[idx].hs_delay >> (bIs420Fmt ? 0x01 : 0x00));
2324*53ee8cc1Swenshuai.xi 
2325*53ee8cc1Swenshuai.xi     //for PG
2326*53ee8cc1Swenshuai.xi     wHfront = HDMITxVideoModeTbl[idx].hs_delay;
2327*53ee8cc1Swenshuai.xi     wVfront = HDMITxVideoModeTbl[idx].vs_delayline;
2328*53ee8cc1Swenshuai.xi 
2329*53ee8cc1Swenshuai.xi     //MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_30, 0x0003, 0x0003);
2330*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_31, (bIs420Fmt||bIsRPMode) ? (HDMITxVideoModeTbl[idx].hde_width/4 - 1) : (HDMITxVideoModeTbl[idx].hde_width/2 - 1));
2331*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_32, (bIs420Fmt||bIsRPMode) ?
2332*53ee8cc1Swenshuai.xi         ((HDMITxVideoModeTbl[idx].htotal - HDMITxVideoModeTbl[idx].hde_width)/4 - 1) : ((HDMITxVideoModeTbl[idx].htotal - HDMITxVideoModeTbl[idx].hde_width)/2 - 1));
2333*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_33, (bIs420Fmt||bIsRPMode) ? (wHfront/4 - 1) : (wHfront/2 - 1));
2334*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_34, (bIs420Fmt||bIsRPMode) ? (HDMITxVideoModeTbl[idx].hs_width/4 - 1) : (HDMITxVideoModeTbl[idx].hs_width/2 - 1));
2335*53ee8cc1Swenshuai.xi 
2336*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_35, HDMITxVideoModeTbl[idx].vde_width - 1);
2337*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_36, (HDMITxVideoModeTbl[idx].i_p_mode == E_HDMITX_VIDEO_INTERLACE_MODE) ?
2338*53ee8cc1Swenshuai.xi         ((HDMITxVideoModeTbl[idx].vtotal - HDMITxVideoModeTbl[idx].vde_width)/2 - 1) : (HDMITxVideoModeTbl[idx].vtotal - HDMITxVideoModeTbl[idx].vde_width - 1));
2339*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_37, wVfront - 1);
2340*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_38, HDMITxVideoModeTbl[idx].vs_width - 1);
2341*53ee8cc1Swenshuai.xi 
2342*53ee8cc1Swenshuai.xi     #else//444->420 || P2I
2343*53ee8cc1Swenshuai.xi 
2344*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_02, HDMITxVideoModeTbl[eSize_idx].vs_width);
2345*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_05, HDMITxVideoModeTbl[eSize_idx].vs_delayline);
2346*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_06, HDMITxVideoModeTbl[eSize_idx].vs_delaypixel);
2347*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_07, HDMITxVideoModeTbl[eSize_idx].hs_width >> (bIs420Fmt ? 0x01 : 0x00));
2348*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_0A, HDMITxVideoModeTbl[eSize_idx].hs_delay >> (bIs420Fmt ? 0x01 : 0x00));
2349*53ee8cc1Swenshuai.xi 
2350*53ee8cc1Swenshuai.xi     //for PG
2351*53ee8cc1Swenshuai.xi     wHfront = HDMITxVideoModeTbl[eSize_idx].hs_delay;
2352*53ee8cc1Swenshuai.xi     wVfront = HDMITxVideoModeTbl[eSize_idx].vs_delayline;
2353*53ee8cc1Swenshuai.xi 
2354*53ee8cc1Swenshuai.xi     //MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_30, 0x0003, 0x0003);
2355*53ee8cc1Swenshuai.xi     #if (defined(HDMITX_SUPPORT_444TO420) && (HDMITX_SUPPORT_444TO420 == 1))
2356*53ee8cc1Swenshuai.xi     if( ( (eSize_idx == E_HDMITX_RES_3840x2160p_60Hz) || (eSize_idx == E_HDMITX_RES_3840x2160p_50Hz) || \
2357*53ee8cc1Swenshuai.xi           (eSize_idx == E_HDMITX_RES_4096x2160p_50Hz) || (eSize_idx == E_HDMITX_RES_4096x2160p_60Hz)
2358*53ee8cc1Swenshuai.xi         ) && bIs420Fmt && (cd_val > E_HDMITX_VIDEO_CD_24Bits)
2359*53ee8cc1Swenshuai.xi        )//4K60 420
2360*53ee8cc1Swenshuai.xi     {
2361*53ee8cc1Swenshuai.xi         if( MHal_HDMITx_Read(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_31) != (HDMITxVideoModeTbl[eSize_idx].hde_width/4 - 1) )
2362*53ee8cc1Swenshuai.xi         {
2363*53ee8cc1Swenshuai.xi             if(ubTimingChanged == FALSE)
2364*53ee8cc1Swenshuai.xi             {
2365*53ee8cc1Swenshuai.xi                 ubTimingChanged = TRUE;
2366*53ee8cc1Swenshuai.xi             }
2367*53ee8cc1Swenshuai.xi         }
2368*53ee8cc1Swenshuai.xi 
2369*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_31, (HDMITxVideoModeTbl[eSize_idx].hde_width/4 - 1) );
2370*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_32, ((HDMITxVideoModeTbl[eSize_idx].htotal - HDMITxVideoModeTbl[eSize_idx].hde_width)/4 - 1) );
2371*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_33, (wHfront/4 - 1) );
2372*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_34, (HDMITxVideoModeTbl[eSize_idx].hs_width/4 - 1) );
2373*53ee8cc1Swenshuai.xi     }
2374*53ee8cc1Swenshuai.xi     else
2375*53ee8cc1Swenshuai.xi     {
2376*53ee8cc1Swenshuai.xi         if(bIsRPMode)
2377*53ee8cc1Swenshuai.xi         {
2378*53ee8cc1Swenshuai.xi             if( MHal_HDMITx_Read(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_31) != (HDMITxVideoModeTbl[eSize_idx].hde_width/4 - 1) )
2379*53ee8cc1Swenshuai.xi             {
2380*53ee8cc1Swenshuai.xi                 if(ubTimingChanged == FALSE)
2381*53ee8cc1Swenshuai.xi                 {
2382*53ee8cc1Swenshuai.xi                     ubTimingChanged = TRUE;
2383*53ee8cc1Swenshuai.xi                 }
2384*53ee8cc1Swenshuai.xi             }
2385*53ee8cc1Swenshuai.xi         }
2386*53ee8cc1Swenshuai.xi         else
2387*53ee8cc1Swenshuai.xi         {
2388*53ee8cc1Swenshuai.xi             if( MHal_HDMITx_Read(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_31) != (HDMITxVideoModeTbl[eSize_idx].hde_width/2 - 1) )
2389*53ee8cc1Swenshuai.xi             {
2390*53ee8cc1Swenshuai.xi                 if(ubTimingChanged == FALSE)
2391*53ee8cc1Swenshuai.xi                 {
2392*53ee8cc1Swenshuai.xi                     ubTimingChanged = TRUE;
2393*53ee8cc1Swenshuai.xi                 }
2394*53ee8cc1Swenshuai.xi             }
2395*53ee8cc1Swenshuai.xi         }
2396*53ee8cc1Swenshuai.xi 
2397*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_31, (bIsRPMode) ? (HDMITxVideoModeTbl[eSize_idx].hde_width/4 - 1) : (HDMITxVideoModeTbl[eSize_idx].hde_width/2 - 1));
2398*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_32, (bIsRPMode) ?
2399*53ee8cc1Swenshuai.xi             ((HDMITxVideoModeTbl[eSize_idx].htotal - HDMITxVideoModeTbl[eSize_idx].hde_width)/4 - 1) : ((HDMITxVideoModeTbl[eSize_idx].htotal - HDMITxVideoModeTbl[eSize_idx].hde_width)/2 - 1));
2400*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_33, (bIsRPMode) ? (wHfront/4 - 1) : (wHfront/2 - 1));
2401*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_34, (bIsRPMode) ? (HDMITxVideoModeTbl[eSize_idx].hs_width/4 - 1) : (HDMITxVideoModeTbl[eSize_idx].hs_width/2 - 1));
2402*53ee8cc1Swenshuai.xi     }
2403*53ee8cc1Swenshuai.xi     #else//Not 444->420
2404*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_31, (bIs420Fmt||bIsRPMode) ? (HDMITxVideoModeTbl[idx].hde_width/4 - 1) : (HDMITxVideoModeTbl[idx].hde_width/2 - 1));
2405*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_32, (bIs420Fmt||bIsRPMode) ?
2406*53ee8cc1Swenshuai.xi         ((HDMITxVideoModeTbl[idx].htotal - HDMITxVideoModeTbl[idx].hde_width)/4 - 1) : ((HDMITxVideoModeTbl[idx].htotal - HDMITxVideoModeTbl[idx].hde_width)/2 - 1));
2407*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_33, (bIs420Fmt||bIsRPMode) ? (wHfront/4 - 1) : (wHfront/2 - 1));
2408*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_34, (bIs420Fmt||bIsRPMode) ? (HDMITxVideoModeTbl[idx].hs_width/4 - 1) : (HDMITxVideoModeTbl[idx].hs_width/2 - 1));
2409*53ee8cc1Swenshuai.xi     #endif
2410*53ee8cc1Swenshuai.xi 
2411*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_35, HDMITxVideoModeTbl[eSize_idx].vde_width - 1);
2412*53ee8cc1Swenshuai.xi 
2413*53ee8cc1Swenshuai.xi     #if(defined(HDMITX_SUPPORT_P2I) && (HDMITX_SUPPORT_P2I == 1))
2414*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_36, (HDMITxVideoModeTbl[eSize_idx].vtotal - HDMITxVideoModeTbl[eSize_idx].vde_width - 1) );
2415*53ee8cc1Swenshuai.xi     #else
2416*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_36, (HDMITxVideoModeTbl[idx].i_p_mode == E_HDMITX_VIDEO_INTERLACE_MODE) ?
2417*53ee8cc1Swenshuai.xi         ((HDMITxVideoModeTbl[idx].vtotal - HDMITxVideoModeTbl[idx].vde_width)/2 - 1) : (HDMITxVideoModeTbl[idx].vtotal - HDMITxVideoModeTbl[idx].vde_width - 1));
2418*53ee8cc1Swenshuai.xi     #endif
2419*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_37, wVfront - 1);
2420*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_38, HDMITxVideoModeTbl[eSize_idx].vs_width - 1);
2421*53ee8cc1Swenshuai.xi 
2422*53ee8cc1Swenshuai.xi     //P2I Setting
2423*53ee8cc1Swenshuai.xi     #if(defined(HDMITX_SUPPORT_P2I) && (HDMITX_SUPPORT_P2I == 1))
2424*53ee8cc1Swenshuai.xi     if(HDMITxVideoModeTbl[idx].i_p_mode == E_HDMITX_VIDEO_INTERLACE_MODE)
2425*53ee8cc1Swenshuai.xi     {
2426*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_50, 0x000D, 0x000D);
2427*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_52, wVfront);
2428*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_53, HDMITxVideoModeTbl[eSize_idx].vs_width);
2429*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_54, bIsRPMode ? wHfront/2 : wHfront);
2430*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_55, wHfront ? HDMITxVideoModeTbl[eSize_idx].hs_width/2 : HDMITxVideoModeTbl[eSize_idx].hs_width);
2431*53ee8cc1Swenshuai.xi     }
2432*53ee8cc1Swenshuai.xi     else
2433*53ee8cc1Swenshuai.xi     {
2434*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_50, 0x000D, 0x0000);
2435*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_52, wVfront);
2436*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_53, HDMITxVideoModeTbl[eSize_idx].vs_width);
2437*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_54, bIsRPMode ? wHfront/2 : wHfront);
2438*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_55, wHfront ? HDMITxVideoModeTbl[eSize_idx].hs_width/2 : HDMITxVideoModeTbl[eSize_idx].hs_width);
2439*53ee8cc1Swenshuai.xi     }
2440*53ee8cc1Swenshuai.xi     #endif
2441*53ee8cc1Swenshuai.xi 
2442*53ee8cc1Swenshuai.xi     //444 -> 420
2443*53ee8cc1Swenshuai.xi     #if (defined(HDMITX_SUPPORT_444TO420) && (HDMITX_SUPPORT_444TO420 == 1))
2444*53ee8cc1Swenshuai.xi     if(bIs420Fmt)
2445*53ee8cc1Swenshuai.xi     {
2446*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_50, 0x0002, 0x0002);
2447*53ee8cc1Swenshuai.xi     }
2448*53ee8cc1Swenshuai.xi     else
2449*53ee8cc1Swenshuai.xi     {
2450*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_VIDEO_REG_BASE, REG_VE_CONFIG_50, 0x0002, 0x0000);
2451*53ee8cc1Swenshuai.xi     }
2452*53ee8cc1Swenshuai.xi     #endif///444->420
2453*53ee8cc1Swenshuai.xi 
2454*53ee8cc1Swenshuai.xi     #endif//!444->420 && !P2I
2455*53ee8cc1Swenshuai.xi 
2456*53ee8cc1Swenshuai.xi     MHal_HDMITx_EnableSSC(ubSSCEn, uiTMDSCLK);
2457*53ee8cc1Swenshuai.xi 
2458*53ee8cc1Swenshuai.xi     // fifo reset
2459*53ee8cc1Swenshuai.xi     if(ubTimingChanged)
2460*53ee8cc1Swenshuai.xi     {
2461*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_0F, 0x0008, 0x0008);
2462*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_0F, 0x0008, 0);
2463*53ee8cc1Swenshuai.xi     }
2464*53ee8cc1Swenshuai.xi }
2465*53ee8cc1Swenshuai.xi 
2466*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2467*53ee8cc1Swenshuai.xi /// @brief This routine will power on or off HDMITx clock (power saving)
2468*53ee8cc1Swenshuai.xi /// @param[in] bEnable: TRUE/FALSE
2469*53ee8cc1Swenshuai.xi /// @return None
2470*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_Power_OnOff(MS_BOOL bEnable)2471*53ee8cc1Swenshuai.xi void MHal_HDMITx_Power_OnOff(MS_BOOL bEnable)
2472*53ee8cc1Swenshuai.xi {
2473*53ee8cc1Swenshuai.xi     if (bEnable)
2474*53ee8cc1Swenshuai.xi     {
2475*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(CLKGEN1_REG_BASE, REG_CKG_HDMITx_CLK_28, BIT0, 0);
2476*53ee8cc1Swenshuai.xi     }
2477*53ee8cc1Swenshuai.xi     else
2478*53ee8cc1Swenshuai.xi     {
2479*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(CLKGEN1_REG_BASE, REG_CKG_HDMITx_CLK_28, BIT0, BIT0);
2480*53ee8cc1Swenshuai.xi     }
2481*53ee8cc1Swenshuai.xi }
2482*53ee8cc1Swenshuai.xi 
2483*53ee8cc1Swenshuai.xi 
MHal_HDMITx_RxBypass_Mode(MsHDMITX_INPUT_FREQ freq,MS_BOOL bflag)2484*53ee8cc1Swenshuai.xi MS_BOOL MHal_HDMITx_RxBypass_Mode(MsHDMITX_INPUT_FREQ freq, MS_BOOL bflag)
2485*53ee8cc1Swenshuai.xi {
2486*53ee8cc1Swenshuai.xi     //wilson@kano:TBD
2487*53ee8cc1Swenshuai.xi     #if 1
2488*53ee8cc1Swenshuai.xi     return FALSE;
2489*53ee8cc1Swenshuai.xi     #else
2490*53ee8cc1Swenshuai.xi     printf("[HDMITx] Bypass Mode = 0x%d\r\n", bflag);
2491*53ee8cc1Swenshuai.xi     if (bflag == TRUE)
2492*53ee8cc1Swenshuai.xi     {
2493*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMIRX_COMBOPHY1_REG_BASE, REG_COMBOPHY1_CONFIG_3C, BIT0, BIT0); //reg_atop_en_clko_vcodiv8_syn
2494*53ee8cc1Swenshuai.xi 
2495*53ee8cc1Swenshuai.xi         //Note: change frequency tolerance if need
2496*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMIRX_COMBOPHY0_REG_BASE, REG_COMBOPHY0_CONFIG_4C, 0xE000, 0xA000); //[13..15] reg_hdmi_clk_thr1 tolerance
2497*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMIRX_COMBOPHY0_REG_BASE, REG_COMBOPHY0_CONFIG_4B, 0xE000, 0xA000); //[13..15] reg_hdmi_clk_thr1 tolerance
2498*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMIRX_COMBOPHY0_REG_BASE, REG_COMBOPHY0_CONFIG_4A, 0xE000, 0xA000); //[13..15] reg_hdmi_clk_thr1 tolerance
2499*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMIRX_COMBOPHY0_REG_BASE, REG_COMBOPHY0_CONFIG_49, 0xE000, 0xA000); //[13..15] reg_hdmi_clk_thr1 tolerance
2500*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMIRX_COMBOPHY0_REG_BASE, REG_COMBOPHY0_CONFIG_09, 0xE000, 0xA000); //[13..15] reg_hdmi_clk_thr1 tolerance
2501*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMIRX_COMBOPHY0_REG_BASE, REG_COMBOPHY0_CONFIG_22, 0xE000, 0xA000); //[13..15] reg_hdmi_clk_thr1 tolerance
2502*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMIRX_COMBOPHY0_REG_BASE, REG_COMBOPHY0_CONFIG_49, 0x1FFF, 0x0C6A); //change 250Mhz -> 297Mhz
2503*53ee8cc1Swenshuai.xi 
2504*53ee8cc1Swenshuai.xi         //Enable Fifo and select input source
2505*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_10, 0x1919); //selct clock from Rx;
2506*53ee8cc1Swenshuai.xi 
2507*53ee8cc1Swenshuai.xi #if 0
2508*53ee8cc1Swenshuai.xi         if (MHal_HDMITx_Read(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_7A) & 0x00C0) //for HDMI 2.0 timing bypass mode
2509*53ee8cc1Swenshuai.xi         {
2510*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_11, BIT0, BIT0); //tmds clock div 2;
2511*53ee8cc1Swenshuai.xi         }
2512*53ee8cc1Swenshuai.xi #endif
2513*53ee8cc1Swenshuai.xi 
2514*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_16, 0x000E, 0x0004); //[1:0]: Lane 0 to fifo; [2]: enable
2515*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_17, 0x000E, 0x0005); //[1:0]: Lane 1 to fifo; [2]: enable
2516*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_18, 0x000E, 0x0006); //[1:0]: Lane 2 to fifo; [2]: enable
2517*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_19, 0x000E, 0x0007); //[1:0]: Lane 3 to fifo; [2]: enable
2518*53ee8cc1Swenshuai.xi 
2519*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_79, 0x1000, 0x1000); //bit repetition HW mode;
2520*53ee8cc1Swenshuai.xi 
2521*53ee8cc1Swenshuai.xi         //synthesizer setting //TBD
2522*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_10, 0x0001, 0x0001);
2523*53ee8cc1Swenshuai.xi         //ssc_set = 0x140000
2524*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_02, 0x0000); //ssc_set [15..0]
2525*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_03, 0x00FF, 0x0014);//ssc_set [7..0]
2526*53ee8cc1Swenshuai.xi 
2527*53ee8cc1Swenshuai.xi         #if 0 //with SSC clock
2528*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_05, 0xFFF0, ssc_step);
2529*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_06, 0x3000, ssc_span);
2530*53ee8cc1Swenshuai.xi         #else //without SSC clock
2531*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_05, 0xFFF0, 0x0000);
2532*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_06, 0x3FFF, 0x0000);
2533*53ee8cc1Swenshuai.xi         #endif
2534*53ee8cc1Swenshuai.xi 
2535*53ee8cc1Swenshuai.xi         //ATOP setting
2536*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_2E, 0xEA00, 0xEA00); //[9]:en_clk_pixel;[11]:en_clk_tmds;[13..15]:en_data_out
2537*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_39, 0xFFFF, 0x0000); //[11..0]: disable power down;[15:12]:pre-emphasis
2538*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_3A, 0x007F, 0x000F); //[3:0]:rterm turn off;[6:4]:disable power down
2539*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_79, 0x2001, 0x2001); //[0]:turn on HW mode; [13]: Rx to tmds bypass
2540*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_46, 0x0200, 0x0200); //[9] hdmi20 hw config mode;
2541*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_7E, 0x0200, 0x0200); //[9]: freq range tolerance up direction;
2542*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_60, 0x0001, 0x0001); //[0]: freq range reset follow rx big change;
2543*53ee8cc1Swenshuai.xi     }
2544*53ee8cc1Swenshuai.xi     else
2545*53ee8cc1Swenshuai.xi     {
2546*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMIRX_COMBOPHY1_REG_BASE, REG_COMBOPHY1_CONFIG_3C, BIT0, 0x0000);
2547*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_10, 0x1101); //selct clock from Rx;
2548*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_11, BIT0, 0x0000); //tmds clock div 2;
2549*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_79, 0x2001, 0x0000); //[0]:turn on HW mode; [13]: Rx to tmds bypass
2550*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_46, 0x0200, 0x0000); //[9] hdmi20 hw config mode;
2551*53ee8cc1Swenshuai.xi     }
2552*53ee8cc1Swenshuai.xi 
2553*53ee8cc1Swenshuai.xi     return TRUE;
2554*53ee8cc1Swenshuai.xi 
2555*53ee8cc1Swenshuai.xi     #endif
2556*53ee8cc1Swenshuai.xi }
2557*53ee8cc1Swenshuai.xi 
2558*53ee8cc1Swenshuai.xi 
2559*53ee8cc1Swenshuai.xi /// @brief This routine will disable TMDS clock, data, and DDC... bypass mode
2560*53ee8cc1Swenshuai.xi /// @return None
2561*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_Disable_RxBypass(void)2562*53ee8cc1Swenshuai.xi MS_BOOL MHal_HDMITx_Disable_RxBypass(void)
2563*53ee8cc1Swenshuai.xi {
2564*53ee8cc1Swenshuai.xi #if 1
2565*53ee8cc1Swenshuai.xi     return FALSE;
2566*53ee8cc1Swenshuai.xi #else
2567*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMIRX_COMBOPHY0_REG_BASE, REG_COMBOPHY1_CONFIG_3C, BIT0, 0x0000);
2568*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_10, 0x1101); //selct clock from Rx;
2569*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_11, BIT0, 0x0000); //tmds clock div 2;
2570*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_79, 0x2001, 0x0000); //[0]:turn on HW mode; [13]: Rx to tmds bypass
2571*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_46, 0x0200, 0x0000); //[9] hdmi20 hw config mode;
2572*53ee8cc1Swenshuai.xi 
2573*53ee8cc1Swenshuai.xi     return TRUE;
2574*53ee8cc1Swenshuai.xi #endif
2575*53ee8cc1Swenshuai.xi }
2576*53ee8cc1Swenshuai.xi 
2577*53ee8cc1Swenshuai.xi 
2578*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2579*53ee8cc1Swenshuai.xi /// @brief This routine will set GPIO pin for HPD
2580*53ee8cc1Swenshuai.xi /// @param[in] u8pin: GPIO0 ~ 12
2581*53ee8cc1Swenshuai.xi /// @return None
2582*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_SetHPDGpioPin(MS_U8 u8pin)2583*53ee8cc1Swenshuai.xi void MHal_HDMITx_SetHPDGpioPin(MS_U8 u8pin)
2584*53ee8cc1Swenshuai.xi {
2585*53ee8cc1Swenshuai.xi     printf("_gHPDGpioPin = 0x%X\r\n", u8pin);
2586*53ee8cc1Swenshuai.xi     _gHPDGpioPin = u8pin;
2587*53ee8cc1Swenshuai.xi }
2588*53ee8cc1Swenshuai.xi 
2589*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
2590*53ee8cc1Swenshuai.xi /// @brief This routine return CHIP capability of DVI mode
2591*53ee8cc1Swenshuai.xi /// @return TRUE, FALSE
2592*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MHal_HDMITx_IsSupportDVIMode(void)2593*53ee8cc1Swenshuai.xi MS_BOOL MHal_HDMITx_IsSupportDVIMode(void)
2594*53ee8cc1Swenshuai.xi {
2595*53ee8cc1Swenshuai.xi     return TRUE;
2596*53ee8cc1Swenshuai.xi }
2597*53ee8cc1Swenshuai.xi 
2598*53ee8cc1Swenshuai.xi // *************  For customer NDS **************//
2599*53ee8cc1Swenshuai.xi 
MHal_HDMITx_Set_AVI_InfoFrame(MsHDMITX_PACKET_PROCESS packet_process,MsHDMITX_AVI_CONTENT_TYPE content_type,MS_U16 * data)2600*53ee8cc1Swenshuai.xi void MHal_HDMITx_Set_AVI_InfoFrame(MsHDMITX_PACKET_PROCESS packet_process, MsHDMITX_AVI_CONTENT_TYPE content_type, MS_U16 *data)
2601*53ee8cc1Swenshuai.xi {
2602*53ee8cc1Swenshuai.xi     MS_U16 tmp_value=0;
2603*53ee8cc1Swenshuai.xi 
2604*53ee8cc1Swenshuai.xi     if (IS_STOP_PKT(packet_process))   // Stop sending packet
2605*53ee8cc1Swenshuai.xi     {
2606*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_CFG_10, 0x0005, 0x0000);  // Stop AVI packet
2607*53ee8cc1Swenshuai.xi     }
2608*53ee8cc1Swenshuai.xi     else
2609*53ee8cc1Swenshuai.xi     {
2610*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_1_09, 0x0080, 0x80); // EIA version 2
2611*53ee8cc1Swenshuai.xi         switch(content_type)
2612*53ee8cc1Swenshuai.xi         {
2613*53ee8cc1Swenshuai.xi             case E_HDMITX_AVI_PIXEL_FROMAT:
2614*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_1_09, 0x0060, *data);
2615*53ee8cc1Swenshuai.xi 				break;
2616*53ee8cc1Swenshuai.xi             case E_HDMITX_AVI_ASPECT_RATIO:
2617*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_1_09, 0x3F1F, *data);
2618*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_2_0A, 0x0003, *(data+1));
2619*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_4_0C, 0xFFFF, *(data+2));
2620*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_5_0D, 0xFFFF, *(data+3));
2621*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_6_0E, 0xFFFF, *(data+4));
2622*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_7_0F, 0xFFFF, *(data+5));
2623*53ee8cc1Swenshuai.xi                 break;
2624*53ee8cc1Swenshuai.xi             case E_HDMITX_AVI_COLORIMETRY:
2625*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_1_09, 0xC000, *data);
2626*53ee8cc1Swenshuai.xi                 MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_2_0A, 0x0030, *(data+1));
2627*53ee8cc1Swenshuai.xi                 break;
2628*53ee8cc1Swenshuai.xi             default:
2629*53ee8cc1Swenshuai.xi                 break;
2630*53ee8cc1Swenshuai.xi         }
2631*53ee8cc1Swenshuai.xi 
2632*53ee8cc1Swenshuai.xi         tmp_value = MHal_HDMITx_InfoFrameCheckSum(E_HDMITX_AVI_INFOFRAME);  // Checksum
2633*53ee8cc1Swenshuai.xi         // cyclic packet
2634*53ee8cc1Swenshuai.xi         if (IS_CYCLIC_PKT(packet_process))
2635*53ee8cc1Swenshuai.xi             MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_AVI_CFG_10, ( (tmp_value<<8) | (HDMITX_PACKET_AVI_FCNT<<3) | 0x0005));  // send AVI packet
2636*53ee8cc1Swenshuai.xi         // single packet
2637*53ee8cc1Swenshuai.xi         else
2638*53ee8cc1Swenshuai.xi         {
2639*53ee8cc1Swenshuai.xi             MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_AVI_CFG_10, (tmp_value<<8) | 0x0001);
2640*53ee8cc1Swenshuai.xi             MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_ACT_HDMI_PKTS_CMD_01, 0x03FF, 1<<E_HDMITX_ACT_AVI_CMD);
2641*53ee8cc1Swenshuai.xi         }
2642*53ee8cc1Swenshuai.xi     }
2643*53ee8cc1Swenshuai.xi }
2644*53ee8cc1Swenshuai.xi 
2645*53ee8cc1Swenshuai.xi //wilson@kano
2646*53ee8cc1Swenshuai.xi //**************************************************************************
2647*53ee8cc1Swenshuai.xi //  [Function Name]:
2648*53ee8cc1Swenshuai.xi //                      MHal_HDMITx_SetGCPParameter()
2649*53ee8cc1Swenshuai.xi //  [Description]:
2650*53ee8cc1Swenshuai.xi //                      setting General Control packet attribute
2651*53ee8cc1Swenshuai.xi //  [Arguments]:
2652*53ee8cc1Swenshuai.xi //                      [stGC_PktPara] stPktPara
2653*53ee8cc1Swenshuai.xi //  [Return]:
2654*53ee8cc1Swenshuai.xi //                      void
2655*53ee8cc1Swenshuai.xi //
2656*53ee8cc1Swenshuai.xi //**************************************************************************
MHal_HDMITx_SetGCPParameter(stGC_PktPara stPktPara)2657*53ee8cc1Swenshuai.xi void MHal_HDMITx_SetGCPParameter(stGC_PktPara stPktPara)
2658*53ee8cc1Swenshuai.xi {
2659*53ee8cc1Swenshuai.xi     gbGeneralPktList[E_HDMITX_GC_PACKET].PktPara.GCPktPara.enAVMute = stPktPara.enAVMute;
2660*53ee8cc1Swenshuai.xi     gbGeneralPktList[E_HDMITX_GC_PACKET].PktPara.GCPktPara.enColorDepInfo = stPktPara.enColorDepInfo;
2661*53ee8cc1Swenshuai.xi }
2662*53ee8cc1Swenshuai.xi 
2663*53ee8cc1Swenshuai.xi //**************************************************************************
2664*53ee8cc1Swenshuai.xi //  [Function Name]:
2665*53ee8cc1Swenshuai.xi //                      MHal_HDMITx_SetPktAttribute()
2666*53ee8cc1Swenshuai.xi //  [Description]:
2667*53ee8cc1Swenshuai.xi //                      configure settings to corresponding packet
2668*53ee8cc1Swenshuai.xi //  [Arguments]:
2669*53ee8cc1Swenshuai.xi //                      [MsHDMITX_PACKET_TYPE] enPktType
2670*53ee8cc1Swenshuai.xi //                      [MS_BOOL] bEnUserDef
2671*53ee8cc1Swenshuai.xi //                      [MS_U8] u8FrmCntNum
2672*53ee8cc1Swenshuai.xi //                      [MsHDMITX_PACKET_PROCESS] enPktCtrl
2673*53ee8cc1Swenshuai.xi //  [Return]:
2674*53ee8cc1Swenshuai.xi //                      void
2675*53ee8cc1Swenshuai.xi //
2676*53ee8cc1Swenshuai.xi //**************************************************************************
MHal_HDMITx_SetPktAttribute(MsHDMITX_PACKET_TYPE enPktType,MS_BOOL bEnUserDef,MS_U8 u8FrmCntNum,MsHDMITX_PACKET_PROCESS enPktCtrl)2677*53ee8cc1Swenshuai.xi void MHal_HDMITx_SetPktAttribute(MsHDMITX_PACKET_TYPE enPktType, MS_BOOL bEnUserDef, MS_U8 u8FrmCntNum, MsHDMITX_PACKET_PROCESS enPktCtrl)
2678*53ee8cc1Swenshuai.xi {
2679*53ee8cc1Swenshuai.xi 	if (enPktType & 0x80) //infoframe packet type
2680*53ee8cc1Swenshuai.xi 	{
2681*53ee8cc1Swenshuai.xi 		gbInfoFrmPktList[enPktType & (~0x80)].EnableUserDef = bEnUserDef;
2682*53ee8cc1Swenshuai.xi 		gbInfoFrmPktList[enPktType & (~0x80)].FrmCntNum = u8FrmCntNum;
2683*53ee8cc1Swenshuai.xi 		gbInfoFrmPktList[enPktType & (~0x80)].enPktCtrl = enPktCtrl;
2684*53ee8cc1Swenshuai.xi 	}
2685*53ee8cc1Swenshuai.xi 	else
2686*53ee8cc1Swenshuai.xi 	{
2687*53ee8cc1Swenshuai.xi 		gbGeneralPktList[enPktType].EnableUserDef = bEnUserDef;
2688*53ee8cc1Swenshuai.xi 		gbGeneralPktList[enPktType].FrmCntNum = u8FrmCntNum;
2689*53ee8cc1Swenshuai.xi 		gbGeneralPktList[enPktType].enPktCtrl = enPktCtrl;
2690*53ee8cc1Swenshuai.xi 	}
2691*53ee8cc1Swenshuai.xi }
2692*53ee8cc1Swenshuai.xi 
2693*53ee8cc1Swenshuai.xi //**************************************************************************
2694*53ee8cc1Swenshuai.xi //  [Function Name]:
2695*53ee8cc1Swenshuai.xi //                      MHal_HDMITx_SetAVIInfoParameter()
2696*53ee8cc1Swenshuai.xi //  [Description]:
2697*53ee8cc1Swenshuai.xi //                      Assign content to AVI Infoframe packet
2698*53ee8cc1Swenshuai.xi //  [Arguments]:
2699*53ee8cc1Swenshuai.xi //                      [stAVIInfo_PktPara] stPktPara
2700*53ee8cc1Swenshuai.xi //  [Return]:
2701*53ee8cc1Swenshuai.xi //                      void
2702*53ee8cc1Swenshuai.xi //
2703*53ee8cc1Swenshuai.xi //**************************************************************************
MHal_HDMITx_SetAVIInfoParameter(stAVIInfo_PktPara stPktPara)2704*53ee8cc1Swenshuai.xi void MHal_HDMITx_SetAVIInfoParameter(stAVIInfo_PktPara stPktPara)
2705*53ee8cc1Swenshuai.xi {
2706*53ee8cc1Swenshuai.xi 	gbInfoFrmPktList[E_HDMITX_AVI_INFOFRAME & (~0x80)].PktPara.AVIInfoPktPara.A0Value = stPktPara.A0Value;
2707*53ee8cc1Swenshuai.xi 	gbInfoFrmPktList[E_HDMITX_AVI_INFOFRAME & (~0x80)].PktPara.AVIInfoPktPara.enableAFDoverWrite = stPktPara.enableAFDoverWrite;
2708*53ee8cc1Swenshuai.xi 	gbInfoFrmPktList[E_HDMITX_AVI_INFOFRAME & (~0x80)].PktPara.AVIInfoPktPara.enColorFmt = stPktPara.enColorFmt;
2709*53ee8cc1Swenshuai.xi 	gbInfoFrmPktList[E_HDMITX_AVI_INFOFRAME & (~0x80)].PktPara.AVIInfoPktPara.enColorimetry = stPktPara.enColorimetry;
2710*53ee8cc1Swenshuai.xi     gbInfoFrmPktList[E_HDMITX_AVI_INFOFRAME & (~0x80)].PktPara.AVIInfoPktPara.enExtColorimetry = stPktPara.enExtColorimetry;
2711*53ee8cc1Swenshuai.xi     gbInfoFrmPktList[E_HDMITX_AVI_INFOFRAME & (~0x80)].PktPara.AVIInfoPktPara.enYCCQuantRange = stPktPara.enYCCQuantRange;
2712*53ee8cc1Swenshuai.xi 	gbInfoFrmPktList[E_HDMITX_AVI_INFOFRAME & (~0x80)].PktPara.AVIInfoPktPara.enVidTiming = stPktPara.enVidTiming;
2713*53ee8cc1Swenshuai.xi 	gbInfoFrmPktList[E_HDMITX_AVI_INFOFRAME & (~0x80)].PktPara.AVIInfoPktPara.enAFDRatio = stPktPara.enAFDRatio;
2714*53ee8cc1Swenshuai.xi 	gbInfoFrmPktList[E_HDMITX_AVI_INFOFRAME & (~0x80)].PktPara.AVIInfoPktPara.enScanInfo = stPktPara.enScanInfo;
2715*53ee8cc1Swenshuai.xi 	gbInfoFrmPktList[E_HDMITX_AVI_INFOFRAME & (~0x80)].PktPara.AVIInfoPktPara.enAspectRatio = stPktPara.enAspectRatio;
2716*53ee8cc1Swenshuai.xi }
2717*53ee8cc1Swenshuai.xi 
2718*53ee8cc1Swenshuai.xi //**************************************************************************
2719*53ee8cc1Swenshuai.xi //  [Function Name]:
2720*53ee8cc1Swenshuai.xi //                      MHal_HDMITx_SetVSInfoParameter()
2721*53ee8cc1Swenshuai.xi //  [Description]:
2722*53ee8cc1Swenshuai.xi //                      Assign content to VendorSpecific Infoframe packet
2723*53ee8cc1Swenshuai.xi //  [Arguments]:
2724*53ee8cc1Swenshuai.xi //                      [stVSInfo_PktPara] stPketPara
2725*53ee8cc1Swenshuai.xi //  [Return]:
2726*53ee8cc1Swenshuai.xi //                      void
2727*53ee8cc1Swenshuai.xi //
2728*53ee8cc1Swenshuai.xi //**************************************************************************
MHal_HDMITx_SetVSInfoParameter(stVSInfo_PktPara stPktPara)2729*53ee8cc1Swenshuai.xi void MHal_HDMITx_SetVSInfoParameter(stVSInfo_PktPara stPktPara)
2730*53ee8cc1Swenshuai.xi {
2731*53ee8cc1Swenshuai.xi 	gbInfoFrmPktList[E_HDMITX_VS_INFOFRAME & (~0x80)].PktPara.VSInfoPktPara.en3DStruct = stPktPara.en3DStruct;
2732*53ee8cc1Swenshuai.xi 	gbInfoFrmPktList[E_HDMITX_VS_INFOFRAME & (~0x80)].PktPara.VSInfoPktPara.en4k2kVIC = stPktPara.en4k2kVIC;
2733*53ee8cc1Swenshuai.xi 	gbInfoFrmPktList[E_HDMITX_VS_INFOFRAME & (~0x80)].PktPara.VSInfoPktPara.enVSFmt = stPktPara.enVSFmt;
2734*53ee8cc1Swenshuai.xi }
2735*53ee8cc1Swenshuai.xi 
2736*53ee8cc1Swenshuai.xi //**************************************************************************
2737*53ee8cc1Swenshuai.xi //  [Function Name]:
2738*53ee8cc1Swenshuai.xi //                      MHal_HDMITx_SetVSInfoParameter()
2739*53ee8cc1Swenshuai.xi //  [Description]:
2740*53ee8cc1Swenshuai.xi //                      Assign content to VendorSpecific Infoframe packet
2741*53ee8cc1Swenshuai.xi //  [Arguments]:
2742*53ee8cc1Swenshuai.xi //                      [stVSInfo_PktPara] stPketPara
2743*53ee8cc1Swenshuai.xi //  [Return]:
2744*53ee8cc1Swenshuai.xi //                      void
2745*53ee8cc1Swenshuai.xi //
2746*53ee8cc1Swenshuai.xi //**************************************************************************
MHal_HDMITx_SetAudioInfoParameter(stAUDInfo_PktPara stPktPara)2747*53ee8cc1Swenshuai.xi void MHal_HDMITx_SetAudioInfoParameter(stAUDInfo_PktPara stPktPara)
2748*53ee8cc1Swenshuai.xi {
2749*53ee8cc1Swenshuai.xi 	gbInfoFrmPktList[E_HDMITX_AUDIO_INFOFRAME & (~0x80)].PktPara.AUDInfoPktPara.enAudChCnt = stPktPara.enAudChCnt;
2750*53ee8cc1Swenshuai.xi 	gbInfoFrmPktList[E_HDMITX_AUDIO_INFOFRAME & (~0x80)].PktPara.AUDInfoPktPara.enAudType = stPktPara.enAudType;
2751*53ee8cc1Swenshuai.xi 	gbInfoFrmPktList[E_HDMITX_AUDIO_INFOFRAME & (~0x80)].PktPara.AUDInfoPktPara.enAudFreq = stPktPara.enAudFreq;
2752*53ee8cc1Swenshuai.xi }
2753*53ee8cc1Swenshuai.xi 
2754*53ee8cc1Swenshuai.xi //**************************************************************************
2755*53ee8cc1Swenshuai.xi //  [Function Name]:
2756*53ee8cc1Swenshuai.xi //                      MHal_HDMITx_SendPacket()
2757*53ee8cc1Swenshuai.xi //  [Description]:
2758*53ee8cc1Swenshuai.xi //                      configure  packet content and process according to user define or defalut setting
2759*53ee8cc1Swenshuai.xi //  [Arguments]:
2760*53ee8cc1Swenshuai.xi //                      [MsHDMITX_PACKET_TYPE] enPktType
2761*53ee8cc1Swenshuai.xi //  [Return]:
2762*53ee8cc1Swenshuai.xi //                      void
2763*53ee8cc1Swenshuai.xi //
2764*53ee8cc1Swenshuai.xi //**************************************************************************
MHal_HDMITx_SendPacket(MsHDMITX_PACKET_TYPE enPktType,MsHDMITX_PACKET_PROCESS packet_process)2765*53ee8cc1Swenshuai.xi void MHal_HDMITx_SendPacket(MsHDMITX_PACKET_TYPE enPktType, MsHDMITX_PACKET_PROCESS packet_process)
2766*53ee8cc1Swenshuai.xi {
2767*53ee8cc1Swenshuai.xi 	if (enPktType & 0x80) //info frame packet
2768*53ee8cc1Swenshuai.xi 	{
2769*53ee8cc1Swenshuai.xi 		MS_U8 ucInfoPktType = enPktType & (~0x80);
2770*53ee8cc1Swenshuai.xi 		MS_U8 ucChkSum = 0;
2771*53ee8cc1Swenshuai.xi 
2772*53ee8cc1Swenshuai.xi         gbInfoFrmPktList[ucInfoPktType].enPktCtrl = packet_process;
2773*53ee8cc1Swenshuai.xi 
2774*53ee8cc1Swenshuai.xi 		switch (enPktType)
2775*53ee8cc1Swenshuai.xi 		{
2776*53ee8cc1Swenshuai.xi 			case E_HDMITX_VS_INFOFRAME:
2777*53ee8cc1Swenshuai.xi 				if (gbInfoFrmPktList[ucInfoPktType].enPktCtrl == E_HDMITX_STOP_PACKET)
2778*53ee8cc1Swenshuai.xi 				{
2779*53ee8cc1Swenshuai.xi 					MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_VS_CFG_35, 0x0005, 0x0000);
2780*53ee8cc1Swenshuai.xi 				}
2781*53ee8cc1Swenshuai.xi 				else
2782*53ee8cc1Swenshuai.xi 				{
2783*53ee8cc1Swenshuai.xi 					if (gbInfoFrmPktList[ucInfoPktType].EnableUserDef == TRUE)
2784*53ee8cc1Swenshuai.xi 					{
2785*53ee8cc1Swenshuai.xi 						ucChkSum = MHal_HDMITx_InfoFrameCheckSum(E_HDMITX_VS_INFOFRAME);
2786*53ee8cc1Swenshuai.xi 
2787*53ee8cc1Swenshuai.xi 						if (gbInfoFrmPktList[ucInfoPktType].enPktCtrl == E_HDMITX_SEND_PACKET) //single
2788*53ee8cc1Swenshuai.xi 						{
2789*53ee8cc1Swenshuai.xi 							MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_VS_CFG_35, (ucChkSum << 8) | 0x0001);
2790*53ee8cc1Swenshuai.xi                             MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_ACT_HDMI_PKTS_CMD_01, 0x03FF, 1 << E_HDMITX_ACT_VSP_CMD);
2791*53ee8cc1Swenshuai.xi 						}
2792*53ee8cc1Swenshuai.xi 						else
2793*53ee8cc1Swenshuai.xi 						{
2794*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_VS_CFG_35, ((ucChkSum<<8) | (gbGeneralPktList[ucInfoPktType].FrmCntNum << 3) | 0x0005));
2795*53ee8cc1Swenshuai.xi 						}
2796*53ee8cc1Swenshuai.xi 					}
2797*53ee8cc1Swenshuai.xi 					else
2798*53ee8cc1Swenshuai.xi 					{
2799*53ee8cc1Swenshuai.xi 						//fill IEEE HDMI tag
2800*53ee8cc1Swenshuai.xi 						MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_VS_1_27, 0xFFFF, 0x0C03);
2801*53ee8cc1Swenshuai.xi 
2802*53ee8cc1Swenshuai.xi 						//check content
2803*53ee8cc1Swenshuai.xi 						if (gbInfoFrmPktList[ucInfoPktType].PktPara.VSInfoPktPara.enVSFmt == E_HDMITX_VIDEO_VS_3D)
2804*53ee8cc1Swenshuai.xi 						{
2805*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_VS_2_28, 0xE000, E_HDMITX_VIDEO_VS_3D << 13);  // video format
2806*53ee8cc1Swenshuai.xi                             MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_VS_3_29, 0x00FF, (gbInfoFrmPktList[ucInfoPktType].PktPara.VSInfoPktPara.en3DStruct) << 4);  // 3D structure
2807*53ee8cc1Swenshuai.xi 						}
2808*53ee8cc1Swenshuai.xi 						else if (gbInfoFrmPktList[ucInfoPktType].PktPara.VSInfoPktPara.enVSFmt == E_HDMITX_VIDEO_VS_4k_2k)
2809*53ee8cc1Swenshuai.xi 						{
2810*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_VS_2_28, 0xE000, E_HDMITX_VIDEO_VS_4k_2k << 13);  // video format
2811*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_VS_3_29, 0x00FF, (gbInfoFrmPktList[ucInfoPktType].PktPara.VSInfoPktPara.en4k2kVIC));	// 4k2k vic
2812*53ee8cc1Swenshuai.xi 						}
2813*53ee8cc1Swenshuai.xi 						else
2814*53ee8cc1Swenshuai.xi 						{
2815*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_VS_2_28, 0xE000, 0);  // video format
2816*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_VS_3_29, 0x00FF, 0);
2817*53ee8cc1Swenshuai.xi 						}
2818*53ee8cc1Swenshuai.xi 
2819*53ee8cc1Swenshuai.xi 						ucChkSum = MHal_HDMITx_InfoFrameCheckSum(E_HDMITX_VS_INFOFRAME);
2820*53ee8cc1Swenshuai.xi 
2821*53ee8cc1Swenshuai.xi 						if (gbInfoFrmPktList[ucInfoPktType].enPktCtrl == E_HDMITX_SEND_PACKET) //single
2822*53ee8cc1Swenshuai.xi 						{
2823*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_VS_CFG_35, (ucChkSum << 8) | 0x0001);
2824*53ee8cc1Swenshuai.xi                             MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_ACT_HDMI_PKTS_CMD_01, 0x03FF, 1 << E_HDMITX_ACT_VSP_CMD);
2825*53ee8cc1Swenshuai.xi 						}
2826*53ee8cc1Swenshuai.xi 						else
2827*53ee8cc1Swenshuai.xi 						{
2828*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_VS_CFG_35, ((ucChkSum << 8) | (HDMITX_PACKET_VS_FCNT << 3) | 0x0005));
2829*53ee8cc1Swenshuai.xi 						}
2830*53ee8cc1Swenshuai.xi 					}
2831*53ee8cc1Swenshuai.xi 				}
2832*53ee8cc1Swenshuai.xi 			break;
2833*53ee8cc1Swenshuai.xi 
2834*53ee8cc1Swenshuai.xi     		case E_HDMITX_AVI_INFOFRAME:
2835*53ee8cc1Swenshuai.xi 				if (gbInfoFrmPktList[ucInfoPktType].enPktCtrl == E_HDMITX_STOP_PACKET)
2836*53ee8cc1Swenshuai.xi 				{
2837*53ee8cc1Swenshuai.xi 				    MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_CFG_10, 0x0005, 0x0000);
2838*53ee8cc1Swenshuai.xi 				}
2839*53ee8cc1Swenshuai.xi 				else
2840*53ee8cc1Swenshuai.xi 				{
2841*53ee8cc1Swenshuai.xi                     if (gbInfoFrmPktList[ucInfoPktType].EnableUserDef == TRUE)
2842*53ee8cc1Swenshuai.xi                     {
2843*53ee8cc1Swenshuai.xi                         ucChkSum = MHal_HDMITx_InfoFrameCheckSum(E_HDMITX_AVI_INFOFRAME);
2844*53ee8cc1Swenshuai.xi 
2845*53ee8cc1Swenshuai.xi     					if (gbInfoFrmPktList[ucInfoPktType].enPktCtrl == E_HDMITX_SEND_PACKET) //single
2846*53ee8cc1Swenshuai.xi     					{
2847*53ee8cc1Swenshuai.xi     						MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_AVI_CFG_10, (ucChkSum << 8) | 0x0001);
2848*53ee8cc1Swenshuai.xi                             MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_ACT_HDMI_PKTS_CMD_01, 0x03FF, 1 << E_HDMITX_ACT_AVI_CMD);
2849*53ee8cc1Swenshuai.xi     					}
2850*53ee8cc1Swenshuai.xi     					else
2851*53ee8cc1Swenshuai.xi     					{
2852*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_AVI_CFG_10, ((ucChkSum << 8) | (gbInfoFrmPktList[ucInfoPktType].FrmCntNum << 3) | 0x0005));
2853*53ee8cc1Swenshuai.xi     					}
2854*53ee8cc1Swenshuai.xi                     }
2855*53ee8cc1Swenshuai.xi                     else
2856*53ee8cc1Swenshuai.xi                     {
2857*53ee8cc1Swenshuai.xi     					MS_U8 ucPktVal = 0;
2858*53ee8cc1Swenshuai.xi 
2859*53ee8cc1Swenshuai.xi     					//Y2, Y1, Y0: RGB, YCbCr 422, 444, 420
2860*53ee8cc1Swenshuai.xi     					ucPktVal = (gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enColorFmt << 5);// | 0x10;
2861*53ee8cc1Swenshuai.xi     					//A0 field
2862*53ee8cc1Swenshuai.xi     					ucPktVal |= ((gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.A0Value == 0x01) ? 0x10 : 0x00);
2863*53ee8cc1Swenshuai.xi     					//S1, S0 field
2864*53ee8cc1Swenshuai.xi     					ucPktVal |= (gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enScanInfo);
2865*53ee8cc1Swenshuai.xi 
2866*53ee8cc1Swenshuai.xi     					MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_1_09, 0x00FF, (MS_U16)ucPktVal); //MDrv_WriteByte(REG_HDMITX_09_L, ucPktVal);
2867*53ee8cc1Swenshuai.xi 
2868*53ee8cc1Swenshuai.xi     					//C1, C0, M1, M0
2869*53ee8cc1Swenshuai.xi     					if ((gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enVidTiming >= E_HDMITX_RES_720x480i) &&
2870*53ee8cc1Swenshuai.xi     						(gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enVidTiming <= E_HDMITX_RES_720x576p))
2871*53ee8cc1Swenshuai.xi     					{
2872*53ee8cc1Swenshuai.xi     						ucPktVal = HDMITX_AviCmrTbl[gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enVidTiming];
2873*53ee8cc1Swenshuai.xi     						ucPktVal |= (gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enAspectRatio << 4);
2874*53ee8cc1Swenshuai.xi     					}
2875*53ee8cc1Swenshuai.xi     					else
2876*53ee8cc1Swenshuai.xi     					{
2877*53ee8cc1Swenshuai.xi     						//HD timing is always 16:9
2878*53ee8cc1Swenshuai.xi     						ucPktVal = HDMITX_AviCmrTbl[gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enVidTiming];
2879*53ee8cc1Swenshuai.xi     					}
2880*53ee8cc1Swenshuai.xi 
2881*53ee8cc1Swenshuai.xi     					//R3, R2, R1, R0: active porting aspect ration
2882*53ee8cc1Swenshuai.xi     					if (gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enableAFDoverWrite == TRUE)
2883*53ee8cc1Swenshuai.xi     					{
2884*53ee8cc1Swenshuai.xi     						ucPktVal |= (gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enAFDRatio & 0x0F);
2885*53ee8cc1Swenshuai.xi     					}
2886*53ee8cc1Swenshuai.xi 
2887*53ee8cc1Swenshuai.xi                         //ucPktVal |= ((MS_U8)gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enExtColorimetry == 0) ? 0 : 0xC0; //set [C1, C0] = [1, 1]
2888*53ee8cc1Swenshuai.xi 
2889*53ee8cc1Swenshuai.xi                         if(gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enColorimetry != E_HDMITX_COLORIMETRY_MAX)
2890*53ee8cc1Swenshuai.xi                         {
2891*53ee8cc1Swenshuai.xi                             ucPktVal = (ucPktVal & 0x3F) | ( ((MS_U8)gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enColorimetry & 0x03) << 6);
2892*53ee8cc1Swenshuai.xi                         }
2893*53ee8cc1Swenshuai.xi 
2894*53ee8cc1Swenshuai.xi     					MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_1_09, 0xFF00, ucPktVal << 8); //MDrv_WriteByte(REG_HDMITX_09_H, ucPktVal);
2895*53ee8cc1Swenshuai.xi 
2896*53ee8cc1Swenshuai.xi                         //EC0, EC1, EC2
2897*53ee8cc1Swenshuai.xi                         ucPktVal = (MS_U8)gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enExtColorimetry;
2898*53ee8cc1Swenshuai.xi                         ucPktVal = (ucPktVal > 6) ? 6 : ucPktVal; //BT2020 RGB & BT2020 YCbCr share same value 6; 7 is reserved;
2899*53ee8cc1Swenshuai.xi                         MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_2_0A, 0x0070, ucPktVal << 4); //MDrv_WriteByteMask(REG_HDMITX_0A_L, ucPktVal << 4, 0x70);
2900*53ee8cc1Swenshuai.xi 
2901*53ee8cc1Swenshuai.xi                                         if(gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enColorFmt == E_HDMITX_VIDEO_COLOR_RGB444)
2902*53ee8cc1Swenshuai.xi                                         {
2903*53ee8cc1Swenshuai.xi                                             //Q1, Q0
2904*53ee8cc1Swenshuai.xi                                             if(gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enYCCQuantRange == E_HDMITX_YCC_QUANT_LIMIT)
2905*53ee8cc1Swenshuai.xi                                             {
2906*53ee8cc1Swenshuai.xi                                                 ucPktVal = 1;
2907*53ee8cc1Swenshuai.xi                                             }
2908*53ee8cc1Swenshuai.xi                                             else if(gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enYCCQuantRange == E_HDMITX_YCC_QUANT_FULL)
2909*53ee8cc1Swenshuai.xi                                             {
2910*53ee8cc1Swenshuai.xi                                                 ucPktVal = 2;
2911*53ee8cc1Swenshuai.xi                                             }
2912*53ee8cc1Swenshuai.xi                                             else
2913*53ee8cc1Swenshuai.xi                                             {
2914*53ee8cc1Swenshuai.xi                                                 ucPktVal = 0;
2915*53ee8cc1Swenshuai.xi                                             }
2916*53ee8cc1Swenshuai.xi 
2917*53ee8cc1Swenshuai.xi                                             MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_2_0A, 0x000C, ucPktVal << 2);
2918*53ee8cc1Swenshuai.xi                                             MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_3_0B, 0x00C0, 0x00);
2919*53ee8cc1Swenshuai.xi                                         }
2920*53ee8cc1Swenshuai.xi                                         else
2921*53ee8cc1Swenshuai.xi                                         {
2922*53ee8cc1Swenshuai.xi                                             //YQ1, YQ0
2923*53ee8cc1Swenshuai.xi                                             if(gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enYCCQuantRange == E_HDMITX_YCC_QUANT_LIMIT)
2924*53ee8cc1Swenshuai.xi                                             {
2925*53ee8cc1Swenshuai.xi                                                 ucPktVal = 0;
2926*53ee8cc1Swenshuai.xi                                             }
2927*53ee8cc1Swenshuai.xi                                             else if(gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enYCCQuantRange == E_HDMITX_YCC_QUANT_FULL)
2928*53ee8cc1Swenshuai.xi                                             {
2929*53ee8cc1Swenshuai.xi                                                 ucPktVal = 1;
2930*53ee8cc1Swenshuai.xi                                             }
2931*53ee8cc1Swenshuai.xi                                             else
2932*53ee8cc1Swenshuai.xi                                             {
2933*53ee8cc1Swenshuai.xi                                                 ucPktVal = 3;
2934*53ee8cc1Swenshuai.xi                                             }
2935*53ee8cc1Swenshuai.xi 
2936*53ee8cc1Swenshuai.xi                                             MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_2_0A, 0x000C, 0x00);
2937*53ee8cc1Swenshuai.xi                                             MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_3_0B, 0x00C0, ucPktVal << 6);
2938*53ee8cc1Swenshuai.xi                                         }
2939*53ee8cc1Swenshuai.xi 
2940*53ee8cc1Swenshuai.xi     					//VIC code: VIC code shoud +1 if aspect ration is 16:9
2941*53ee8cc1Swenshuai.xi     					ucPktVal = HDMITX_AviVicTbl[gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enVidTiming];
2942*53ee8cc1Swenshuai.xi 
2943*53ee8cc1Swenshuai.xi     					if (((gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enVidTiming >= E_HDMITX_RES_720x480i) &&
2944*53ee8cc1Swenshuai.xi     						(gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enVidTiming <= E_HDMITX_RES_720x576p)) &&
2945*53ee8cc1Swenshuai.xi     						(gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enAspectRatio == E_HDMITX_VIDEO_AR_16_9))
2946*53ee8cc1Swenshuai.xi     					{
2947*53ee8cc1Swenshuai.xi     						ucPktVal += 1;
2948*53ee8cc1Swenshuai.xi     					}
2949*53ee8cc1Swenshuai.xi                         else if (gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enAspectRatio == E_HDMITX_VIDEO_AR_21_9)
2950*53ee8cc1Swenshuai.xi                         {
2951*53ee8cc1Swenshuai.xi                             MS_U8 AR21_9MappingTbl[14][2] = {
2952*53ee8cc1Swenshuai.xi                                     {60, 65},
2953*53ee8cc1Swenshuai.xi                                     {61, 66},
2954*53ee8cc1Swenshuai.xi                                     {62, 67},
2955*53ee8cc1Swenshuai.xi                                     {19, 68},
2956*53ee8cc1Swenshuai.xi                                     { 4, 69},
2957*53ee8cc1Swenshuai.xi                                     {41, 70},
2958*53ee8cc1Swenshuai.xi                                     {47, 71},
2959*53ee8cc1Swenshuai.xi                                     {32, 72},
2960*53ee8cc1Swenshuai.xi                                     {33, 73},
2961*53ee8cc1Swenshuai.xi                                     {34, 74},
2962*53ee8cc1Swenshuai.xi                                     {31, 75},
2963*53ee8cc1Swenshuai.xi                                     {16, 76},
2964*53ee8cc1Swenshuai.xi                                     {64, 77},
2965*53ee8cc1Swenshuai.xi                                     {63, 78}
2966*53ee8cc1Swenshuai.xi                                 };
2967*53ee8cc1Swenshuai.xi 
2968*53ee8cc1Swenshuai.xi                             if ((ucPktVal >= 93) && (ucPktVal <= 97))//3840*2160p@24 ~ 3840*2160@60
2969*53ee8cc1Swenshuai.xi                             {
2970*53ee8cc1Swenshuai.xi                                 ucPktVal += 10;
2971*53ee8cc1Swenshuai.xi                             }
2972*53ee8cc1Swenshuai.xi                             else if ((gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enVidTiming >= E_HDMITX_RES_3840x2160p_24Hz) &&\
2973*53ee8cc1Swenshuai.xi                                 (gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enVidTiming <= E_HDMITX_RES_3840x2160p_30Hz))
2974*53ee8cc1Swenshuai.xi                             {
2975*53ee8cc1Swenshuai.xi                                 ucPktVal += (103 + (gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enVidTiming - E_HDMITX_RES_3840x2160p_24Hz));
2976*53ee8cc1Swenshuai.xi                             }
2977*53ee8cc1Swenshuai.xi                             else if ((ucPktVal > 78) && (ucPktVal <= 92))
2978*53ee8cc1Swenshuai.xi                             {
2979*53ee8cc1Swenshuai.xi                                 //do nothing;
2980*53ee8cc1Swenshuai.xi                             }
2981*53ee8cc1Swenshuai.xi                             else
2982*53ee8cc1Swenshuai.xi                             {
2983*53ee8cc1Swenshuai.xi                                 MS_U8 i = 0;
2984*53ee8cc1Swenshuai.xi                                 MS_BOOL bValidVIC = FALSE;
2985*53ee8cc1Swenshuai.xi 
2986*53ee8cc1Swenshuai.xi                                 for ( i = 0; i < 14; i++ )
2987*53ee8cc1Swenshuai.xi                                 {
2988*53ee8cc1Swenshuai.xi                                     if (AR21_9MappingTbl[i][0] == ucPktVal)
2989*53ee8cc1Swenshuai.xi                                     {
2990*53ee8cc1Swenshuai.xi                                         ucPktVal = AR21_9MappingTbl[i][1];
2991*53ee8cc1Swenshuai.xi                                         bValidVIC = TRUE;
2992*53ee8cc1Swenshuai.xi                                         break;
2993*53ee8cc1Swenshuai.xi                                     }
2994*53ee8cc1Swenshuai.xi                                 }
2995*53ee8cc1Swenshuai.xi 
2996*53ee8cc1Swenshuai.xi                                 if (!bValidVIC)
2997*53ee8cc1Swenshuai.xi                                 {
2998*53ee8cc1Swenshuai.xi                                     printf("%s :: Invalid VIC Code for 21:9 Aspect Ratio!!!\r\n", __FUNCTION__);
2999*53ee8cc1Swenshuai.xi                                 }
3000*53ee8cc1Swenshuai.xi                             }
3001*53ee8cc1Swenshuai.xi                         }
3002*53ee8cc1Swenshuai.xi 
3003*53ee8cc1Swenshuai.xi     					MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_2_0A, 0x7F00, ucPktVal << 8); //MDrv_WriteByte(REG_HDMITX_0A_H, (ucPktVal & 0x7F));
3004*53ee8cc1Swenshuai.xi 
3005*53ee8cc1Swenshuai.xi     					//check repetition
3006*53ee8cc1Swenshuai.xi     					if ((HDMITxVideoModeTbl[gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enVidTiming].i_p_mode == E_HDMITX_VIDEO_INTERLACE_MODE) &&
3007*53ee8cc1Swenshuai.xi     						(gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enVidTiming <= E_HDMITX_RES_720x576i))
3008*53ee8cc1Swenshuai.xi     					{
3009*53ee8cc1Swenshuai.xi     						MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_3_0B, 0x000F, 0x0001); //MDrv_WriteByteMask(REG_HDMITX_0B_L, 0x01, 0x0F);
3010*53ee8cc1Swenshuai.xi     					}
3011*53ee8cc1Swenshuai.xi     					else
3012*53ee8cc1Swenshuai.xi     					{
3013*53ee8cc1Swenshuai.xi     						MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_3_0B, 0x000F, 0x0000); //MDrv_WriteByteMask(REG_HDMITX_0B_L, 0x00, 0x0F);
3014*53ee8cc1Swenshuai.xi     					}
3015*53ee8cc1Swenshuai.xi 
3016*53ee8cc1Swenshuai.xi                         //YQ1, YQ0
3017*53ee8cc1Swenshuai.xi                         //MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_3_0B, 0x00C0, (MS_U8)(gbInfoFrmPktList[ucInfoPktType].PktPara.AVIInfoPktPara.enYCCQuantRange << 6));
3018*53ee8cc1Swenshuai.xi 
3019*53ee8cc1Swenshuai.xi     					//AVI version
3020*53ee8cc1Swenshuai.xi     					MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AVI_7_0F, 0x0300, (MS_U16)(HDMITX_AVI_INFO_PKT_VER << 8));
3021*53ee8cc1Swenshuai.xi     					//MDrv_WriteByteMask(REG_HDMITX_0F_H, HDMITX_AVI_INFO_PKT_VER, 0x03);
3022*53ee8cc1Swenshuai.xi 
3023*53ee8cc1Swenshuai.xi     					ucChkSum = MHal_HDMITx_InfoFrameCheckSum(E_HDMITX_AVI_INFOFRAME);
3024*53ee8cc1Swenshuai.xi 
3025*53ee8cc1Swenshuai.xi     					if (gbInfoFrmPktList[ucInfoPktType].enPktCtrl == E_HDMITX_SEND_PACKET) //single
3026*53ee8cc1Swenshuai.xi     					{
3027*53ee8cc1Swenshuai.xi     						MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_AVI_CFG_10, (ucChkSum << 8) | 0x0001);
3028*53ee8cc1Swenshuai.xi                             MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_ACT_HDMI_PKTS_CMD_01, 0x03FF, 1 << E_HDMITX_ACT_AVI_CMD);
3029*53ee8cc1Swenshuai.xi     					}
3030*53ee8cc1Swenshuai.xi     					else
3031*53ee8cc1Swenshuai.xi     					{
3032*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_AVI_CFG_10, ((ucChkSum << 8) | (HDMITX_PACKET_AVI_FCNT << 3) | 0x0005));
3033*53ee8cc1Swenshuai.xi 							//MDrv_Write2Byte(REG_HDMITX_10_L, 0x05 | (ucChkSum << 8) | (HDMITX_PACKET_AVI_FCNT << 3));
3034*53ee8cc1Swenshuai.xi     					}
3035*53ee8cc1Swenshuai.xi                     }
3036*53ee8cc1Swenshuai.xi 				}
3037*53ee8cc1Swenshuai.xi 			break;
3038*53ee8cc1Swenshuai.xi 
3039*53ee8cc1Swenshuai.xi     		case E_HDMITX_SPD_INFOFRAME:
3040*53ee8cc1Swenshuai.xi 				if (gbInfoFrmPktList[ucInfoPktType].enPktCtrl == E_HDMITX_STOP_PACKET)
3041*53ee8cc1Swenshuai.xi 				{
3042*53ee8cc1Swenshuai.xi 					MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_SPD_CFG_22, 0x0005, 0x0000); //MDrv_WriteByteMask(REG_HDMITX_22_L, 0x00, 0x05);
3043*53ee8cc1Swenshuai.xi 				}
3044*53ee8cc1Swenshuai.xi 				else
3045*53ee8cc1Swenshuai.xi 				{
3046*53ee8cc1Swenshuai.xi 					if (gbInfoFrmPktList[ucInfoPktType].EnableUserDef == TRUE)
3047*53ee8cc1Swenshuai.xi 					{
3048*53ee8cc1Swenshuai.xi 						ucChkSum = MHal_HDMITx_InfoFrameCheckSum(E_HDMITX_SPD_INFOFRAME);
3049*53ee8cc1Swenshuai.xi 
3050*53ee8cc1Swenshuai.xi 						if (gbInfoFrmPktList[ucInfoPktType].enPktCtrl == E_HDMITX_SEND_PACKET) //single
3051*53ee8cc1Swenshuai.xi 						{
3052*53ee8cc1Swenshuai.xi 							MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_SPD_CFG_22, (ucChkSum << 8) | 0x0001);
3053*53ee8cc1Swenshuai.xi                             MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_ACT_HDMI_PKTS_CMD_01, 0x03FF, 1 << E_HDMITX_ACT_SPD_CMD);
3054*53ee8cc1Swenshuai.xi 						}
3055*53ee8cc1Swenshuai.xi 						else
3056*53ee8cc1Swenshuai.xi 						{
3057*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_SPD_CFG_22, ((ucChkSum << 8) | (gbInfoFrmPktList[ucInfoPktType].FrmCntNum << 3) | 0x0005));
3058*53ee8cc1Swenshuai.xi 							//MDrv_Write2Byte(REG_HDMITX_22_L, 0x05 | (ucChkSum << 8) | (gbInfoFrmPktList[ucInfoPktType].FrmCntNum << 3));
3059*53ee8cc1Swenshuai.xi 						}
3060*53ee8cc1Swenshuai.xi 					}
3061*53ee8cc1Swenshuai.xi 					else
3062*53ee8cc1Swenshuai.xi 					{
3063*53ee8cc1Swenshuai.xi 						MS_U8 i = 0;
3064*53ee8cc1Swenshuai.xi                         MS_U8 ucPktVal = 0;
3065*53ee8cc1Swenshuai.xi 
3066*53ee8cc1Swenshuai.xi                         for (i = 0; i < ((HDMITX_SPD_INFO_PKT_LEN + 1) >> 1); i++)
3067*53ee8cc1Swenshuai.xi                         {
3068*53ee8cc1Swenshuai.xi                             if (i < 4)  // vendor name
3069*53ee8cc1Swenshuai.xi                             {
3070*53ee8cc1Swenshuai.xi                                 ucPktVal = (HDMITX_VendorName[2*i+1]<<8) | HDMITX_VendorName[2*i];
3071*53ee8cc1Swenshuai.xi                                 MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_SPD_1_15+i, 0x7F7F, ucPktVal);
3072*53ee8cc1Swenshuai.xi                             }
3073*53ee8cc1Swenshuai.xi                             else if ((i >= 4) && (i < 12))  // product description
3074*53ee8cc1Swenshuai.xi                             {
3075*53ee8cc1Swenshuai.xi                                 ucPktVal = (HDMITX_ProductName[2*(i-4)+1]<<8) | HDMITX_ProductName[2*(i-4)];
3076*53ee8cc1Swenshuai.xi                                 MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_SPD_5_19+(i-4), 0x7F7F, ucPktVal);
3077*53ee8cc1Swenshuai.xi                             }
3078*53ee8cc1Swenshuai.xi                             else  // source device information
3079*53ee8cc1Swenshuai.xi                             {
3080*53ee8cc1Swenshuai.xi                                 MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_SPD_13_21, 0x00FF, HDMITX_PACKET_SPD_SDI);
3081*53ee8cc1Swenshuai.xi                             }
3082*53ee8cc1Swenshuai.xi                         }
3083*53ee8cc1Swenshuai.xi 
3084*53ee8cc1Swenshuai.xi                         #if 0
3085*53ee8cc1Swenshuai.xi 						for ( i = 0; i < (HDMITX_SPD_INFO_PKT_LEN - 1); i++ )
3086*53ee8cc1Swenshuai.xi 						{
3087*53ee8cc1Swenshuai.xi 							if ( i < 8 )
3088*53ee8cc1Swenshuai.xi 								MDrv_WriteByte((REG_HDMITX_15_L + i), gbHDMITX_VendorName[i]);
3089*53ee8cc1Swenshuai.xi 							else
3090*53ee8cc1Swenshuai.xi 								MDrv_WriteByte((REG_HDMITX_15_L + i), gbHDMITX_ProductName[i-8]);
3091*53ee8cc1Swenshuai.xi 						}
3092*53ee8cc1Swenshuai.xi 
3093*53ee8cc1Swenshuai.xi 						MDrv_WriteByte(REG_HDMITX_21_L, 0x01); //SPD infoframe, byte25: source information: 0x01 = Digital STB
3094*53ee8cc1Swenshuai.xi                         #endif
3095*53ee8cc1Swenshuai.xi 
3096*53ee8cc1Swenshuai.xi 						ucChkSum = MHal_HDMITx_InfoFrameCheckSum(E_HDMITX_SPD_INFOFRAME);
3097*53ee8cc1Swenshuai.xi 
3098*53ee8cc1Swenshuai.xi 						if (gbInfoFrmPktList[ucInfoPktType].enPktCtrl == E_HDMITX_SEND_PACKET) //single
3099*53ee8cc1Swenshuai.xi 						{
3100*53ee8cc1Swenshuai.xi 							MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_SPD_CFG_22, (ucChkSum << 8) | 0x0001);
3101*53ee8cc1Swenshuai.xi                             MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_ACT_HDMI_PKTS_CMD_01, 0x03FF, 1 << E_HDMITX_ACT_SPD_CMD);
3102*53ee8cc1Swenshuai.xi 						}
3103*53ee8cc1Swenshuai.xi 						else
3104*53ee8cc1Swenshuai.xi 						{
3105*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_SPD_CFG_22, ((ucChkSum << 8) | (HDMITX_PACKET_SPD_FCNT << 3) | 0x0005));
3106*53ee8cc1Swenshuai.xi 							//MDrv_Write2Byte(REG_HDMITX_22_L, 0x05 | (ucChkSum << 8) | (HDMITX_PACKET_SPD_FCNT << 3));
3107*53ee8cc1Swenshuai.xi 						}
3108*53ee8cc1Swenshuai.xi 					}
3109*53ee8cc1Swenshuai.xi 				}
3110*53ee8cc1Swenshuai.xi 
3111*53ee8cc1Swenshuai.xi 			break;
3112*53ee8cc1Swenshuai.xi 
3113*53ee8cc1Swenshuai.xi     		case E_HDMITX_AUDIO_INFOFRAME:
3114*53ee8cc1Swenshuai.xi 				if (gbInfoFrmPktList[ucInfoPktType].enPktCtrl == E_HDMITX_STOP_PACKET)
3115*53ee8cc1Swenshuai.xi 				{
3116*53ee8cc1Swenshuai.xi 					MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AUD_CFG_14, 0x0005, 0x0000);
3117*53ee8cc1Swenshuai.xi 				}
3118*53ee8cc1Swenshuai.xi 				else
3119*53ee8cc1Swenshuai.xi 				{
3120*53ee8cc1Swenshuai.xi 					// Modified for HDMI CTS test -
3121*53ee8cc1Swenshuai.xi                     //     - Audio Coding Type (CT3~CT0) is 0x0 then continue else then FAIL
3122*53ee8cc1Swenshuai.xi                     //     - Sampling Frequency (SF2~ SF0) is zero then continue else then FAIL.
3123*53ee8cc1Swenshuai.xi                     //     - Sample Size (SS1~ SS0) is zero then continue else then FAIL.
3124*53ee8cc1Swenshuai.xi                     //tmp_value = (gHDMITxInfo.output_audio_frequncy << 10) | 0x11;  // audio sampling frequency, PCM and 2 channel.
3125*53ee8cc1Swenshuai.xi                     //MHal_HDMITx_Mask_Write(REG_HDMITX_BANK1, REG_PKT_AUD_1_11, 0x1FFF, tmp_value);
3126*53ee8cc1Swenshuai.xi 
3127*53ee8cc1Swenshuai.xi 					if (gbInfoFrmPktList[ucInfoPktType].PktPara.AUDInfoPktPara.enAudChCnt == E_HDMITX_AUDIO_CH_2) // 2-channel
3128*53ee8cc1Swenshuai.xi 					{
3129*53ee8cc1Swenshuai.xi 					    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_AUD_1_11, (E_HDMITX_AUDIO_CH_2 - 1) & 0x07); // 2 channels
3130*53ee8cc1Swenshuai.xi                         MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AUD_2_12, 0xFF00, 0); // Channel allocation
3131*53ee8cc1Swenshuai.xi 					}
3132*53ee8cc1Swenshuai.xi 					else //8- channel
3133*53ee8cc1Swenshuai.xi 					{
3134*53ee8cc1Swenshuai.xi 					    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_AUD_1_11, (E_HDMITX_AUDIO_CH_8 - 1)&0x07); // 8 channels
3135*53ee8cc1Swenshuai.xi                         MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AUD_2_12, 0xFF00, 0x1F00); // Channel allocation
3136*53ee8cc1Swenshuai.xi 					}
3137*53ee8cc1Swenshuai.xi 					//clear LFEP value
3138*53ee8cc1Swenshuai.xi 					MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_AUD_3_13, 0x0001, 0x0000); //Fix LFEP defalut value in Kappa.
3139*53ee8cc1Swenshuai.xi 
3140*53ee8cc1Swenshuai.xi 					ucChkSum = MHal_HDMITx_InfoFrameCheckSum(E_HDMITX_AUDIO_INFOFRAME);
3141*53ee8cc1Swenshuai.xi 
3142*53ee8cc1Swenshuai.xi 					if (gbInfoFrmPktList[ucInfoPktType].enPktCtrl == E_HDMITX_SEND_PACKET) //single
3143*53ee8cc1Swenshuai.xi 					{
3144*53ee8cc1Swenshuai.xi 						MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_AUD_CFG_14, (ucChkSum << 8) | 0x0001);
3145*53ee8cc1Swenshuai.xi                         MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_ACT_HDMI_PKTS_CMD_01, 0x03FF, 1 << E_HDMITX_ACT_AUD_CMD);
3146*53ee8cc1Swenshuai.xi 					}
3147*53ee8cc1Swenshuai.xi 					else
3148*53ee8cc1Swenshuai.xi 					{
3149*53ee8cc1Swenshuai.xi 						if (gbInfoFrmPktList[ucInfoPktType].EnableUserDef == TRUE)
3150*53ee8cc1Swenshuai.xi 						{
3151*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_AUD_CFG_14, ( (ucChkSum << 8) | (gbInfoFrmPktList[ucInfoPktType].FrmCntNum << 3) | 0x0005));
3152*53ee8cc1Swenshuai.xi 						}
3153*53ee8cc1Swenshuai.xi 						else
3154*53ee8cc1Swenshuai.xi 						{
3155*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_AUD_CFG_14, ( (ucChkSum << 8) | (HDMITX_PACKET_AUD_FCNT << 3) | 0x0005));
3156*53ee8cc1Swenshuai.xi 						}
3157*53ee8cc1Swenshuai.xi 					}
3158*53ee8cc1Swenshuai.xi 				}
3159*53ee8cc1Swenshuai.xi 
3160*53ee8cc1Swenshuai.xi                 //NOTE:: Kano move channel status from 0x00 to 0x0A
3161*53ee8cc1Swenshuai.xi                 if (gbInfoFrmPktList[ucInfoPktType].EnableUserDef == FALSE)
3162*53ee8cc1Swenshuai.xi                 {
3163*53ee8cc1Swenshuai.xi                     MHal_HDMITx_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CH_STATUS0_0A, ((gbInfoFrmPktList[ucInfoPktType].PktPara.AUDInfoPktPara.enAudType == E_HDMITX_AUDIO_PCM) ? 0 : BIT1)); // [1]: PCM / non-PCM
3164*53ee8cc1Swenshuai.xi                     MHal_HDMITx_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CH_STATUS1_0B, (TxAudioFreqTbl[gbInfoFrmPktList[ucInfoPktType].PktPara.AUDInfoPktPara.enAudFreq].CH_Status3 << 8) | (gbInfoFrmPktList[ucInfoPktType].PktPara.AUDInfoPktPara.enAudChCnt << 4)); //[11:8]: audio sampling frequncy; [7:4]: audio channel count
3165*53ee8cc1Swenshuai.xi                     MHal_HDMITx_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CH_STATUS2_0C, 0x0000);
3166*53ee8cc1Swenshuai.xi                 }
3167*53ee8cc1Swenshuai.xi                 // Audio sampling frequency
3168*53ee8cc1Swenshuai.xi                 // 1           1        0        0        32 kHz
3169*53ee8cc1Swenshuai.xi                 // 0           0        0        0        44.1 kHz
3170*53ee8cc1Swenshuai.xi                 // 0           0        0        1        88.2 kHz
3171*53ee8cc1Swenshuai.xi                 // 0           0        1        1        176.4 kHz
3172*53ee8cc1Swenshuai.xi                 // 0           1        0        0        48 kHz
3173*53ee8cc1Swenshuai.xi                 // 0           1        0        1        96 kHz
3174*53ee8cc1Swenshuai.xi                 // 0           1        1        1        192 kHz
3175*53ee8cc1Swenshuai.xi                 // 1           0        0        1        768 kHz
3176*53ee8cc1Swenshuai.xi 			break;
3177*53ee8cc1Swenshuai.xi 
3178*53ee8cc1Swenshuai.xi     		case E_HDMITX_MPEG_INFOFRAME:
3179*53ee8cc1Swenshuai.xi 				//TBD
3180*53ee8cc1Swenshuai.xi 			break;
3181*53ee8cc1Swenshuai.xi 
3182*53ee8cc1Swenshuai.xi             case E_HDMITX_HDR_INFOFRAME:
3183*53ee8cc1Swenshuai.xi                 if (gbInfoFrmPktList[ucInfoPktType].enPktCtrl == E_HDMITX_STOP_PACKET)
3184*53ee8cc1Swenshuai.xi 				{
3185*53ee8cc1Swenshuai.xi 					MHal_HDMITx_Mask_Write(HDMITX_2_REG_BASE, REG_HDMI_2_CONFIG_1E, 0x0001, 0x0000);
3186*53ee8cc1Swenshuai.xi 				}
3187*53ee8cc1Swenshuai.xi 				else
3188*53ee8cc1Swenshuai.xi 				{
3189*53ee8cc1Swenshuai.xi 				    if (gbInfoFrmPktList[ucInfoPktType].EnableUserDef == TRUE)
3190*53ee8cc1Swenshuai.xi 					{
3191*53ee8cc1Swenshuai.xi 					    ucChkSum = MHal_HDMITx_InfoFrameCheckSum(E_HDMITX_HDR_INFOFRAME);
3192*53ee8cc1Swenshuai.xi 
3193*53ee8cc1Swenshuai.xi 						if (gbInfoFrmPktList[ucInfoPktType].enPktCtrl == E_HDMITX_SEND_PACKET) //single
3194*53ee8cc1Swenshuai.xi 						{
3195*53ee8cc1Swenshuai.xi 							MHal_HDMITx_Write(HDMITX_2_REG_BASE, REG_HDMI_2_CONFIG_1E, (ucChkSum << 8) | 0x0001); //[15..8]: chk_sum; [0]:hdr_send_cmd
3196*53ee8cc1Swenshuai.xi                             MHal_HDMITx_Mask_Write(HDMITX_2_REG_BASE, REG_HDMI_2_CONFIG_00, 0xFFFF, 0x0001); //[0]:reg_act_hdr_cmd
3197*53ee8cc1Swenshuai.xi 						}
3198*53ee8cc1Swenshuai.xi 						else
3199*53ee8cc1Swenshuai.xi 						{
3200*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Write(HDMITX_2_REG_BASE, REG_HDMI_2_CONFIG_1E, ((ucChkSum<<8) | (gbGeneralPktList[ucInfoPktType].FrmCntNum << 3) | 0x0005));
3201*53ee8cc1Swenshuai.xi 						}
3202*53ee8cc1Swenshuai.xi                     }
3203*53ee8cc1Swenshuai.xi                     else
3204*53ee8cc1Swenshuai.xi                     {
3205*53ee8cc1Swenshuai.xi                         //TBD
3206*53ee8cc1Swenshuai.xi                         ucChkSum = MHal_HDMITx_InfoFrameCheckSum(E_HDMITX_HDR_INFOFRAME);
3207*53ee8cc1Swenshuai.xi 
3208*53ee8cc1Swenshuai.xi                         if (gbInfoFrmPktList[ucInfoPktType].enPktCtrl == E_HDMITX_SEND_PACKET) //single
3209*53ee8cc1Swenshuai.xi 						{
3210*53ee8cc1Swenshuai.xi 							MHal_HDMITx_Write(HDMITX_2_REG_BASE, REG_HDMI_2_CONFIG_1E, (ucChkSum << 8) | 0x0001); //[15..8]: chk_sum; [0]:hdr_send_cmd
3211*53ee8cc1Swenshuai.xi                             MHal_HDMITx_Mask_Write(HDMITX_2_REG_BASE, REG_HDMI_2_CONFIG_00, 0xFFFF, 0x0001); //[0]:reg_act_hdr_cmd
3212*53ee8cc1Swenshuai.xi 						}
3213*53ee8cc1Swenshuai.xi 						else
3214*53ee8cc1Swenshuai.xi 						{
3215*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Write(HDMITX_2_REG_BASE, REG_HDMI_2_CONFIG_1E, ((ucChkSum<<8) | (HDMITX_PACKET_HDR_FCNT << 3) | 0x0005));
3216*53ee8cc1Swenshuai.xi 						}
3217*53ee8cc1Swenshuai.xi 
3218*53ee8cc1Swenshuai.xi                     }
3219*53ee8cc1Swenshuai.xi                 }
3220*53ee8cc1Swenshuai.xi             break;
3221*53ee8cc1Swenshuai.xi 
3222*53ee8cc1Swenshuai.xi 			default:
3223*53ee8cc1Swenshuai.xi 				printf("hal_HDMITx_SendPacket():: Invalid Packet Type!!\r\n");
3224*53ee8cc1Swenshuai.xi 			break;
3225*53ee8cc1Swenshuai.xi 		}
3226*53ee8cc1Swenshuai.xi 	}
3227*53ee8cc1Swenshuai.xi 	else //general packet
3228*53ee8cc1Swenshuai.xi 	{
3229*53ee8cc1Swenshuai.xi 	    gbGeneralPktList[enPktType].enPktCtrl = packet_process;
3230*53ee8cc1Swenshuai.xi 
3231*53ee8cc1Swenshuai.xi 		switch (enPktType)
3232*53ee8cc1Swenshuai.xi 		{
3233*53ee8cc1Swenshuai.xi 			case E_HDMITX_NULL_PACKET:
3234*53ee8cc1Swenshuai.xi 				if (gbGeneralPktList[enPktType].enPktCtrl == E_HDMITX_STOP_PACKET)
3235*53ee8cc1Swenshuai.xi 				{
3236*53ee8cc1Swenshuai.xi 					MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_NUL_CFG_02, 0x0005, 0x0000);
3237*53ee8cc1Swenshuai.xi 				}
3238*53ee8cc1Swenshuai.xi 				else
3239*53ee8cc1Swenshuai.xi 				{
3240*53ee8cc1Swenshuai.xi 					if (gbGeneralPktList[enPktType].enPktCtrl == E_HDMITX_SEND_PACKET) //single
3241*53ee8cc1Swenshuai.xi 					{
3242*53ee8cc1Swenshuai.xi 						MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_NUL_CFG_02, 0x00FF, 0x0001);
3243*53ee8cc1Swenshuai.xi                         MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_ACT_HDMI_PKTS_CMD_01, 0x03FF, 1 << E_HDMITX_ACT_NUL_CMD);
3244*53ee8cc1Swenshuai.xi 					}
3245*53ee8cc1Swenshuai.xi 					else
3246*53ee8cc1Swenshuai.xi 					{
3247*53ee8cc1Swenshuai.xi 						if (gbGeneralPktList[enPktType].EnableUserDef == TRUE)
3248*53ee8cc1Swenshuai.xi 						{
3249*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_NUL_CFG_02, 0x00FF, ((gbGeneralPktList[enPktType].FrmCntNum << 3) |0x0005) );
3250*53ee8cc1Swenshuai.xi 						}
3251*53ee8cc1Swenshuai.xi 						else
3252*53ee8cc1Swenshuai.xi 						{
3253*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_NUL_CFG_02, 0x00FF, ((HDMITX_PACKET_NULL_FCNT << 3) |0x0005) );
3254*53ee8cc1Swenshuai.xi 						}
3255*53ee8cc1Swenshuai.xi 					}
3256*53ee8cc1Swenshuai.xi 				}
3257*53ee8cc1Swenshuai.xi 			break;
3258*53ee8cc1Swenshuai.xi 
3259*53ee8cc1Swenshuai.xi 			case E_HDMITX_ACR_PACKET:
3260*53ee8cc1Swenshuai.xi 				if (gbGeneralPktList[enPktType].enPktCtrl == E_HDMITX_STOP_PACKET) //stop packet
3261*53ee8cc1Swenshuai.xi 				{
3262*53ee8cc1Swenshuai.xi 					MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_ACR_CFG_08, 0x000F, 0x0008);
3263*53ee8cc1Swenshuai.xi 				}
3264*53ee8cc1Swenshuai.xi 				else
3265*53ee8cc1Swenshuai.xi 				{
3266*53ee8cc1Swenshuai.xi 					if (gbGeneralPktList[enPktType].enPktCtrl == E_HDMITX_SEND_PACKET) //single
3267*53ee8cc1Swenshuai.xi 					{
3268*53ee8cc1Swenshuai.xi 						MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_ACR_CFG_08, 0x00FF, 0x0009);
3269*53ee8cc1Swenshuai.xi 						MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_ACT_HDMI_PKTS_CMD_01, 0x03FF, 1 << E_HDMITX_ACT_ACR_CMD);
3270*53ee8cc1Swenshuai.xi 					}
3271*53ee8cc1Swenshuai.xi 					else //cyclic
3272*53ee8cc1Swenshuai.xi 					{
3273*53ee8cc1Swenshuai.xi 						if (gbGeneralPktList[enPktType].EnableUserDef == TRUE)
3274*53ee8cc1Swenshuai.xi 						{
3275*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_ACR_CFG_08, 0x00FF, ((gbGeneralPktList[enPktType].FrmCntNum << 4) |0x05));
3276*53ee8cc1Swenshuai.xi 						}
3277*53ee8cc1Swenshuai.xi 						else
3278*53ee8cc1Swenshuai.xi 						{
3279*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_ACR_CFG_08, 0x00FF, ((HDMITX_PACKET_ACR_FCNT << 4) |0x05));
3280*53ee8cc1Swenshuai.xi 						}
3281*53ee8cc1Swenshuai.xi 					}
3282*53ee8cc1Swenshuai.xi 				}
3283*53ee8cc1Swenshuai.xi 			break;
3284*53ee8cc1Swenshuai.xi 
3285*53ee8cc1Swenshuai.xi     		case E_HDMITX_AS_PACKET:
3286*53ee8cc1Swenshuai.xi 				if (gbGeneralPktList[enPktType].enPktCtrl == E_HDMITX_STOP_PACKET)
3287*53ee8cc1Swenshuai.xi 				{
3288*53ee8cc1Swenshuai.xi 					MHal_HDMITx_Mask_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CONFIG_05, BIT7|BIT0, BIT0); // [7]: disable audio FIFO, [0]:audio FIFO flush
3289*53ee8cc1Swenshuai.xi 				}
3290*53ee8cc1Swenshuai.xi 				else
3291*53ee8cc1Swenshuai.xi 				{
3292*53ee8cc1Swenshuai.xi 					MHal_HDMITx_Mask_Write(HDMITX_AUDIO_REG_BASE, REG_AE_CONFIG_05, BIT7|BIT0, BIT7); // [7]: enable audio FIFO, [0]:audio FIFO not flush
3293*53ee8cc1Swenshuai.xi 				}
3294*53ee8cc1Swenshuai.xi 			break;
3295*53ee8cc1Swenshuai.xi 
3296*53ee8cc1Swenshuai.xi     		case E_HDMITX_GC_PACKET:
3297*53ee8cc1Swenshuai.xi 				if (gbGeneralPktList[enPktType].enPktCtrl == E_HDMITX_STOP_PACKET) //stop packet
3298*53ee8cc1Swenshuai.xi 				{
3299*53ee8cc1Swenshuai.xi 				    MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_GC_CFG_03, 0x000F, (gbGeneralPktList[enPktType].PktPara.GCPktPara.enAVMute << 1) | 0x0000);
3300*53ee8cc1Swenshuai.xi 				}
3301*53ee8cc1Swenshuai.xi 				else
3302*53ee8cc1Swenshuai.xi 				{
3303*53ee8cc1Swenshuai.xi 					//fill color depth information
3304*53ee8cc1Swenshuai.xi 					MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_GC12_04, 0x010F, gbGeneralPktList[enPktType].PktPara.GCPktPara.enColorDepInfo); // [8]: default phase = 0, [3:0]: Color depth
3305*53ee8cc1Swenshuai.xi 
3306*53ee8cc1Swenshuai.xi 					if (gbGeneralPktList[enPktType].enPktCtrl == E_HDMITX_SEND_PACKET) //single
3307*53ee8cc1Swenshuai.xi 					{
3308*53ee8cc1Swenshuai.xi 					    MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_GC_CFG_03, 0x007F, (gbGeneralPktList[enPktType].PktPara.GCPktPara.enAVMute << 1)| 0x21); // [6]: 0, DC and non-DC info send together
3309*53ee8cc1Swenshuai.xi                         MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_ACT_HDMI_PKTS_CMD_01, 0x03FF, 1 << E_HDMITX_ACT_GCP_CMD);
3310*53ee8cc1Swenshuai.xi 						//MDrv_WriteByteMask(REG_HDMITX_03_L, 0x21, 0x7F);
3311*53ee8cc1Swenshuai.xi 					}
3312*53ee8cc1Swenshuai.xi 					else //cyclic
3313*53ee8cc1Swenshuai.xi 					{
3314*53ee8cc1Swenshuai.xi 						if (gbGeneralPktList[enPktType].EnableUserDef == TRUE)
3315*53ee8cc1Swenshuai.xi 						{
3316*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_GC_CFG_03, 0x007F, ((gbGeneralPktList[enPktType].PktPara.GCPktPara.enAVMute << 1) | (gbGeneralPktList[enPktType].FrmCntNum << 4) | 0x29));
3317*53ee8cc1Swenshuai.xi 						}
3318*53ee8cc1Swenshuai.xi 						else
3319*53ee8cc1Swenshuai.xi 						{
3320*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_GC_CFG_03, 0x007F, ((gbGeneralPktList[enPktType].PktPara.GCPktPara.enAVMute << 1) | (HDMITX_PACKET_GC_FCNT << 4) | 0x29));
3321*53ee8cc1Swenshuai.xi 						}
3322*53ee8cc1Swenshuai.xi 					}
3323*53ee8cc1Swenshuai.xi 				}
3324*53ee8cc1Swenshuai.xi 			break;
3325*53ee8cc1Swenshuai.xi 
3326*53ee8cc1Swenshuai.xi     		case E_HDMITX_ACP_PACKET:
3327*53ee8cc1Swenshuai.xi 				if (gbGeneralPktList[enPktType].enPktCtrl == E_HDMITX_STOP_PACKET) //stop packet
3328*53ee8cc1Swenshuai.xi 				{
3329*53ee8cc1Swenshuai.xi 					MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_ACP_CFG_40, 0x0005, 0x0000);
3330*53ee8cc1Swenshuai.xi 				}
3331*53ee8cc1Swenshuai.xi 				else
3332*53ee8cc1Swenshuai.xi 				{
3333*53ee8cc1Swenshuai.xi 					MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_ACP_0_38, 0xFFFF, 0x0000); //acp type is 0x00
3334*53ee8cc1Swenshuai.xi 
3335*53ee8cc1Swenshuai.xi 					if (gbGeneralPktList[enPktType].enPktCtrl == E_HDMITX_SEND_PACKET) //single
3336*53ee8cc1Swenshuai.xi 					{
3337*53ee8cc1Swenshuai.xi 					    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_ACP_CFG_40, 0x0001);
3338*53ee8cc1Swenshuai.xi                         MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_ACT_HDMI_PKTS_CMD_01, 0x03FF, 1 << E_HDMITX_ACT_ACP_CMD);
3339*53ee8cc1Swenshuai.xi 					}
3340*53ee8cc1Swenshuai.xi 					else //cyclic
3341*53ee8cc1Swenshuai.xi 					{
3342*53ee8cc1Swenshuai.xi 						if (gbGeneralPktList[enPktType].EnableUserDef == TRUE)
3343*53ee8cc1Swenshuai.xi 						{
3344*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_ACP_CFG_40, ((gbGeneralPktList[enPktType].FrmCntNum << 3) | 0x0005));
3345*53ee8cc1Swenshuai.xi 						}
3346*53ee8cc1Swenshuai.xi 						else
3347*53ee8cc1Swenshuai.xi 						{
3348*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_ACP_CFG_40, (HDMITX_PACKET_ACP_FCNT | 0x0005));
3349*53ee8cc1Swenshuai.xi 						}
3350*53ee8cc1Swenshuai.xi 					}
3351*53ee8cc1Swenshuai.xi 				}
3352*53ee8cc1Swenshuai.xi 			break;
3353*53ee8cc1Swenshuai.xi 
3354*53ee8cc1Swenshuai.xi     		case E_HDMITX_ISRC1_PACKET:
3355*53ee8cc1Swenshuai.xi 				if (gbGeneralPktList[enPktType].enPktCtrl == E_HDMITX_STOP_PACKET) //stop packet
3356*53ee8cc1Swenshuai.xi 				{
3357*53ee8cc1Swenshuai.xi 					MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_ISRC_CFG_51, 0x0005, 0x0000);
3358*53ee8cc1Swenshuai.xi 				}
3359*53ee8cc1Swenshuai.xi 				else
3360*53ee8cc1Swenshuai.xi 				{
3361*53ee8cc1Swenshuai.xi 					if (gbGeneralPktList[enPktType].enPktCtrl == E_HDMITX_SEND_PACKET) //single
3362*53ee8cc1Swenshuai.xi 					{
3363*53ee8cc1Swenshuai.xi 						MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_ISRC_CFG_51, 0x0001);
3364*53ee8cc1Swenshuai.xi                         MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_ACT_HDMI_PKTS_CMD_01, 0x03FF, 1 << E_HDMITX_ACT_ISRC_CMD);
3365*53ee8cc1Swenshuai.xi 					}
3366*53ee8cc1Swenshuai.xi 					else //cyclic
3367*53ee8cc1Swenshuai.xi 					{
3368*53ee8cc1Swenshuai.xi 						if (gbGeneralPktList[enPktType].EnableUserDef == TRUE)
3369*53ee8cc1Swenshuai.xi 						{
3370*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_ISRC_CFG_51, ((gbGeneralPktList[enPktType].FrmCntNum << 3) | 0x0005));						}
3371*53ee8cc1Swenshuai.xi 						else
3372*53ee8cc1Swenshuai.xi 						{
3373*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_ISRC_CFG_51, ((HDMITX_PACKET_ISRC_FCNT << 3) | 0x0005));
3374*53ee8cc1Swenshuai.xi 						}
3375*53ee8cc1Swenshuai.xi 					}
3376*53ee8cc1Swenshuai.xi 				}
3377*53ee8cc1Swenshuai.xi 			break;
3378*53ee8cc1Swenshuai.xi 
3379*53ee8cc1Swenshuai.xi     		case E_HDMITX_ISRC2_PACKET:
3380*53ee8cc1Swenshuai.xi 				//check ISRC cnt value
3381*53ee8cc1Swenshuai.xi 				if (MHal_HDMITx_Read(HDMITX_REG_BASE, REG_PKT_ISRC_CFG_51) & 0x8000)
3382*53ee8cc1Swenshuai.xi 				{
3383*53ee8cc1Swenshuai.xi 					if (gbGeneralPktList[enPktType].enPktCtrl == E_HDMITX_STOP_PACKET) //stop packet
3384*53ee8cc1Swenshuai.xi 					{
3385*53ee8cc1Swenshuai.xi 						MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_PKT_ISRC_CFG_51, 0x0005, 0x0000);
3386*53ee8cc1Swenshuai.xi 					}
3387*53ee8cc1Swenshuai.xi 					else
3388*53ee8cc1Swenshuai.xi 					{
3389*53ee8cc1Swenshuai.xi 					    MS_U8 u8ISRCCntVal = 0x80;
3390*53ee8cc1Swenshuai.xi 
3391*53ee8cc1Swenshuai.xi 						if (gbGeneralPktList[enPktType].enPktCtrl == E_HDMITX_SEND_PACKET) //single
3392*53ee8cc1Swenshuai.xi 						{
3393*53ee8cc1Swenshuai.xi 						    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_ISRC_CFG_51, (u8ISRCCntVal << 8) | 0x0001 ); // 0x80: ISRC_CONT = 1, ISRC1 & ISRC2
3394*53ee8cc1Swenshuai.xi                             MHal_HDMITx_Mask_Write(HDMITX_REG_BASE, REG_ACT_HDMI_PKTS_CMD_01, 0x03FF, 1 << E_HDMITX_ACT_ISRC_CMD);
3395*53ee8cc1Swenshuai.xi 						}
3396*53ee8cc1Swenshuai.xi 						else //cyclic
3397*53ee8cc1Swenshuai.xi 						{
3398*53ee8cc1Swenshuai.xi 							if (gbGeneralPktList[enPktType].EnableUserDef == TRUE)
3399*53ee8cc1Swenshuai.xi 							{
3400*53ee8cc1Swenshuai.xi 							    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_ISRC_CFG_51, ((u8ISRCCntVal << 8) | (gbGeneralPktList[enPktType].FrmCntNum << 3) | 0x0005));
3401*53ee8cc1Swenshuai.xi 							}
3402*53ee8cc1Swenshuai.xi 							else
3403*53ee8cc1Swenshuai.xi 							{
3404*53ee8cc1Swenshuai.xi 							    MHal_HDMITx_Write(HDMITX_REG_BASE, REG_PKT_ISRC_CFG_51, ((u8ISRCCntVal << 8) | (HDMITX_PACKET_ISRC_FCNT << 3) | 0x0005));
3405*53ee8cc1Swenshuai.xi 							}
3406*53ee8cc1Swenshuai.xi 						}
3407*53ee8cc1Swenshuai.xi 					}
3408*53ee8cc1Swenshuai.xi 				}
3409*53ee8cc1Swenshuai.xi 			break;
3410*53ee8cc1Swenshuai.xi 
3411*53ee8cc1Swenshuai.xi     		case E_HDMITX_DSD_PACKET:
3412*53ee8cc1Swenshuai.xi 				//TBD
3413*53ee8cc1Swenshuai.xi 			break;
3414*53ee8cc1Swenshuai.xi 
3415*53ee8cc1Swenshuai.xi     		case E_HDMITX_HBR_PACKET:
3416*53ee8cc1Swenshuai.xi 				//TBD
3417*53ee8cc1Swenshuai.xi 			break;
3418*53ee8cc1Swenshuai.xi 
3419*53ee8cc1Swenshuai.xi     		case E_HDMITX_GM_PACKET:
3420*53ee8cc1Swenshuai.xi 				//TBD
3421*53ee8cc1Swenshuai.xi 			break;
3422*53ee8cc1Swenshuai.xi 
3423*53ee8cc1Swenshuai.xi 			default:
3424*53ee8cc1Swenshuai.xi 				printf("hal_HDMITx_SendPacket():: Invalid Packet Type!!\r\n");
3425*53ee8cc1Swenshuai.xi 			break;
3426*53ee8cc1Swenshuai.xi 		}
3427*53ee8cc1Swenshuai.xi 	}
3428*53ee8cc1Swenshuai.xi }
3429*53ee8cc1Swenshuai.xi 
MHal_HDMITx_EnableSSC(MS_BOOL bEnable,MS_U32 uiTMDSCLK)3430*53ee8cc1Swenshuai.xi void MHal_HDMITx_EnableSSC(MS_BOOL bEnable, MS_U32 uiTMDSCLK)
3431*53ee8cc1Swenshuai.xi {
3432*53ee8cc1Swenshuai.xi     //Maxim does not implement SSC yet.
3433*53ee8cc1Swenshuai.xi     #if 0
3434*53ee8cc1Swenshuai.xi     #define HDMITX_MPLL_CLK                        432 //432MHz
3435*53ee8cc1Swenshuai.xi     #define HDMITX_SSC_CLK                          30 //30KHz
3436*53ee8cc1Swenshuai.xi     #define HDMITX_SSC_DEVIATION              1 // 0.1%
3437*53ee8cc1Swenshuai.xi     #define HDMITX_SSC_DEVIATION_DIVIDER      1000
3438*53ee8cc1Swenshuai.xi     #define HDMITX_SSC_THREAD_LEVEL1      150 ///1080p 8bits
3439*53ee8cc1Swenshuai.xi     #define HDMITX_SSC_THREAD_LEVEL2      300 ///4K30 8bits
3440*53ee8cc1Swenshuai.xi     #define HDMITX_SSC_SPAN_REG                REG_HDMITxPHY_CONFIG_06
3441*53ee8cc1Swenshuai.xi     #define HDMITX_SSC_STEP_REG                 REG_HDMITxPHY_CONFIG_07
3442*53ee8cc1Swenshuai.xi     #define HDMITX_SSC_SUB_DIVIDER_REG   REG_HDMITxPHY_CONFIG_01
3443*53ee8cc1Swenshuai.xi 
3444*53ee8cc1Swenshuai.xi     MS_U32 ub2x19times = 524288;// 2^ 19
3445*53ee8cc1Swenshuai.xi     MS_U32 dSYNCLK = 1;
3446*53ee8cc1Swenshuai.xi     MS_U32 ub432MHz = HDMITX_MPLL_CLK;
3447*53ee8cc1Swenshuai.xi     MS_U32 ubSSCClk = HDMITX_SSC_CLK;
3448*53ee8cc1Swenshuai.xi     MS_U32 dSSc_Deviation= HDMITX_SSC_DEVIATION;
3449*53ee8cc1Swenshuai.xi     MS_U32 ubSYNSet = 0;
3450*53ee8cc1Swenshuai.xi     MS_U32 dSSC_Span = 0;
3451*53ee8cc1Swenshuai.xi     MS_U32 dSSC_Step = 0;
3452*53ee8cc1Swenshuai.xi     MS_U32 dPixel_Clk = 0;
3453*53ee8cc1Swenshuai.xi 
3454*53ee8cc1Swenshuai.xi     if(!bEnable)
3455*53ee8cc1Swenshuai.xi     {
3456*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, HDMITX_SSC_SPAN_REG, 0x3FFF, 0 );//Span
3457*53ee8cc1Swenshuai.xi         MHal_HDMITx_Write(HDMITX_PHY_REG_BASE, HDMITX_SSC_STEP_REG, 0);//Step
3458*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, HDMITX_SSC_SUB_DIVIDER_REG, 0x7000, 0 );//Sub-Divider
3459*53ee8cc1Swenshuai.xi         return;
3460*53ee8cc1Swenshuai.xi     }
3461*53ee8cc1Swenshuai.xi 
3462*53ee8cc1Swenshuai.xi     ubSYNSet = MHal_HDMITx_Read(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_02);
3463*53ee8cc1Swenshuai.xi     ubSYNSet |= ( (MHal_HDMITx_Read(HDMITX_PHY_REG_BASE, REG_HDMITxPHY_CONFIG_03) & 0xFF) << 16);
3464*53ee8cc1Swenshuai.xi 
3465*53ee8cc1Swenshuai.xi     if(ubSYNSet != 0)
3466*53ee8cc1Swenshuai.xi         dSYNCLK = ((ub432MHz*ub2x19times)/ubSYNSet);
3467*53ee8cc1Swenshuai.xi 
3468*53ee8cc1Swenshuai.xi     if(ubSSCClk != 0)
3469*53ee8cc1Swenshuai.xi         dSSC_Span = (dSYNCLK * 250) / (ubSSCClk); //Span = SYN_CLK_KHz / (SSC_CLK_KHz * 4)
3470*53ee8cc1Swenshuai.xi 
3471*53ee8cc1Swenshuai.xi     if( (dSSC_Span != 0) && (HDMITX_SSC_DEVIATION_DIVIDER != 0) )
3472*53ee8cc1Swenshuai.xi         dSSC_Step = (((ubSYNSet/ dSSC_Span)/HDMITX_SSC_DEVIATION_DIVIDER) * dSSc_Deviation) ; //Step = SYN_SET * deviation / Span
3473*53ee8cc1Swenshuai.xi 
3474*53ee8cc1Swenshuai.xi     printf("ubSYNSet=%x, dSYNCLK=%d, dSSC_Span=%d, dSSC_Step=%d\r\n", ubSYNSet, dSYNCLK, dSSC_Span, dSSC_Step);
3475*53ee8cc1Swenshuai.xi 
3476*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, HDMITX_SSC_SPAN_REG, 0x3FFF, ( ((int)dSSC_Span) & 0x3FFF) );//Span
3477*53ee8cc1Swenshuai.xi     MHal_HDMITx_Write(HDMITX_PHY_REG_BASE, HDMITX_SSC_STEP_REG, ( ((int)dSSC_Step) & 0xFFFF) );//Step
3478*53ee8cc1Swenshuai.xi 
3479*53ee8cc1Swenshuai.xi     //Read tmds clock
3480*53ee8cc1Swenshuai.xi     #if 0
3481*53ee8cc1Swenshuai.xi     MHal_HDMITx_Mask_Write(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_20, 0x3F, 0x3F);
3482*53ee8cc1Swenshuai.xi     dPixel_Clk = ((MHal_HDMITx_Read(HDMITX_MISC_REG_BASE, REG_MISC_CONFIG_21) << 1) * 12 / 128);
3483*53ee8cc1Swenshuai.xi     #else
3484*53ee8cc1Swenshuai.xi     dPixel_Clk = uiTMDSCLK;
3485*53ee8cc1Swenshuai.xi     #endif
3486*53ee8cc1Swenshuai.xi     printf("dPixel_Clk=%d\r\n", dPixel_Clk);
3487*53ee8cc1Swenshuai.xi 
3488*53ee8cc1Swenshuai.xi     if(dPixel_Clk < HDMITX_SSC_THREAD_LEVEL1)
3489*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, HDMITX_SSC_SUB_DIVIDER_REG, 0x7000, 0x0000 );//Sub-Divider
3490*53ee8cc1Swenshuai.xi     else if(dPixel_Clk < HDMITX_SSC_THREAD_LEVEL2)
3491*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, HDMITX_SSC_SUB_DIVIDER_REG, 0x7000, 0x1000 );//Sub-Divider
3492*53ee8cc1Swenshuai.xi     else
3493*53ee8cc1Swenshuai.xi         MHal_HDMITx_Mask_Write(HDMITX_PHY_REG_BASE, HDMITX_SSC_SUB_DIVIDER_REG, 0x7000, 0x3000 );//Sub-Divider
3494*53ee8cc1Swenshuai.xi 
3495*53ee8cc1Swenshuai.xi     #endif
3496*53ee8cc1Swenshuai.xi }
3497*53ee8cc1Swenshuai.xi 
MHal_HDMITx_GetPixelClk_ByTiming(MsHDMITX_VIDEO_TIMING idx,MsHDMITX_VIDEO_COLOR_FORMAT color_fmt,MsHDMITX_VIDEO_COLORDEPTH_VAL color_depth)3498*53ee8cc1Swenshuai.xi MS_U32 MHal_HDMITx_GetPixelClk_ByTiming(MsHDMITX_VIDEO_TIMING idx, MsHDMITX_VIDEO_COLOR_FORMAT color_fmt, MsHDMITX_VIDEO_COLORDEPTH_VAL color_depth)
3499*53ee8cc1Swenshuai.xi {
3500*53ee8cc1Swenshuai.xi     MS_U32 dwTMDSDataRate = 0;
3501*53ee8cc1Swenshuai.xi     MS_U8 ubBitNum = 8;
3502*53ee8cc1Swenshuai.xi 
3503*53ee8cc1Swenshuai.xi     switch(color_depth)
3504*53ee8cc1Swenshuai.xi     {
3505*53ee8cc1Swenshuai.xi         case E_HDMITX_VIDEO_CD_NoID:
3506*53ee8cc1Swenshuai.xi         case E_HDMITX_VIDEO_CD_24Bits:
3507*53ee8cc1Swenshuai.xi         {
3508*53ee8cc1Swenshuai.xi             ubBitNum = 8;
3509*53ee8cc1Swenshuai.xi         }
3510*53ee8cc1Swenshuai.xi         break;
3511*53ee8cc1Swenshuai.xi 
3512*53ee8cc1Swenshuai.xi         case E_HDMITX_VIDEO_CD_30Bits:
3513*53ee8cc1Swenshuai.xi         {
3514*53ee8cc1Swenshuai.xi             ubBitNum = 10;
3515*53ee8cc1Swenshuai.xi         }
3516*53ee8cc1Swenshuai.xi         break;
3517*53ee8cc1Swenshuai.xi 
3518*53ee8cc1Swenshuai.xi         case E_HDMITX_VIDEO_CD_36Bits:
3519*53ee8cc1Swenshuai.xi         {
3520*53ee8cc1Swenshuai.xi             ubBitNum = 12;
3521*53ee8cc1Swenshuai.xi         }
3522*53ee8cc1Swenshuai.xi         break;
3523*53ee8cc1Swenshuai.xi 
3524*53ee8cc1Swenshuai.xi         case E_HDMITX_VIDEO_CD_48Bits:
3525*53ee8cc1Swenshuai.xi         {
3526*53ee8cc1Swenshuai.xi             ubBitNum = 16;
3527*53ee8cc1Swenshuai.xi         }
3528*53ee8cc1Swenshuai.xi         break;
3529*53ee8cc1Swenshuai.xi 
3530*53ee8cc1Swenshuai.xi         default:
3531*53ee8cc1Swenshuai.xi         {
3532*53ee8cc1Swenshuai.xi             ubBitNum = 8;
3533*53ee8cc1Swenshuai.xi         }
3534*53ee8cc1Swenshuai.xi         break;
3535*53ee8cc1Swenshuai.xi     }
3536*53ee8cc1Swenshuai.xi 
3537*53ee8cc1Swenshuai.xi     dwTMDSDataRate = (HDMITxVideoModeTbl[idx].pixel_clk/1000) * ubBitNum / 8;
3538*53ee8cc1Swenshuai.xi 
3539*53ee8cc1Swenshuai.xi     if(color_fmt == E_HDMITX_VIDEO_COLOR_YUV420)
3540*53ee8cc1Swenshuai.xi         dwTMDSDataRate = dwTMDSDataRate/2;
3541*53ee8cc1Swenshuai.xi 
3542*53ee8cc1Swenshuai.xi     //printf("Time_ID = %d, C_FMT = %d, C_DEP = %d, PXL_CLK = %d\r\n", idx, color_fmt, color_depth, dwTMDSDataRate);
3543*53ee8cc1Swenshuai.xi     return dwTMDSDataRate;
3544*53ee8cc1Swenshuai.xi }
3545*53ee8cc1Swenshuai.xi 
MHal_HDMITx_GetMaxPixelClk(void)3546*53ee8cc1Swenshuai.xi MS_U32 MHal_HDMITx_GetMaxPixelClk(void)
3547*53ee8cc1Swenshuai.xi {
3548*53ee8cc1Swenshuai.xi     return HDMITX_MAX_PIXEL_CLK/1000;
3549*53ee8cc1Swenshuai.xi }
3550