xref: /utopia/UTPA2-700.0.x/modules/xc/hal/maldives/pnl/halPNL.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 #ifndef _HAL_PNL_C_
79*53ee8cc1Swenshuai.xi #define _HAL_PNL_C_
80*53ee8cc1Swenshuai.xi 
81*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
82*53ee8cc1Swenshuai.xi //  Include Files
83*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
84*53ee8cc1Swenshuai.xi 
85*53ee8cc1Swenshuai.xi #include "MsCommon.h"
86*53ee8cc1Swenshuai.xi #include "MsTypes.h"
87*53ee8cc1Swenshuai.xi #include <string.h>
88*53ee8cc1Swenshuai.xi #include "utopia.h"
89*53ee8cc1Swenshuai.xi #include "utopia_dapi.h"
90*53ee8cc1Swenshuai.xi #include "apiPNL.h"
91*53ee8cc1Swenshuai.xi #include "apiPNL_v2.h"
92*53ee8cc1Swenshuai.xi #include "drvPNL.h"
93*53ee8cc1Swenshuai.xi #include "halPNL.h"
94*53ee8cc1Swenshuai.xi #include "PNL_private.h"
95*53ee8cc1Swenshuai.xi #include "drvPNL.h"
96*53ee8cc1Swenshuai.xi #include "halPNL.h"
97*53ee8cc1Swenshuai.xi #include "pnl_hwreg_utility2.h"
98*53ee8cc1Swenshuai.xi #include "Munich_pnl_lpll_tbl.h"
99*53ee8cc1Swenshuai.xi 
100*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
101*53ee8cc1Swenshuai.xi //  Driver Compiler Options
102*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
103*53ee8cc1Swenshuai.xi 
104*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
105*53ee8cc1Swenshuai.xi //  Local Defines
106*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
107*53ee8cc1Swenshuai.xi 
108*53ee8cc1Swenshuai.xi #define UNUSED(x)       (x=x)
109*53ee8cc1Swenshuai.xi #if 1
110*53ee8cc1Swenshuai.xi #define HAL_PNL_DBG(_dbgSwitch_, _fmt, _args...)      { if((_dbgSwitch_ & _u16PnlDbgSwitch) != 0) printf("PNL:"_fmt, ##_args); }
111*53ee8cc1Swenshuai.xi #define HAL_MOD_CAL_DBG(x)    //x
112*53ee8cc1Swenshuai.xi #else
113*53ee8cc1Swenshuai.xi #define HAL_PNL_DBG(_dbgSwitch_, _fmt, _args...)      { }
114*53ee8cc1Swenshuai.xi #endif
115*53ee8cc1Swenshuai.xi 
116*53ee8cc1Swenshuai.xi #define DAC_LPLL_ICTRL     0x0002
117*53ee8cc1Swenshuai.xi #define LVDS_LPLL_ICTRL    0x0001
118*53ee8cc1Swenshuai.xi 
119*53ee8cc1Swenshuai.xi //Get MOD calibration time
120*53ee8cc1Swenshuai.xi #define MOD_CAL_TIMER   FALSE
121*53ee8cc1Swenshuai.xi 
122*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
123*53ee8cc1Swenshuai.xi //  Local Structurs
124*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
125*53ee8cc1Swenshuai.xi 
126*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
127*53ee8cc1Swenshuai.xi //  Global Variables
128*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
129*53ee8cc1Swenshuai.xi 
130*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
131*53ee8cc1Swenshuai.xi //  Local Variables
132*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
133*53ee8cc1Swenshuai.xi 
134*53ee8cc1Swenshuai.xi // Output swing = 150mV + Code * 10mV.
135*53ee8cc1Swenshuai.xi // Designer recommand value. 0x15 = 21 = 250mv
136*53ee8cc1Swenshuai.xi static MS_U16  _u16PnlDefault_SwingLevel = 250;
137*53ee8cc1Swenshuai.xi static PNL_OUTPUT_MODE   _eDrvPnlInitOptions = E_PNL_OUTPUT_CLK_DATA;
138*53ee8cc1Swenshuai.xi MS_U8 _u8MOD_CALI_TARGET = 0;     ///< MOD_REG(0x7D),[10:9]00: 250mV ,01: 350mV ,10:300mV ,11:200mV
139*53ee8cc1Swenshuai.xi MS_S8 _usMOD_CALI_OFFSET = 0;        ///< MOD_REG(0x7D),[5:0]+ _usMOD_CALI_OFFSET
140*53ee8cc1Swenshuai.xi MS_U8 _u8MOD_CALI_VALUE  = 0x15;     /// Final value
141*53ee8cc1Swenshuai.xi 
142*53ee8cc1Swenshuai.xi MS_U8 _u8MOD_LVDS_Pair_Shift = 0;       ///< 0:default setting, LVDS pair Shift
143*53ee8cc1Swenshuai.xi MS_U8 _u8MOD_LVDS_Pair_Type = 0;        ///< 0:default setting, LVDS data differential pair
144*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
145*53ee8cc1Swenshuai.xi //  Debug Functions
146*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
147*53ee8cc1Swenshuai.xi 
148*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
149*53ee8cc1Swenshuai.xi //  Local Functions
150*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
151*53ee8cc1Swenshuai.xi 
152*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
153*53ee8cc1Swenshuai.xi //  Global Function
154*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
155*53ee8cc1Swenshuai.xi /**
156*53ee8cc1Swenshuai.xi *   @brief: Power On MOD. but not mutex protected
157*53ee8cc1Swenshuai.xi *
158*53ee8cc1Swenshuai.xi */
MHal_MOD_PowerOn(void * pInstance,MS_BOOL bEn,MS_U8 u8LPLL_Type,MS_U8 DualModeType,MS_U16 u16OutputCFG0_7,MS_U16 u16OutputCFG8_15,MS_U16 u16OutputCFG16_21)159*53ee8cc1Swenshuai.xi MS_U8 MHal_MOD_PowerOn(void *pInstance,MS_BOOL bEn, MS_U8 u8LPLL_Type,MS_U8 DualModeType, MS_U16 u16OutputCFG0_7, MS_U16 u16OutputCFG8_15, MS_U16 u16OutputCFG16_21)
160*53ee8cc1Swenshuai.xi {
161*53ee8cc1Swenshuai.xi     if( bEn )
162*53ee8cc1Swenshuai.xi     {
163*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_37_L, 0x00, BIT(8));
164*53ee8cc1Swenshuai.xi 
165*53ee8cc1Swenshuai.xi         //analog MOD power down. 1: power down, 0: power up
166*53ee8cc1Swenshuai.xi         // For Mod2 no output signel
167*53ee8cc1Swenshuai.xi         ///////////////////////////////////////////////////
168*53ee8cc1Swenshuai.xi 
169*53ee8cc1Swenshuai.xi         //2. Power on MOD (current and regulator)
170*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_78_L, 0x00 , BIT(0) | BIT(7) );
171*53ee8cc1Swenshuai.xi 
172*53ee8cc1Swenshuai.xi         //enable ib, enable ck
173*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_77_L, (BIT(1) | BIT(0)), (BIT(1) | BIT(0)));
174*53ee8cc1Swenshuai.xi 
175*53ee8cc1Swenshuai.xi         // clock gen of dot-mini
176*53ee8cc1Swenshuai.xi         if(u8LPLL_Type == E_PNL_TYPE_MINILVDS)
177*53ee8cc1Swenshuai.xi         {
178*53ee8cc1Swenshuai.xi             MOD_W2BYTE(REG_MOD_BK00_20_L, 0x4400);
179*53ee8cc1Swenshuai.xi         }
180*53ee8cc1Swenshuai.xi         else
181*53ee8cc1Swenshuai.xi         {
182*53ee8cc1Swenshuai.xi             MOD_W2BYTE(REG_MOD_BK00_20_L, 0x0000);
183*53ee8cc1Swenshuai.xi         }
184*53ee8cc1Swenshuai.xi 
185*53ee8cc1Swenshuai.xi         // 3. 4. 5.
186*53ee8cc1Swenshuai.xi         MHal_Output_LVDS_Pair_Setting(pInstance,DualModeType, u16OutputCFG0_7, u16OutputCFG8_15, u16OutputCFG16_21);
187*53ee8cc1Swenshuai.xi 
188*53ee8cc1Swenshuai.xi     }
189*53ee8cc1Swenshuai.xi     else
190*53ee8cc1Swenshuai.xi     {
191*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_37_L, BIT(8), BIT(8));
192*53ee8cc1Swenshuai.xi         if(u8LPLL_Type !=E_PNL_TYPE_MINILVDS)
193*53ee8cc1Swenshuai.xi         {
194*53ee8cc1Swenshuai.xi             MOD_W2BYTEMSK(REG_MOD_BK00_78_L, 0x00, BIT(0));                              //analog MOD power down. 1: power down, 0: power up
195*53ee8cc1Swenshuai.xi         }
196*53ee8cc1Swenshuai.xi 
197*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_77_L, 0, (BIT(1) | BIT(0) ));                           //enable ib, enable ck
198*53ee8cc1Swenshuai.xi 
199*53ee8cc1Swenshuai.xi         // clock gen of dot-mini
200*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_20_L, 0x1100);
201*53ee8cc1Swenshuai.xi     }
202*53ee8cc1Swenshuai.xi 
203*53ee8cc1Swenshuai.xi     return 1;
204*53ee8cc1Swenshuai.xi }
205*53ee8cc1Swenshuai.xi /**
206*53ee8cc1Swenshuai.xi *   @brief: Setup the PVDD power 1:2.5V, 0:3.3V
207*53ee8cc1Swenshuai.xi *
208*53ee8cc1Swenshuai.xi */
MHal_MOD_PVDD_Power_Setting(void * pInstance,MS_BOOL bIs2p5)209*53ee8cc1Swenshuai.xi void MHal_MOD_PVDD_Power_Setting(void *pInstance,MS_BOOL bIs2p5)
210*53ee8cc1Swenshuai.xi {
211*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_37_L, ((bIs2p5)? BIT(6):0), BIT(6));    //MOD PVDD=1: 2.5,PVDD=0: 3.3
212*53ee8cc1Swenshuai.xi }
213*53ee8cc1Swenshuai.xi 
MHal_PNL_TCON_Init(void * pInstance)214*53ee8cc1Swenshuai.xi void MHal_PNL_TCON_Init(void *pInstance)
215*53ee8cc1Swenshuai.xi {
216*53ee8cc1Swenshuai.xi 
217*53ee8cc1Swenshuai.xi }
218*53ee8cc1Swenshuai.xi 
MHal_Shift_LVDS_Pair(void * pInstance,MS_U8 Type)219*53ee8cc1Swenshuai.xi void MHal_Shift_LVDS_Pair(void *pInstance,MS_U8 Type)
220*53ee8cc1Swenshuai.xi {
221*53ee8cc1Swenshuai.xi     if(Type == 1)
222*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_42_L, (BIT(7) | BIT(6)), (BIT(7) | BIT(6))); // shift_lvds_pair, set LVDS Mode3
223*53ee8cc1Swenshuai.xi     else
224*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_42_L, 0x0000, (BIT(7) | BIT(6)));
225*53ee8cc1Swenshuai.xi 
226*53ee8cc1Swenshuai.xi }
227*53ee8cc1Swenshuai.xi 
MHal_Output_LVDS_Pair_Setting(void * pInstance,MS_U8 Type,MS_U16 u16OutputCFG0_7,MS_U16 u16OutputCFG8_15,MS_U16 u16OutputCFG16_21)228*53ee8cc1Swenshuai.xi void MHal_Output_LVDS_Pair_Setting(void *pInstance,MS_U8 Type, MS_U16 u16OutputCFG0_7, MS_U16 u16OutputCFG8_15, MS_U16 u16OutputCFG16_21)
229*53ee8cc1Swenshuai.xi {
230*53ee8cc1Swenshuai.xi     // Disable OP
231*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_78_L, BIT(1) , BIT(1) );
232*53ee8cc1Swenshuai.xi 
233*53ee8cc1Swenshuai.xi     if(Type == LVDS_DUAL_OUTPUT_SPECIAL )
234*53ee8cc1Swenshuai.xi     {
235*53ee8cc1Swenshuai.xi         // for 100/128 pin special case
236*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_34_L, 0x1000, 0xFF00);
237*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_6D_L, 0x5555);
238*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_6E_L, 0x0055);
239*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_6F_L, 0x0000);
240*53ee8cc1Swenshuai.xi     }
241*53ee8cc1Swenshuai.xi     else if(Type == LVDS_SINGLE_OUTPUT_A)
242*53ee8cc1Swenshuai.xi     {
243*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_6D_L, 0x0000, 0xF000);
244*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_6E_L, 0x5500);
245*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_6F_L, 0x0005, 0x000F);
246*53ee8cc1Swenshuai.xi     }
247*53ee8cc1Swenshuai.xi     else if( Type == LVDS_SINGLE_OUTPUT_B)
248*53ee8cc1Swenshuai.xi     {
249*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_6D_L, 0x5000, 0xF000);
250*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_6E_L, 0x0055);
251*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_6F_L, 0x0000, 0x000F);
252*53ee8cc1Swenshuai.xi     }
253*53ee8cc1Swenshuai.xi     else if( Type == LVDS_OUTPUT_User)
254*53ee8cc1Swenshuai.xi     {
255*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_6D_L, u16OutputCFG0_7);
256*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_6E_L, u16OutputCFG8_15);
257*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_6F_L, u16OutputCFG16_21, 0x000F);
258*53ee8cc1Swenshuai.xi     }
259*53ee8cc1Swenshuai.xi     else
260*53ee8cc1Swenshuai.xi     {
261*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_6D_L, 0x5550);
262*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_6E_L, 0x0555);
263*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_6F_L, 0x0000);
264*53ee8cc1Swenshuai.xi     }
265*53ee8cc1Swenshuai.xi 
266*53ee8cc1Swenshuai.xi     MsOS_DelayTask(2);
267*53ee8cc1Swenshuai.xi 
268*53ee8cc1Swenshuai.xi     // Enable OP
269*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_78_L, 0x00 , BIT(1) );
270*53ee8cc1Swenshuai.xi 
271*53ee8cc1Swenshuai.xi }
272*53ee8cc1Swenshuai.xi 
MHal_Output_Channel_Order(void * pInstance,MS_U8 Type,MS_U16 u16OutputOrder0_3,MS_U16 u16OutputOrder4_7,MS_U16 u16OutputOrder8_11,MS_U16 u16OutputOrder12_13)273*53ee8cc1Swenshuai.xi void MHal_Output_Channel_Order(void *pInstance,
274*53ee8cc1Swenshuai.xi                                MS_U8 Type,
275*53ee8cc1Swenshuai.xi                                MS_U16 u16OutputOrder0_3,
276*53ee8cc1Swenshuai.xi                                MS_U16 u16OutputOrder4_7,
277*53ee8cc1Swenshuai.xi                                MS_U16 u16OutputOrder8_11,
278*53ee8cc1Swenshuai.xi                                MS_U16 u16OutputOrder12_13)
279*53ee8cc1Swenshuai.xi {
280*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
281*53ee8cc1Swenshuai.xi     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
282*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
283*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
284*53ee8cc1Swenshuai.xi #if 0
285*53ee8cc1Swenshuai.xi     if(Type == APIPNL_OUTPUT_CHANNEL_ORDER_USER )
286*53ee8cc1Swenshuai.xi     {
287*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_08_L, u16OutputOrder0_3);
288*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_09_L, u16OutputOrder4_7);
289*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_0A_L, u16OutputOrder8_11);
290*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_0B_L, u16OutputOrder12_13);
291*53ee8cc1Swenshuai.xi     }
292*53ee8cc1Swenshuai.xi     else
293*53ee8cc1Swenshuai.xi     {
294*53ee8cc1Swenshuai.xi         if(   (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)
295*53ee8cc1Swenshuai.xi             ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE))
296*53ee8cc1Swenshuai.xi         {
297*53ee8cc1Swenshuai.xi             if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16MOD_CTRLA & BIT(1))
298*53ee8cc1Swenshuai.xi             {
299*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_08_L, 0x6420);
300*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_09_L, 0x7531);
301*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_0A_L, 0xB9A8);
302*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_0B_L, 0x0000);
303*53ee8cc1Swenshuai.xi             }
304*53ee8cc1Swenshuai.xi             else
305*53ee8cc1Swenshuai.xi             {
306*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_08_L, 0x5410);
307*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_09_L, 0x7632);
308*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_0A_L, 0xB9A8);
309*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_0B_L, 0x0000);
310*53ee8cc1Swenshuai.xi             }
311*53ee8cc1Swenshuai.xi         }
312*53ee8cc1Swenshuai.xi         else
313*53ee8cc1Swenshuai.xi         {
314*53ee8cc1Swenshuai.xi             MOD_W2BYTE(REG_MOD_BK00_08_L, 0x5410);
315*53ee8cc1Swenshuai.xi             MOD_W2BYTE(REG_MOD_BK00_09_L, 0x5410);
316*53ee8cc1Swenshuai.xi             MOD_W2BYTE(REG_MOD_BK00_0A_L, 0xB9A8);
317*53ee8cc1Swenshuai.xi             MOD_W2BYTE(REG_MOD_BK00_0B_L, 0x0000);
318*53ee8cc1Swenshuai.xi         }
319*53ee8cc1Swenshuai.xi     }
320*53ee8cc1Swenshuai.xi #endif
321*53ee8cc1Swenshuai.xi 
322*53ee8cc1Swenshuai.xi }
323*53ee8cc1Swenshuai.xi 
MHal_PQ_Clock_Gen_For_Gamma(void * pInstance)324*53ee8cc1Swenshuai.xi void MHal_PQ_Clock_Gen_For_Gamma(void *pInstance)
325*53ee8cc1Swenshuai.xi {
326*53ee8cc1Swenshuai.xi     W2BYTEMSK(REG_CLKGEN0_52_L, 0x00, 0x07);
327*53ee8cc1Swenshuai.xi }
328*53ee8cc1Swenshuai.xi 
MHal_VOP_SetGammaMappingMode(void * pInstance,MS_U8 u8Mapping)329*53ee8cc1Swenshuai.xi void MHal_VOP_SetGammaMappingMode(void *pInstance,MS_U8 u8Mapping)
330*53ee8cc1Swenshuai.xi {
331*53ee8cc1Swenshuai.xi 
332*53ee8cc1Swenshuai.xi     if(u8Mapping & GAMMA_MAPPING)
333*53ee8cc1Swenshuai.xi     {
334*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK10_74_L, (u8Mapping & GAMMA_10BIT_MAPPING)? BIT(15):0, BIT(15));
335*53ee8cc1Swenshuai.xi     }
336*53ee8cc1Swenshuai.xi     else
337*53ee8cc1Swenshuai.xi     {
338*53ee8cc1Swenshuai.xi         PNL_ASSERT(0, "Invalid eSupportGammaMapMode [%d] Passed to [%s], please make sure the u8Mapping[%d] is valid\n.",
339*53ee8cc1Swenshuai.xi                        u8Mapping, __FUNCTION__, u8Mapping);
340*53ee8cc1Swenshuai.xi     }
341*53ee8cc1Swenshuai.xi }
342*53ee8cc1Swenshuai.xi 
Hal_VOP_Is_GammaMappingMode_enable(void * pInstance)343*53ee8cc1Swenshuai.xi MS_BOOL Hal_VOP_Is_GammaMappingMode_enable(void *pInstance)
344*53ee8cc1Swenshuai.xi {
345*53ee8cc1Swenshuai.xi     return SC_R2BYTEMSK(0,REG_SC_BK10_74_L, BIT(15));
346*53ee8cc1Swenshuai.xi }
347*53ee8cc1Swenshuai.xi 
348*53ee8cc1Swenshuai.xi // After A5, 8 bit mode only support burst write!!!
Hal_VOP_Is_GammaSupportSignalWrite(void * pInstance,DRVPNL_GAMMA_MAPPEING_MODE u8Mapping)349*53ee8cc1Swenshuai.xi MS_BOOL Hal_VOP_Is_GammaSupportSignalWrite(void *pInstance,DRVPNL_GAMMA_MAPPEING_MODE u8Mapping)
350*53ee8cc1Swenshuai.xi {
351*53ee8cc1Swenshuai.xi     return TRUE;
352*53ee8cc1Swenshuai.xi }
353*53ee8cc1Swenshuai.xi 
354*53ee8cc1Swenshuai.xi 
hal_PNL_WriteGamma12Bit(void * pInstance,MS_U8 u8Channel,MS_BOOL bBurstWrite,MS_U16 u16Addr,MS_U16 u16GammaValue)355*53ee8cc1Swenshuai.xi void hal_PNL_WriteGamma12Bit(void *pInstance,MS_U8 u8Channel, MS_BOOL bBurstWrite, MS_U16 u16Addr, MS_U16 u16GammaValue)
356*53ee8cc1Swenshuai.xi {
357*53ee8cc1Swenshuai.xi     MS_U16 u16Delay = 0xFFFF;
358*53ee8cc1Swenshuai.xi 
359*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_GAMMA, "Write [ch %d][addr 0x%x]: 0x%x \n", u8Channel, u16Addr, u16GammaValue);
360*53ee8cc1Swenshuai.xi 
361*53ee8cc1Swenshuai.xi     if (!bBurstWrite )
362*53ee8cc1Swenshuai.xi     {
363*53ee8cc1Swenshuai.xi         while (SC_R2BYTEMSK(0,REG_SC_BK10_6D_L, 0xE0) && (--u16Delay));          // Check whether the Write chanel is ready
364*53ee8cc1Swenshuai.xi         PNL_ASSERT(u16Delay > 0, "%s\n", "WriteGamma timeout");
365*53ee8cc1Swenshuai.xi 
366*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK10_6C_L, u16Addr, 0x3FF);                          // set address port
367*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,(REG_SC_BK10_6E_L + u8Channel *2), u16GammaValue, 0xFFF);      // Set channel data
368*53ee8cc1Swenshuai.xi 
369*53ee8cc1Swenshuai.xi         // kick off write
370*53ee8cc1Swenshuai.xi         switch(u8Channel)
371*53ee8cc1Swenshuai.xi         {
372*53ee8cc1Swenshuai.xi             case 0:  // Red
373*53ee8cc1Swenshuai.xi                 SC_W2BYTEMSK(0,REG_SC_BK10_6D_L, BIT(5), BIT(5));
374*53ee8cc1Swenshuai.xi                 break;
375*53ee8cc1Swenshuai.xi 
376*53ee8cc1Swenshuai.xi             case 1:  // Green
377*53ee8cc1Swenshuai.xi                 SC_W2BYTEMSK(0,REG_SC_BK10_6D_L, BIT(6), BIT(6));
378*53ee8cc1Swenshuai.xi                 break;
379*53ee8cc1Swenshuai.xi 
380*53ee8cc1Swenshuai.xi             case 2:  // Blue
381*53ee8cc1Swenshuai.xi                 SC_W2BYTEMSK(0,REG_SC_BK10_6D_L, BIT(7), BIT(7));
382*53ee8cc1Swenshuai.xi                 break;
383*53ee8cc1Swenshuai.xi         }
384*53ee8cc1Swenshuai.xi 
385*53ee8cc1Swenshuai.xi         while (SC_R2BYTEMSK(0,REG_SC_BK10_6D_L, 0xE0) && (--u16Delay));          // Check whether the Write chanel is ready
386*53ee8cc1Swenshuai.xi     }
387*53ee8cc1Swenshuai.xi     else
388*53ee8cc1Swenshuai.xi     {
389*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK10_6E_L, u16GammaValue, 0xFFF);
390*53ee8cc1Swenshuai.xi     }
391*53ee8cc1Swenshuai.xi 
392*53ee8cc1Swenshuai.xi 
393*53ee8cc1Swenshuai.xi     PNL_ASSERT(u16Delay > 0, "%s\n", "WriteGamma timeout");
394*53ee8cc1Swenshuai.xi 
395*53ee8cc1Swenshuai.xi }
396*53ee8cc1Swenshuai.xi 
397*53ee8cc1Swenshuai.xi 
hal_PNL_SetMaxGammaValue(void * pInstance,MS_U8 u8Channel,MS_U16 u16MaxGammaValue)398*53ee8cc1Swenshuai.xi void hal_PNL_SetMaxGammaValue(void *pInstance, MS_U8 u8Channel, MS_U16 u16MaxGammaValue)
399*53ee8cc1Swenshuai.xi {
400*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_GAMMA, "Max gamma of %d is 0x%x\n", u8Channel, u16MaxGammaValue);
401*53ee8cc1Swenshuai.xi 
402*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(0,(REG_SC_BK10_7A_L + 4 * u8Channel), u16MaxGammaValue, 0xFFF);           // max. base 0
403*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(0,(REG_SC_BK10_7B_L + 4 * u8Channel), u16MaxGammaValue, 0xFFF);           // max. base 1
404*53ee8cc1Swenshuai.xi }
405*53ee8cc1Swenshuai.xi 
406*53ee8cc1Swenshuai.xi 
407*53ee8cc1Swenshuai.xi /////////////////////////////////////////////////////////////////////////////
408*53ee8cc1Swenshuai.xi // Gamma format (12 bit LUT)
409*53ee8cc1Swenshuai.xi //      0, 1, 2, 3, ..., NumOfLevel, totally N Sets of tNormalGammaR/G/B[],
410*53ee8cc1Swenshuai.xi //      1 set uses 2 bytes of memory.
411*53ee8cc1Swenshuai.xi //
412*53ee8cc1Swenshuai.xi // [T2 and before ] N = 256
413*53ee8cc1Swenshuai.xi // [T3]             N = 256 or 1024
414*53ee8cc1Swenshuai.xi // ______________________________________________________________________________
415*53ee8cc1Swenshuai.xi //  Byte | 0         1           2               n-1        n
416*53ee8cc1Swenshuai.xi //    [G1|G0]       [G0]       [G1] . ...... .  [Gmax]    [Gmax]
417*53ee8cc1Swenshuai.xi //    3:0  3:0      11:4       11:4              3:0       11:4
418*53ee8cc1Swenshuai.xi //
419*53ee8cc1Swenshuai.xi 
Hal_PNL_Set12BitGammaPerChannel(void * pInstance,MS_U8 u8Channel,MS_U8 * u8Tab,DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode)420*53ee8cc1Swenshuai.xi void Hal_PNL_Set12BitGammaPerChannel(void *pInstance, MS_U8 u8Channel, MS_U8 * u8Tab, DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode )
421*53ee8cc1Swenshuai.xi {
422*53ee8cc1Swenshuai.xi     MS_U16 u16Addr            = 0;
423*53ee8cc1Swenshuai.xi     MS_U16 u16CodeTableIndex  = u16Addr/2*3;
424*53ee8cc1Swenshuai.xi     MS_U16 u16GammaValue      = 0;
425*53ee8cc1Swenshuai.xi     MS_U16 u16MaxGammaValue   = 0;
426*53ee8cc1Swenshuai.xi     MS_U16 u16NumOfLevel = GammaMapMode == E_DRVPNL_GAMMA_8BIT_MAPPING ? 256 : 1024;
427*53ee8cc1Swenshuai.xi     MS_BOOL bUsingBurstWrite = !Hal_VOP_Is_GammaSupportSignalWrite(pInstance,GammaMapMode);
428*53ee8cc1Swenshuai.xi 
429*53ee8cc1Swenshuai.xi     // Go to burst write if not support
430*53ee8cc1Swenshuai.xi     if ( bUsingBurstWrite )
431*53ee8cc1Swenshuai.xi     {
432*53ee8cc1Swenshuai.xi         // 1.   initial burst write address, LUT_ADDR[7:0]
433*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK10_6C_L, 0x00 , 0x3FF);
434*53ee8cc1Swenshuai.xi 
435*53ee8cc1Swenshuai.xi         // 2.   select burst write channel, REG_LUT_BW_CH_SEL[1:0]
436*53ee8cc1Swenshuai.xi         switch(u8Channel)
437*53ee8cc1Swenshuai.xi         {
438*53ee8cc1Swenshuai.xi             case 0:  // Red
439*53ee8cc1Swenshuai.xi                 SC_W2BYTEMSK(0,REG_SC_BK10_6D_L, 0x00 , BIT(3) | BIT(2) );
440*53ee8cc1Swenshuai.xi                 break;
441*53ee8cc1Swenshuai.xi 
442*53ee8cc1Swenshuai.xi             case 1:  // Green
443*53ee8cc1Swenshuai.xi                 SC_W2BYTEMSK(0,REG_SC_BK10_6D_L, BIT(2) , BIT(3) | BIT(2) );
444*53ee8cc1Swenshuai.xi                 break;
445*53ee8cc1Swenshuai.xi 
446*53ee8cc1Swenshuai.xi             case 2:  // Blue
447*53ee8cc1Swenshuai.xi                 SC_W2BYTEMSK(0,REG_SC_BK10_6D_L, BIT(3) , BIT(3) | BIT(2) );
448*53ee8cc1Swenshuai.xi                 break;
449*53ee8cc1Swenshuai.xi         }
450*53ee8cc1Swenshuai.xi 
451*53ee8cc1Swenshuai.xi         // 3.   enable burst write mode, REG_LUT_BW_MAIN_EN
452*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK10_6D_L, BIT(0) , BIT(0)); // Burst write enable
453*53ee8cc1Swenshuai.xi 
454*53ee8cc1Swenshuai.xi     }
455*53ee8cc1Swenshuai.xi 
456*53ee8cc1Swenshuai.xi     //printf("\33[0;31m Gamma Mapping mode %d \n \33[m",GammaMapMode );
457*53ee8cc1Swenshuai.xi     // write gamma table per one channel
458*53ee8cc1Swenshuai.xi     for(; u16Addr < u16NumOfLevel; u16CodeTableIndex += 3)
459*53ee8cc1Swenshuai.xi     {
460*53ee8cc1Swenshuai.xi         // gamma x
461*53ee8cc1Swenshuai.xi         u16GammaValue = u8Tab[u16CodeTableIndex] & 0x0F;
462*53ee8cc1Swenshuai.xi         u16GammaValue |= u8Tab[u16CodeTableIndex+1] << 4;
463*53ee8cc1Swenshuai.xi 
464*53ee8cc1Swenshuai.xi         PNL_DBG(PNL_DBGLEVEL_GAMMA,"Gamma x: SrcGTbl[%d] = 0x%x, [%d] = 0x%x, Gamma = 0x%x, GammaLvl=%d\n",
465*53ee8cc1Swenshuai.xi                                     u16CodeTableIndex, u8Tab[u16CodeTableIndex], u16CodeTableIndex+1, u8Tab[u16CodeTableIndex+1], u16GammaValue, u16NumOfLevel);
466*53ee8cc1Swenshuai.xi 
467*53ee8cc1Swenshuai.xi         if(u16MaxGammaValue < u16GammaValue)
468*53ee8cc1Swenshuai.xi         {
469*53ee8cc1Swenshuai.xi             u16MaxGammaValue = u16GammaValue;
470*53ee8cc1Swenshuai.xi         }
471*53ee8cc1Swenshuai.xi 
472*53ee8cc1Swenshuai.xi         // write gamma value
473*53ee8cc1Swenshuai.xi         hal_PNL_WriteGamma12Bit(pInstance,u8Channel,bUsingBurstWrite, u16Addr, u16GammaValue);
474*53ee8cc1Swenshuai.xi         u16Addr++;
475*53ee8cc1Swenshuai.xi 
476*53ee8cc1Swenshuai.xi         // gamma x+1
477*53ee8cc1Swenshuai.xi         u16GammaValue = (u8Tab[u16CodeTableIndex] & 0xF0) >> 4;
478*53ee8cc1Swenshuai.xi         u16GammaValue |= u8Tab[u16CodeTableIndex+2] << 4;
479*53ee8cc1Swenshuai.xi 
480*53ee8cc1Swenshuai.xi         PNL_DBG(PNL_DBGLEVEL_GAMMA, "Gamma x+1: SrcGTbl[%d] = 0x%x, [%d] = 0x%x, Gamma = 0x%x\n", u16CodeTableIndex, u8Tab[u16CodeTableIndex], u16CodeTableIndex+2, u8Tab[u16CodeTableIndex+2], u16GammaValue);
481*53ee8cc1Swenshuai.xi 
482*53ee8cc1Swenshuai.xi         if(u16MaxGammaValue < u16GammaValue)
483*53ee8cc1Swenshuai.xi         {
484*53ee8cc1Swenshuai.xi             u16MaxGammaValue = u16GammaValue;
485*53ee8cc1Swenshuai.xi         }
486*53ee8cc1Swenshuai.xi 
487*53ee8cc1Swenshuai.xi         // write gamma value
488*53ee8cc1Swenshuai.xi         hal_PNL_WriteGamma12Bit(pInstance,u8Channel,bUsingBurstWrite, u16Addr, u16GammaValue);
489*53ee8cc1Swenshuai.xi         u16Addr++;
490*53ee8cc1Swenshuai.xi     }
491*53ee8cc1Swenshuai.xi 
492*53ee8cc1Swenshuai.xi     if ( bUsingBurstWrite )
493*53ee8cc1Swenshuai.xi     {
494*53ee8cc1Swenshuai.xi         // 5.   after finish burst write data of one channel, disable burst write mode
495*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK10_6D_L, 0x00 , BIT(0));
496*53ee8cc1Swenshuai.xi     }
497*53ee8cc1Swenshuai.xi 
498*53ee8cc1Swenshuai.xi     hal_PNL_SetMaxGammaValue(pInstance,u8Channel, u16MaxGammaValue);
499*53ee8cc1Swenshuai.xi }
_MHal_PNL_GetSupportedLPLLIndex(void * pInstance,PNL_TYPE eLPLL_Type,PNL_MODE eLPLL_Mode,MS_U64 ldHz)500*53ee8cc1Swenshuai.xi static E_PNL_SUPPORTED_LPLL_TYPE _MHal_PNL_GetSupportedLPLLIndex(void *pInstance,
501*53ee8cc1Swenshuai.xi                                                                  PNL_TYPE eLPLL_Type,
502*53ee8cc1Swenshuai.xi                                                                  PNL_MODE eLPLL_Mode,
503*53ee8cc1Swenshuai.xi                                                                  MS_U64 ldHz)
504*53ee8cc1Swenshuai.xi {
505*53ee8cc1Swenshuai.xi     E_PNL_SUPPORTED_LPLL_TYPE u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MAX;
506*53ee8cc1Swenshuai.xi 
507*53ee8cc1Swenshuai.xi     switch (eLPLL_Type)
508*53ee8cc1Swenshuai.xi     {
509*53ee8cc1Swenshuai.xi         case E_PNL_TYPE_LVDS:
510*53ee8cc1Swenshuai.xi             switch (eLPLL_Mode)
511*53ee8cc1Swenshuai.xi             {
512*53ee8cc1Swenshuai.xi                 case E_PNL_MODE_SINGLE:
513*53ee8cc1Swenshuai.xi                     u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_LVDS_1CH_50to90MHz;
514*53ee8cc1Swenshuai.xi                 break;
515*53ee8cc1Swenshuai.xi 
516*53ee8cc1Swenshuai.xi                 default:
517*53ee8cc1Swenshuai.xi                 case E_PNL_MODE_DUAL:
518*53ee8cc1Swenshuai.xi                     if ((ldHz >= 500000000UL) && (ldHz < 1100000000UL))
519*53ee8cc1Swenshuai.xi                     {
520*53ee8cc1Swenshuai.xi                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_LVDS_2CH_50to110MHz;
521*53ee8cc1Swenshuai.xi                     }
522*53ee8cc1Swenshuai.xi                     else
523*53ee8cc1Swenshuai.xi                     {
524*53ee8cc1Swenshuai.xi                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_LVDS_2CH_110to150MHz;
525*53ee8cc1Swenshuai.xi                     }
526*53ee8cc1Swenshuai.xi                 break;
527*53ee8cc1Swenshuai.xi             }
528*53ee8cc1Swenshuai.xi         break;
529*53ee8cc1Swenshuai.xi 
530*53ee8cc1Swenshuai.xi         case E_PNL_TYPE_HS_LVDS:
531*53ee8cc1Swenshuai.xi 
532*53ee8cc1Swenshuai.xi             switch (eLPLL_Mode)
533*53ee8cc1Swenshuai.xi             {
534*53ee8cc1Swenshuai.xi                 case E_PNL_MODE_SINGLE:
535*53ee8cc1Swenshuai.xi                     if((ldHz >= 500000000UL) && (ldHz < 1100000000UL))
536*53ee8cc1Swenshuai.xi                     {
537*53ee8cc1Swenshuai.xi                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_1CH_50to110MHz;
538*53ee8cc1Swenshuai.xi                     }
539*53ee8cc1Swenshuai.xi                     else
540*53ee8cc1Swenshuai.xi                     {
541*53ee8cc1Swenshuai.xi                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_1CH_110to150MHz;
542*53ee8cc1Swenshuai.xi                     }
543*53ee8cc1Swenshuai.xi                 break;
544*53ee8cc1Swenshuai.xi 
545*53ee8cc1Swenshuai.xi                 default:
546*53ee8cc1Swenshuai.xi                 case E_PNL_MODE_DUAL:
547*53ee8cc1Swenshuai.xi                     if(ldHz >= 2300000000UL)
548*53ee8cc1Swenshuai.xi                     {
549*53ee8cc1Swenshuai.xi                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_2CH_230to300MHz;
550*53ee8cc1Swenshuai.xi                     }
551*53ee8cc1Swenshuai.xi                     else if(ldHz >= 1145000000UL)
552*53ee8cc1Swenshuai.xi                     {
553*53ee8cc1Swenshuai.xi                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_2CH_114_5to230MHz;
554*53ee8cc1Swenshuai.xi                     }
555*53ee8cc1Swenshuai.xi                     else
556*53ee8cc1Swenshuai.xi                     {
557*53ee8cc1Swenshuai.xi                         u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_2CH_50to114_5MHz;
558*53ee8cc1Swenshuai.xi                     }
559*53ee8cc1Swenshuai.xi                 break;
560*53ee8cc1Swenshuai.xi             }
561*53ee8cc1Swenshuai.xi         break;
562*53ee8cc1Swenshuai.xi 
563*53ee8cc1Swenshuai.xi         case E_PNL_TYPE_TTL:
564*53ee8cc1Swenshuai.xi               if ((ldHz >= 250000000UL) && (ldHz < 500000000UL))
565*53ee8cc1Swenshuai.xi               {
566*53ee8cc1Swenshuai.xi                   u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_TTL_25to50MHz;
567*53ee8cc1Swenshuai.xi               }
568*53ee8cc1Swenshuai.xi               else if((ldHz >= 500000000UL) && (ldHz < 1000000000UL))
569*53ee8cc1Swenshuai.xi               {
570*53ee8cc1Swenshuai.xi                   u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_TTL_50to100MHz;
571*53ee8cc1Swenshuai.xi               }
572*53ee8cc1Swenshuai.xi               else
573*53ee8cc1Swenshuai.xi               {
574*53ee8cc1Swenshuai.xi                   u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_TTL_100to150MHz;
575*53ee8cc1Swenshuai.xi               }
576*53ee8cc1Swenshuai.xi           break;
577*53ee8cc1Swenshuai.xi 
578*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_1CH_3P_8BIT:
579*53ee8cc1Swenshuai.xi             //if (ldHz >= 500000000UL)
580*53ee8cc1Swenshuai.xi             {
581*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_1CH_3PAIR_8BIT_50to80MHz;
582*53ee8cc1Swenshuai.xi             }
583*53ee8cc1Swenshuai.xi         break;
584*53ee8cc1Swenshuai.xi 
585*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_2CH_3P_8BIT:
586*53ee8cc1Swenshuai.xi             if (ldHz >= 1000000000UL)
587*53ee8cc1Swenshuai.xi             {
588*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_3PAIR_8BIT_100to150MHz;
589*53ee8cc1Swenshuai.xi             }
590*53ee8cc1Swenshuai.xi             else //if (ldHz >= 500000000UL)
591*53ee8cc1Swenshuai.xi             {
592*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex =     E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_3PAIR_8BIT_50to100MHz;
593*53ee8cc1Swenshuai.xi             }
594*53ee8cc1Swenshuai.xi         break;
595*53ee8cc1Swenshuai.xi 
596*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_1CH_3P_6BIT:
597*53ee8cc1Swenshuai.xi             if (ldHz >= 666700000UL)
598*53ee8cc1Swenshuai.xi             {
599*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_1CH_3PAIR_6BIT_66_67to80MHz;
600*53ee8cc1Swenshuai.xi             }
601*53ee8cc1Swenshuai.xi             else //if (ldHz >= 500000000UL)
602*53ee8cc1Swenshuai.xi             {
603*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_1CH_3PAIR_6BIT_50to66_67MHz;
604*53ee8cc1Swenshuai.xi             }
605*53ee8cc1Swenshuai.xi         break;
606*53ee8cc1Swenshuai.xi 
607*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_2CH_3P_6BIT:
608*53ee8cc1Swenshuai.xi             if (ldHz >= 1333300000UL)
609*53ee8cc1Swenshuai.xi             {
610*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_3PAIR_6BIT_133_33to150MHz;
611*53ee8cc1Swenshuai.xi             }
612*53ee8cc1Swenshuai.xi             else if (ldHz >= 666700000UL)
613*53ee8cc1Swenshuai.xi             {
614*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_3PAIR_6BIT_66_67to133_33MHz;
615*53ee8cc1Swenshuai.xi             }
616*53ee8cc1Swenshuai.xi             else
617*53ee8cc1Swenshuai.xi             {
618*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_3PAIR_6BIT_50to66_67MHz;
619*53ee8cc1Swenshuai.xi             }
620*53ee8cc1Swenshuai.xi         break;
621*53ee8cc1Swenshuai.xi 
622*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_2CH_6P_8BIT:
623*53ee8cc1Swenshuai.xi             if (ldHz >= 1000000000UL)
624*53ee8cc1Swenshuai.xi             {
625*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_6PAIR_8BIT_100to150MHz;
626*53ee8cc1Swenshuai.xi             }
627*53ee8cc1Swenshuai.xi             else //if (ldHz >= 500000000UL)
628*53ee8cc1Swenshuai.xi             {
629*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_6PAIR_8BIT_50to100MHz;
630*53ee8cc1Swenshuai.xi             }
631*53ee8cc1Swenshuai.xi         break;
632*53ee8cc1Swenshuai.xi 
633*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_2CH_6P_6BIT:
634*53ee8cc1Swenshuai.xi             if (ldHz >= 1333300000UL)
635*53ee8cc1Swenshuai.xi             {
636*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_6PAIR_6BIT_133_33to150MHz;
637*53ee8cc1Swenshuai.xi             }
638*53ee8cc1Swenshuai.xi             else if (ldHz >= 666700000UL)
639*53ee8cc1Swenshuai.xi             {
640*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_6PAIR_6BIT_66_67to133_33MHz;
641*53ee8cc1Swenshuai.xi             }
642*53ee8cc1Swenshuai.xi             else
643*53ee8cc1Swenshuai.xi             {
644*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_6PAIR_6BIT_50to66_67MHz;
645*53ee8cc1Swenshuai.xi             }
646*53ee8cc1Swenshuai.xi         break;
647*53ee8cc1Swenshuai.xi 
648*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_EPI34_4P:
649*53ee8cc1Swenshuai.xi             if (ldHz >= 950000000UL)
650*53ee8cc1Swenshuai.xi             {
651*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_34_10bit_4PAIR_95to150MHz;
652*53ee8cc1Swenshuai.xi             }
653*53ee8cc1Swenshuai.xi             else //if (ldHz >= 800000000UL)
654*53ee8cc1Swenshuai.xi             {
655*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_34_10bit_4PAIR_80to95MHz;
656*53ee8cc1Swenshuai.xi             }
657*53ee8cc1Swenshuai.xi         break;
658*53ee8cc1Swenshuai.xi 
659*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_EPI34_6P:
660*53ee8cc1Swenshuai.xi             //if (ldHz >= 800000000UL)
661*53ee8cc1Swenshuai.xi             {
662*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_34_10bit_6PAIR_80to150MHz;
663*53ee8cc1Swenshuai.xi             }
664*53ee8cc1Swenshuai.xi         break;
665*53ee8cc1Swenshuai.xi 
666*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_EPI34_8P:
667*53ee8cc1Swenshuai.xi             if (ldHz >= 950000000UL)
668*53ee8cc1Swenshuai.xi             {
669*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_34_10bit_8PAIR_95to150MHz;
670*53ee8cc1Swenshuai.xi             }
671*53ee8cc1Swenshuai.xi             else //if (ldHz >= 800000000UL)
672*53ee8cc1Swenshuai.xi             {
673*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_34_10bit_8PAIR_80to95MHz;
674*53ee8cc1Swenshuai.xi             }
675*53ee8cc1Swenshuai.xi         break;
676*53ee8cc1Swenshuai.xi 
677*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_EPI28_4P:
678*53ee8cc1Swenshuai.xi             if (ldHz >= 1150000000UL)
679*53ee8cc1Swenshuai.xi             {
680*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_8bit_4PAIR_115to150MHz;
681*53ee8cc1Swenshuai.xi             }
682*53ee8cc1Swenshuai.xi             else //if (ldHz >= 800000000UL)
683*53ee8cc1Swenshuai.xi             {
684*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_8bit_4PAIR_80to115MHz;
685*53ee8cc1Swenshuai.xi             }
686*53ee8cc1Swenshuai.xi         break;
687*53ee8cc1Swenshuai.xi 
688*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_EPI28_6P:
689*53ee8cc1Swenshuai.xi             //if (ldHz >= 800000000UL)
690*53ee8cc1Swenshuai.xi             {
691*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_8bit_6PAIR_80to150MHz;
692*53ee8cc1Swenshuai.xi             }
693*53ee8cc1Swenshuai.xi         break;
694*53ee8cc1Swenshuai.xi 
695*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_EPI28_8P:
696*53ee8cc1Swenshuai.xi             if (ldHz >= 1150000000UL)
697*53ee8cc1Swenshuai.xi             {
698*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_8bit_8PAIR_115to150MHz;
699*53ee8cc1Swenshuai.xi             }
700*53ee8cc1Swenshuai.xi             else //if (ldHz >= 800000000UL)
701*53ee8cc1Swenshuai.xi             {
702*53ee8cc1Swenshuai.xi                 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_8bit_8PAIR_80to115MHz;
703*53ee8cc1Swenshuai.xi             }
704*53ee8cc1Swenshuai.xi         break;
705*53ee8cc1Swenshuai.xi 
706*53ee8cc1Swenshuai.xi         default:
707*53ee8cc1Swenshuai.xi             u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MAX;
708*53ee8cc1Swenshuai.xi         break;
709*53ee8cc1Swenshuai.xi     }
710*53ee8cc1Swenshuai.xi     return u8SupportedLPLLIndex;
711*53ee8cc1Swenshuai.xi }
_MHal_PNL_DumpLPLLTable(void * pInstance,E_PNL_SUPPORTED_LPLL_TYPE LPLLTblIndex)712*53ee8cc1Swenshuai.xi static void _MHal_PNL_DumpLPLLTable(void *pInstance, E_PNL_SUPPORTED_LPLL_TYPE LPLLTblIndex)
713*53ee8cc1Swenshuai.xi {
714*53ee8cc1Swenshuai.xi     if (LPLLTblIndex == E_PNL_SUPPORTED_LPLL_MAX)
715*53ee8cc1Swenshuai.xi     {
716*53ee8cc1Swenshuai.xi         printf("[%s,%5d] Unspported LPLL Type, skip LPLL setting\n",__FUNCTION__,__LINE__);
717*53ee8cc1Swenshuai.xi         return;
718*53ee8cc1Swenshuai.xi     }
719*53ee8cc1Swenshuai.xi 
720*53ee8cc1Swenshuai.xi     int indexCounter = 0;
721*53ee8cc1Swenshuai.xi 
722*53ee8cc1Swenshuai.xi     for(indexCounter = 0 ; indexCounter<LPLL_REG_NUM; indexCounter++)
723*53ee8cc1Swenshuai.xi     {
724*53ee8cc1Swenshuai.xi         if (LPLLSettingTBL[LPLLTblIndex][indexCounter].address == 0xFF) //delay in micro second
725*53ee8cc1Swenshuai.xi         {
726*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(LPLLSettingTBL[LPLLTblIndex][indexCounter].value);
727*53ee8cc1Swenshuai.xi             continue; // step forward to next register setting.
728*53ee8cc1Swenshuai.xi         }
729*53ee8cc1Swenshuai.xi 
730*53ee8cc1Swenshuai.xi         W2BYTEMSK(L_BK_LPLL(LPLLSettingTBL[LPLLTblIndex][indexCounter].address),
731*53ee8cc1Swenshuai.xi                   LPLLSettingTBL[LPLLTblIndex][indexCounter].value,
732*53ee8cc1Swenshuai.xi                   LPLLSettingTBL[LPLLTblIndex][indexCounter].mask);
733*53ee8cc1Swenshuai.xi     }
734*53ee8cc1Swenshuai.xi 
735*53ee8cc1Swenshuai.xi }
736*53ee8cc1Swenshuai.xi 
MHal_PNL_Init_LPLL(void * pInstance,PNL_TYPE eLPLL_Type,PNL_MODE eLPLL_Mode,MS_U64 ldHz)737*53ee8cc1Swenshuai.xi void MHal_PNL_Init_LPLL(void *pInstance,PNL_TYPE eLPLL_Type,PNL_MODE eLPLL_Mode,MS_U64 ldHz)
738*53ee8cc1Swenshuai.xi {
739*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
740*53ee8cc1Swenshuai.xi     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
741*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
742*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
743*53ee8cc1Swenshuai.xi     E_PNL_SUPPORTED_LPLL_TYPE u8SupportedLPLLLIndex = E_PNL_SUPPORTED_LPLL_MAX;
744*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]\n", __FUNCTION__, __LINE__);
745*53ee8cc1Swenshuai.xi 
746*53ee8cc1Swenshuai.xi     u8SupportedLPLLLIndex = _MHal_PNL_GetSupportedLPLLIndex(pInstance, eLPLL_Type,eLPLL_Mode,ldHz);
747*53ee8cc1Swenshuai.xi     W2BYTEMSK(L_BK_LPLL(0x6D), 0x84, 0xFF);
748*53ee8cc1Swenshuai.xi     if (u8SupportedLPLLLIndex == E_PNL_SUPPORTED_LPLL_MAX)
749*53ee8cc1Swenshuai.xi     {
750*53ee8cc1Swenshuai.xi         printf("Not Supported LPLL Type, skip LPLL Init\n");
751*53ee8cc1Swenshuai.xi         return;
752*53ee8cc1Swenshuai.xi     }
753*53ee8cc1Swenshuai.xi 
754*53ee8cc1Swenshuai.xi     _MHal_PNL_DumpLPLLTable(pInstance, u8SupportedLPLLLIndex);
755*53ee8cc1Swenshuai.xi 
756*53ee8cc1Swenshuai.xi 
757*53ee8cc1Swenshuai.xi     MHal_MOD_PVDD_Power_Setting(pInstance, pPNLResourcePrivate->sthalPNL._bPVDD_2V5); // Einstein is always use 3.3V PVDD Power.
758*53ee8cc1Swenshuai.xi     //switch(eLPLL_Type)
759*53ee8cc1Swenshuai.xi     //{
760*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_LVDS:
761*53ee8cc1Swenshuai.xi 
762*53ee8cc1Swenshuai.xi     //        if(eLPLL_Mode == E_PNL_MODE_SINGLE)
763*53ee8cc1Swenshuai.xi     //        {
764*53ee8cc1Swenshuai.xi     //            W2BYTEMSK(L_BK_LPLL(0x02), 0x2000, 0x3000);// [13:12]reg_lpll1_scalar_div_first
765*53ee8cc1Swenshuai.xi     //        }
766*53ee8cc1Swenshuai.xi     //        else
767*53ee8cc1Swenshuai.xi     //        {
768*53ee8cc1Swenshuai.xi     //            W2BYTEMSK(L_BK_LPLL(0x02), 0x1000, 0x3000);// [13:12] reg_lpll1_scalar_div_first
769*53ee8cc1Swenshuai.xi     //        }
770*53ee8cc1Swenshuai.xi 
771*53ee8cc1Swenshuai.xi     //        W2BYTEMSK(L_BK_LPLL(0x01), 0x203, 0xFF03); // [15:8]|[1:0]  reg_lpll1_loop_div_second | reg_lpll1_loop_div_first
772*53ee8cc1Swenshuai.xi     //        W2BYTEMSK(L_BK_LPLL(0x02), 0x0700, 0x0F00);// [11:8] reg_lpll1_scalar_div_second
773*53ee8cc1Swenshuai.xi     //        W2BYTEMSK(L_BK_LPLL(0x03), 0x12, 0x23F);// [9]|[5]|[4:2]|[1:0]  reg_lpll1_en_skew_div | reg_lpll1_pd | reg_lpll1_ibias_ictrl | reg_lpll1_icp_ictrl
774*53ee8cc1Swenshuai.xi     //        W2BYTEMSK(L_BK_LPLL(0x2E), 0x20, 0x6F);// [6]|[5]|[3:0]   reg_lpll_en_fifo | reg_lpll_vco_sel | reg_lpll_fifo_div
775*53ee8cc1Swenshuai.xi     //        W2BYTEMSK(L_BK_LPLL(0x30), 0x0, 0xFF00);// [15:8]  reg_lpll2_input_div_second
776*53ee8cc1Swenshuai.xi     //        W2BYTEMSK(L_BK_LPLL(0x31), 0x0, 0xFF03);// [15:8]|[1:0]  reg_lpll2_loop_div_second | reg_lpll2_loop_div_first
777*53ee8cc1Swenshuai.xi     //        W2BYTEMSK(L_BK_LPLL(0x32), 0x0, 0x3);// [1:0]  reg_lpll2_output_div_first
778*53ee8cc1Swenshuai.xi     //        W2BYTEMSK(L_BK_LPLL(0x33), 0x20, 0x3F);// [5]|[4:2]|[1:0]  reg_lpll2_pd | reg_lpll2_ibias_ictrl | reg_lpll2_icp_ictrl
779*53ee8cc1Swenshuai.xi     //        W2BYTEMSK(L_BK_LPLL(0x35), 0x1300, 0x7320);// [14:12]|[9:8]|[5]  reg_lpll1_skew_div |reg_lpll_pd_phdac |reg_lpll_2ndpll_clk_sel
780*53ee8cc1Swenshuai.xi     //        W2BYTEMSK(L_BK_LPLL(0x37), 0x0, 0x4006);// [14]|[2]|[1]  reg_lpll1_test[30] | reg_lpll1_test[18]| reg_lpll1_test[17]
781*53ee8cc1Swenshuai.xi 
782*53ee8cc1Swenshuai.xi     //        break;
783*53ee8cc1Swenshuai.xi 
784*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_HS_LVDS:
785*53ee8cc1Swenshuai.xi 
786*53ee8cc1Swenshuai.xi 
787*53ee8cc1Swenshuai.xi     //        break;
788*53ee8cc1Swenshuai.xi 
789*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_HF_LVDS:
790*53ee8cc1Swenshuai.xi 
791*53ee8cc1Swenshuai.xi 
792*53ee8cc1Swenshuai.xi     //        break;
793*53ee8cc1Swenshuai.xi     //    default:
794*53ee8cc1Swenshuai.xi     //    //Others
795*53ee8cc1Swenshuai.xi     //        break;
796*53ee8cc1Swenshuai.xi     //}
797*53ee8cc1Swenshuai.xi 
798*53ee8cc1Swenshuai.xi     //if( eLPLL_Type == E_PNL_TYPE_TTL)
799*53ee8cc1Swenshuai.xi     //    MHal_MOD_PVDD_Power_Setting(pInstance,FALSE);
800*53ee8cc1Swenshuai.xi     //else
801*53ee8cc1Swenshuai.xi     //    MHal_MOD_PVDD_Power_Setting(pInstance,TRUE);
802*53ee8cc1Swenshuai.xi }
803*53ee8cc1Swenshuai.xi 
MHal_PNL_Get_Loop_DIV(void * pInstance,MS_U8 u8LPLL_Mode,MS_U8 eLPLL_Type,MS_U32 ldHz)804*53ee8cc1Swenshuai.xi MS_U8 MHal_PNL_Get_Loop_DIV(void *pInstance, MS_U8 u8LPLL_Mode, MS_U8 eLPLL_Type, MS_U32 ldHz)
805*53ee8cc1Swenshuai.xi {
806*53ee8cc1Swenshuai.xi     MS_U16 u16loop_div = 0;
807*53ee8cc1Swenshuai.xi     E_PNL_SUPPORTED_LPLL_TYPE u8SupportedLPLLLIndex = E_PNL_SUPPORTED_LPLL_MAX;
808*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]E_PNL_LPLL_VIDEO : eLPLL_Type=%u, u8LPLL_Mode=%u, ldHz=%lu\n", __FUNCTION__, __LINE__, eLPLL_Type, u8LPLL_Mode, ldHz);
809*53ee8cc1Swenshuai.xi     u8SupportedLPLLLIndex = _MHal_PNL_GetSupportedLPLLIndex(pInstance, eLPLL_Type,u8LPLL_Mode,ldHz);
810*53ee8cc1Swenshuai.xi 
811*53ee8cc1Swenshuai.xi     if (u8SupportedLPLLLIndex == E_PNL_SUPPORTED_LPLL_MAX)
812*53ee8cc1Swenshuai.xi     {
813*53ee8cc1Swenshuai.xi         printf("[%s,%5d] Error LPLL type\n",__FUNCTION__,__LINE__);
814*53ee8cc1Swenshuai.xi         u16loop_div = 0 ;
815*53ee8cc1Swenshuai.xi     }
816*53ee8cc1Swenshuai.xi     else
817*53ee8cc1Swenshuai.xi     {
818*53ee8cc1Swenshuai.xi         u16loop_div = u16LoopDiv[u8SupportedLPLLLIndex];
819*53ee8cc1Swenshuai.xi     }
820*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "E_PNL_LPLL_VIDEO : u16loop_div=%u\n", u16loop_div);
821*53ee8cc1Swenshuai.xi 
822*53ee8cc1Swenshuai.xi     u16loop_div *= 2;
823*53ee8cc1Swenshuai.xi     return u16loop_div;
824*53ee8cc1Swenshuai.xi     //MS_U16 u16loop_div=0;
825*53ee8cc1Swenshuai.xi     //switch(eLPLL_Type)
826*53ee8cc1Swenshuai.xi     //{
827*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_MINILVDS:
828*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_ANALOG_MINILVDS:
829*53ee8cc1Swenshuai.xi     //    case E_PNL_LPLL_MINILVDS_6P_1L:
830*53ee8cc1Swenshuai.xi     //        u16loop_div = 8;
831*53ee8cc1Swenshuai.xi     //    break;
832*53ee8cc1Swenshuai.xi 
833*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_DIGITAL_MINILVDS:  //E_PNL_TYPE_MINILVDS_6P_2L
834*53ee8cc1Swenshuai.xi     //        u16loop_div = 4;
835*53ee8cc1Swenshuai.xi     //    break;
836*53ee8cc1Swenshuai.xi 
837*53ee8cc1Swenshuai.xi     //    case E_PNL_LPLL_MINILVDS_4P_2L:
838*53ee8cc1Swenshuai.xi     //        u16loop_div = 12;
839*53ee8cc1Swenshuai.xi     //    break;
840*53ee8cc1Swenshuai.xi 
841*53ee8cc1Swenshuai.xi     //    case E_PNL_LPLL_MINILVDS_4P_1L:
842*53ee8cc1Swenshuai.xi     //        u16loop_div = 6;
843*53ee8cc1Swenshuai.xi     //    break;
844*53ee8cc1Swenshuai.xi 
845*53ee8cc1Swenshuai.xi     //    case E_PNL_LPLL_MINILVDS_3P_2L:
846*53ee8cc1Swenshuai.xi     //        u16loop_div = 16;
847*53ee8cc1Swenshuai.xi     //    break;
848*53ee8cc1Swenshuai.xi     //    case E_PNL_LPLL_MINILVDS_3P_1L:
849*53ee8cc1Swenshuai.xi     //        u16loop_div = 8;
850*53ee8cc1Swenshuai.xi     //    break;
851*53ee8cc1Swenshuai.xi 
852*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_LVDS:
853*53ee8cc1Swenshuai.xi     //        if(u8LPLL_Mode == E_PNL_MODE_SINGLE)
854*53ee8cc1Swenshuai.xi     //            u16loop_div = 28;
855*53ee8cc1Swenshuai.xi     //        else if(u8LPLL_Mode == E_PNL_MODE_DUAL)
856*53ee8cc1Swenshuai.xi     //            u16loop_div = 14;
857*53ee8cc1Swenshuai.xi     //    break;
858*53ee8cc1Swenshuai.xi 
859*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_TTL:
860*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_RSDS:
861*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_MFC:
862*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_DAC_I:
863*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_DAC_P:
864*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_PDPLVDS:
865*53ee8cc1Swenshuai.xi     //    default:
866*53ee8cc1Swenshuai.xi     //        u16loop_div = 7;
867*53ee8cc1Swenshuai.xi     //    break;
868*53ee8cc1Swenshuai.xi     //}
869*53ee8cc1Swenshuai.xi     //u16loop_div *= 2;
870*53ee8cc1Swenshuai.xi 
871*53ee8cc1Swenshuai.xi     //return u16loop_div;
872*53ee8cc1Swenshuai.xi }
873*53ee8cc1Swenshuai.xi 
MHal_PNL_Get_LPLL_LoopGain(void * pInstance,MS_U8 eLPLL_Mode,MS_U8 eLPLL_Type,MS_U32 ldHz)874*53ee8cc1Swenshuai.xi MS_U16 MHal_PNL_Get_LPLL_LoopGain(void *pInstance, MS_U8 eLPLL_Mode, MS_U8 eLPLL_Type, MS_U32 ldHz)
875*53ee8cc1Swenshuai.xi {
876*53ee8cc1Swenshuai.xi     MS_U8 u8loop_gain = 0;
877*53ee8cc1Swenshuai.xi     E_PNL_SUPPORTED_LPLL_TYPE u8SupportedLPLLLIndex = E_PNL_SUPPORTED_LPLL_MAX;
878*53ee8cc1Swenshuai.xi     u8SupportedLPLLLIndex = _MHal_PNL_GetSupportedLPLLIndex(pInstance, eLPLL_Type,eLPLL_Mode,ldHz);
879*53ee8cc1Swenshuai.xi 
880*53ee8cc1Swenshuai.xi     if (u8SupportedLPLLLIndex == E_PNL_SUPPORTED_LPLL_MAX)
881*53ee8cc1Swenshuai.xi     {
882*53ee8cc1Swenshuai.xi         printf("[%s,%5d] Error LPLL type\n",__FUNCTION__,__LINE__);
883*53ee8cc1Swenshuai.xi         u8loop_gain = 0 ;
884*53ee8cc1Swenshuai.xi     }
885*53ee8cc1Swenshuai.xi     else
886*53ee8cc1Swenshuai.xi     {
887*53ee8cc1Swenshuai.xi         u8loop_gain = u16LoopGain[u8SupportedLPLLLIndex];
888*53ee8cc1Swenshuai.xi     }
889*53ee8cc1Swenshuai.xi 
890*53ee8cc1Swenshuai.xi     return u8loop_gain;
891*53ee8cc1Swenshuai.xi     //MS_U16     u16loop_gain = 0;
892*53ee8cc1Swenshuai.xi 
893*53ee8cc1Swenshuai.xi     //switch(eLPLL_Type)
894*53ee8cc1Swenshuai.xi     //{
895*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_MINILVDS:
896*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_ANALOG_MINILVDS:
897*53ee8cc1Swenshuai.xi     //    case E_PNL_LPLL_MINILVDS_6P_1L:
898*53ee8cc1Swenshuai.xi     //        u16loop_gain = LPLL_LOOPGAIN;
899*53ee8cc1Swenshuai.xi     //    break;
900*53ee8cc1Swenshuai.xi 
901*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_DIGITAL_MINILVDS:  //E_PNL_TYPE_MINILVDS_6P_2L
902*53ee8cc1Swenshuai.xi     //        u16loop_gain = 24;
903*53ee8cc1Swenshuai.xi     //    break;
904*53ee8cc1Swenshuai.xi 
905*53ee8cc1Swenshuai.xi     //    case E_PNL_LPLL_MINILVDS_4P_2L:
906*53ee8cc1Swenshuai.xi     //    case E_PNL_LPLL_MINILVDS_4P_1L:
907*53ee8cc1Swenshuai.xi     //        u16loop_gain = LPLL_LOOPGAIN;
908*53ee8cc1Swenshuai.xi     //    break;
909*53ee8cc1Swenshuai.xi 
910*53ee8cc1Swenshuai.xi     //    case E_PNL_LPLL_MINILVDS_3P_2L:
911*53ee8cc1Swenshuai.xi     //    case E_PNL_LPLL_MINILVDS_3P_1L:
912*53ee8cc1Swenshuai.xi     //        u16loop_gain = LPLL_LOOPGAIN;
913*53ee8cc1Swenshuai.xi     //    break;
914*53ee8cc1Swenshuai.xi 
915*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_TTL:
916*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_LVDS:
917*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_RSDS:
918*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_MFC:
919*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_DAC_I:
920*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_DAC_P:
921*53ee8cc1Swenshuai.xi     //    case E_PNL_TYPE_PDPLVDS:
922*53ee8cc1Swenshuai.xi     //    default:
923*53ee8cc1Swenshuai.xi     //        u16loop_gain = LPLL_LOOPGAIN;
924*53ee8cc1Swenshuai.xi     //    break;
925*53ee8cc1Swenshuai.xi     //}
926*53ee8cc1Swenshuai.xi 
927*53ee8cc1Swenshuai.xi     //return u16loop_gain;
928*53ee8cc1Swenshuai.xi }
929*53ee8cc1Swenshuai.xi 
930*53ee8cc1Swenshuai.xi #define SKIP_TIMING_CHANGE_CAP  TRUE
Hal_PNL_SkipTimingChange_GetCaps(void * pInstance)931*53ee8cc1Swenshuai.xi MS_BOOL Hal_PNL_SkipTimingChange_GetCaps(void *pInstance)
932*53ee8cc1Swenshuai.xi {
933*53ee8cc1Swenshuai.xi     #if (SKIP_TIMING_CHANGE_CAP)
934*53ee8cc1Swenshuai.xi         return TRUE;
935*53ee8cc1Swenshuai.xi     #else
936*53ee8cc1Swenshuai.xi         return FALSE;
937*53ee8cc1Swenshuai.xi     #endif
938*53ee8cc1Swenshuai.xi }
939*53ee8cc1Swenshuai.xi 
MHal_PNL_HWLVDSReservedtoLRFlag(void * pInstance,PNL_DrvHW_LVDSResInfo lvdsresinfo)940*53ee8cc1Swenshuai.xi void MHal_PNL_HWLVDSReservedtoLRFlag(void *pInstance,PNL_DrvHW_LVDSResInfo lvdsresinfo)
941*53ee8cc1Swenshuai.xi {
942*53ee8cc1Swenshuai.xi     if (lvdsresinfo.bEnable)
943*53ee8cc1Swenshuai.xi     {
944*53ee8cc1Swenshuai.xi         if (lvdsresinfo.u16channel & BIT(0))  // Channel A
945*53ee8cc1Swenshuai.xi         {
946*53ee8cc1Swenshuai.xi             if (lvdsresinfo.u32pair & BIT(3))  // pair 3
947*53ee8cc1Swenshuai.xi             {
948*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_5A_L, BIT(15), BIT(15));
949*53ee8cc1Swenshuai.xi             }
950*53ee8cc1Swenshuai.xi             if (lvdsresinfo.u32pair & BIT(4))  // pair 4
951*53ee8cc1Swenshuai.xi             {
952*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_5A_L, BIT(14), BIT(14));
953*53ee8cc1Swenshuai.xi             }
954*53ee8cc1Swenshuai.xi         }
955*53ee8cc1Swenshuai.xi         if (lvdsresinfo.u16channel & BIT(1))  // Channel B
956*53ee8cc1Swenshuai.xi         {
957*53ee8cc1Swenshuai.xi             if (lvdsresinfo.u32pair & BIT(3))  // pair 3
958*53ee8cc1Swenshuai.xi             {
959*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_5A_L, BIT(13), BIT(13));
960*53ee8cc1Swenshuai.xi             }
961*53ee8cc1Swenshuai.xi             if (lvdsresinfo.u32pair & BIT(4))  // pair 4
962*53ee8cc1Swenshuai.xi             {
963*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_5A_L, BIT(12), BIT(12));
964*53ee8cc1Swenshuai.xi             }
965*53ee8cc1Swenshuai.xi         }
966*53ee8cc1Swenshuai.xi     }
967*53ee8cc1Swenshuai.xi     else
968*53ee8cc1Swenshuai.xi     {
969*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_5A_L, 0x0000, (BIT(15) | BIT(14) | BIT(13) | BIT(12)));
970*53ee8cc1Swenshuai.xi     }
971*53ee8cc1Swenshuai.xi }
972*53ee8cc1Swenshuai.xi 
973*53ee8cc1Swenshuai.xi 
974*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////
975*53ee8cc1Swenshuai.xi // Turn OD function
976*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////
MHal_PNL_OverDriver_Init(void * pInstance,MS_U32 u32OD_MSB_Addr,MS_U32 u32OD_MSB_limit,MS_U32 u32OD_LSB_Addr,MS_U32 u32OD_LSB_limit)977*53ee8cc1Swenshuai.xi void MHal_PNL_OverDriver_Init(void *pInstance,MS_U32 u32OD_MSB_Addr, MS_U32 u32OD_MSB_limit, MS_U32 u32OD_LSB_Addr, MS_U32 u32OD_LSB_limit)
978*53ee8cc1Swenshuai.xi {
979*53ee8cc1Swenshuai.xi     SC_W2BYTE(0,REG_SC_BK16_15_L, (MS_U16)(u32OD_MSB_Addr & 0xFFFF)); // OD MSB request base address
980*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(0,REG_SC_BK16_16_L, (MS_U16)((u32OD_MSB_Addr >> 16) & 0x03FF), 0x03FF); // OD MSB request base address
981*53ee8cc1Swenshuai.xi     SC_W2BYTE(0,REG_SC_BK16_17_L, (MS_U16)(u32OD_MSB_limit & 0xFFFF)); // OD MSB request address limit
982*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(0,REG_SC_BK16_18_L, (MS_U16)((u32OD_MSB_limit >> 16) & 0x03FF), 0x03FF); // OD MSB request address limit
983*53ee8cc1Swenshuai.xi 
984*53ee8cc1Swenshuai.xi     SC_W2BYTE(0,REG_SC_BK16_39_L, (MS_U16)(u32OD_MSB_limit & 0xFFFF)); // OD frame buffer write address limit
985*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(0,REG_SC_BK16_3A_L, (MS_U16)((u32OD_MSB_limit >> 16) & 0x00FF), 0x00FF); // OD frame buffer write address limit
986*53ee8cc1Swenshuai.xi 
987*53ee8cc1Swenshuai.xi     SC_W2BYTE(0,REG_SC_BK16_3B_L, (MS_U16)(u32OD_MSB_limit & 0xFFFF)); // OD frame buffer read address limit
988*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(0,REG_SC_BK16_3C_L, (MS_U16)((u32OD_MSB_limit >> 16) & 0x00FF), 0x00FF); // OD frame buffer read address limit
989*53ee8cc1Swenshuai.xi 
990*53ee8cc1Swenshuai.xi     ///SC_W2BYTE(0,REG_SC_BK16_4F_L, (MS_U16)(u32OD_LSB_Addr & 0xFFFF)); // OD LSB request base address
991*53ee8cc1Swenshuai.xi     ///SC_W2BYTEMSK(0,REG_SC_BK16_50_L, (MS_U16)((u32OD_LSB_Addr >> 16) & 0x00FF), 0x00FF); // OD LSB request base address
992*53ee8cc1Swenshuai.xi     ///SC_W2BYTEMSK(0,REG_SC_BK16_50_L, (MS_U16)((u32OD_LSB_limit & 0x00FF) << 8), 0xFF00); // OD LSB request limit address
993*53ee8cc1Swenshuai.xi     ///SC_W2BYTE(0,REG_SC_BK16_51_L, (MS_U16)((u32OD_LSB_limit >> 8) & 0xFFFF)); // OD LSB request limit address
994*53ee8cc1Swenshuai.xi 
995*53ee8cc1Swenshuai.xi     SC_W2BYTE(0,REG_SC_BK16_1A_L, 0x4020); // OD request rFIFO limit threshold, priority threshold
996*53ee8cc1Swenshuai.xi     SC_W2BYTE(0,REG_SC_BK16_1C_L, 0x4020); // OD request wFIFO limit threshold, priority threshold
997*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(0,REG_SC_BK16_3A_L, 0x00, BIT(14)); // OD strength gradually bypass
998*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(0,REG_SC_BK16_3A_L, 0x2F00, 0x3F00);    // OD strength gradually slop
999*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(0,REG_SC_BK16_12_L, 0x0C, 0xFF);    // OD active threshold
1000*53ee8cc1Swenshuai.xi }
1001*53ee8cc1Swenshuai.xi 
MHal_PNL_OverDriver_Enable(void * pInstance,MS_BOOL bEnable)1002*53ee8cc1Swenshuai.xi void MHal_PNL_OverDriver_Enable(void *pInstance,MS_BOOL bEnable)
1003*53ee8cc1Swenshuai.xi {
1004*53ee8cc1Swenshuai.xi     // OD mode
1005*53ee8cc1Swenshuai.xi     // OD used user weight to output blending directly
1006*53ee8cc1Swenshuai.xi     // OD Enable
1007*53ee8cc1Swenshuai.xi     if (bEnable)
1008*53ee8cc1Swenshuai.xi     {
1009*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK16_10_L, 0x2D, 0x2F);
1010*53ee8cc1Swenshuai.xi     }
1011*53ee8cc1Swenshuai.xi     else
1012*53ee8cc1Swenshuai.xi     {
1013*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK16_10_L, 0x2C, 0x2F);
1014*53ee8cc1Swenshuai.xi     }
1015*53ee8cc1Swenshuai.xi }
1016*53ee8cc1Swenshuai.xi 
MHal_PNL_OverDriver_TBL(void * pInstance,MS_U8 u8ODTbl[1056])1017*53ee8cc1Swenshuai.xi void MHal_PNL_OverDriver_TBL(void *pInstance,MS_U8 u8ODTbl[1056])
1018*53ee8cc1Swenshuai.xi {
1019*53ee8cc1Swenshuai.xi     // SRAM 1: 17x17 = 289
1020*53ee8cc1Swenshuai.xi     // SRAM 2: 17x16 = 272
1021*53ee8cc1Swenshuai.xi     // SRAM 3: 17x16 = 272
1022*53ee8cc1Swenshuai.xi     // SRAM 4: 16x16 = 256
1023*53ee8cc1Swenshuai.xi     MS_U16 i;
1024*53ee8cc1Swenshuai.xi     MS_U8 u8target;
1025*53ee8cc1Swenshuai.xi     MS_BOOL bEnable;
1026*53ee8cc1Swenshuai.xi 
1027*53ee8cc1Swenshuai.xi     bEnable = SC_R2BYTEMSK(0,REG_SC_BK16_10_L, BIT(0));
1028*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(0,REG_SC_BK16_10_L, 0x00, BIT(0)); // OD enable
1029*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(0,REG_SC_BK16_01_L, 0x0E, 0x0E); // OD table SRAM enable, RGB channel
1030*53ee8cc1Swenshuai.xi 
1031*53ee8cc1Swenshuai.xi     u8target= u8ODTbl[9];
1032*53ee8cc1Swenshuai.xi     for (i=0; i<272; i++)
1033*53ee8cc1Swenshuai.xi     {
1034*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK16_03_L, (i == 9)?u8target:(u8target ^ u8ODTbl[i]), 0x00FF);
1035*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK16_02_L, (i|0x8000), 0x81FF);
1036*53ee8cc1Swenshuai.xi         while(SC_R2BYTEMSK(0,REG_SC_BK16_02_L, BIT(15)));
1037*53ee8cc1Swenshuai.xi     }
1038*53ee8cc1Swenshuai.xi 
1039*53ee8cc1Swenshuai.xi     // temp patch for 33x33 for SRAM1
1040*53ee8cc1Swenshuai.xi     for (i=272; i<289; i++)
1041*53ee8cc1Swenshuai.xi     {
1042*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK16_03_L, 0x00, 0x00FF);
1043*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK16_02_L, (i|0x8000), 0x81FF);
1044*53ee8cc1Swenshuai.xi         while(SC_R2BYTEMSK(0,REG_SC_BK16_02_L, BIT(15)));
1045*53ee8cc1Swenshuai.xi     }
1046*53ee8cc1Swenshuai.xi 
1047*53ee8cc1Swenshuai.xi     u8target= u8ODTbl[(272+19)];
1048*53ee8cc1Swenshuai.xi     for (i=0; i<272; i++)
1049*53ee8cc1Swenshuai.xi     {
1050*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK16_06_L, (i == 19)?u8target:(u8target ^ u8ODTbl[(272+i)]), 0x00FF);
1051*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK16_05_L, (i|0x8000), 0x81FF);
1052*53ee8cc1Swenshuai.xi         while(SC_R2BYTEMSK(0,REG_SC_BK16_05_L, BIT(15)));
1053*53ee8cc1Swenshuai.xi     }
1054*53ee8cc1Swenshuai.xi 
1055*53ee8cc1Swenshuai.xi     u8target= u8ODTbl[(272*2+29)];
1056*53ee8cc1Swenshuai.xi     for (i=0; i<256; i++)
1057*53ee8cc1Swenshuai.xi     {
1058*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK16_09_L, (i == 29)?u8target:(u8target ^ u8ODTbl[(272*2+i)]), 0x00FF);
1059*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK16_08_L, (i|0x8000), 0x81FF);
1060*53ee8cc1Swenshuai.xi         while(SC_R2BYTEMSK(0,REG_SC_BK16_08_L, BIT(15)));
1061*53ee8cc1Swenshuai.xi     }
1062*53ee8cc1Swenshuai.xi 
1063*53ee8cc1Swenshuai.xi     // temp patch for 33x33 for SRAM3
1064*53ee8cc1Swenshuai.xi     for (i=256; i<272; i++)
1065*53ee8cc1Swenshuai.xi     {
1066*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK16_09_L, 0x00, 0x00FF);
1067*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK16_08_L, (i|0x8000), 0x81FF);
1068*53ee8cc1Swenshuai.xi         while(SC_R2BYTEMSK(0,REG_SC_BK16_08_L, BIT(15)));
1069*53ee8cc1Swenshuai.xi     }
1070*53ee8cc1Swenshuai.xi 
1071*53ee8cc1Swenshuai.xi     u8target= u8ODTbl[(272*2+256+39)];
1072*53ee8cc1Swenshuai.xi     for (i=0; i<256; i++)
1073*53ee8cc1Swenshuai.xi     {
1074*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK16_0C_L, (i == 39)?u8target:(u8target ^ u8ODTbl[(272*2+256+i)]), 0x00FF);
1075*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK16_0B_L, (i|0x8000), 0x81FF);
1076*53ee8cc1Swenshuai.xi         while(SC_R2BYTEMSK(0,REG_SC_BK16_0D_L, BIT(15)));
1077*53ee8cc1Swenshuai.xi     }
1078*53ee8cc1Swenshuai.xi 
1079*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(0,REG_SC_BK16_01_L, 0x00, 0x0E); // OD table SRAM enable, RGB channel
1080*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(0,REG_SC_BK16_10_L, bEnable, BIT(0)); // OD enable
1081*53ee8cc1Swenshuai.xi }
1082*53ee8cc1Swenshuai.xi 
_MHal_PNL_MOD_Swing_Refactor_AfterCAL(void * pInstance,MS_U16 u16Swing_Level)1083*53ee8cc1Swenshuai.xi MS_U16 _MHal_PNL_MOD_Swing_Refactor_AfterCAL(void *pInstance, MS_U16 u16Swing_Level)
1084*53ee8cc1Swenshuai.xi {
1085*53ee8cc1Swenshuai.xi     MS_U8 u8ibcal = 0x00;
1086*53ee8cc1Swenshuai.xi     MS_U16 u16AfterCal_value = 0;
1087*53ee8cc1Swenshuai.xi     MS_U16 u16Cus_value = 0;
1088*53ee8cc1Swenshuai.xi 
1089*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1090*53ee8cc1Swenshuai.xi     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
1091*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1092*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
1093*53ee8cc1Swenshuai.xi 
1094*53ee8cc1Swenshuai.xi     // =========
1095*53ee8cc1Swenshuai.xi     // GCR_CAL_LEVEL[1:0] : REG_MOD_BK00_7D_L =>
1096*53ee8cc1Swenshuai.xi     // 2'b00 250mV ' GCR_ICON_CHx[5:0]=2'h15 (decimal 21)
1097*53ee8cc1Swenshuai.xi     // 2'b01 350mV ' GCR_ICON_CHx[5:0]=2'h1F (decimal 31)
1098*53ee8cc1Swenshuai.xi     // 2'b10 300mV ' GCR_ICON_CHx[5:0]=2'h1A (decimal 26)
1099*53ee8cc1Swenshuai.xi     // 2'b11 200mV ' GCR_ICON_CHx[5:0]=2'h10 (decimal 16)
1100*53ee8cc1Swenshuai.xi     // =========
1101*53ee8cc1Swenshuai.xi     switch(pPNLResourcePrivate->sthalPNL._u8MOD_CALI_TARGET)
1102*53ee8cc1Swenshuai.xi     {
1103*53ee8cc1Swenshuai.xi         default:
1104*53ee8cc1Swenshuai.xi         case 0:
1105*53ee8cc1Swenshuai.xi             u8ibcal = 0x15;
1106*53ee8cc1Swenshuai.xi         break;
1107*53ee8cc1Swenshuai.xi         case 1:
1108*53ee8cc1Swenshuai.xi             u8ibcal = 0x1F;
1109*53ee8cc1Swenshuai.xi         break;
1110*53ee8cc1Swenshuai.xi         case 2:
1111*53ee8cc1Swenshuai.xi             u8ibcal = 0x1A;
1112*53ee8cc1Swenshuai.xi         break;
1113*53ee8cc1Swenshuai.xi         case 3:
1114*53ee8cc1Swenshuai.xi             u8ibcal = 0x10;
1115*53ee8cc1Swenshuai.xi         break;
1116*53ee8cc1Swenshuai.xi     }
1117*53ee8cc1Swenshuai.xi     u16Cus_value = (u16Swing_Level) * (pPNLResourcePrivate->sthalPNL._u8MOD_CALI_VALUE + 4)/(u8ibcal + 4);
1118*53ee8cc1Swenshuai.xi     u16AfterCal_value = (u16Cus_value-40)/10+2;
1119*53ee8cc1Swenshuai.xi 
1120*53ee8cc1Swenshuai.xi     HAL_MOD_CAL_DBG(printf("\r\n--Swing value after refactor = %d\n", u16AfterCal_value));
1121*53ee8cc1Swenshuai.xi 
1122*53ee8cc1Swenshuai.xi     return u16AfterCal_value;
1123*53ee8cc1Swenshuai.xi }
1124*53ee8cc1Swenshuai.xi 
MHal_PNL_MOD_Control_Out_Swing(void * pInstance,MS_U16 u16Swing_Level)1125*53ee8cc1Swenshuai.xi MS_BOOL MHal_PNL_MOD_Control_Out_Swing(void *pInstance,MS_U16 u16Swing_Level)
1126*53ee8cc1Swenshuai.xi {
1127*53ee8cc1Swenshuai.xi     MS_BOOL bStatus = FALSE;
1128*53ee8cc1Swenshuai.xi     MS_U16 u16ValidSwing = 0;
1129*53ee8cc1Swenshuai.xi     MS_U16 u16ValidSwing_ext = 0;
1130*53ee8cc1Swenshuai.xi 
1131*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1132*53ee8cc1Swenshuai.xi     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
1133*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1134*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
1135*53ee8cc1Swenshuai.xi 
1136*53ee8cc1Swenshuai.xi     if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_LVDS)||
1137*53ee8cc1Swenshuai.xi       (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_HS_LVDS))
1138*53ee8cc1Swenshuai.xi     {
1139*53ee8cc1Swenshuai.xi         if(u16Swing_Level>600)
1140*53ee8cc1Swenshuai.xi             u16Swing_Level=600;
1141*53ee8cc1Swenshuai.xi         if(u16Swing_Level<40)
1142*53ee8cc1Swenshuai.xi             u16Swing_Level=40;
1143*53ee8cc1Swenshuai.xi 
1144*53ee8cc1Swenshuai.xi         u16ValidSwing = _MHal_PNL_MOD_Swing_Refactor_AfterCAL(pInstance, u16Swing_Level);
1145*53ee8cc1Swenshuai.xi     }
1146*53ee8cc1Swenshuai.xi     else
1147*53ee8cc1Swenshuai.xi     {
1148*53ee8cc1Swenshuai.xi         u16ValidSwing = u16Swing_Level;
1149*53ee8cc1Swenshuai.xi     }
1150*53ee8cc1Swenshuai.xi 
1151*53ee8cc1Swenshuai.xi     u16ValidSwing     = u16ValidSwing & 0x3F;
1152*53ee8cc1Swenshuai.xi     u16ValidSwing_ext = (u16ValidSwing & 0x40)>>6;
1153*53ee8cc1Swenshuai.xi 
1154*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_29_L,
1155*53ee8cc1Swenshuai.xi         ( (u16ValidSwing << 4 )|(u16ValidSwing << 10 ) ) , 0xFFF0);
1156*53ee8cc1Swenshuai.xi 
1157*53ee8cc1Swenshuai.xi     MOD_W2BYTE(REG_MOD_BK00_2A_L,
1158*53ee8cc1Swenshuai.xi         ((u16ValidSwing  )|(u16ValidSwing << 6 ) |(u16ValidSwing << 12 ) ));
1159*53ee8cc1Swenshuai.xi 
1160*53ee8cc1Swenshuai.xi     MOD_W2BYTE(REG_MOD_BK00_2B_L,
1161*53ee8cc1Swenshuai.xi         ( (u16ValidSwing >> 4  )|(u16ValidSwing << 2 ) |(u16ValidSwing << 8 ) | (u16ValidSwing << 14 )));
1162*53ee8cc1Swenshuai.xi 
1163*53ee8cc1Swenshuai.xi     MOD_W2BYTE(REG_MOD_BK00_2C_L,
1164*53ee8cc1Swenshuai.xi         ( (u16ValidSwing >> 2  )|(u16ValidSwing << 4 ) |(u16ValidSwing << 10 ) ) );
1165*53ee8cc1Swenshuai.xi 
1166*53ee8cc1Swenshuai.xi     MOD_W2BYTE(REG_MOD_BK00_2D_L,
1167*53ee8cc1Swenshuai.xi         ( (u16ValidSwing  )|(u16ValidSwing << 6 ) |(u16ValidSwing << 12 ) ));
1168*53ee8cc1Swenshuai.xi 
1169*53ee8cc1Swenshuai.xi     MOD_W2BYTE(REG_MOD_BK00_2E_L,
1170*53ee8cc1Swenshuai.xi         ( (u16ValidSwing >> 4 )|(u16ValidSwing << 2 )) );
1171*53ee8cc1Swenshuai.xi 
1172*53ee8cc1Swenshuai.xi     /// for extended bit, extended bit for reg_gcr_icon_ch0~ch13
1173*53ee8cc1Swenshuai.xi     MOD_W2BYTE(REG_MOD_BK00_2F_L,
1174*53ee8cc1Swenshuai.xi             (u16ValidSwing_ext     )|(u16ValidSwing_ext << 1 )|(u16ValidSwing_ext << 2 )|(u16ValidSwing_ext << 3 )|
1175*53ee8cc1Swenshuai.xi             (u16ValidSwing_ext << 4)|(u16ValidSwing_ext << 5 )|(u16ValidSwing_ext << 6 )|(u16ValidSwing_ext << 7 )|
1176*53ee8cc1Swenshuai.xi             (u16ValidSwing_ext << 8)|(u16ValidSwing_ext << 9 )|(u16ValidSwing_ext <<10 )|(u16ValidSwing_ext <<11 )|
1177*53ee8cc1Swenshuai.xi             (u16ValidSwing_ext <<12)|(u16ValidSwing_ext <<13 )|(u16ValidSwing_ext <<14 )|(u16ValidSwing_ext <<15 )
1178*53ee8cc1Swenshuai.xi             );
1179*53ee8cc1Swenshuai.xi 
1180*53ee8cc1Swenshuai.xi     bStatus = TRUE;
1181*53ee8cc1Swenshuai.xi 
1182*53ee8cc1Swenshuai.xi     return bStatus;
1183*53ee8cc1Swenshuai.xi }
1184*53ee8cc1Swenshuai.xi 
1185*53ee8cc1Swenshuai.xi 
1186*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////
1187*53ee8cc1Swenshuai.xi // Turn Pre-Emphasis Current function
1188*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////
MHal_PNL_MOD_Control_Out_PE_Current(void * pInstance,MS_U16 u16Current_Level)1189*53ee8cc1Swenshuai.xi MS_BOOL MHal_PNL_MOD_Control_Out_PE_Current (void *pInstance,MS_U16 u16Current_Level)
1190*53ee8cc1Swenshuai.xi {
1191*53ee8cc1Swenshuai.xi     MS_BOOL bStatus = FALSE;
1192*53ee8cc1Swenshuai.xi     MS_U16 u16ValidCurrent = u16Current_Level & 0x07;
1193*53ee8cc1Swenshuai.xi 
1194*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_23_L,
1195*53ee8cc1Swenshuai.xi         ( (u16ValidCurrent  ) |(u16ValidCurrent << 3 )|(u16ValidCurrent << 6 )
1196*53ee8cc1Swenshuai.xi         |(u16ValidCurrent << 9 ) |(u16ValidCurrent << 12 )) , 0x7FFF);
1197*53ee8cc1Swenshuai.xi 
1198*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_24_L,
1199*53ee8cc1Swenshuai.xi         ( (u16ValidCurrent  ) |(u16ValidCurrent << 3 )|(u16ValidCurrent << 6 )
1200*53ee8cc1Swenshuai.xi         |(u16ValidCurrent << 9 ) |(u16ValidCurrent << 12 )) , 0x7FFF);
1201*53ee8cc1Swenshuai.xi 
1202*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_25_L,
1203*53ee8cc1Swenshuai.xi         ( (u16ValidCurrent  ) |(u16ValidCurrent << 3 )|(u16ValidCurrent << 6 )
1204*53ee8cc1Swenshuai.xi         |(u16ValidCurrent << 9 ) |(u16ValidCurrent << 12 )) , 0x7FFF);
1205*53ee8cc1Swenshuai.xi 
1206*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_26_L,
1207*53ee8cc1Swenshuai.xi         ( (u16ValidCurrent  ) |(u16ValidCurrent << 3 )|(u16ValidCurrent << 6 )
1208*53ee8cc1Swenshuai.xi         |(u16ValidCurrent << 9 ) |(u16ValidCurrent << 12 )) , 0x7FFF);
1209*53ee8cc1Swenshuai.xi 
1210*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_29_L, u16ValidCurrent  ,0x0007);
1211*53ee8cc1Swenshuai.xi 
1212*53ee8cc1Swenshuai.xi     bStatus = TRUE;
1213*53ee8cc1Swenshuai.xi 
1214*53ee8cc1Swenshuai.xi     return bStatus;
1215*53ee8cc1Swenshuai.xi }
1216*53ee8cc1Swenshuai.xi 
1217*53ee8cc1Swenshuai.xi 
1218*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////
1219*53ee8cc1Swenshuai.xi // 1.Turn TTL low-power mode function
1220*53ee8cc1Swenshuai.xi // 2.Turn internal termination function
1221*53ee8cc1Swenshuai.xi // 3.Turn DRIVER BIAS OP function
1222*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////
MHal_PNL_MOD_Control_Out_TTL_Resistor_OP(void * pInstance,MS_BOOL bEnble)1223*53ee8cc1Swenshuai.xi MS_BOOL MHal_PNL_MOD_Control_Out_TTL_Resistor_OP (void *pInstance,MS_BOOL bEnble)
1224*53ee8cc1Swenshuai.xi {
1225*53ee8cc1Swenshuai.xi     MS_BOOL bStatus = FALSE;
1226*53ee8cc1Swenshuai.xi     if(bEnble)
1227*53ee8cc1Swenshuai.xi     {
1228*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_36_L, 0xFFFF, 0xFFFF); //Enable TTL low-power mode
1229*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_37_L, 0x001E, 0x001E);
1230*53ee8cc1Swenshuai.xi 
1231*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_75_L, 0xFFFF, 0xFFFF); //GCR_EN_RINT (internal termination open)
1232*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_76_L, 0x003F, 0x003F);
1233*53ee8cc1Swenshuai.xi 
1234*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_79_L, 0xFFFF, 0xFFFF); //Disable DRIVER BIAS OP
1235*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_7A_L, 0x003F, 0x003F);
1236*53ee8cc1Swenshuai.xi     }
1237*53ee8cc1Swenshuai.xi     else
1238*53ee8cc1Swenshuai.xi     {
1239*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_36_L, 0x0000, 0xFFFF); //Disable TTL low-power mode
1240*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_37_L, 0x0000, 0x001E);
1241*53ee8cc1Swenshuai.xi 
1242*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_75_L, 0x0000, 0xFFFF); //GCR_EN_RINT (internal termination close)
1243*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_76_L, 0x0000, 0x003F);
1244*53ee8cc1Swenshuai.xi 
1245*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_79_L, 0x0000, 0xFFFF); //Enable DRIVER BIAS OP
1246*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_7A_L, 0x0000, 0x003F);
1247*53ee8cc1Swenshuai.xi     }
1248*53ee8cc1Swenshuai.xi 
1249*53ee8cc1Swenshuai.xi     bStatus = TRUE;
1250*53ee8cc1Swenshuai.xi     return bStatus;
1251*53ee8cc1Swenshuai.xi }
1252*53ee8cc1Swenshuai.xi 
MHal_PNL_PreInit(void * pInstance,PNL_OUTPUT_MODE eParam)1253*53ee8cc1Swenshuai.xi void MHal_PNL_PreInit(void *pInstance,PNL_OUTPUT_MODE eParam)
1254*53ee8cc1Swenshuai.xi {
1255*53ee8cc1Swenshuai.xi     _eDrvPnlInitOptions = eParam;
1256*53ee8cc1Swenshuai.xi }
1257*53ee8cc1Swenshuai.xi 
MHal_PNL_Get_Output_MODE(void * pInstance)1258*53ee8cc1Swenshuai.xi PNL_OUTPUT_MODE MHal_PNL_Get_Output_MODE(void *pInstance)
1259*53ee8cc1Swenshuai.xi {
1260*53ee8cc1Swenshuai.xi     PNL_OUTPUT_MODE eParam = _eDrvPnlInitOptions;
1261*53ee8cc1Swenshuai.xi 
1262*53ee8cc1Swenshuai.xi     return eParam;
1263*53ee8cc1Swenshuai.xi }
1264*53ee8cc1Swenshuai.xi 
MHal_PNL_SetOutputType(void * pInstance,PNL_OUTPUT_MODE eOutputMode,PNL_TYPE eLPLL_Type)1265*53ee8cc1Swenshuai.xi void MHal_PNL_SetOutputType(void *pInstance,PNL_OUTPUT_MODE eOutputMode, PNL_TYPE eLPLL_Type)
1266*53ee8cc1Swenshuai.xi {
1267*53ee8cc1Swenshuai.xi     MS_U16 u16ValidSwing2 = 0;
1268*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1269*53ee8cc1Swenshuai.xi     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
1270*53ee8cc1Swenshuai.xi 
1271*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1272*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
1273*53ee8cc1Swenshuai.xi     if( eLPLL_Type == E_PNL_TYPE_TTL)
1274*53ee8cc1Swenshuai.xi     {
1275*53ee8cc1Swenshuai.xi         // select pair output to be TTL
1276*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_6D_L, 0x0000);
1277*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_6E_L, 0x0000);
1278*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_6F_L, 0x0000, 0xEFFF);//0x6F
1279*53ee8cc1Swenshuai.xi 
1280*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_42_L, 0x0000, (BIT(7) | BIT(6))); // shift_lvds_pair
1281*53ee8cc1Swenshuai.xi 
1282*53ee8cc1Swenshuai.xi         // other TTL setting
1283*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_45_L, 0x0000);     // TTL output enable
1284*53ee8cc1Swenshuai.xi 
1285*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_46_L, 0x0000);
1286*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_47_L, 0x0000);
1287*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_7E_L, 0x0000, 0xE000);
1288*53ee8cc1Swenshuai.xi 
1289*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_44_L, 0x3FF, 0x3FF);       // TTL skew
1290*53ee8cc1Swenshuai.xi 
1291*53ee8cc1Swenshuai.xi         // GPO gating
1292*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_4A_L, BIT(8), BIT(8));         // GPO gating
1293*53ee8cc1Swenshuai.xi     }
1294*53ee8cc1Swenshuai.xi     else
1295*53ee8cc1Swenshuai.xi     {
1296*53ee8cc1Swenshuai.xi         switch(eOutputMode)
1297*53ee8cc1Swenshuai.xi         {
1298*53ee8cc1Swenshuai.xi             case E_PNL_OUTPUT_NO_OUTPUT:
1299*53ee8cc1Swenshuai.xi                 // if MOD_45[5:0] = 0x3F && XC_MOD_EXT_DATA_EN_L = 0x0,
1300*53ee8cc1Swenshuai.xi                 // then if XC_MOD_OUTPUT_CONF_L = 0x0 ---> output TTL as tri-state
1301*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_6D_L, 0x0000);
1302*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_6E_L, 0x0000);
1303*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_6F_L, 0x0000, 0x000F);
1304*53ee8cc1Swenshuai.xi 
1305*53ee8cc1Swenshuai.xi                 //----------------------------------
1306*53ee8cc1Swenshuai.xi                 // Purpose: Set the output to be the GPO, and let it's level to Low
1307*53ee8cc1Swenshuai.xi                 // 1. External Enable, Pair 0~5
1308*53ee8cc1Swenshuai.xi                 // 2. GPIO Enable, pair 0~5
1309*53ee8cc1Swenshuai.xi                 // 3. GPIO Output data : All low, pair 0~5
1310*53ee8cc1Swenshuai.xi                 // 4. GPIO OEZ: output piar 0~5
1311*53ee8cc1Swenshuai.xi                 //----------------------------------
1312*53ee8cc1Swenshuai.xi 
1313*53ee8cc1Swenshuai.xi                 //1.External Enable, Pair 0~5
1314*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_46_L, 0x0FFF, 0x0FFF);
1315*53ee8cc1Swenshuai.xi                 //2.GPIO Enable, pair 0~5
1316*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_4D_L, 0x0FFF, 0x0FFF);
1317*53ee8cc1Swenshuai.xi                 //3.GPIO Output data : All low, pair 0~5
1318*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_4F_L, 0x0000, 0x0FFF);
1319*53ee8cc1Swenshuai.xi                 //4.GPIO OEZ: output piar 0~5
1320*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_51_L, 0x0000, 0x0FFF);
1321*53ee8cc1Swenshuai.xi 
1322*53ee8cc1Swenshuai.xi                 //1.External Enable, Pair 6~15
1323*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_46_L, 0xF000, 0xF000);
1324*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_47_L, 0xFFFF);
1325*53ee8cc1Swenshuai.xi                 //2.GPIO Enable, pair 6~15
1326*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_4D_L, 0xF000, 0xF000);
1327*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_4E_L, 0xFFFF);
1328*53ee8cc1Swenshuai.xi                 //3.GPIO Output data : All low, pair 6~15
1329*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_4F_L, 0x0000, 0xF000);
1330*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_50_L, 0x0000);
1331*53ee8cc1Swenshuai.xi                 //4.GPIO OEZ: output piar 6~15
1332*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_51_L, 0x0000, 0xF000);
1333*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_52_L, 0x0000);
1334*53ee8cc1Swenshuai.xi 
1335*53ee8cc1Swenshuai.xi                 //1234.External Enable, Pair 16~17
1336*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_7E_L, 0xFF00);
1337*53ee8cc1Swenshuai.xi 
1338*53ee8cc1Swenshuai.xi                 //1.External Enable, Pair 18~20, 2.GPIO Enable, pair 18~20
1339*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_7C_L, 0x3F3F, 0x3F3F);
1340*53ee8cc1Swenshuai.xi                 //3.GPIO Output data : All low, pair 18~20
1341*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_7A_L, 0x0000, 0x3F00);
1342*53ee8cc1Swenshuai.xi                 //4.GPIO OEZ: output piar 18~20
1343*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_7F_L, 0x0000, 0xFC00);
1344*53ee8cc1Swenshuai.xi                 break;
1345*53ee8cc1Swenshuai.xi 
1346*53ee8cc1Swenshuai.xi             case E_PNL_OUTPUT_CLK_ONLY:
1347*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_6D_L, 0, 0xF000);
1348*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_6E_L, 0x4004);
1349*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_6F_L, 0, 0x000F);
1350*53ee8cc1Swenshuai.xi                 break;
1351*53ee8cc1Swenshuai.xi 
1352*53ee8cc1Swenshuai.xi             case E_PNL_OUTPUT_DATA_ONLY:
1353*53ee8cc1Swenshuai.xi             case E_PNL_OUTPUT_CLK_DATA:
1354*53ee8cc1Swenshuai.xi             default:
1355*53ee8cc1Swenshuai.xi 
1356*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_4D_L, 0x0000, 0xF000);
1357*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_4E_L, 0x0000);
1358*53ee8cc1Swenshuai.xi                 //1. set GCR_PVDD_2P5=1��b0;           MOD PVDD power:    0: 3.3V
1359*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_37_L, 0x00, BIT(6));
1360*53ee8cc1Swenshuai.xi                 //2. set PD_IB_MOD=1��b0;
1361*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_78_L, 0x00, BIT(0));
1362*53ee8cc1Swenshuai.xi                 //  save ch6 init value
1363*53ee8cc1Swenshuai.xi                 u16ValidSwing2 = (MOD_R2BYTEMSK(REG_MOD_BK00_2B_L, 0x3F00)>>8);
1364*53ee8cc1Swenshuai.xi                 //3. set Desired Pairs: GCR_ICON[5:0]=6��h3f (current all open);
1365*53ee8cc1Swenshuai.xi                 MHal_PNL_MOD_Control_Out_Swing(pInstance,0x3F);
1366*53ee8cc1Swenshuai.xi                 //4. set Desired Pairs: GCR_PE_ADJ[2:0]=3��h7 (pre-emphasis current all open )
1367*53ee8cc1Swenshuai.xi                 MHal_PNL_MOD_Control_Out_PE_Current (pInstance,0x07);
1368*53ee8cc1Swenshuai.xi                 //5. Enable low-power modeinternal termination Open, Enable OP
1369*53ee8cc1Swenshuai.xi                 MHal_PNL_MOD_Control_Out_TTL_Resistor_OP (pInstance,1);
1370*53ee8cc1Swenshuai.xi 
1371*53ee8cc1Swenshuai.xi                 MsOS_DelayTask(1);
1372*53ee8cc1Swenshuai.xi 
1373*53ee8cc1Swenshuai.xi                 //6. Enable low-power modeinternal termination Open, Enable OP
1374*53ee8cc1Swenshuai.xi                 MHal_Output_LVDS_Pair_Setting(pInstance,
1375*53ee8cc1Swenshuai.xi                                               pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type,
1376*53ee8cc1Swenshuai.xi                                               pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7,
1377*53ee8cc1Swenshuai.xi                                               pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15,
1378*53ee8cc1Swenshuai.xi                                               pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG16_21);
1379*53ee8cc1Swenshuai.xi                 //pPNLResourcePrivate->stdrvPNL._stPnlInitData
1380*53ee8cc1Swenshuai.xi                 MHal_Shift_LVDS_Pair(pInstance,_u8MOD_LVDS_Pair_Shift);
1381*53ee8cc1Swenshuai.xi 
1382*53ee8cc1Swenshuai.xi                 //7. set Desired Pairs: GCR_PE_ADJ[2:0]=3��h0 (pre-emphasis current all Close)
1383*53ee8cc1Swenshuai.xi                 MHal_PNL_MOD_Control_Out_PE_Current (pInstance,0x00);
1384*53ee8cc1Swenshuai.xi                 //8. set Desired Pairs: GCR_ICON[5:0]    (current all init);
1385*53ee8cc1Swenshuai.xi                 MHal_PNL_MOD_Control_Out_Swing(pInstance,u16ValidSwing2);
1386*53ee8cc1Swenshuai.xi                 //9. Disable low-power modeinternal termination Close, Disable OP
1387*53ee8cc1Swenshuai.xi                 MHal_PNL_MOD_Control_Out_TTL_Resistor_OP (pInstance,0);
1388*53ee8cc1Swenshuai.xi 
1389*53ee8cc1Swenshuai.xi                 // other TTL setting
1390*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_45_L, 0x003F);     // LVDS output enable, [5:4] Output enable: PANEL_LVDS/ PANEL_miniLVDS/ PANEL_RSDS
1391*53ee8cc1Swenshuai.xi 
1392*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_46_L, 0x0000, 0xF000);
1393*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_47_L, 0x0000);
1394*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_7E_L, 0x0000, 0x000F);
1395*53ee8cc1Swenshuai.xi 
1396*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_44_L, 0x000, 0x3FF);    // TTL skew
1397*53ee8cc1Swenshuai.xi 
1398*53ee8cc1Swenshuai.xi                 // GPO gating
1399*53ee8cc1Swenshuai.xi                 MOD_W2BYTEMSK(REG_MOD_BK00_4A_L, 0x0, BIT(8));     // GPO gating
1400*53ee8cc1Swenshuai.xi 
1401*53ee8cc1Swenshuai.xi             break;
1402*53ee8cc1Swenshuai.xi         }
1403*53ee8cc1Swenshuai.xi     }
1404*53ee8cc1Swenshuai.xi }
1405*53ee8cc1Swenshuai.xi 
Mhal_PNL_Flock_LPLLSet(void * pInstance,MS_U32 ldHz)1406*53ee8cc1Swenshuai.xi void Mhal_PNL_Flock_LPLLSet(void *pInstance,MS_U32 ldHz)
1407*53ee8cc1Swenshuai.xi {
1408*53ee8cc1Swenshuai.xi     UNUSED(ldHz);
1409*53ee8cc1Swenshuai.xi }
1410*53ee8cc1Swenshuai.xi 
1411*53ee8cc1Swenshuai.xi 
MHal_PNL_MISC_Control(void * pInstance,MS_U32 u32PNL_MISC)1412*53ee8cc1Swenshuai.xi void MHal_PNL_MISC_Control(void *pInstance,MS_U32 u32PNL_MISC)
1413*53ee8cc1Swenshuai.xi {
1414*53ee8cc1Swenshuai.xi     if(u32PNL_MISC & E_DRVPNL_MISC_MFC_ENABLE)
1415*53ee8cc1Swenshuai.xi     {
1416*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_42_L, BIT(7), BIT(7));       // shift LVDS pair
1417*53ee8cc1Swenshuai.xi     }
1418*53ee8cc1Swenshuai.xi }
1419*53ee8cc1Swenshuai.xi 
MHal_PNL_Init_XC_Clk(void * pInstance,PNL_InitData * pstPanelInitData)1420*53ee8cc1Swenshuai.xi void MHal_PNL_Init_XC_Clk(void *pInstance,PNL_InitData *pstPanelInitData)
1421*53ee8cc1Swenshuai.xi {
1422*53ee8cc1Swenshuai.xi     // setup output dot clock
1423*53ee8cc1Swenshuai.xi     W2BYTEMSK(REG_CKG_ODCLK, CKG_ODCLK_CLK_LPLL, CKG_ODCLK_MASK);      // select source tobe LPLL clock
1424*53ee8cc1Swenshuai.xi     W2BYTEMSK(REG_CKG_ODCLK, DISABLE, CKG_ODCLK_INVERT);               // clock not invert
1425*53ee8cc1Swenshuai.xi     W2BYTEMSK(REG_CKG_ODCLK, DISABLE, CKG_ODCLK_GATED);                // enable clock
1426*53ee8cc1Swenshuai.xi 
1427*53ee8cc1Swenshuai.xi     W2BYTEMSK(REG_CKG_BT656, CKG_BT656_CLK_LPLL, CKG_BT656_MASK);      // select source tobe LPLL clock
1428*53ee8cc1Swenshuai.xi     W2BYTEMSK(REG_CKG_BT656, DISABLE, CKG_ODCLK_INVERT);               // clock not invert
1429*53ee8cc1Swenshuai.xi     W2BYTEMSK(REG_CKG_BT656, DISABLE, CKG_ODCLK_GATED);                // enable clock
1430*53ee8cc1Swenshuai.xi     W2BYTE(REG_CLKGEN0_4F_L,0x0000); //[3:0]CLK_VBY1_FIFO clock setting
1431*53ee8cc1Swenshuai.xi     W2BYTE(L_CLKGEN0(0x57),0x0000); //[15:12]ckg_bt656 [3:0]ckg_fifo
1432*53ee8cc1Swenshuai.xi     W2BYTE(L_CLKGEN0(0x58),0x0000); //[3:0]ckg_tx_mod
1433*53ee8cc1Swenshuai.xi 
1434*53ee8cc1Swenshuai.xi     W2BYTE(L_CLKGEN0(0x63),0x0000); //[11:8]ckg_tx_mod [3:0]ckg_osd2mod
1435*53ee8cc1Swenshuai.xi 
1436*53ee8cc1Swenshuai.xi     //W2BYTE(L_CLKGEN1(0x31), 0x0000); //[11:8]ckg_odclk_frc
1437*53ee8cc1Swenshuai.xi }
1438*53ee8cc1Swenshuai.xi 
MHal_PNL_Init_MOD(void * pInstance,PNL_InitData * pstPanelInitData)1439*53ee8cc1Swenshuai.xi void MHal_PNL_Init_MOD(void *pInstance,PNL_InitData *pstPanelInitData)
1440*53ee8cc1Swenshuai.xi {
1441*53ee8cc1Swenshuai.xi 
1442*53ee8cc1Swenshuai.xi     //-------------------------------------------------------------------------
1443*53ee8cc1Swenshuai.xi     // Set MOD registers
1444*53ee8cc1Swenshuai.xi     //-------------------------------------------------------------------------
1445*53ee8cc1Swenshuai.xi 
1446*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_40_L, pstPanelInitData->u16MOD_CTRL0, LBMASK);
1447*53ee8cc1Swenshuai.xi     if(pstPanelInitData->eLPLL_Type == E_PNL_TYPE_TTL)
1448*53ee8cc1Swenshuai.xi     {
1449*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_40_L, (pstPanelInitData->u16OSTRL)<<4, 0xF00);
1450*53ee8cc1Swenshuai.xi     }
1451*53ee8cc1Swenshuai.xi     //    GPIO is controlled in drvPadConf.c
1452*53ee8cc1Swenshuai.xi     //    MDrv_Write2Byte(L_BK_MOD(0x46), 0x0000);    //EXT GPO disable
1453*53ee8cc1Swenshuai.xi     //    MDrv_Write2Byte(L_BK_MOD(0x47), 0x0000);    //EXT GPO disable
1454*53ee8cc1Swenshuai.xi     MOD_W2BYTE(REG_MOD_BK00_49_L, pstPanelInitData->u16MOD_CTRL9); //{L_BK_MOD(0x49), 0x00}, // [7,6] : output formate selction 10: 8bit, 01: 6bit :other 10bit, bit shift
1455*53ee8cc1Swenshuai.xi     MOD_W2BYTE(REG_MOD_BK00_4A_L, pstPanelInitData->u16MOD_CTRLA);
1456*53ee8cc1Swenshuai.xi     MOD_W2BYTE(REG_MOD_BK00_4B_L,  pstPanelInitData->u8MOD_CTRLB);  //[1:0]ti_bitmode 10:8bit  11:6bit  0x:10bit
1457*53ee8cc1Swenshuai.xi 
1458*53ee8cc1Swenshuai.xi     if ( SUPPORT_SYNC_FOR_DUAL_MODE )
1459*53ee8cc1Swenshuai.xi     {
1460*53ee8cc1Swenshuai.xi         // Set 1 only when PNL is dual mode
1461*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_44_L, (pstPanelInitData->eLPLL_Mode << 12) , BIT(12));
1462*53ee8cc1Swenshuai.xi     }
1463*53ee8cc1Swenshuai.xi 
1464*53ee8cc1Swenshuai.xi     //dual port lvds _start_//
1465*53ee8cc1Swenshuai.xi     // output configure for 26 pair output 00: TTL, 01: LVDS/RSDS/mini-LVDS data differential pair, 10: mini-LVDS clock output, 11: RSDS clock output
1466*53ee8cc1Swenshuai.xi     MOD_W2BYTE(REG_MOD_BK00_6F_L, 0x0000);    // output configure for 26 pair output 00: TTL, 01: LVDS/RSDS/mini-LVDS data differential pair, 10: mini-LVDS clock output, 11: RSDS clock output
1467*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_77_L, 0x1C, 0xFC);       // original is MDrv_WriteByteMask(L_BK_MOD(0x77), 0x0F, BITMASK(7:2));
1468*53ee8cc1Swenshuai.xi     //dual port lvds _end_//
1469*53ee8cc1Swenshuai.xi 
1470*53ee8cc1Swenshuai.xi     //MOD_W2BYTEMSK(REG_MOD_BK00_78_L, (_u8PnlDiffSwingLevel << 1), 0xFE);       //differential output swing level
1471*53ee8cc1Swenshuai.xi     //if(!MHal_PNL_MOD_Control_Out_Swing(_u16PnlDefault_SwingLevel))
1472*53ee8cc1Swenshuai.xi     //    printf(">>Swing Level setting error!!\n");
1473*53ee8cc1Swenshuai.xi     MOD_W2BYTE(REG_MOD_BK00_73_L, pstPanelInitData->u16LVDSTxSwapValue);
1474*53ee8cc1Swenshuai.xi 
1475*53ee8cc1Swenshuai.xi 
1476*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_78_L, 0x0100,0x0100);
1477*53ee8cc1Swenshuai.xi     // TODO: move from MDrv_Scaler_Init(), need to double check!
1478*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_53_L, BIT(0), BIT(0));
1479*53ee8cc1Swenshuai.xi 
1480*53ee8cc1Swenshuai.xi     if (R1BYTEMSK(REG_CHIP_REVISION, 0xFF) > 0)
1481*53ee8cc1Swenshuai.xi     {
1482*53ee8cc1Swenshuai.xi         // it needs internal LDO for chip after U02
1483*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_7B_L, 0x03, 0xFF); // for internal LDO
1484*53ee8cc1Swenshuai.xi     }
1485*53ee8cc1Swenshuai.xi 
1486*53ee8cc1Swenshuai.xi     //--------------------------------------------------------------
1487*53ee8cc1Swenshuai.xi     //Depend On Bitmode to set Dither
1488*53ee8cc1Swenshuai.xi     //--------------------------------------------------------------
1489*53ee8cc1Swenshuai.xi 
1490*53ee8cc1Swenshuai.xi 
1491*53ee8cc1Swenshuai.xi     // always enable noise dither and disable TAILCUT
1492*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(0,REG_SC_BK24_3F_L, ((pstPanelInitData->u8PanelNoiseDith ? XC_PAFRC_DITH_NOISEDITH_EN : (1 - XC_PAFRC_DITH_NOISEDITH_EN)) <<3) , BIT(3));
1493*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(0,REG_SC_BK24_3F_L, XC_PAFRC_DITH_TAILCUT_DISABLE, BIT(4));
1494*53ee8cc1Swenshuai.xi 
1495*53ee8cc1Swenshuai.xi     switch(pstPanelInitData->u8MOD_CTRLB & 0x03)//[1:0]ti_bitmode b'10:8bit  11:6bit  0x:10bit
1496*53ee8cc1Swenshuai.xi     {
1497*53ee8cc1Swenshuai.xi         case HAL_TI_6BIT_MODE:
1498*53ee8cc1Swenshuai.xi             SC_W2BYTEMSK(0,REG_SC_BK24_3F_L, BIT(0), BIT(0));
1499*53ee8cc1Swenshuai.xi             SC_W2BYTEMSK(0,REG_SC_BK24_3F_L, BIT(2), BIT(2));
1500*53ee8cc1Swenshuai.xi             break;
1501*53ee8cc1Swenshuai.xi 
1502*53ee8cc1Swenshuai.xi         case HAL_TI_8BIT_MODE:
1503*53ee8cc1Swenshuai.xi             SC_W2BYTEMSK(0,REG_SC_BK24_3F_L, BIT(0), BIT(0));
1504*53ee8cc1Swenshuai.xi             SC_W2BYTEMSK(0,REG_SC_BK24_3F_L, 0x00, BIT(2));
1505*53ee8cc1Swenshuai.xi             break;
1506*53ee8cc1Swenshuai.xi 
1507*53ee8cc1Swenshuai.xi         case HAL_TI_10BIT_MODE:
1508*53ee8cc1Swenshuai.xi         default:
1509*53ee8cc1Swenshuai.xi             SC_W2BYTEMSK(0,REG_SC_BK24_3F_L, 0x00, BIT(0));
1510*53ee8cc1Swenshuai.xi             SC_W2BYTEMSK(0,REG_SC_BK24_3F_L, 0x00, BIT(2));
1511*53ee8cc1Swenshuai.xi             break;
1512*53ee8cc1Swenshuai.xi             }
1513*53ee8cc1Swenshuai.xi 
1514*53ee8cc1Swenshuai.xi 
1515*53ee8cc1Swenshuai.xi     //-----depend on bitmode to set Dither------------------------------
1516*53ee8cc1Swenshuai.xi     MHal_PNL_SetOutputType(pInstance,_eDrvPnlInitOptions, pstPanelInitData->eLPLL_Type);     // TTL to Ursa
1517*53ee8cc1Swenshuai.xi 
1518*53ee8cc1Swenshuai.xi     MHal_PNL_MISC_Control(pInstance,pstPanelInitData->u32PNL_MISC);
1519*53ee8cc1Swenshuai.xi 
1520*53ee8cc1Swenshuai.xi }
1521*53ee8cc1Swenshuai.xi 
MHal_PNL_DumpMODReg(void * pInstance,MS_U32 u32Addr,MS_U16 u16Value,MS_BOOL bHiByte,MS_U16 u16Mask)1522*53ee8cc1Swenshuai.xi void MHal_PNL_DumpMODReg(void *pInstance,MS_U32 u32Addr, MS_U16 u16Value, MS_BOOL bHiByte, MS_U16 u16Mask)
1523*53ee8cc1Swenshuai.xi {
1524*53ee8cc1Swenshuai.xi     if (bHiByte)
1525*53ee8cc1Swenshuai.xi     {
1526*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(u32Addr, (u16Value << 8), (u16Mask << 8));
1527*53ee8cc1Swenshuai.xi     }
1528*53ee8cc1Swenshuai.xi     else
1529*53ee8cc1Swenshuai.xi     {
1530*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(u32Addr, u16Value, u16Mask);
1531*53ee8cc1Swenshuai.xi     }
1532*53ee8cc1Swenshuai.xi }
MHal_MOD_Calibration_Init(void * pInstance,PNL_ModCali_InitData * pstModCaliInitData)1533*53ee8cc1Swenshuai.xi void MHal_MOD_Calibration_Init(void *pInstance, PNL_ModCali_InitData *pstModCaliInitData)
1534*53ee8cc1Swenshuai.xi {
1535*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1536*53ee8cc1Swenshuai.xi     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
1537*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1538*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
1539*53ee8cc1Swenshuai.xi     pPNLResourcePrivate->sthalPNL._usMOD_CALI_OFFSET= pstModCaliInitData->u8ModCaliTarget;
1540*53ee8cc1Swenshuai.xi     pPNLResourcePrivate->sthalPNL._u8MOD_CALI_VALUE = pstModCaliInitData->s8ModCaliOffset;
1541*53ee8cc1Swenshuai.xi }
1542*53ee8cc1Swenshuai.xi 
MHal_BD_LVDS_Output_Type(void * pInstance,MS_U16 Type)1543*53ee8cc1Swenshuai.xi void MHal_BD_LVDS_Output_Type(void *pInstance,MS_U16 Type)
1544*53ee8cc1Swenshuai.xi {
1545*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1546*53ee8cc1Swenshuai.xi     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
1547*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1548*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
1549*53ee8cc1Swenshuai.xi 
1550*53ee8cc1Swenshuai.xi     if(Type == LVDS_DUAL_OUTPUT_SPECIAL )
1551*53ee8cc1Swenshuai.xi     {
1552*53ee8cc1Swenshuai.xi         _u8MOD_LVDS_Pair_Shift = LVDS_DUAL_OUTPUT_SPECIAL;
1553*53ee8cc1Swenshuai.xi         _u8MOD_LVDS_Pair_Type = 1;
1554*53ee8cc1Swenshuai.xi     }
1555*53ee8cc1Swenshuai.xi     else
1556*53ee8cc1Swenshuai.xi     {
1557*53ee8cc1Swenshuai.xi         _u8MOD_LVDS_Pair_Type  = Type;
1558*53ee8cc1Swenshuai.xi     }
1559*53ee8cc1Swenshuai.xi 
1560*53ee8cc1Swenshuai.xi     pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type = _u8MOD_LVDS_Pair_Type;
1561*53ee8cc1Swenshuai.xi }
1562*53ee8cc1Swenshuai.xi 
msModCalDDAOUT(void * pInstance)1563*53ee8cc1Swenshuai.xi MS_BOOL msModCalDDAOUT(void *pInstance)
1564*53ee8cc1Swenshuai.xi {
1565*53ee8cc1Swenshuai.xi    // W2BYTEMSK(BK_MOD(0x7D), ENABLE, 8:8);
1566*53ee8cc1Swenshuai.xi    // MsOS_DelayTask(10);  //10ms
1567*53ee8cc1Swenshuai.xi     return (MS_BOOL)((MOD_R2BYTEMSK(REG_MOD_BK00_7D_L, BIT(8))) >> 8);
1568*53ee8cc1Swenshuai.xi }
1569*53ee8cc1Swenshuai.xi 
msModCurrentCalibration(void * pInstance)1570*53ee8cc1Swenshuai.xi MS_U8 msModCurrentCalibration(void *pInstance)
1571*53ee8cc1Swenshuai.xi {
1572*53ee8cc1Swenshuai.xi #if MOD_CAL_TIMER
1573*53ee8cc1Swenshuai.xi     MS_U32 delay_start_time;
1574*53ee8cc1Swenshuai.xi     delay_start_time=MsOS_GetSystemTime();
1575*53ee8cc1Swenshuai.xi #endif
1576*53ee8cc1Swenshuai.xi 
1577*53ee8cc1Swenshuai.xi #if (!ENABLE_Auto_ModCurrentCalibration)
1578*53ee8cc1Swenshuai.xi     return 0x60;
1579*53ee8cc1Swenshuai.xi #else
1580*53ee8cc1Swenshuai.xi     MS_U8 u8cur_ibcal=0;
1581*53ee8cc1Swenshuai.xi     MS_U16 u16cur_ibcal[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
1582*53ee8cc1Swenshuai.xi     MS_U32 x=0;
1583*53ee8cc1Swenshuai.xi     MS_U16 u16reg_3280,u16reg_3282,u16reg_328a;
1584*53ee8cc1Swenshuai.xi     MS_U16 u16reg_32da,u16reg_32dc,u16reg_32de;
1585*53ee8cc1Swenshuai.xi 
1586*53ee8cc1Swenshuai.xi 
1587*53ee8cc1Swenshuai.xi     u16reg_3280 = MOD_R2BYTEMSK(REG_MOD_BK00_40_L, LBMASK);
1588*53ee8cc1Swenshuai.xi     u16reg_3282 = MOD_R2BYTEMSK(REG_MOD_BK00_41_L, LBMASK);
1589*53ee8cc1Swenshuai.xi     u16reg_328a = MOD_R2BYTEMSK(REG_MOD_BK00_45_L, LBMASK);
1590*53ee8cc1Swenshuai.xi 
1591*53ee8cc1Swenshuai.xi     u16reg_32da = MOD_R2BYTE(REG_MOD_BK00_6D_L);
1592*53ee8cc1Swenshuai.xi     u16reg_32dc = MOD_R2BYTE(REG_MOD_BK00_6E_L);
1593*53ee8cc1Swenshuai.xi     u16reg_32de = MOD_R2BYTE(REG_MOD_BK00_6F_L);
1594*53ee8cc1Swenshuai.xi 
1595*53ee8cc1Swenshuai.xi // =========
1596*53ee8cc1Swenshuai.xi // GCR_CAL_LEVEL[1:0] : REG_MOD_BK00_7D_L =>
1597*53ee8cc1Swenshuai.xi // 2'b00 250mV ' GCR_ICON_CHx[5:0]=2'h15 (decimal 21)
1598*53ee8cc1Swenshuai.xi // 2'b01 350mV ' GCR_ICON_CHx[5:0]=2'h1F (decimal 31)
1599*53ee8cc1Swenshuai.xi // 2'b10 300mV ' GCR_ICON_CHx[5:0]=2'h1A (decimal 26)
1600*53ee8cc1Swenshuai.xi // 2'b11 200mV ' GCR_ICON_CHx[5:0]=2'h10 (decimal 16)
1601*53ee8cc1Swenshuai.xi // =========
1602*53ee8cc1Swenshuai.xi 
1603*53ee8cc1Swenshuai.xi     switch(_u8MOD_CALI_TARGET)
1604*53ee8cc1Swenshuai.xi     {
1605*53ee8cc1Swenshuai.xi         default:
1606*53ee8cc1Swenshuai.xi         case 0:
1607*53ee8cc1Swenshuai.xi             u8cur_ibcal = 0x19;
1608*53ee8cc1Swenshuai.xi         break;
1609*53ee8cc1Swenshuai.xi         case 1:
1610*53ee8cc1Swenshuai.xi             u8cur_ibcal = 0x26;
1611*53ee8cc1Swenshuai.xi         break;
1612*53ee8cc1Swenshuai.xi         case 2:
1613*53ee8cc1Swenshuai.xi             u8cur_ibcal = 0x14;
1614*53ee8cc1Swenshuai.xi         break;
1615*53ee8cc1Swenshuai.xi         case 3:
1616*53ee8cc1Swenshuai.xi             u8cur_ibcal = 0x12;
1617*53ee8cc1Swenshuai.xi         break;
1618*53ee8cc1Swenshuai.xi     }
1619*53ee8cc1Swenshuai.xi 
1620*53ee8cc1Swenshuai.xi     //MOD_W2BYTEMSK(REG_MOD_BK00_2B_L, ((MS_U16)u8cur_ibcal)<<8, 0x3F00); // calibration initialized value
1621*53ee8cc1Swenshuai.xi 
1622*53ee8cc1Swenshuai.xi     //Set output config to be test clock output mode
1623*53ee8cc1Swenshuai.xi     MOD_W2BYTE(REG_MOD_BK00_6D_L, 0xFFFF);
1624*53ee8cc1Swenshuai.xi     MOD_W2BYTE(REG_MOD_BK00_6E_L, 0xFFFF);
1625*53ee8cc1Swenshuai.xi     MOD_W2BYTE(REG_MOD_BK00_6F_L, 0xFFFF);
1626*53ee8cc1Swenshuai.xi 
1627*53ee8cc1Swenshuai.xi     // White Pattern for Calibration
1628*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_32_L, BIT(15), BIT(15)); // Enable test enable of digi seri
1629*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_41_L, 0x00, 0xFF);       // Set analog testpix output to low
1630*53ee8cc1Swenshuai.xi     // (1) Set keep mode to auto write calibration result into register.
1631*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_3C_L, BIT(15), BIT(15));
1632*53ee8cc1Swenshuai.xi 
1633*53ee8cc1Swenshuai.xi     // (2) Set calibration step waiting time
1634*53ee8cc1Swenshuai.xi     MOD_W2BYTE(REG_MOD_BK00_3B_L, 0x0080); // (about 5us)
1635*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_3C_L, 0x0000, 0x00FF);
1636*53ee8cc1Swenshuai.xi 
1637*53ee8cc1Swenshuai.xi     // (3) Set calibration toggle time
1638*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_3C_L, 0x0500, 0x0F00);
1639*53ee8cc1Swenshuai.xi     // Set Calibration target
1640*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_7D_L, BIT(2), BIT(3)|BIT(2));  // Select calibration source pair, 01: channel 6
1641*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_7D_L, _u8MOD_CALI_TARGET, BIT(1)|BIT(0));    // Select calibration target voltage, 00: 200mv, 01:350mv, 10: 250mv, 11: 150mv
1642*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_7D_L, BIT(7), BIT(7));         // Enable calibration function
1643*53ee8cc1Swenshuai.xi 
1644*53ee8cc1Swenshuai.xi     HAL_MOD_CAL_DBG(printf("\r\n [%s](1)Init value:u8cur_ibcal = %d\n", __FUNCTION__, u8cur_ibcal));
1645*53ee8cc1Swenshuai.xi     MS_U8 u8CheckTimes = 0;
1646*53ee8cc1Swenshuai.xi     while(1)
1647*53ee8cc1Swenshuai.xi     {
1648*53ee8cc1Swenshuai.xi         // (7) Enable Hardware calibration
1649*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_3D_L, BIT(15), BIT(15));
1650*53ee8cc1Swenshuai.xi 
1651*53ee8cc1Swenshuai.xi         // (8) Wait 2ms
1652*53ee8cc1Swenshuai.xi         MsOS_DelayTask(2);
1653*53ee8cc1Swenshuai.xi 
1654*53ee8cc1Swenshuai.xi         // (10) Disable Hardware calibration
1655*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_3D_L, 0x00, BIT(15));
1656*53ee8cc1Swenshuai.xi 
1657*53ee8cc1Swenshuai.xi         // (9)Check Finish and Fail flag bit
1658*53ee8cc1Swenshuai.xi         //BK1032, 0x3D[14], Finish flag=1
1659*53ee8cc1Swenshuai.xi         //BK1032, 0x3D[13], Fail flag=0
1660*53ee8cc1Swenshuai.xi         if (MOD_R2BYTEMSK(REG_MOD_BK00_3D_L, 0x6000) == 0x4000)
1661*53ee8cc1Swenshuai.xi         {
1662*53ee8cc1Swenshuai.xi             printf("\033[0;31m [%s][%d] cal ok, break  \033[0m\n", __FUNCTION__, __LINE__);
1663*53ee8cc1Swenshuai.xi             //u16cur_ibcal
1664*53ee8cc1Swenshuai.xi             u16cur_ibcal[0]=(MOD_R2BYTEMSK(REG_MOD_BK00_2F_L,0x0001)<<6)|  (MOD_R2BYTEMSK(REG_MOD_BK00_29_L, 0x3F0)>>4);   // ch0
1665*53ee8cc1Swenshuai.xi             u16cur_ibcal[1]=(MOD_R2BYTEMSK(REG_MOD_BK00_2F_L,0x0002)<<6)|  (MOD_R2BYTEMSK(REG_MOD_BK00_29_L, 0xFC00)>>10); // ch1
1666*53ee8cc1Swenshuai.xi 
1667*53ee8cc1Swenshuai.xi             u16cur_ibcal[2]=(MOD_R2BYTEMSK(REG_MOD_BK00_2F_L,0x0004)<<6)|  (MOD_R2BYTEMSK(REG_MOD_BK00_2A_L, 0x3F));       // ch2
1668*53ee8cc1Swenshuai.xi             u16cur_ibcal[3]=(MOD_R2BYTEMSK(REG_MOD_BK00_2F_L,0x0008)<<6)|  (MOD_R2BYTEMSK(REG_MOD_BK00_2A_L, 0xFC0)>>6);   // ch3
1669*53ee8cc1Swenshuai.xi             u16cur_ibcal[4]=(MOD_R2BYTEMSK(REG_MOD_BK00_2F_L,0x0010)<<6)|  (MOD_R2BYTEMSK(REG_MOD_BK00_2A_L, 0xF000)>>12) | (MOD_R2BYTEMSK(REG_MOD_BK00_2B_L, 0x03))<<4;
1670*53ee8cc1Swenshuai.xi             u16cur_ibcal[5]=(MOD_R2BYTEMSK(REG_MOD_BK00_2F_L,0x0020)<<6)|  (MOD_R2BYTEMSK(REG_MOD_BK00_2B_L, 0xFC)>>2);    // ch5
1671*53ee8cc1Swenshuai.xi             u16cur_ibcal[6]=(MOD_R2BYTEMSK(REG_MOD_BK00_2F_L,0x0040)<<6)|  (MOD_R2BYTEMSK(REG_MOD_BK00_2B_L, 0x3F00)>>8);  // ch6
1672*53ee8cc1Swenshuai.xi             u16cur_ibcal[7]=(MOD_R2BYTEMSK(REG_MOD_BK00_2F_L,0x0080)<<6)|  (MOD_R2BYTEMSK(REG_MOD_BK00_2B_L, 0xC000)>>14) | (MOD_R2BYTEMSK(REG_MOD_BK00_2C_L, 0x0F)<<2);
1673*53ee8cc1Swenshuai.xi             u16cur_ibcal[8]=(MOD_R2BYTEMSK(REG_MOD_BK00_2F_L,0x0100)<<6)|  (MOD_R2BYTEMSK(REG_MOD_BK00_2C_L, 0x3F0)>>4);    // ch8
1674*53ee8cc1Swenshuai.xi             u16cur_ibcal[9]=(MOD_R2BYTEMSK(REG_MOD_BK00_2F_L,0x0200)<<6)|  (MOD_R2BYTEMSK(REG_MOD_BK00_2C_L, 0xFC00)>>10);    // ch9
1675*53ee8cc1Swenshuai.xi 
1676*53ee8cc1Swenshuai.xi             u16cur_ibcal[10]=(MOD_R2BYTEMSK(REG_MOD_BK00_2F_L,0x0400)<<6)|  (MOD_R2BYTEMSK(REG_MOD_BK00_2D_L, 0x3F));       // ch10
1677*53ee8cc1Swenshuai.xi             u16cur_ibcal[11]=(MOD_R2BYTEMSK(REG_MOD_BK00_2F_L,0x0800)<<6)|  (MOD_R2BYTEMSK(REG_MOD_BK00_2D_L, 0xFC0)>>6);   // ch11
1678*53ee8cc1Swenshuai.xi             u16cur_ibcal[12]=(MOD_R2BYTEMSK(REG_MOD_BK00_2F_L,0x1000)<<6)|  (MOD_R2BYTEMSK(REG_MOD_BK00_2D_L, 0xF000)>>12) | (MOD_R2BYTEMSK(REG_MOD_BK00_2E_L, 0x03)<<4);
1679*53ee8cc1Swenshuai.xi             u16cur_ibcal[13]=(MOD_R2BYTEMSK(REG_MOD_BK00_2F_L,0x2000)<<6)|  (MOD_R2BYTEMSK(REG_MOD_BK00_2E_L, 0xFC)>>2);    // ch13
1680*53ee8cc1Swenshuai.xi             break;
1681*53ee8cc1Swenshuai.xi         }
1682*53ee8cc1Swenshuai.xi         else
1683*53ee8cc1Swenshuai.xi         {
1684*53ee8cc1Swenshuai.xi             u8CheckTimes ++;
1685*53ee8cc1Swenshuai.xi             //printf("\033[0;31m [%s][%d] cal ng, u8CheckTimes: %d  \033[0m\n", __FUNCTION__, __LINE__, u8CheckTimes);
1686*53ee8cc1Swenshuai.xi         }
1687*53ee8cc1Swenshuai.xi 
1688*53ee8cc1Swenshuai.xi         if (u8CheckTimes > 3)
1689*53ee8cc1Swenshuai.xi         {
1690*53ee8cc1Swenshuai.xi             // (13) If 3 times all fail, set all pair to nominal value by disable keep mode
1691*53ee8cc1Swenshuai.xi             //MOD_W2BYTEMSK(REG_MOD_BK00_3C_L, 0x00, BIT(15));
1692*53ee8cc1Swenshuai.xi             printf("\033[0;31m [%s][%d] If 3 times all fail, set all pair to nominal value by disable keep mode  \033[0m\n", __FUNCTION__, __LINE__);
1693*53ee8cc1Swenshuai.xi             break;
1694*53ee8cc1Swenshuai.xi         }
1695*53ee8cc1Swenshuai.xi     }
1696*53ee8cc1Swenshuai.xi 
1697*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_3C_L, 0x00, BIT(15));
1698*53ee8cc1Swenshuai.xi 
1699*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_7D_L, 0x00, BIT(7));  // Disable calibration function
1700*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_32_L, 0x00, BIT(15)); // Disable test enable of digi seri
1701*53ee8cc1Swenshuai.xi 
1702*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_40_L, u16reg_3280, LBMASK);
1703*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_41_L, u16reg_3282, LBMASK);
1704*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_45_L, u16reg_328a, LBMASK);
1705*53ee8cc1Swenshuai.xi 
1706*53ee8cc1Swenshuai.xi     MOD_W2BYTE(REG_MOD_BK00_6D_L, u16reg_32da);
1707*53ee8cc1Swenshuai.xi     MOD_W2BYTE(REG_MOD_BK00_6E_L, u16reg_32dc);
1708*53ee8cc1Swenshuai.xi     MOD_W2BYTE(REG_MOD_BK00_6F_L, u16reg_32de);
1709*53ee8cc1Swenshuai.xi 
1710*53ee8cc1Swenshuai.xi     if (u8CheckTimes <=3)
1711*53ee8cc1Swenshuai.xi     {
1712*53ee8cc1Swenshuai.xi         HAL_MOD_CAL_DBG(printf("\r\n----- Calibration ok \n"));
1713*53ee8cc1Swenshuai.xi         for(x=0;x<14;x++)
1714*53ee8cc1Swenshuai.xi         {
1715*53ee8cc1Swenshuai.xi             //printf("\033[1;33m[%s:%d]BEF %d = %d\033[m\n",__FUNCTION__,__LINE__,x,u16cur_ibcal[x]);
1716*53ee8cc1Swenshuai.xi             if((u16cur_ibcal[x]>=(u8cur_ibcal*1.6))||(u16cur_ibcal[x]<=(u8cur_ibcal*0.4)))
1717*53ee8cc1Swenshuai.xi             {
1718*53ee8cc1Swenshuai.xi                 u16cur_ibcal[x]=u8cur_ibcal;
1719*53ee8cc1Swenshuai.xi             }
1720*53ee8cc1Swenshuai.xi             //printf("\033[1;33m[%s:%d]AFT %d = %d\033[m\n",__FUNCTION__,__LINE__,x,u16cur_ibcal[x]);
1721*53ee8cc1Swenshuai.xi         }
1722*53ee8cc1Swenshuai.xi     }
1723*53ee8cc1Swenshuai.xi     else
1724*53ee8cc1Swenshuai.xi     {
1725*53ee8cc1Swenshuai.xi         HAL_MOD_CAL_DBG(printf("\r\n----- Calibration fail: 0x%lx \n", MOD_R2BYTEMSK(REG_MOD_BK00_3D_L, 0x6000)));
1726*53ee8cc1Swenshuai.xi         //printf("\033[1;33m[%s:%d]BEF %d = %d\033[m\n",__FUNCTION__,__LINE__,x,u16cur_ibcal[x]);
1727*53ee8cc1Swenshuai.xi         for(x=0;x<14;x++)
1728*53ee8cc1Swenshuai.xi         {
1729*53ee8cc1Swenshuai.xi             u16cur_ibcal[x]=u8cur_ibcal;
1730*53ee8cc1Swenshuai.xi         }
1731*53ee8cc1Swenshuai.xi         //printf("\033[1;33m[%s:%d]AFT %d = %d\033[m\n",__FUNCTION__,__LINE__,x,u16cur_ibcal[x]);
1732*53ee8cc1Swenshuai.xi     }
1733*53ee8cc1Swenshuai.xi 
1734*53ee8cc1Swenshuai.xi     // Store the final value
1735*53ee8cc1Swenshuai.xi     HAL_MOD_CAL_DBG(printf("\r\n (3)Store value = %d\n", u8cur_ibcal));
1736*53ee8cc1Swenshuai.xi 
1737*53ee8cc1Swenshuai.xi     _u8MOD_CALI_VALUE = (u8cur_ibcal & 0x3F);
1738*53ee8cc1Swenshuai.xi 
1739*53ee8cc1Swenshuai.xi     // copy the valur of ch6 to all channel( 0~20)
1740*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_29_L,((MS_U16)(u16cur_ibcal[0]&0x3F))<<4, 0x3F0);   // ch0
1741*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_29_L,((MS_U16)(u16cur_ibcal[1]&0x3F))<<10, 0xFC00); // ch1
1742*53ee8cc1Swenshuai.xi 
1743*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_2A_L,((MS_U16)(u16cur_ibcal[2]&0x3F)), 0x3F);       // ch2
1744*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_2A_L,((MS_U16)(u16cur_ibcal[3]&0x3F))<<6, 0xFC0);   // ch3
1745*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_2A_L,((MS_U16)(u16cur_ibcal[4]&0x3F))<<12, 0xF000); // ch4
1746*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_2B_L,((MS_U16)(u16cur_ibcal[4]&0x3F))>>4, 0x03);
1747*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_2B_L,((MS_U16)(u16cur_ibcal[5]&0x3F))<<2, 0xFC);    // ch5
1748*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_2B_L,((MS_U16)(u16cur_ibcal[6]&0x3F))<<8, 0x3F00);  // ch6
1749*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_2B_L,((MS_U16)(u16cur_ibcal[7]&0x3F))<<14, 0xC000);   // ch7
1750*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_2C_L,((MS_U16)(u16cur_ibcal[7]&0x3F))>>2, 0x0F);
1751*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_2C_L,((MS_U16)(u16cur_ibcal[8]&0x3F))<<4, 0x3F0);    // ch8
1752*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_2C_L,((MS_U16)(u16cur_ibcal[9]&0x3F))<<10, 0xFC00);    // ch9
1753*53ee8cc1Swenshuai.xi 
1754*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_2D_L,((MS_U16)(u16cur_ibcal[10]&0x3F)), 0x3F);       // ch10
1755*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_2D_L,((MS_U16)(u16cur_ibcal[11]&0x3F))<<6, 0xFC0);   // ch11
1756*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_2D_L,((MS_U16)(u16cur_ibcal[12]&0x3F))<<12, 0xF000); // ch12
1757*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_2E_L,((MS_U16)(u16cur_ibcal[12]&0x3F))>>4, 0x03);
1758*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_2E_L,((MS_U16)(u16cur_ibcal[13]&0x3F))<<2, 0xFC);    // ch13
1759*53ee8cc1Swenshuai.xi     MOD_W2BYTEMSK(REG_MOD_BK00_2F_L,0x0000, 0x1FFF);    // MSB
1760*53ee8cc1Swenshuai.xi 
1761*53ee8cc1Swenshuai.xi #if MOD_CAL_TIMER
1762*53ee8cc1Swenshuai.xi     printf("[%s] takes %ld ms\n", __FUNCTION__, (MsOS_GetSystemTime()-delay_start_time));
1763*53ee8cc1Swenshuai.xi #endif
1764*53ee8cc1Swenshuai.xi     return (u8cur_ibcal&0x3F);//MOD_R2BYTEMSK(REG_MOD_BK00_2B_L, 0x3F00);
1765*53ee8cc1Swenshuai.xi #endif
1766*53ee8cc1Swenshuai.xi }
1767*53ee8cc1Swenshuai.xi 
MHal_PNL_MOD_Calibration(void * pInstance)1768*53ee8cc1Swenshuai.xi PNL_Result MHal_PNL_MOD_Calibration(void *pInstance)
1769*53ee8cc1Swenshuai.xi {
1770*53ee8cc1Swenshuai.xi     MS_U8 u8Cab;
1771*53ee8cc1Swenshuai.xi     MS_U8 u8BackUSBPwrStatus;
1772*53ee8cc1Swenshuai.xi 
1773*53ee8cc1Swenshuai.xi 
1774*53ee8cc1Swenshuai.xi     u8BackUSBPwrStatus = R2BYTEMSK(L_BK_UTMI1(0x04), BIT(7));
1775*53ee8cc1Swenshuai.xi 
1776*53ee8cc1Swenshuai.xi     W2BYTEMSK(L_BK_UTMI1(0x04), 0x00, BIT(7));
1777*53ee8cc1Swenshuai.xi 
1778*53ee8cc1Swenshuai.xi     u8Cab = msModCurrentCalibration(pInstance);
1779*53ee8cc1Swenshuai.xi 
1780*53ee8cc1Swenshuai.xi     W2BYTEMSK(L_BK_UTMI1(0x04), u8BackUSBPwrStatus, BIT(7));
1781*53ee8cc1Swenshuai.xi 
1782*53ee8cc1Swenshuai.xi 
1783*53ee8cc1Swenshuai.xi     return E_PNL_OK;
1784*53ee8cc1Swenshuai.xi 
1785*53ee8cc1Swenshuai.xi }
1786*53ee8cc1Swenshuai.xi 
MHal_PNL_PowerDownLPLL(void * pInstance,MS_BOOL bEnable)1787*53ee8cc1Swenshuai.xi static void MHal_PNL_PowerDownLPLL(void *pInstance,MS_BOOL bEnable)
1788*53ee8cc1Swenshuai.xi {
1789*53ee8cc1Swenshuai.xi     if(bEnable)
1790*53ee8cc1Swenshuai.xi     {
1791*53ee8cc1Swenshuai.xi         W2BYTEMSK(L_BK_LPLL(0x03), BIT(5), BIT(5));
1792*53ee8cc1Swenshuai.xi     }
1793*53ee8cc1Swenshuai.xi     else
1794*53ee8cc1Swenshuai.xi     {
1795*53ee8cc1Swenshuai.xi         W2BYTEMSK(L_BK_LPLL(0x03), FALSE, BIT(5));
1796*53ee8cc1Swenshuai.xi     }
1797*53ee8cc1Swenshuai.xi }
1798*53ee8cc1Swenshuai.xi 
MHal_PNL_En(void * pInstance,MS_BOOL bPanelOn,MS_BOOL bCalEn)1799*53ee8cc1Swenshuai.xi PNL_Result MHal_PNL_En(void *pInstance,MS_BOOL bPanelOn, MS_BOOL bCalEn)
1800*53ee8cc1Swenshuai.xi {
1801*53ee8cc1Swenshuai.xi     MS_U8 u8Cab;
1802*53ee8cc1Swenshuai.xi     MS_U8 u8BackUSBPwrStatus;
1803*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1804*53ee8cc1Swenshuai.xi     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
1805*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1806*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
1807*53ee8cc1Swenshuai.xi 
1808*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "[%s][%d]\n", __FUNCTION__, __LINE__);
1809*53ee8cc1Swenshuai.xi 
1810*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u32PNL_MISC = %x\n", (unsigned int)pPNLResourcePrivate->stdrvPNL._stPnlInitData.u32PNL_MISC);
1811*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "bPanelOn = %x\n", bPanelOn);
1812*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "eLPLL_Type            = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type);
1813*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "_u8MOD_LVDS_Pair_Type = %x\n", pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type);
1814*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u16OutputCFG0_7       = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7);
1815*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u16OutputCFG8_15      = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15);
1816*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u16OutputCFG16_21     = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG16_21);
1817*53ee8cc1Swenshuai.xi 
1818*53ee8cc1Swenshuai.xi     MS_U16 u16PortA = MOD_R2BYTE(REG_MOD_BK00_6D_L);
1819*53ee8cc1Swenshuai.xi     MS_U16 u16PortB = MOD_R2BYTE(REG_MOD_BK00_6E_L);
1820*53ee8cc1Swenshuai.xi 
1821*53ee8cc1Swenshuai.xi     if(u16PortA!=0)
1822*53ee8cc1Swenshuai.xi         pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7   = MOD_R2BYTE(REG_MOD_BK00_6D_L);
1823*53ee8cc1Swenshuai.xi     if(u16PortB!=0)
1824*53ee8cc1Swenshuai.xi         pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15  = MOD_R2BYTE(REG_MOD_BK00_6E_L);
1825*53ee8cc1Swenshuai.xi 
1826*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "==========================\n\n");
1827*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u16OutputCFG0_7       = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7);
1828*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u16OutputCFG8_15      = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15);
1829*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u16OutputCFG16_21     = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG16_21);
1830*53ee8cc1Swenshuai.xi 
1831*53ee8cc1Swenshuai.xi     if(bPanelOn)
1832*53ee8cc1Swenshuai.xi     {
1833*53ee8cc1Swenshuai.xi         // The order is PanelVCC -> delay pnlGetOnTiming1() -> VOP -> MOD
1834*53ee8cc1Swenshuai.xi         // VOP
1835*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0,REG_SC_BK10_46_L, 0x4000, HBMASK);
1836*53ee8cc1Swenshuai.xi 
1837*53ee8cc1Swenshuai.xi         // mod power on
1838*53ee8cc1Swenshuai.xi         MHal_MOD_PowerOn(pInstance
1839*53ee8cc1Swenshuai.xi                         , ENABLE
1840*53ee8cc1Swenshuai.xi                         , pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type
1841*53ee8cc1Swenshuai.xi                         , pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type
1842*53ee8cc1Swenshuai.xi                         , pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7
1843*53ee8cc1Swenshuai.xi                         , pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15
1844*53ee8cc1Swenshuai.xi                         , pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG16_21);
1845*53ee8cc1Swenshuai.xi 
1846*53ee8cc1Swenshuai.xi         // turn on LPLL
1847*53ee8cc1Swenshuai.xi         MHal_PNL_PowerDownLPLL(pInstance,FALSE);
1848*53ee8cc1Swenshuai.xi 
1849*53ee8cc1Swenshuai.xi #if ENABLE_MODE_PATCH
1850*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_33_L, 0x0039);
1851*53ee8cc1Swenshuai.xi         MsOS_DelayTask(5);
1852*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_33_L, BIT(8), BIT(8));
1853*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_33_L, BIT(9), BIT(9));
1854*53ee8cc1Swenshuai.xi #endif
1855*53ee8cc1Swenshuai.xi 
1856*53ee8cc1Swenshuai.xi         if(bCalEn)
1857*53ee8cc1Swenshuai.xi         {
1858*53ee8cc1Swenshuai.xi 
1859*53ee8cc1Swenshuai.xi             u8BackUSBPwrStatus = R2BYTEMSK(L_BK_UTMI1(0x04), BIT(7));
1860*53ee8cc1Swenshuai.xi 
1861*53ee8cc1Swenshuai.xi             W2BYTEMSK(L_BK_UTMI1(0x04), 0x00, BIT(7));
1862*53ee8cc1Swenshuai.xi 
1863*53ee8cc1Swenshuai.xi             u8Cab = msModCurrentCalibration(pInstance);
1864*53ee8cc1Swenshuai.xi 
1865*53ee8cc1Swenshuai.xi             W2BYTEMSK(L_BK_UTMI1(0x04), u8BackUSBPwrStatus, BIT(7));
1866*53ee8cc1Swenshuai.xi 
1867*53ee8cc1Swenshuai.xi         }
1868*53ee8cc1Swenshuai.xi         if(!MHal_PNL_MOD_Control_Out_Swing(pInstance,_u16PnlDefault_SwingLevel))
1869*53ee8cc1Swenshuai.xi             printf(">>Swing Level setting error!!\n");
1870*53ee8cc1Swenshuai.xi     }
1871*53ee8cc1Swenshuai.xi     else
1872*53ee8cc1Swenshuai.xi {
1873*53ee8cc1Swenshuai.xi         // The order is LPLL -> MOD -> VOP -> delay for MOD power off -> turn off VCC
1874*53ee8cc1Swenshuai.xi 
1875*53ee8cc1Swenshuai.xi         // LPLL
1876*53ee8cc1Swenshuai.xi         // MHal_PNL_PowerDownLPLL(TRUE); //Remove to keep op vsync if panel off
1877*53ee8cc1Swenshuai.xi 
1878*53ee8cc1Swenshuai.xi         MHal_MOD_PowerOn(pInstance
1879*53ee8cc1Swenshuai.xi                         , DISABLE
1880*53ee8cc1Swenshuai.xi                         , pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type
1881*53ee8cc1Swenshuai.xi                         , pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type
1882*53ee8cc1Swenshuai.xi                         , pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7
1883*53ee8cc1Swenshuai.xi                         , pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15
1884*53ee8cc1Swenshuai.xi                         , pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG16_21);
1885*53ee8cc1Swenshuai.xi         // VOP
1886*53ee8cc1Swenshuai.xi         if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_LVDS ||
1887*53ee8cc1Swenshuai.xi             pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_DAC_I ||
1888*53ee8cc1Swenshuai.xi             pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_DAC_P)//(bIsLVDS)
1889*53ee8cc1Swenshuai.xi             SC_W2BYTEMSK(0,REG_SC_BK10_46_L, 0xFF, LBMASK);
1890*53ee8cc1Swenshuai.xi         else
1891*53ee8cc1Swenshuai.xi             SC_W2BYTEMSK(0,REG_SC_BK10_46_L, 0x00, 0xFF);
1892*53ee8cc1Swenshuai.xi     }
1893*53ee8cc1Swenshuai.xi 
1894*53ee8cc1Swenshuai.xi     return E_PNL_OK;
1895*53ee8cc1Swenshuai.xi }
1896*53ee8cc1Swenshuai.xi 
MHal_PNL_SetOutputPattern(void * pInstance,MS_BOOL bEnable,MS_U16 u16Red,MS_U16 u16Green,MS_U16 u16Blue)1897*53ee8cc1Swenshuai.xi void MHal_PNL_SetOutputPattern(void *pInstance,MS_BOOL bEnable, MS_U16 u16Red , MS_U16 u16Green, MS_U16 u16Blue)
1898*53ee8cc1Swenshuai.xi {
1899*53ee8cc1Swenshuai.xi     if (bEnable)
1900*53ee8cc1Swenshuai.xi     {
1901*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_02_L, u16Red , 0x03FF);
1902*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_03_L, u16Green , 0x03FF);
1903*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_04_L, u16Blue , 0x03FF);
1904*53ee8cc1Swenshuai.xi         MsOS_DelayTask(10);
1905*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_01_L, BIT(15) , BIT(15));
1906*53ee8cc1Swenshuai.xi     }
1907*53ee8cc1Swenshuai.xi     else
1908*53ee8cc1Swenshuai.xi     {
1909*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_01_L, DISABLE , BIT(15));
1910*53ee8cc1Swenshuai.xi     }
1911*53ee8cc1Swenshuai.xi 
1912*53ee8cc1Swenshuai.xi }
1913*53ee8cc1Swenshuai.xi 
MHal_PNL_Switch_LPLL_SubBank(void * pInstance,MS_U16 u16Bank)1914*53ee8cc1Swenshuai.xi void MHal_PNL_Switch_LPLL_SubBank(void *pInstance,MS_U16 u16Bank)
1915*53ee8cc1Swenshuai.xi {
1916*53ee8cc1Swenshuai.xi     UNUSED(u16Bank);
1917*53ee8cc1Swenshuai.xi }
1918*53ee8cc1Swenshuai.xi 
MHal_PNL_Switch_TCON_SubBank(void * pInstance,MS_U16 u16Bank)1919*53ee8cc1Swenshuai.xi void MHal_PNL_Switch_TCON_SubBank(void *pInstance,MS_U16 u16Bank)
1920*53ee8cc1Swenshuai.xi {
1921*53ee8cc1Swenshuai.xi     W2BYTEMSK(L_BK_TCON(0x00), u16Bank&0xff, 0xFF);
1922*53ee8cc1Swenshuai.xi }
1923*53ee8cc1Swenshuai.xi 
MHal_PNL_Read_TCON_SubBank(void * pInstance)1924*53ee8cc1Swenshuai.xi MS_U16 MHal_PNL_Read_TCON_SubBank(void *pInstance)
1925*53ee8cc1Swenshuai.xi {
1926*53ee8cc1Swenshuai.xi     return (MS_U16)R2BYTEMSK(L_BK_TCON(0x00),0xFF);
1927*53ee8cc1Swenshuai.xi }
1928*53ee8cc1Swenshuai.xi 
MHal_PNL_IsYUVOutput(void * pInstance)1929*53ee8cc1Swenshuai.xi MS_BOOL MHal_PNL_IsYUVOutput(void *pInstance)
1930*53ee8cc1Swenshuai.xi {
1931*53ee8cc1Swenshuai.xi    return FALSE;
1932*53ee8cc1Swenshuai.xi }
1933*53ee8cc1Swenshuai.xi 
MHal_PNL_PreSetModeOn(void * pInstance,MS_BOOL bSetMode)1934*53ee8cc1Swenshuai.xi void MHal_PNL_PreSetModeOn(void *pInstance, MS_BOOL bSetMode)
1935*53ee8cc1Swenshuai.xi {
1936*53ee8cc1Swenshuai.xi }
MHal_PNL_Set_Device_Bank_Offset(void * pInstance)1937*53ee8cc1Swenshuai.xi void MHal_PNL_Set_Device_Bank_Offset(void *pInstance)
1938*53ee8cc1Swenshuai.xi {
1939*53ee8cc1Swenshuai.xi     UNUSED(pInstance);
1940*53ee8cc1Swenshuai.xi     memset(u32PNL_XCDeviceBankOffset, 0, sizeof(MS_U32)*E_PNL_DEVICE_ID_NUM);
1941*53ee8cc1Swenshuai.xi     u32PNL_XCDeviceBankOffset[E_PNL_DEVICE_ID_0] = E_HALPNL_DEVICE0_XC_BANK_OFFSET; // Set SC0 reg bank offset
1942*53ee8cc1Swenshuai.xi     u32PNL_XCDeviceBankOffset[E_PNL_DEVICE_ID_1] = E_HALPNL_DEVICE1_XC_BANK_OFFSET; // Set SC2 reg bank offset
1943*53ee8cc1Swenshuai.xi }
MHal_PNL_SetOSDSSC(void * pInstance,MS_U16 u16Fmodulation,MS_U16 u16Rdeviation,MS_BOOL bEnable)1944*53ee8cc1Swenshuai.xi MS_BOOL MHal_PNL_SetOSDSSC(void *pInstance, MS_U16 u16Fmodulation, MS_U16 u16Rdeviation, MS_BOOL bEnable)
1945*53ee8cc1Swenshuai.xi {
1946*53ee8cc1Swenshuai.xi     return TRUE;
1947*53ee8cc1Swenshuai.xi }
MHal_PNL_SetOSDSSC_En(void * pInstance,MS_BOOL bEnable)1948*53ee8cc1Swenshuai.xi void MHal_PNL_SetOSDSSC_En(void *pInstance, MS_BOOL bEnable)
1949*53ee8cc1Swenshuai.xi {
1950*53ee8cc1Swenshuai.xi }
MHal_PNL_Init(void * pInstance)1951*53ee8cc1Swenshuai.xi void MHal_PNL_Init(void *pInstance)
1952*53ee8cc1Swenshuai.xi {
1953*53ee8cc1Swenshuai.xi     // Do nothing
1954*53ee8cc1Swenshuai.xi     UNUSED(pInstance);
1955*53ee8cc1Swenshuai.xi }
1956*53ee8cc1Swenshuai.xi 
MHal_PNL_SetOutputInterlaceTiming(void * pInstance,MS_BOOL bEnable)1957*53ee8cc1Swenshuai.xi MS_BOOL MHal_PNL_SetOutputInterlaceTiming(void *pInstance, MS_BOOL bEnable)
1958*53ee8cc1Swenshuai.xi {
1959*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1960*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1961*53ee8cc1Swenshuai.xi 
1962*53ee8cc1Swenshuai.xi     if (bEnable == TRUE)
1963*53ee8cc1Swenshuai.xi     {
1964*53ee8cc1Swenshuai.xi         //interlace output vtotal modify
1965*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0, REG_SC_BK0F_2A_L, BIT(5)|BIT(8), BIT(5)|BIT(8));
1966*53ee8cc1Swenshuai.xi         // two different interlace information through channel A reserved bit
1967*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_40_L, BIT(4) | BIT(7), BIT(4) | BIT(7));
1968*53ee8cc1Swenshuai.xi         // two different interlace information through channel B reserved bit
1969*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_42_L, BIT(10)|BIT(11), BIT(10)|BIT(11));
1970*53ee8cc1Swenshuai.xi     }
1971*53ee8cc1Swenshuai.xi     else
1972*53ee8cc1Swenshuai.xi     {
1973*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(0, REG_SC_BK0F_2A_L, 0x00, BIT(5)|BIT(8));
1974*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_40_L, 0x00, BIT(4) | BIT(7));
1975*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_42_L, 0x00, BIT(10)|BIT(11));
1976*53ee8cc1Swenshuai.xi     }
1977*53ee8cc1Swenshuai.xi 
1978*53ee8cc1Swenshuai.xi     return TRUE;
1979*53ee8cc1Swenshuai.xi }
1980*53ee8cc1Swenshuai.xi 
MHal_PNL_GetOutputInterlaceTiming(void * pInstance)1981*53ee8cc1Swenshuai.xi MS_BOOL MHal_PNL_GetOutputInterlaceTiming(void *pInstance)
1982*53ee8cc1Swenshuai.xi {
1983*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1984*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1985*53ee8cc1Swenshuai.xi 
1986*53ee8cc1Swenshuai.xi     MS_BOOL bIsInterlaceOutput = FALSE;
1987*53ee8cc1Swenshuai.xi     //interlace output vtotal modify
1988*53ee8cc1Swenshuai.xi     if (SC_R2BYTEMSK(0, REG_SC_BK0F_2A_L, BIT(5)|BIT(8)) == (BIT(5)|BIT(8)))
1989*53ee8cc1Swenshuai.xi     {
1990*53ee8cc1Swenshuai.xi         if ((MOD_R2BYTEMSK(REG_MOD_BK00_40_L, BIT(4) | BIT(7)) == (BIT(4) | BIT(7)))
1991*53ee8cc1Swenshuai.xi             || (MOD_R2BYTEMSK(REG_MOD_BK00_42_L, BIT(10) | BIT(11)) == (BIT(10)|BIT(11))))
1992*53ee8cc1Swenshuai.xi         {
1993*53ee8cc1Swenshuai.xi             bIsInterlaceOutput = TRUE;
1994*53ee8cc1Swenshuai.xi         }
1995*53ee8cc1Swenshuai.xi     }
1996*53ee8cc1Swenshuai.xi     else
1997*53ee8cc1Swenshuai.xi     {
1998*53ee8cc1Swenshuai.xi         bIsInterlaceOutput = FALSE;
1999*53ee8cc1Swenshuai.xi     }
2000*53ee8cc1Swenshuai.xi     return bIsInterlaceOutput;
2001*53ee8cc1Swenshuai.xi }
2002*53ee8cc1Swenshuai.xi 
MHal_PNL_GetPanelVStart(void)2003*53ee8cc1Swenshuai.xi MS_U16 MHal_PNL_GetPanelVStart(void)
2004*53ee8cc1Swenshuai.xi {
2005*53ee8cc1Swenshuai.xi     return 0;
2006*53ee8cc1Swenshuai.xi }
2007*53ee8cc1Swenshuai.xi 
MHal_Pnl_Get_SupportMaxDclk(void * pInstance)2008*53ee8cc1Swenshuai.xi MS_U16 MHal_Pnl_Get_SupportMaxDclk(void *pInstance)
2009*53ee8cc1Swenshuai.xi {
2010*53ee8cc1Swenshuai.xi     return 0;
2011*53ee8cc1Swenshuai.xi }
2012*53ee8cc1Swenshuai.xi #endif
2013*53ee8cc1Swenshuai.xi 
2014