xref: /utopia/UTPA2-700.0.x/modules/xc/drv/pnl/drvPNL.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi //    Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi //    No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi //    modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi //    supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi //    Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi //    Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi //    obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi //    such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi //    MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi //    confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi //    third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi //    without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi //    intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi //    and in conformity with any international standard.  You agree to waive any
38*53ee8cc1Swenshuai.xi //    claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi //    incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi //    In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi //    consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi //    revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi //    You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi //    even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi //    request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi //    parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi //    services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi //    MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi //    ("Services").
52*53ee8cc1Swenshuai.xi //    You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi //    writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi //    disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi //    or otherwise:
58*53ee8cc1Swenshuai.xi //    (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi //        mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi //    (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi //        including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi //        of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi //    (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi //    of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi //    Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi //    settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi //    Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi //    with the said Rules.
72*53ee8cc1Swenshuai.xi //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi //    be English.
74*53ee8cc1Swenshuai.xi //    The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // ("MStar Confidential Information") by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi 
95*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
96*53ee8cc1Swenshuai.xi ///
97*53ee8cc1Swenshuai.xi /// file    drvPNL.c
98*53ee8cc1Swenshuai.xi /// @brief  Panel Driver Interface
99*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
100*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
101*53ee8cc1Swenshuai.xi #define _DRVPNL_C_
102*53ee8cc1Swenshuai.xi 
103*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
104*53ee8cc1Swenshuai.xi //  Include Files
105*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
106*53ee8cc1Swenshuai.xi // Common Definition
107*53ee8cc1Swenshuai.xi #include "MsCommon.h"
108*53ee8cc1Swenshuai.xi 
109*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
110*53ee8cc1Swenshuai.xi #include <linux/string.h>
111*53ee8cc1Swenshuai.xi #include <linux/delay.h>
112*53ee8cc1Swenshuai.xi #include <asm/div64.h>
113*53ee8cc1Swenshuai.xi #else
114*53ee8cc1Swenshuai.xi #include "string.h"
115*53ee8cc1Swenshuai.xi #define do_div(x,y) ((x)/=(y))
116*53ee8cc1Swenshuai.xi #endif
117*53ee8cc1Swenshuai.xi // Internal Definition
118*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
119*53ee8cc1Swenshuai.xi 
120*53ee8cc1Swenshuai.xi #ifndef _DRV_SYS_H_
121*53ee8cc1Swenshuai.xi #include "drvSYS.h"
122*53ee8cc1Swenshuai.xi #endif
123*53ee8cc1Swenshuai.xi #include "utopia.h"
124*53ee8cc1Swenshuai.xi #include "utopia_dapi.h"
125*53ee8cc1Swenshuai.xi #include "apiPNL.h"
126*53ee8cc1Swenshuai.xi #include "apiPNL_v2.h"
127*53ee8cc1Swenshuai.xi #include "drvPNL.h"
128*53ee8cc1Swenshuai.xi #include "halPNL.h"
129*53ee8cc1Swenshuai.xi #include "PNL_private.h"
130*53ee8cc1Swenshuai.xi #include "pnl_hwreg_utility2.h"
131*53ee8cc1Swenshuai.xi #include "halCHIP.h"
132*53ee8cc1Swenshuai.xi 
133*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
134*53ee8cc1Swenshuai.xi #if (KERNEL_DRIVER_PATCH ==1)
135*53ee8cc1Swenshuai.xi #if !defined(CONFIG_ARM64)
136*53ee8cc1Swenshuai.xi #include <linux/math64.h>
137*53ee8cc1Swenshuai.xi //__aeabi_uldivmod
__aeabi_uldivmod(unsigned long long n,unsigned long long d)138*53ee8cc1Swenshuai.xi unsigned long long __aeabi_uldivmod(unsigned long long n, unsigned long long d)
139*53ee8cc1Swenshuai.xi {
140*53ee8cc1Swenshuai.xi     return div64_u64(n, d);
141*53ee8cc1Swenshuai.xi }
142*53ee8cc1Swenshuai.xi 
143*53ee8cc1Swenshuai.xi //__aeabi_ldivmod
__aeabi_ldivmod(long long n,long long d)144*53ee8cc1Swenshuai.xi long long __aeabi_ldivmod(long long n, long long d)
145*53ee8cc1Swenshuai.xi {
146*53ee8cc1Swenshuai.xi     return div64_s64(n, d);
147*53ee8cc1Swenshuai.xi }
148*53ee8cc1Swenshuai.xi #endif
149*53ee8cc1Swenshuai.xi #endif
150*53ee8cc1Swenshuai.xi #endif
151*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
152*53ee8cc1Swenshuai.xi //  Driver Compiler Options
153*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
154*53ee8cc1Swenshuai.xi 
155*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
156*53ee8cc1Swenshuai.xi //  Local Defines
157*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
158*53ee8cc1Swenshuai.xi #define UNUSED(x)       (x=x)
159*53ee8cc1Swenshuai.xi #define TCON_TAB_MAX_SIZE  2048
160*53ee8cc1Swenshuai.xi 
161*53ee8cc1Swenshuai.xi #define NONPM_BASE                  (0x100000)
162*53ee8cc1Swenshuai.xi #define OD_BYTE_PER_WORD   16
163*53ee8cc1Swenshuai.xi #define PANEL_VSTART_OFFSET 8 //8    // for PANEL_DE_VSTART add offset
164*53ee8cc1Swenshuai.xi 
165*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
166*53ee8cc1Swenshuai.xi //  Local Structurs
167*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
168*53ee8cc1Swenshuai.xi static const MS_U8       _cPnlVer[] = PNL_LIB_VERSION;
169*53ee8cc1Swenshuai.xi 
170*53ee8cc1Swenshuai.xi // Internal Data
171*53ee8cc1Swenshuai.xi 
172*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
173*53ee8cc1Swenshuai.xi //  Global Variables
174*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
175*53ee8cc1Swenshuai.xi 
176*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
177*53ee8cc1Swenshuai.xi //  Local Variables
178*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
179*53ee8cc1Swenshuai.xi // Function in mdrv_xc_menuload.c
180*53ee8cc1Swenshuai.xi typedef enum
181*53ee8cc1Swenshuai.xi {
182*53ee8cc1Swenshuai.xi     E_MLOAD_UNSUPPORTED = 0,
183*53ee8cc1Swenshuai.xi     E_MLOAD_DISABLED    = 1,
184*53ee8cc1Swenshuai.xi     E_MLOAD_ENABLED     = 2,
185*53ee8cc1Swenshuai.xi }MLOAD_TYPE;
186*53ee8cc1Swenshuai.xi 
187*53ee8cc1Swenshuai.xi typedef enum
188*53ee8cc1Swenshuai.xi {
189*53ee8cc1Swenshuai.xi     E_MLG_UNSUPPORTED = 0,
190*53ee8cc1Swenshuai.xi     E_MLG_DISABLED    = 1,
191*53ee8cc1Swenshuai.xi     E_MLG_ENABLED     = 2,
192*53ee8cc1Swenshuai.xi }MLG_TYPE;
193*53ee8cc1Swenshuai.xi 
194*53ee8cc1Swenshuai.xi extern MS_BOOL MApi_XC_MLoad_WriteCmds_And_Fire(MS_U32 *pu32Addr, MS_U16 *pu16Data, MS_U16 *pu16Mask, MS_U16 u16CmdCnt);
195*53ee8cc1Swenshuai.xi extern MS_BOOL MApi_XC_MLoad_WriteCmd_And_Fire(MS_U32 u32Addr, MS_U16 u16Data, MS_U16 u16Mask);
196*53ee8cc1Swenshuai.xi extern MLOAD_TYPE MApi_XC_MLoad_GetStatus(void);
197*53ee8cc1Swenshuai.xi extern MLG_TYPE MApi_XC_MLG_GetStatus(void);
198*53ee8cc1Swenshuai.xi extern void MApi_XC_MLG_Fire(MS_U8 *pR, MS_U8 *pG, MS_U8 *pB, MS_U16 u16Count, MS_U16 *pMaxGammaValue);
199*53ee8cc1Swenshuai.xi extern MS_BOOL MDrv_XC_IsSupportPipPatchUsingSc1MainAsSc0Sub(void);
200*53ee8cc1Swenshuai.xi 
201*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
202*53ee8cc1Swenshuai.xi //  Debug Functions
203*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
204*53ee8cc1Swenshuai.xi 
205*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
206*53ee8cc1Swenshuai.xi //  Local Functions
207*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
_MDrv_PNL_Init_XC_T3D(void * pInstance,PNL_InitData * pstPanelInitData)208*53ee8cc1Swenshuai.xi static void _MDrv_PNL_Init_XC_T3D(void *pInstance, PNL_InitData *pstPanelInitData)
209*53ee8cc1Swenshuai.xi {
210*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
211*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
212*53ee8cc1Swenshuai.xi 
213*53ee8cc1Swenshuai.xi     if (pstPanelInitData->u32PNL_MISC & E_DRVPNL_MISC_SKIP_T3D_CONTROL)
214*53ee8cc1Swenshuai.xi     {
215*53ee8cc1Swenshuai.xi         //printf("\033[0;31m [%s][%d] *** SKIP T3D control ***  \033[0m\n", __FUNCTION__, __LINE__);
216*53ee8cc1Swenshuai.xi     }
217*53ee8cc1Swenshuai.xi     else
218*53ee8cc1Swenshuai.xi     {
219*53ee8cc1Swenshuai.xi         //Need move those setting to hal to avoid write Reg which is not T3D bank by any chip
220*53ee8cc1Swenshuai.xi         #if 0
221*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK63_55_L, pstPanelInitData->u16Width, 0x1FFF);//pixel width
222*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK63_66_L, pstPanelInitData->u16Height, 0x1FFF);//reg_col_height
223*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK63_51_L, pstPanelInitData->u16Width, 0x1FFF);//reg_ln_width
224*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK63_52_L, pstPanelInitData->u16Height, 0x1FFF);//reg_col_height
225*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK62_61_L, pstPanelInitData->u16Width, 0x3FFF);//reg_ln_width
226*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK62_62_L, pstPanelInitData->u16Height, 0x1FFF);//reg_col_height
227*53ee8cc1Swenshuai.xi 
228*53ee8cc1Swenshuai.xi         //per designer, should always enable t3d, since it will affect osd/video's pipeline
229*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK63_61_L, BIT(0), BIT(0));//Enable Depth Render, for osd pipe line adjustment
230*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK62_08_L, BIT(4), BIT(4));//mtv bypass mode
231*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK63_57_L,(BIT(0)|BIT(1)),(BIT(0)|BIT(1)));//T3D fix subde enable, fix for T3D/PIP conflict issue (bit 0)     Bug Fix miu eco (bit 1)
232*53ee8cc1Swenshuai.xi         #endif
233*53ee8cc1Swenshuai.xi         MHal_PNL_Set_T3D_Setting(pInstance);
234*53ee8cc1Swenshuai.xi     }
235*53ee8cc1Swenshuai.xi }
236*53ee8cc1Swenshuai.xi 
_MDrv_PNL_Init_XC_VOP(void * pInstance,PNL_InitData * pstPanelInitData)237*53ee8cc1Swenshuai.xi static void _MDrv_PNL_Init_XC_VOP(void *pInstance, PNL_InitData *pstPanelInitData)
238*53ee8cc1Swenshuai.xi {
239*53ee8cc1Swenshuai.xi     //Note: H/V Total, H/V DE End, H/V Syncwidth all need minus 1 when set to register
240*53ee8cc1Swenshuai.xi     MS_U16 u16DE_HEND = pstPanelInitData->u16HStart + pstPanelInitData->u16Width - 1;
241*53ee8cc1Swenshuai.xi     MS_U16 u16DE_HStart = pstPanelInitData->u16HStart;
242*53ee8cc1Swenshuai.xi     MS_U16 u16DE_VEND = pstPanelInitData->u16VStart + pstPanelInitData->u16Height - 1;
243*53ee8cc1Swenshuai.xi     MS_U16 u16DE_VStart = pstPanelInitData->u16VStart;
244*53ee8cc1Swenshuai.xi     MS_U16 u16VsyncStart = 0;
245*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
246*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
247*53ee8cc1Swenshuai.xi 
248*53ee8cc1Swenshuai.xi     if (MDrv_XC_IsSupportPipPatchUsingSc1MainAsSc0Sub())
249*53ee8cc1Swenshuai.xi     {
250*53ee8cc1Swenshuai.xi         u16VsyncStart = pstPanelInitData->u16VTotal - pstPanelInitData->u16VSyncStart +PANEL_VSTART_OFFSET;// vsync start = Vtt - (VSyncWidth + BackPorch)
251*53ee8cc1Swenshuai.xi     }
252*53ee8cc1Swenshuai.xi     else
253*53ee8cc1Swenshuai.xi     {
254*53ee8cc1Swenshuai.xi         u16VsyncStart = pstPanelInitData->u16VTotal - pstPanelInitData->u16VSyncStart ;// vsync start = Vtt - (VSyncWidth + BackPorch)
255*53ee8cc1Swenshuai.xi     }
256*53ee8cc1Swenshuai.xi 
257*53ee8cc1Swenshuai.xi     // Htotal/Vtotal
258*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_0C_L, (pstPanelInitData->u16HTotal - 1), VOP_HTT_MASK);         // output htotal
259*53ee8cc1Swenshuai.xi #if defined(CONFIG_MBOOT) || !defined(PATCH_HW_VTT_LIMITATION)
260*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_0D_L, (pstPanelInitData->u16VTotal - 1), VOP_VTT_MASK);         // output vtotal
261*53ee8cc1Swenshuai.xi #endif
262*53ee8cc1Swenshuai.xi #if defined(PATCH_HW_VTT_LIMITATION)
263*53ee8cc1Swenshuai.xi     if(R1BYTEMSK(REG_CHIP_REVISION,0xFF) < HW_VTT_LIMITATION_CHIPREV)
264*53ee8cc1Swenshuai.xi     {
265*53ee8cc1Swenshuai.xi         MOD_W2BYTEMSK(REG_MOD_BK00_65_L,pstPanelInitData->u16VTotal,0x1FFF);
266*53ee8cc1Swenshuai.xi         MHal_PNL_SetVopVttByBK68(pPNLInstancePrivate->u32DeviceID, (pstPanelInitData->u16VTotal - 1)&VOP_VTT_MASK);
267*53ee8cc1Swenshuai.xi     }
268*53ee8cc1Swenshuai.xi #endif
269*53ee8cc1Swenshuai.xi     // DE H/V start/size
270*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_04_L, u16DE_HStart, VOP_DE_HSTART_MASK);                                       // DE H start
271*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_05_L, u16DE_HEND  , VOP_DE_HEND_MASK);  // DE H end
272*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_06_L, u16DE_VStart, VOP_DE_VSTART_MASK);                                       // DE V start
273*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_07_L, u16DE_VEND  , VOP_DE_VEND_MASK);  // DE V end
274*53ee8cc1Swenshuai.xi     //If support sc1, init sub vop
275*53ee8cc1Swenshuai.xi     if (MDrv_XC_IsSupportPipPatchUsingSc1MainAsSc0Sub())
276*53ee8cc1Swenshuai.xi     {
277*53ee8cc1Swenshuai.xi         //follow HW_DESIGN_4K2K_VER = 6 rule
278*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(1, REG_SC_BK10_0C_L, (pstPanelInitData->u16HTotal/2 - 1), VOP_HTT_MASK);
279*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(1, REG_SC_BK10_0D_L, VOP_VTT_MASK, VOP_VTT_MASK);         // output vtotal
280*53ee8cc1Swenshuai.xi 
281*53ee8cc1Swenshuai.xi         // DE H/V start/size
282*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(1, REG_SC_BK10_04_L, u16DE_HStart/2, VOP_DE_HSTART_MASK);                                       // DE H start
283*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(1, REG_SC_BK10_05_L, u16DE_HStart + pstPanelInitData->u16Width/2 - 1 , VOP_DE_HEND_MASK);  // DE H end
284*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(1, REG_SC_BK10_06_L, u16DE_VStart, VOP_DE_VSTART_MASK);                                       // DE V start
285*53ee8cc1Swenshuai.xi         //FIX ME: need review
286*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(1, REG_SC_BK10_07_L, u16DE_VStart+pstPanelInitData->u16Height-1, VOP_DE_VEND_MASK);  // DE V end
287*53ee8cc1Swenshuai.xi     }
288*53ee8cc1Swenshuai.xi     // Display H/V start/size
289*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_08_L, u16DE_HStart , VOP_DISPLAY_HSTART_MASK);                                               // Display H start
290*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_09_L, u16DE_HEND   , VOP_DISPLAY_HEND_MASK);  // Display H end
291*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_0A_L, u16DE_VStart , VOP_DISPLAY_VSTART_MASK);                                               // Display V start
292*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_0B_L, u16DE_VEND   , VOP_DISPLAY_VEND_MASK);  // Display V end
293*53ee8cc1Swenshuai.xi 
294*53ee8cc1Swenshuai.xi     // H/V sync start/width
295*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_01_L, (pstPanelInitData->u8HSyncWidth-1), LBMASK);                    // hsync width
296*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_02_L, ((u16VsyncStart & 0x7FF) | ((u16VsyncStart & 0x800) << 1)), 0x17FF);     // vsync start = Vtt - (VSyncWidth + BackPorch)
297*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_03_L, (u16VsyncStart + pstPanelInitData->u8VSyncWidth - 1), VOP_VSYNC_END_MASK);    // vsync end = Vsync start + Vsync Width
298*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_10_L, (pstPanelInitData->bManuelVSyncCtrl << 15), BIT(15));                                  // manual vsync control
299*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_10_L, BIT(14), BIT(14));       //default set to mode1                                                                       // disable auto_htotal
300*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_23_L, BIT(7), BIT(7));
301*53ee8cc1Swenshuai.xi 
302*53ee8cc1Swenshuai.xi     // output control
303*53ee8cc1Swenshuai.xi     SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_21_L, pstPanelInitData->u16OCTRL);
304*53ee8cc1Swenshuai.xi 
305*53ee8cc1Swenshuai.xi     if (pstPanelInitData->eLPLL_Type == E_PNL_TYPE_LVDS ||
306*53ee8cc1Swenshuai.xi         pstPanelInitData->eLPLL_Type == E_PNL_TYPE_DAC_I ||
307*53ee8cc1Swenshuai.xi         pstPanelInitData->eLPLL_Type == E_PNL_TYPE_DAC_P)
308*53ee8cc1Swenshuai.xi     {
309*53ee8cc1Swenshuai.xi         // LVDS
310*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_22_L, 0x11, LBMASK);  //   0x2f44 : Enable clock of internal control - LVDS or TTL Output
311*53ee8cc1Swenshuai.xi     }
312*53ee8cc1Swenshuai.xi     else
313*53ee8cc1Swenshuai.xi     {
314*53ee8cc1Swenshuai.xi         // RSDS
315*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_22_L, 0x00, LBMASK);
316*53ee8cc1Swenshuai.xi     }
317*53ee8cc1Swenshuai.xi 
318*53ee8cc1Swenshuai.xi     SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_46_L, pstPanelInitData->u16OSTRL);
319*53ee8cc1Swenshuai.xi 
320*53ee8cc1Swenshuai.xi     // output driving current
321*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_47_L, pstPanelInitData->u16ODRV, LBMASK);
322*53ee8cc1Swenshuai.xi }
323*53ee8cc1Swenshuai.xi 
MDrv_PNL_GetDefaultVfreq(void * pInstance,MS_U16 u16Vfreq)324*53ee8cc1Swenshuai.xi MS_U16 MDrv_PNL_GetDefaultVfreq(void *pInstance, MS_U16 u16Vfreq)
325*53ee8cc1Swenshuai.xi {
326*53ee8cc1Swenshuai.xi     MS_U16 u16DefaultVFreq = 0;
327*53ee8cc1Swenshuai.xi 
328*53ee8cc1Swenshuai.xi     UNUSED(pInstance);
329*53ee8cc1Swenshuai.xi 
330*53ee8cc1Swenshuai.xi     if(u16Vfreq > 2100)
331*53ee8cc1Swenshuai.xi     {
332*53ee8cc1Swenshuai.xi         u16DefaultVFreq = 2400;
333*53ee8cc1Swenshuai.xi     }
334*53ee8cc1Swenshuai.xi     else if(u16Vfreq > 1900)
335*53ee8cc1Swenshuai.xi     {
336*53ee8cc1Swenshuai.xi         u16DefaultVFreq = 2000;
337*53ee8cc1Swenshuai.xi     }
338*53ee8cc1Swenshuai.xi     else if(u16Vfreq > 1100)
339*53ee8cc1Swenshuai.xi     {
340*53ee8cc1Swenshuai.xi         u16DefaultVFreq = 1200;
341*53ee8cc1Swenshuai.xi     }
342*53ee8cc1Swenshuai.xi     else if(u16Vfreq > 900)
343*53ee8cc1Swenshuai.xi     {
344*53ee8cc1Swenshuai.xi         u16DefaultVFreq = 1000;
345*53ee8cc1Swenshuai.xi     }
346*53ee8cc1Swenshuai.xi     else if(u16Vfreq > 550)
347*53ee8cc1Swenshuai.xi     {
348*53ee8cc1Swenshuai.xi         u16DefaultVFreq = 600;
349*53ee8cc1Swenshuai.xi     }
350*53ee8cc1Swenshuai.xi     else if(u16Vfreq > 350)
351*53ee8cc1Swenshuai.xi     {
352*53ee8cc1Swenshuai.xi         u16DefaultVFreq = 500;
353*53ee8cc1Swenshuai.xi     }
354*53ee8cc1Swenshuai.xi     else if(u16Vfreq > 250)
355*53ee8cc1Swenshuai.xi     {
356*53ee8cc1Swenshuai.xi         u16DefaultVFreq = 300;
357*53ee8cc1Swenshuai.xi     }
358*53ee8cc1Swenshuai.xi     else if(u16Vfreq > 245)
359*53ee8cc1Swenshuai.xi     {
360*53ee8cc1Swenshuai.xi         u16DefaultVFreq = 250;
361*53ee8cc1Swenshuai.xi     }
362*53ee8cc1Swenshuai.xi     else if(u16Vfreq > 235)
363*53ee8cc1Swenshuai.xi     {
364*53ee8cc1Swenshuai.xi         u16DefaultVFreq = 240;
365*53ee8cc1Swenshuai.xi     }
366*53ee8cc1Swenshuai.xi     else
367*53ee8cc1Swenshuai.xi     {
368*53ee8cc1Swenshuai.xi         u16DefaultVFreq = 150;
369*53ee8cc1Swenshuai.xi     }
370*53ee8cc1Swenshuai.xi 
371*53ee8cc1Swenshuai.xi     return u16DefaultVFreq;
372*53ee8cc1Swenshuai.xi }
373*53ee8cc1Swenshuai.xi 
_MDrv_PNL_Init_LPLL(void * pInstance,PNL_InitData * pstPanelInitData)374*53ee8cc1Swenshuai.xi static void _MDrv_PNL_Init_LPLL(void *pInstance, PNL_InitData *pstPanelInitData)
375*53ee8cc1Swenshuai.xi {
376*53ee8cc1Swenshuai.xi     MS_U64 ldHz = 1;
377*53ee8cc1Swenshuai.xi     MS_U16 u16DefaultVFreq = 0;
378*53ee8cc1Swenshuai.xi 
379*53ee8cc1Swenshuai.xi     MS_U16 u16HTotal = pstPanelInitData->u16HTotal;
380*53ee8cc1Swenshuai.xi     MS_U16 u16VTotal = pstPanelInitData->u16VTotal;
381*53ee8cc1Swenshuai.xi 
382*53ee8cc1Swenshuai.xi     u16DefaultVFreq = MDrv_PNL_GetDefaultVfreq(pInstance, pstPanelInitData->u16DefaultVFreq);
383*53ee8cc1Swenshuai.xi 
384*53ee8cc1Swenshuai.xi     if(((pstPanelInitData->u32PNL_MISC == E_DRVPNL_MISC_MFC_ENABLE) || (pstPanelInitData->u32PNL_MISC == E_DRVPNL_MISC_MFC_ENABLE_60HZ))
385*53ee8cc1Swenshuai.xi         &&(pstPanelInitData->u16Width == 1280)
386*53ee8cc1Swenshuai.xi         &&(pstPanelInitData->u16Height == 720))
387*53ee8cc1Swenshuai.xi     {
388*53ee8cc1Swenshuai.xi         u16HTotal = 2200;
389*53ee8cc1Swenshuai.xi         u16VTotal = 1130;
390*53ee8cc1Swenshuai.xi     }
391*53ee8cc1Swenshuai.xi 
392*53ee8cc1Swenshuai.xi     printf("[%s][%d]pstPanelInitData->u16Width=%u, pstPanelInitData->u16Height=%u\n",
393*53ee8cc1Swenshuai.xi         __FUNCTION__,__LINE__,pstPanelInitData->u16Width, pstPanelInitData->u16Height);
394*53ee8cc1Swenshuai.xi     printf("[%s][%d]u16HTotal=%u,u16VTotal=%u,pstPanelInitData->u16HTotal=%u,pstPanelInitData->u16VTotal=%u, u16DefaultVFreq=%u\n",
395*53ee8cc1Swenshuai.xi         __FUNCTION__,__LINE__,u16HTotal,u16VTotal,pstPanelInitData->u16HTotal,pstPanelInitData->u16VTotal,u16DefaultVFreq);
396*53ee8cc1Swenshuai.xi 
397*53ee8cc1Swenshuai.xi     ldHz = (MS_U64) (((MS_U64)u16HTotal) * (MS_U64)u16VTotal * (MS_U64)u16DefaultVFreq);
398*53ee8cc1Swenshuai.xi 
399*53ee8cc1Swenshuai.xi     MHal_PNL_Init_LPLL(pInstance, pstPanelInitData->eLPLL_Type,pstPanelInitData->eLPLL_Mode,ldHz);
400*53ee8cc1Swenshuai.xi 
401*53ee8cc1Swenshuai.xi     if ((pstPanelInitData->u32PNL_MISC == E_DRVPNL_MISC_MFC_ENABLE) ||
402*53ee8cc1Swenshuai.xi         (pstPanelInitData->u32PNL_MISC == E_DRVPNL_MISC_MFC_ENABLE_60HZ) ||
403*53ee8cc1Swenshuai.xi         (E_PNL_LPLL_VBY1_10BIT_8LANE == pstPanelInitData->eLPLL_Type)) // Napoli VB1_8lane default use FRC, so need 2 LPLL
404*53ee8cc1Swenshuai.xi     {
405*53ee8cc1Swenshuai.xi         MHal_PNL_FRC_lpll_src_sel(pInstance, 0);
406*53ee8cc1Swenshuai.xi     }
407*53ee8cc1Swenshuai.xi     else
408*53ee8cc1Swenshuai.xi     {
409*53ee8cc1Swenshuai.xi         MHal_PNL_FRC_lpll_src_sel(pInstance, 1);
410*53ee8cc1Swenshuai.xi     }
411*53ee8cc1Swenshuai.xi 
412*53ee8cc1Swenshuai.xi }
413*53ee8cc1Swenshuai.xi 
_MDrv_PNL_DClkFactor(void * pInstance,PNL_MODE eLPLL_Mode,PNL_TYPE eLPLL_Type,MS_U64 ldHz)414*53ee8cc1Swenshuai.xi static MS_U64 _MDrv_PNL_DClkFactor(void *pInstance, PNL_MODE eLPLL_Mode, PNL_TYPE eLPLL_Type, MS_U64 ldHz)
415*53ee8cc1Swenshuai.xi {
416*53ee8cc1Swenshuai.xi     return (((MS_U64)LVDS_MPLL_CLOCK_MHZ * 524288 * MHal_PNL_Get_LPLL_LoopGain(pInstance, eLPLL_Mode, eLPLL_Type, ldHz)));  //216*524288*8=0x36000000
417*53ee8cc1Swenshuai.xi }
418*53ee8cc1Swenshuai.xi 
_MDrv_PNL_Init_Output_Dclk(void * pInstance,PNL_InitData * pstPanelInitData)419*53ee8cc1Swenshuai.xi static void _MDrv_PNL_Init_Output_Dclk(void *pInstance, PNL_InitData *pstPanelInitData)
420*53ee8cc1Swenshuai.xi {
421*53ee8cc1Swenshuai.xi     MS_U32 u32OutputDclk;
422*53ee8cc1Swenshuai.xi     MS_U16 u16DefaultVFreq = 0;
423*53ee8cc1Swenshuai.xi     MS_U64 ldHz = 1;
424*53ee8cc1Swenshuai.xi 
425*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
426*53ee8cc1Swenshuai.xi     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
427*53ee8cc1Swenshuai.xi 
428*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
429*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
430*53ee8cc1Swenshuai.xi 
431*53ee8cc1Swenshuai.xi     MS_U16 u16HTotal = pstPanelInitData->u16HTotal;
432*53ee8cc1Swenshuai.xi     MS_U16 u16VTotal = pstPanelInitData->u16VTotal;
433*53ee8cc1Swenshuai.xi 
434*53ee8cc1Swenshuai.xi     u16DefaultVFreq = MDrv_PNL_GetDefaultVfreq(pInstance, pstPanelInitData->u16DefaultVFreq);
435*53ee8cc1Swenshuai.xi 
436*53ee8cc1Swenshuai.xi     /// for A5/Agate FRC Active  FPP 720P
437*53ee8cc1Swenshuai.xi     if(((pstPanelInitData->u32PNL_MISC == E_DRVPNL_MISC_MFC_ENABLE) || (pstPanelInitData->u32PNL_MISC == E_DRVPNL_MISC_MFC_ENABLE_60HZ))
438*53ee8cc1Swenshuai.xi         &&(pstPanelInitData->u16Width == 1280)
439*53ee8cc1Swenshuai.xi         &&(pstPanelInitData->u16Height== 720))
440*53ee8cc1Swenshuai.xi     {
441*53ee8cc1Swenshuai.xi         u16HTotal = 2200;
442*53ee8cc1Swenshuai.xi         u16VTotal = 1130;
443*53ee8cc1Swenshuai.xi     }
444*53ee8cc1Swenshuai.xi     printf("[%s][%d]pstPanelInitData->u16Width=%u, pstPanelInitData->u16Height=%u\n",
445*53ee8cc1Swenshuai.xi         __FUNCTION__,__LINE__,pstPanelInitData->u16Width, pstPanelInitData->u16Height);
446*53ee8cc1Swenshuai.xi     printf("[%s][%d]u16HTotal=%u,u16VTotal=%u,pstPanelInitData->u16HTotal=%u,pstPanelInitData->u16VTotal=%u, u16DefaultVFreq=%u\n",
447*53ee8cc1Swenshuai.xi         __FUNCTION__,__LINE__,u16HTotal,u16VTotal,pstPanelInitData->u16HTotal,pstPanelInitData->u16VTotal,u16DefaultVFreq);
448*53ee8cc1Swenshuai.xi 
449*53ee8cc1Swenshuai.xi     ldHz = (MS_U64) (((MS_U64)u16HTotal) * u16VTotal * u16DefaultVFreq);
450*53ee8cc1Swenshuai.xi 
451*53ee8cc1Swenshuai.xi     u32OutputDclk = MDrv_PNL_CalculateLPLLSETbyDClk(pInstance, (MS_U64)ldHz, FALSE);
452*53ee8cc1Swenshuai.xi 
453*53ee8cc1Swenshuai.xi     //printf("_MDrv_PNL_Init_Output_Dclk u32div = %lu, u32LpllSet = %lx\n", (MS_U32)u32div, (MS_U32)ldPllSet);
454*53ee8cc1Swenshuai.xi 
455*53ee8cc1Swenshuai.xi     MHal_PNL_Switch_LPLL_SubBank(pInstance, 0x00);
456*53ee8cc1Swenshuai.xi     W2BYTEMSK(L_BK_LPLL(0x0C), FALSE, BIT(3));
457*53ee8cc1Swenshuai.xi     W4BYTE(L_BK_LPLL(0x0F), u32OutputDclk);
458*53ee8cc1Swenshuai.xi 
459*53ee8cc1Swenshuai.xi     if((pPNLResourcePrivate->stapiPNL._stPnlStatus.bPanel_Initialized == 0)&&
460*53ee8cc1Swenshuai.xi        (pPNLResourcePrivate->stapiPNL._bSkipTimingChange == FALSE))
461*53ee8cc1Swenshuai.xi     {
462*53ee8cc1Swenshuai.xi         MHal_PNL_ChannelFIFOPointerADjust(pInstance);
463*53ee8cc1Swenshuai.xi     }
464*53ee8cc1Swenshuai.xi #if SUPPORT_FRC
465*53ee8cc1Swenshuai.xi     ldHz = (MS_U64) (((MS_U64)pstPanelInitData->u16HTotal) * pstPanelInitData->u16VTotal * u16DefaultVFreq);
466*53ee8cc1Swenshuai.xi 
467*53ee8cc1Swenshuai.xi     Mhal_PNL_Flock_LPLLSet(pInstance, ldHz);
468*53ee8cc1Swenshuai.xi #endif
469*53ee8cc1Swenshuai.xi }
470*53ee8cc1Swenshuai.xi 
471*53ee8cc1Swenshuai.xi 
472*53ee8cc1Swenshuai.xi /*static void _MDrv_PNL_TCON_GetTabSize(MS_U8 *pTconTab, MS_U16 u16tabtype, MS_U32 *pu32TconTabsize)
473*53ee8cc1Swenshuai.xi {
474*53ee8cc1Swenshuai.xi     MS_U8 u8Colslen = 0;
475*53ee8cc1Swenshuai.xi     MS_U16 u16timeout = 0x3FFF;
476*53ee8cc1Swenshuai.xi     MS_U16 u16Addr;
477*53ee8cc1Swenshuai.xi     if (pTconTab == NULL)
478*53ee8cc1Swenshuai.xi     {
479*53ee8cc1Swenshuai.xi         PNL_ASSERT(0, "[%s] TCONTable error \n.", __FUNCTION__);
480*53ee8cc1Swenshuai.xi         return;
481*53ee8cc1Swenshuai.xi     }
482*53ee8cc1Swenshuai.xi     switch(u16tabtype )
483*53ee8cc1Swenshuai.xi     {
484*53ee8cc1Swenshuai.xi     case TCON_TABTYPE_GENERAL:
485*53ee8cc1Swenshuai.xi     case TCON_TABTYPE_GPIO:
486*53ee8cc1Swenshuai.xi     case TCON_TABTYPE_SCALER:
487*53ee8cc1Swenshuai.xi     case TCON_TABTYPE_MOD:
488*53ee8cc1Swenshuai.xi     case TCON_TABTYPE_GAMMA:
489*53ee8cc1Swenshuai.xi         u8Colslen = 4;
490*53ee8cc1Swenshuai.xi         break;
491*53ee8cc1Swenshuai.xi     case TCON_TABTYPE_POWER_SEQUENCE_ON:
492*53ee8cc1Swenshuai.xi     case TCON_TABTYPE_POWER_SEQUENCE_OFF:
493*53ee8cc1Swenshuai.xi         u8Colslen = 7;
494*53ee8cc1Swenshuai.xi         break;
495*53ee8cc1Swenshuai.xi     default:
496*53ee8cc1Swenshuai.xi         PNL_ASSERT(0, "[%s] GetTable Size :unknown Tab Size \n.", __FUNCTION__);
497*53ee8cc1Swenshuai.xi         return ;
498*53ee8cc1Swenshuai.xi     }
499*53ee8cc1Swenshuai.xi     while (--u16timeout)
500*53ee8cc1Swenshuai.xi     {
501*53ee8cc1Swenshuai.xi         u16Addr = (pTconTab[*pu32TconTabsize]<<8) + pTconTab[(*pu32TconTabsize +1)];
502*53ee8cc1Swenshuai.xi         if (u16Addr == REG_TABLE_END) // check end of table
503*53ee8cc1Swenshuai.xi         {
504*53ee8cc1Swenshuai.xi             *pu32TconTabsize = *pu32TconTabsize + 4;
505*53ee8cc1Swenshuai.xi             break;
506*53ee8cc1Swenshuai.xi         }
507*53ee8cc1Swenshuai.xi         *pu32TconTabsize = *pu32TconTabsize + u8Colslen;
508*53ee8cc1Swenshuai.xi     }
509*53ee8cc1Swenshuai.xi     if (u16timeout==0)
510*53ee8cc1Swenshuai.xi     {
511*53ee8cc1Swenshuai.xi         PNL_ASSERT(0, "[%s] fails: timeout \n.", __FUNCTION__);
512*53ee8cc1Swenshuai.xi     }
513*53ee8cc1Swenshuai.xi 
514*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "<<*pu32TconTabsize= %ld>>\n", *pu32TconTabsize);
515*53ee8cc1Swenshuai.xi 
516*53ee8cc1Swenshuai.xi     if(*pu32TconTabsize > TCON_TAB_MAX_SIZE)
517*53ee8cc1Swenshuai.xi     {
518*53ee8cc1Swenshuai.xi         PNL_ASSERT(0, "[%s] Tab size too large than TCON_TAB_MAX_SIZE = %d \n.", __FUNCTION__, TCON_TAB_MAX_SIZE);
519*53ee8cc1Swenshuai.xi     }
520*53ee8cc1Swenshuai.xi }*/
521*53ee8cc1Swenshuai.xi 
522*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
523*53ee8cc1Swenshuai.xi //  Global Functions
524*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_PNL_GetLibVer(void)525*53ee8cc1Swenshuai.xi const MS_U8 * MDrv_PNL_GetLibVer(void)              ///< Get version
526*53ee8cc1Swenshuai.xi {
527*53ee8cc1Swenshuai.xi     return _cPnlVer;
528*53ee8cc1Swenshuai.xi }
529*53ee8cc1Swenshuai.xi 
MDrv_PNL_GetInfo(void * pInstance)530*53ee8cc1Swenshuai.xi ST_PNL_DRV_INFO MDrv_PNL_GetInfo(void *pInstance)          ///< Get info from driver
531*53ee8cc1Swenshuai.xi {
532*53ee8cc1Swenshuai.xi     ST_PNL_DRV_INFO stPNLInfo = {GAMMA_TYPE, GAMMA_MAPPING};
533*53ee8cc1Swenshuai.xi 
534*53ee8cc1Swenshuai.xi     UNUSED(pInstance);
535*53ee8cc1Swenshuai.xi 
536*53ee8cc1Swenshuai.xi     return stPNLInfo;
537*53ee8cc1Swenshuai.xi }
538*53ee8cc1Swenshuai.xi 
MDrv_PNL_Control_Out_Swing(void * pInstance,MS_U16 u16Swing_Level)539*53ee8cc1Swenshuai.xi MS_BOOL MDrv_PNL_Control_Out_Swing(void *pInstance, MS_U16 u16Swing_Level)
540*53ee8cc1Swenshuai.xi {
541*53ee8cc1Swenshuai.xi     return (MS_BOOL)MHal_PNL_MOD_Control_Out_Swing(pInstance, u16Swing_Level);
542*53ee8cc1Swenshuai.xi }
543*53ee8cc1Swenshuai.xi 
MDrv_PNL_PreInit(void * pInstance,PNL_OUTPUT_MODE eParam)544*53ee8cc1Swenshuai.xi PNL_Result MDrv_PNL_PreInit(void *pInstance, PNL_OUTPUT_MODE eParam)
545*53ee8cc1Swenshuai.xi {
546*53ee8cc1Swenshuai.xi     if ( eParam == E_PNL_OUTPUT_MAX )
547*53ee8cc1Swenshuai.xi         return E_PNL_FAIL;
548*53ee8cc1Swenshuai.xi 
549*53ee8cc1Swenshuai.xi     MHal_PNL_PreInit(pInstance, eParam);
550*53ee8cc1Swenshuai.xi 
551*53ee8cc1Swenshuai.xi     return E_PNL_OK;
552*53ee8cc1Swenshuai.xi }
553*53ee8cc1Swenshuai.xi 
554*53ee8cc1Swenshuai.xi // Output Dclk
MDrv_PNL_CalculateLPLLSETbyDClk(void * pInstance,MS_U64 u64LdHz,MS_BOOL bHighAccurate)555*53ee8cc1Swenshuai.xi MS_U32 MDrv_PNL_CalculateLPLLSETbyDClk(void *pInstance, MS_U64 u64LdHz, MS_BOOL bHighAccurate)
556*53ee8cc1Swenshuai.xi {
557*53ee8cc1Swenshuai.xi 
558*53ee8cc1Swenshuai.xi     MS_U64 u64LdPllSet = 0;
559*53ee8cc1Swenshuai.xi     MS_U32 u32Div = 0;
560*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
561*53ee8cc1Swenshuai.xi     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
562*53ee8cc1Swenshuai.xi 
563*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
564*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
565*53ee8cc1Swenshuai.xi 
566*53ee8cc1Swenshuai.xi     // loop div and loop gain use default parameters to avoid dclk floating out of range and getting wrong value
567*53ee8cc1Swenshuai.xi     MS_U64 u64DefaultLdHz = (MS_U64) (((MS_U64)pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16HTotal)
568*53ee8cc1Swenshuai.xi                                        * pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16VTotal
569*53ee8cc1Swenshuai.xi                                        * pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16DefaultVFreq);
570*53ee8cc1Swenshuai.xi #if defined (__aarch64__)
571*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "CalculateLPLLSETbyDClk u32KHz = %lu, u64DefaultLdHz = %lu\n", u64LdHz, u64DefaultLdHz);
572*53ee8cc1Swenshuai.xi #else
573*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "CalculateLPLLSETbyDClk u32KHz = %llu, u64DefaultLdHz = %llu\n", u64LdHz, u64DefaultLdHz);
574*53ee8cc1Swenshuai.xi #endif
575*53ee8cc1Swenshuai.xi 
576*53ee8cc1Swenshuai.xi     #if (HW_DESIGN_HDMITX_VER == 2)
577*53ee8cc1Swenshuai.xi     if ((E_PNL_TYPE_DAC_P == pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type) || (E_PNL_TYPE_DAC_I == pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type))
578*53ee8cc1Swenshuai.xi     {
579*53ee8cc1Swenshuai.xi         // For Maxim HDMITx different color depth, need to use u64LdHz to parse loop_div
580*53ee8cc1Swenshuai.xi         if (bHighAccurate)
581*53ee8cc1Swenshuai.xi             u64DefaultLdHz = u64LdHz/100;
582*53ee8cc1Swenshuai.xi         else
583*53ee8cc1Swenshuai.xi             u64DefaultLdHz = u64LdHz;
584*53ee8cc1Swenshuai.xi     }
585*53ee8cc1Swenshuai.xi     #endif
586*53ee8cc1Swenshuai.xi 
587*53ee8cc1Swenshuai.xi #if (PNL_SUPPORT_2P_MODE == TRUE)
588*53ee8cc1Swenshuai.xi     /// Mini LVDS, EPI34/28, LVDS_1CH, Vx1_1P are 1P structure
589*53ee8cc1Swenshuai.xi     if(!((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_TTL)||
590*53ee8cc1Swenshuai.xi         ((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_LVDS)&&(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Mode==E_PNL_MODE_SINGLE))||
591*53ee8cc1Swenshuai.xi         ((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_HS_LVDS)&&(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Mode==E_PNL_MODE_SINGLE))||
592*53ee8cc1Swenshuai.xi         (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_1LANE)||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_LPLL_VBY1_8BIT_1LANE)||
593*53ee8cc1Swenshuai.xi         ((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type >= E_PNL_LPLL_MINILVDS_2CH_3P_8BIT)&&(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type <= E_PNL_LPLL_MINILVDS_1CH_6P_6BIT))||
594*53ee8cc1Swenshuai.xi         ((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type >= E_PNL_LPLL_EPI34_2P)&&(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type <= E_PNL_LPLL_EPI28_4P))))
595*53ee8cc1Swenshuai.xi     {
596*53ee8cc1Swenshuai.xi         u64LdHz = u64LdHz/2;
597*53ee8cc1Swenshuai.xi     }
598*53ee8cc1Swenshuai.xi #endif
599*53ee8cc1Swenshuai.xi 
600*53ee8cc1Swenshuai.xi     MS_U32 u32Factor = 10;
601*53ee8cc1Swenshuai.xi 
602*53ee8cc1Swenshuai.xi     if (bHighAccurate)
603*53ee8cc1Swenshuai.xi     {
604*53ee8cc1Swenshuai.xi         u32Factor = 1000;
605*53ee8cc1Swenshuai.xi     }
606*53ee8cc1Swenshuai.xi 
607*53ee8cc1Swenshuai.xi     switch(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type)
608*53ee8cc1Swenshuai.xi     {
609*53ee8cc1Swenshuai.xi 
610*53ee8cc1Swenshuai.xi         case E_PNL_TYPE_MINILVDS:
611*53ee8cc1Swenshuai.xi         case E_PNL_TYPE_ANALOG_MINILVDS:
612*53ee8cc1Swenshuai.xi         case E_PNL_TYPE_DIGITAL_MINILVDS:
613*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_5P_2L:
614*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_4P_2L:
615*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_3P_2L:
616*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_6P_1L:
617*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_5P_1L:
618*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_4P_1L:
619*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_3P_1L:
620*53ee8cc1Swenshuai.xi 
621*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_1CH_3P_6BIT:
622*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_1CH_4P_6BIT:
623*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_1CH_5P_6BIT:
624*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_1CH_6P_6BIT:
625*53ee8cc1Swenshuai.xi 
626*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_2CH_3P_6BIT:
627*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_2CH_4P_6BIT:
628*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_2CH_5P_6BIT:
629*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_2CH_6P_6BIT:
630*53ee8cc1Swenshuai.xi 
631*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_1CH_3P_8BIT:
632*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_1CH_4P_8BIT:
633*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_1CH_5P_8BIT:
634*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_1CH_6P_8BIT:
635*53ee8cc1Swenshuai.xi 
636*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_2CH_3P_8BIT:
637*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_2CH_4P_8BIT:
638*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_2CH_5P_8BIT:
639*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_MINILVDS_2CH_6P_8BIT:
640*53ee8cc1Swenshuai.xi 
641*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_EPI34_8P:
642*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_EPI28_8P:
643*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_EPI34_6P:
644*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_EPI28_6P:
645*53ee8cc1Swenshuai.xi 
646*53ee8cc1Swenshuai.xi         case E_PNL_TYPE_TTL_TCON:
647*53ee8cc1Swenshuai.xi         case E_PNL_TYPE_TTL:
648*53ee8cc1Swenshuai.xi         case E_PNL_TYPE_LVDS:
649*53ee8cc1Swenshuai.xi         case E_PNL_TYPE_RSDS:
650*53ee8cc1Swenshuai.xi         case E_PNL_TYPE_MFC:
651*53ee8cc1Swenshuai.xi         case E_PNL_TYPE_DAC_I:
652*53ee8cc1Swenshuai.xi         case E_PNL_TYPE_DAC_P:
653*53ee8cc1Swenshuai.xi         case E_PNL_TYPE_PDPLVDS:
654*53ee8cc1Swenshuai.xi         case E_PNL_TYPE_HF_LVDS:
655*53ee8cc1Swenshuai.xi         case E_PNL_TYPE_HS_LVDS:
656*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_HDMI_BYPASS_MODE:
657*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_VBY1_8BIT_4LANE_BYPASS_MODE:
658*53ee8cc1Swenshuai.xi         case E_PNL_LPLL_VBY1_10BIT_4LANE_BYPASS_MODE:
659*53ee8cc1Swenshuai.xi         default:
660*53ee8cc1Swenshuai.xi             //the first " *2 " is from  the dual mode
661*53ee8cc1Swenshuai.xi             u32Div=(MS_U32)(MHal_PNL_Get_Loop_DIV(pInstance, pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Mode, pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type, u64DefaultLdHz));
662*53ee8cc1Swenshuai.xi             u64LdPllSet = (_MDrv_PNL_DClkFactor(pInstance, pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Mode, pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type, u64DefaultLdHz) * 1000000 * u32Factor *2) + ((u64LdHz * u32Div) >> 1);
663*53ee8cc1Swenshuai.xi             if(u32Div != 0)
664*53ee8cc1Swenshuai.xi             {
665*53ee8cc1Swenshuai.xi #if (KERNEL_DRIVER_PATCH ==1)
666*53ee8cc1Swenshuai.xi                 u64LdPllSet /= u64LdHz;
667*53ee8cc1Swenshuai.xi #else
668*53ee8cc1Swenshuai.xi                 do_div(u64LdPllSet, u64LdHz);
669*53ee8cc1Swenshuai.xi #endif
670*53ee8cc1Swenshuai.xi                 do_div(u64LdPllSet, u32Div);
671*53ee8cc1Swenshuai.xi             }
672*53ee8cc1Swenshuai.xi             break;
673*53ee8cc1Swenshuai.xi     }
674*53ee8cc1Swenshuai.xi 
675*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "CalculateLPLLSETbyDClk u32LpllSet = %tx\n", (ptrdiff_t)u64LdPllSet);
676*53ee8cc1Swenshuai.xi     return (MS_U32)u64LdPllSet;
677*53ee8cc1Swenshuai.xi 
678*53ee8cc1Swenshuai.xi }
679*53ee8cc1Swenshuai.xi 
MDrv_PNL_Init(void * pInstance)680*53ee8cc1Swenshuai.xi PNL_Result MDrv_PNL_Init(void *pInstance)
681*53ee8cc1Swenshuai.xi {
682*53ee8cc1Swenshuai.xi     MS_PHY u32NonPMBankSize, u32PMBankSize;
683*53ee8cc1Swenshuai.xi 
684*53ee8cc1Swenshuai.xi     // get MMIO base
685*53ee8cc1Swenshuai.xi     if(MDrv_MMIO_GetBASE( &g_ptr_PnlRiuBaseAddr, &u32NonPMBankSize, MS_MODULE_PNL ) != TRUE)
686*53ee8cc1Swenshuai.xi     {
687*53ee8cc1Swenshuai.xi         PNL_ASSERT(0, "%s %lx %lx\n", "Get base address failed", g_ptr_PnlRiuBaseAddr, u32NonPMBankSize);
688*53ee8cc1Swenshuai.xi         return E_PNL_GET_BASEADDR_FAIL;
689*53ee8cc1Swenshuai.xi     }
690*53ee8cc1Swenshuai.xi     else
691*53ee8cc1Swenshuai.xi     {
692*53ee8cc1Swenshuai.xi #if defined (__aarch64__)
693*53ee8cc1Swenshuai.xi         printf("MDrv_PNL_Init u32PnlRiuBaseAddr = %lx\n", g_ptr_PnlRiuBaseAddr);
694*53ee8cc1Swenshuai.xi #else
695*53ee8cc1Swenshuai.xi         printf("MDrv_PNL_Init u32PnlRiuBaseAddr = %tx\n", (ptrdiff_t)g_ptr_PnlRiuBaseAddr);
696*53ee8cc1Swenshuai.xi #endif
697*53ee8cc1Swenshuai.xi     }
698*53ee8cc1Swenshuai.xi 
699*53ee8cc1Swenshuai.xi     if(MDrv_MMIO_GetBASE( &g_ptr_PMRiuBaseAddr, &u32PMBankSize, MS_MODULE_PM ) != TRUE)
700*53ee8cc1Swenshuai.xi     {
701*53ee8cc1Swenshuai.xi         PNL_ASSERT(0, "%s %lx %lx\n", "Get PM base address failed", g_ptr_PMRiuBaseAddr, u32PMBankSize);
702*53ee8cc1Swenshuai.xi         return E_PNL_GET_BASEADDR_FAIL;
703*53ee8cc1Swenshuai.xi     }
704*53ee8cc1Swenshuai.xi     else
705*53ee8cc1Swenshuai.xi     {
706*53ee8cc1Swenshuai.xi #if defined (__aarch64__)
707*53ee8cc1Swenshuai.xi         printf("MDrv_PNL_Init u32PnlRiuBaseAddr = %lx\n", g_ptr_PnlRiuBaseAddr);
708*53ee8cc1Swenshuai.xi #else
709*53ee8cc1Swenshuai.xi         printf("MDrv_PNL_Init u32PMRiuBaseAddr = %tx\n",(ptrdiff_t) g_ptr_PMRiuBaseAddr);
710*53ee8cc1Swenshuai.xi #endif
711*53ee8cc1Swenshuai.xi     }
712*53ee8cc1Swenshuai.xi 
713*53ee8cc1Swenshuai.xi     MHal_PNL_Set_Device_Bank_Offset(pInstance);
714*53ee8cc1Swenshuai.xi     MHal_PQ_Clock_Gen_For_Gamma(pInstance);
715*53ee8cc1Swenshuai.xi     MHal_PNL_Init(pInstance);
716*53ee8cc1Swenshuai.xi 
717*53ee8cc1Swenshuai.xi     return E_PNL_OK;
718*53ee8cc1Swenshuai.xi }
719*53ee8cc1Swenshuai.xi 
MDrv_PNL_SetPanelType(void * pInstance,PNL_InitData * pstPanelInitData)720*53ee8cc1Swenshuai.xi PNL_Result MDrv_PNL_SetPanelType(void *pInstance, PNL_InitData *pstPanelInitData)
721*53ee8cc1Swenshuai.xi {
722*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
723*53ee8cc1Swenshuai.xi     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
724*53ee8cc1Swenshuai.xi 
725*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
726*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
727*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]\n", __FUNCTION__, __LINE__);
728*53ee8cc1Swenshuai.xi 
729*53ee8cc1Swenshuai.xi     if(
730*53ee8cc1Swenshuai.xi     ((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_TTL_TCON)||
731*53ee8cc1Swenshuai.xi     ((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type >= E_PNL_LPLL_MINILVDS_5P_2L)&&
732*53ee8cc1Swenshuai.xi     (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type <= E_PNL_LPLL_MINILVDS_1CH_6P_6BIT))))
733*53ee8cc1Swenshuai.xi     {
734*53ee8cc1Swenshuai.xi         if(MDrv_SYS_Query(E_SYS_QUERY_TCON_SUPPORTED) == FALSE)
735*53ee8cc1Swenshuai.xi         {
736*53ee8cc1Swenshuai.xi             printf("[%s][%d] ATTENTION!!! TCON PNL but not support TCON\n\n", __FUNCTION__, __LINE__);
737*53ee8cc1Swenshuai.xi             return E_PNL_FAIL;
738*53ee8cc1Swenshuai.xi         }
739*53ee8cc1Swenshuai.xi     }
740*53ee8cc1Swenshuai.xi 
741*53ee8cc1Swenshuai.xi     if (pPNLResourcePrivate->stdrvPNL._stPnlInitData.u32PNL_MISC == E_DRVPNL_MISC_MFC_ENABLE)
742*53ee8cc1Swenshuai.xi     {
743*53ee8cc1Swenshuai.xi         // For FRC case, check efuse about 120Hz panel support or not
744*53ee8cc1Swenshuai.xi         if (MHal_PNL_Is_Support120Hz() == FALSE)
745*53ee8cc1Swenshuai.xi         {
746*53ee8cc1Swenshuai.xi             printf("[%s][%d] Only support 60Hz panel\n\n", __FUNCTION__, __LINE__);
747*53ee8cc1Swenshuai.xi             return E_PNL_FAIL;
748*53ee8cc1Swenshuai.xi         }
749*53ee8cc1Swenshuai.xi     }
750*53ee8cc1Swenshuai.xi 
751*53ee8cc1Swenshuai.xi     if(   ( IsVBY1(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type) )||
752*53ee8cc1Swenshuai.xi           (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_LPLL_VBY1_8BIT_4LANE_BYPASS_MODE) ||
753*53ee8cc1Swenshuai.xi           (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_4LANE_BYPASS_MODE))
754*53ee8cc1Swenshuai.xi     {
755*53ee8cc1Swenshuai.xi         if(MHal_PNL_VBY1_IsSupport_Hardware_TrainingMode(pInstance)!= TRUE)
756*53ee8cc1Swenshuai.xi         {
757*53ee8cc1Swenshuai.xi             pPNLResourcePrivate->stdrvPNL._stPnlInitData.bVideo_HW_Training_En = FALSE;
758*53ee8cc1Swenshuai.xi             printf("[%s][%d] ATTENTION!!! Not support HW Training Mode\n\n", __FUNCTION__, __LINE__);
759*53ee8cc1Swenshuai.xi         }
760*53ee8cc1Swenshuai.xi 
761*53ee8cc1Swenshuai.xi         if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.bVideo_HW_Training_En)
762*53ee8cc1Swenshuai.xi         {
763*53ee8cc1Swenshuai.xi             if((pPNLResourcePrivate->stapiPNL._stPnlStatus.bPanel_Initialized == 0)&&
764*53ee8cc1Swenshuai.xi                (pPNLResourcePrivate->stapiPNL._bSkipTimingChange == FALSE))
765*53ee8cc1Swenshuai.xi             {
766*53ee8cc1Swenshuai.xi                 MOD_W2BYTE(REG_MOD_BK00_60_L, 0x0000);
767*53ee8cc1Swenshuai.xi             }
768*53ee8cc1Swenshuai.xi         }
769*53ee8cc1Swenshuai.xi         else
770*53ee8cc1Swenshuai.xi         {
771*53ee8cc1Swenshuai.xi             //Close the RT51 handshack code flow
772*53ee8cc1Swenshuai.xi             MOD_W2BYTEMSK(REG_MOD_BK00_44_L, BIT(14), BIT(14));
773*53ee8cc1Swenshuai.xi         }
774*53ee8cc1Swenshuai.xi     }
775*53ee8cc1Swenshuai.xi 
776*53ee8cc1Swenshuai.xi     if(pPNLResourcePrivate->stapiPNL._bSkipTimingChange == FALSE)
777*53ee8cc1Swenshuai.xi     {
778*53ee8cc1Swenshuai.xi         MHal_PNL_Init_XC_Clk(pInstance, &pPNLResourcePrivate->stdrvPNL._stPnlInitData);
779*53ee8cc1Swenshuai.xi     }
780*53ee8cc1Swenshuai.xi     _MDrv_PNL_Init_XC_VOP(pInstance, &pPNLResourcePrivate->stdrvPNL._stPnlInitData);
781*53ee8cc1Swenshuai.xi     _MDrv_PNL_Init_XC_T3D(pInstance, &pPNLResourcePrivate->stdrvPNL._stPnlInitData);
782*53ee8cc1Swenshuai.xi     MHal_PNL_Init_MOD(pInstance, &pPNLResourcePrivate->stdrvPNL._stPnlInitData);
783*53ee8cc1Swenshuai.xi     _MDrv_PNL_Init_LPLL(pInstance, &pPNLResourcePrivate->stdrvPNL._stPnlInitData);
784*53ee8cc1Swenshuai.xi     _MDrv_PNL_Init_Output_Dclk(pInstance, &pPNLResourcePrivate->stdrvPNL._stPnlInitData);
785*53ee8cc1Swenshuai.xi 
786*53ee8cc1Swenshuai.xi 
787*53ee8cc1Swenshuai.xi 
788*53ee8cc1Swenshuai.xi     if(   ( IsVBY1(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type) )||
789*53ee8cc1Swenshuai.xi           (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_LPLL_VBY1_8BIT_4LANE_BYPASS_MODE) ||
790*53ee8cc1Swenshuai.xi           (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_4LANE_BYPASS_MODE))
791*53ee8cc1Swenshuai.xi     {
792*53ee8cc1Swenshuai.xi         if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.bVideo_HW_Training_En)
793*53ee8cc1Swenshuai.xi         {
794*53ee8cc1Swenshuai.xi //            MOD_W2BYTEMSK(REG_MOD_BK00_63_L, 0x8000, 0x8000);
795*53ee8cc1Swenshuai.xi             //MHal_PNL_VBY1_Hardware_TrainingMode_En(pInstance, TRUE ,DISABLE);
796*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(100);
797*53ee8cc1Swenshuai.xi             MHal_PNL_VBY1_Hardware_TrainingMode_En(pInstance, TRUE ,ENABLE);
798*53ee8cc1Swenshuai.xi //            MsOS_DelayTaskUs(10);
799*53ee8cc1Swenshuai.xi //            MOD_W2BYTEMSK(REG_MOD_BK00_63_L, 0x0000, 0x8000);
800*53ee8cc1Swenshuai.xi         }
801*53ee8cc1Swenshuai.xi         else
802*53ee8cc1Swenshuai.xi         {
803*53ee8cc1Swenshuai.xi             //Open the RT51 handshack code flow
804*53ee8cc1Swenshuai.xi             MOD_W2BYTEMSK(REG_MOD_BK00_44_L, 0, BIT(14));
805*53ee8cc1Swenshuai.xi         }
806*53ee8cc1Swenshuai.xi     }
807*53ee8cc1Swenshuai.xi 
808*53ee8cc1Swenshuai.xi     return E_PNL_OK;
809*53ee8cc1Swenshuai.xi }
810*53ee8cc1Swenshuai.xi 
MDrv_PNL_Close(void * pInstance)811*53ee8cc1Swenshuai.xi PNL_Result MDrv_PNL_Close(void *pInstance)
812*53ee8cc1Swenshuai.xi {
813*53ee8cc1Swenshuai.xi     UNUSED(pInstance);
814*53ee8cc1Swenshuai.xi     return E_PNL_OK;
815*53ee8cc1Swenshuai.xi }
816*53ee8cc1Swenshuai.xi 
_MDrv_VOP_SetGammaMappingMode(void * pInstance,MS_U8 u8Mapping)817*53ee8cc1Swenshuai.xi static void _MDrv_VOP_SetGammaMappingMode(void *pInstance, MS_U8 u8Mapping)
818*53ee8cc1Swenshuai.xi {
819*53ee8cc1Swenshuai.xi     MHal_VOP_SetGammaMappingMode(pInstance, u8Mapping);
820*53ee8cc1Swenshuai.xi }
821*53ee8cc1Swenshuai.xi 
822*53ee8cc1Swenshuai.xi /// set gamma table
MDrv_PNL_SetGammaTbl(void * pInstance,DRVPNL_GAMMA_TYPE eGammaType,MS_U8 * pu8GammaTab[3],DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode)823*53ee8cc1Swenshuai.xi PNL_Result MDrv_PNL_SetGammaTbl(void *pInstance, DRVPNL_GAMMA_TYPE eGammaType, MS_U8* pu8GammaTab[3],
824*53ee8cc1Swenshuai.xi                                  DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode)
825*53ee8cc1Swenshuai.xi {
826*53ee8cc1Swenshuai.xi     MS_U8 u8TgtChannel = 0;
827*53ee8cc1Swenshuai.xi     MS_U8* pcTab1;
828*53ee8cc1Swenshuai.xi     MS_U8 u8BackupMainSubEnableFlag = 0;
829*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
830*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
831*53ee8cc1Swenshuai.xi 
832*53ee8cc1Swenshuai.xi     UNUSED(eGammaType);
833*53ee8cc1Swenshuai.xi 
834*53ee8cc1Swenshuai.xi     // delay 2ms to wait LPLL stable (if not stable, it will make gamma value incorrect)
835*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
836*53ee8cc1Swenshuai.xi     mdelay(2);
837*53ee8cc1Swenshuai.xi #else
838*53ee8cc1Swenshuai.xi     MsOS_DelayTask(2);
839*53ee8cc1Swenshuai.xi #endif
840*53ee8cc1Swenshuai.xi 
841*53ee8cc1Swenshuai.xi 
842*53ee8cc1Swenshuai.xi     // If gamma is on, turn if off
843*53ee8cc1Swenshuai.xi     //if(SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_50_L, BIT(0)))
844*53ee8cc1Swenshuai.xi     if((SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_50_L, BIT(0)))&&(MApi_XC_MLG_GetStatus() != E_MLG_ENABLED))
845*53ee8cc1Swenshuai.xi     {
846*53ee8cc1Swenshuai.xi         if(MApi_XC_MLoad_GetStatus() == E_MLOAD_ENABLED)
847*53ee8cc1Swenshuai.xi         {
848*53ee8cc1Swenshuai.xi             MS_U32 u32Addr[2];
849*53ee8cc1Swenshuai.xi             MS_U16 u16Data[2], u16Mask[2];
850*53ee8cc1Swenshuai.xi             printf("MApi_XC_MLoad_GetStatus()\n");
851*53ee8cc1Swenshuai.xi             // Disable Gamma of MainWindow
852*53ee8cc1Swenshuai.xi             u32Addr[0] = 0x10A0;
853*53ee8cc1Swenshuai.xi             u16Data[0] = 0x0000;
854*53ee8cc1Swenshuai.xi             u16Mask[0] = 0x0001;
855*53ee8cc1Swenshuai.xi             // Disable Gamma of SubWindow
856*53ee8cc1Swenshuai.xi             u32Addr[1] = 0x0F30;
857*53ee8cc1Swenshuai.xi             u16Data[1] = 0x0000;
858*53ee8cc1Swenshuai.xi             u16Mask[1] = 0x0001;
859*53ee8cc1Swenshuai.xi             MApi_XC_MLoad_WriteCmds_And_Fire(u32Addr ,u16Data ,u16Mask , 2);
860*53ee8cc1Swenshuai.xi         }
861*53ee8cc1Swenshuai.xi         else
862*53ee8cc1Swenshuai.xi         {
863*53ee8cc1Swenshuai.xi 
864*53ee8cc1Swenshuai.xi             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_50_L, FALSE, BIT(0));
865*53ee8cc1Swenshuai.xi             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK0F_18_L, FALSE, BIT(0));
866*53ee8cc1Swenshuai.xi         }
867*53ee8cc1Swenshuai.xi 
868*53ee8cc1Swenshuai.xi         u8BackupMainSubEnableFlag |= BIT(0);
869*53ee8cc1Swenshuai.xi     }
870*53ee8cc1Swenshuai.xi #ifdef USE_PANEL_GAMMA
871*53ee8cc1Swenshuai.xi     else if (SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_26_L, BIT(3)))
872*53ee8cc1Swenshuai.xi     {
873*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_26_L, FALSE, BIT(3));
874*53ee8cc1Swenshuai.xi         u8BackupMainSubEnableFlag |= BIT(3);
875*53ee8cc1Swenshuai.xi     }
876*53ee8cc1Swenshuai.xi #endif
877*53ee8cc1Swenshuai.xi 
878*53ee8cc1Swenshuai.xi 
879*53ee8cc1Swenshuai.xi     _MDrv_VOP_SetGammaMappingMode(pInstance, (GammaMapMode == E_DRVPNL_GAMMA_8BIT_MAPPING) ? GAMMA_8BIT_MAPPING : GAMMA_10BIT_MAPPING);
880*53ee8cc1Swenshuai.xi 
881*53ee8cc1Swenshuai.xi     if  (MApi_XC_MLG_GetStatus() == E_MLG_ENABLED)
882*53ee8cc1Swenshuai.xi     {
883*53ee8cc1Swenshuai.xi         MS_U8 u8Channel;
884*53ee8cc1Swenshuai.xi         MS_U16 pMaxGammaValue[3] ;
885*53ee8cc1Swenshuai.xi         MS_U16 u16NumOfLevel = ((GammaMapMode == E_DRVPNL_GAMMA_8BIT_MAPPING) ? 256 : 1024);
886*53ee8cc1Swenshuai.xi         pMaxGammaValue[0] = pMaxGammaValue[1] = pMaxGammaValue[2] = 0;
887*53ee8cc1Swenshuai.xi         MApi_XC_MLG_Fire(pu8GammaTab[0], pu8GammaTab[1], pu8GammaTab[2], u16NumOfLevel, pMaxGammaValue);
888*53ee8cc1Swenshuai.xi         // write max. value of gamma
889*53ee8cc1Swenshuai.xi         for(u8Channel = 0; u8Channel < 3; u8Channel ++)
890*53ee8cc1Swenshuai.xi         {
891*53ee8cc1Swenshuai.xi             hal_PNL_SetMaxGammaValue(pInstance, u8Channel, pMaxGammaValue[u8Channel]);
892*53ee8cc1Swenshuai.xi         }
893*53ee8cc1Swenshuai.xi     }
894*53ee8cc1Swenshuai.xi     else
895*53ee8cc1Swenshuai.xi     {
896*53ee8cc1Swenshuai.xi 
897*53ee8cc1Swenshuai.xi         while( u8TgtChannel < 3 )   // 0 for R, 1 for G, 2 for B
898*53ee8cc1Swenshuai.xi         {
899*53ee8cc1Swenshuai.xi             pcTab1 = pu8GammaTab[u8TgtChannel];
900*53ee8cc1Swenshuai.xi #ifdef MONACO_SC2
901*53ee8cc1Swenshuai.xi             if(pPNLInstancePrivate->u32DeviceID == 0)
902*53ee8cc1Swenshuai.xi #endif
903*53ee8cc1Swenshuai.xi                 Hal_PNL_Set12BitGammaPerChannel(pInstance, u8TgtChannel, pcTab1, GammaMapMode);
904*53ee8cc1Swenshuai.xi #ifdef MONACO_SC2
905*53ee8cc1Swenshuai.xi             else
906*53ee8cc1Swenshuai.xi                 Hal_PNL_Set12BitGammaPerChannel_SC2(pInstance, u8TgtChannel, pcTab1, GammaMapMode);
907*53ee8cc1Swenshuai.xi #endif
908*53ee8cc1Swenshuai.xi             u8TgtChannel++;
909*53ee8cc1Swenshuai.xi         }
910*53ee8cc1Swenshuai.xi     }
911*53ee8cc1Swenshuai.xi 
912*53ee8cc1Swenshuai.xi     // Recovery gamma table
913*53ee8cc1Swenshuai.xi     //if( u8BackupMainSubEnableFlag & BIT(0) )
914*53ee8cc1Swenshuai.xi     if(( u8BackupMainSubEnableFlag & BIT(0) )&&(MApi_XC_MLG_GetStatus() != E_MLG_ENABLED))
915*53ee8cc1Swenshuai.xi     {
916*53ee8cc1Swenshuai.xi 
917*53ee8cc1Swenshuai.xi         if(MApi_XC_MLoad_GetStatus() == E_MLOAD_ENABLED)
918*53ee8cc1Swenshuai.xi         {
919*53ee8cc1Swenshuai.xi             MS_U32 u32Addr[2];
920*53ee8cc1Swenshuai.xi             MS_U16 u16Data[2], u16Mask[2];
921*53ee8cc1Swenshuai.xi 
922*53ee8cc1Swenshuai.xi             // Enable Gamma of MainWindow
923*53ee8cc1Swenshuai.xi             u32Addr[0] = 0x10A0;
924*53ee8cc1Swenshuai.xi             u16Data[0] = 0x0001;
925*53ee8cc1Swenshuai.xi             u16Mask[0] = 0x0001;
926*53ee8cc1Swenshuai.xi             // Enable Gamma of SubWindow
927*53ee8cc1Swenshuai.xi             u32Addr[1] = 0x0F30;
928*53ee8cc1Swenshuai.xi             u16Data[1] = 0x0001;
929*53ee8cc1Swenshuai.xi             u16Mask[1] = 0x0001;
930*53ee8cc1Swenshuai.xi             MApi_XC_MLoad_WriteCmds_And_Fire(u32Addr ,u16Data ,u16Mask , 2);
931*53ee8cc1Swenshuai.xi         }
932*53ee8cc1Swenshuai.xi         else
933*53ee8cc1Swenshuai.xi         {
934*53ee8cc1Swenshuai.xi             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_50_L, BIT(0), BIT(0));
935*53ee8cc1Swenshuai.xi             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK0F_18_L, BIT(0), BIT(0));
936*53ee8cc1Swenshuai.xi         }
937*53ee8cc1Swenshuai.xi     }
938*53ee8cc1Swenshuai.xi     else if ( u8BackupMainSubEnableFlag & BIT(3) )
939*53ee8cc1Swenshuai.xi     {
940*53ee8cc1Swenshuai.xi         #ifdef USE_PANEL_GAMMA
941*53ee8cc1Swenshuai.xi             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_26_L, BIT(3), BIT(3));
942*53ee8cc1Swenshuai.xi         #endif
943*53ee8cc1Swenshuai.xi     }
944*53ee8cc1Swenshuai.xi     return E_PNL_OK;
945*53ee8cc1Swenshuai.xi }
946*53ee8cc1Swenshuai.xi 
947*53ee8cc1Swenshuai.xi 
948*53ee8cc1Swenshuai.xi 
MDrv_PNL_GetGammaTbl(void * pInstance,DRVPNL_GAMMA_TYPE eGammaType,MS_U8 * pu8GammaTab[3],DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode)949*53ee8cc1Swenshuai.xi PNL_Result MDrv_PNL_GetGammaTbl(void *pInstance, DRVPNL_GAMMA_TYPE eGammaType, MS_U8* pu8GammaTab[3],
950*53ee8cc1Swenshuai.xi                                  DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode)
951*53ee8cc1Swenshuai.xi {
952*53ee8cc1Swenshuai.xi     MS_U8 u8TgtChannel = 0;
953*53ee8cc1Swenshuai.xi     MS_U8* pcTab1;
954*53ee8cc1Swenshuai.xi     while( u8TgtChannel < 3 )   // 0 for R, 1 for G, 2 for B
955*53ee8cc1Swenshuai.xi     {
956*53ee8cc1Swenshuai.xi         pcTab1 = pu8GammaTab[u8TgtChannel];
957*53ee8cc1Swenshuai.xi         Hal_PNL_Get12BitGammaPerChannel(pInstance, u8TgtChannel, pcTab1, GammaMapMode);
958*53ee8cc1Swenshuai.xi         u8TgtChannel++;
959*53ee8cc1Swenshuai.xi     }
960*53ee8cc1Swenshuai.xi     return E_PNL_OK;
961*53ee8cc1Swenshuai.xi }
962*53ee8cc1Swenshuai.xi 
963*53ee8cc1Swenshuai.xi 
MDrv_PNL_SetGammaValue(void * pInstance,MS_U8 u8Channel,MS_U16 u16Offset,MS_U16 u16GammaValue)964*53ee8cc1Swenshuai.xi PNL_Result MDrv_PNL_SetGammaValue(void *pInstance, MS_U8 u8Channel, MS_U16 u16Offset, MS_U16 u16GammaValue)
965*53ee8cc1Swenshuai.xi {
966*53ee8cc1Swenshuai.xi     MS_U16 u16MaxGammaValue;
967*53ee8cc1Swenshuai.xi     MS_U8 u8BackupMainSubEnableFlag = 0;
968*53ee8cc1Swenshuai.xi     MS_U16 u16MaxOffset = 0;
969*53ee8cc1Swenshuai.xi     MS_BOOL bUsingBurstWrite = FALSE;
970*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
971*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
972*53ee8cc1Swenshuai.xi 
973*53ee8cc1Swenshuai.xi     // delay 2ms to wait LPLL stable (if not stable, it will make gamma value incorrect)
974*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
975*53ee8cc1Swenshuai.xi     mdelay(2);
976*53ee8cc1Swenshuai.xi #else
977*53ee8cc1Swenshuai.xi     MsOS_DelayTask(2);
978*53ee8cc1Swenshuai.xi #endif
979*53ee8cc1Swenshuai.xi 
980*53ee8cc1Swenshuai.xi     if (u8Channel > 2)
981*53ee8cc1Swenshuai.xi     {
982*53ee8cc1Swenshuai.xi         return E_PNL_FAIL;
983*53ee8cc1Swenshuai.xi     }
984*53ee8cc1Swenshuai.xi 
985*53ee8cc1Swenshuai.xi     if (Hal_VOP_Is_GammaMappingMode_enable(pInstance))
986*53ee8cc1Swenshuai.xi     {
987*53ee8cc1Swenshuai.xi         u16MaxOffset = 1024;
988*53ee8cc1Swenshuai.xi         // Check write mode
989*53ee8cc1Swenshuai.xi         bUsingBurstWrite = !Hal_VOP_Is_GammaSupportSignalWrite(pInstance, E_DRVPNL_GAMMA_10BIT_MAPPING);
990*53ee8cc1Swenshuai.xi     }
991*53ee8cc1Swenshuai.xi     else
992*53ee8cc1Swenshuai.xi     {
993*53ee8cc1Swenshuai.xi         u16MaxOffset = 256;
994*53ee8cc1Swenshuai.xi         bUsingBurstWrite = !Hal_VOP_Is_GammaSupportSignalWrite(pInstance, E_DRVPNL_GAMMA_8BIT_MAPPING);
995*53ee8cc1Swenshuai.xi     }
996*53ee8cc1Swenshuai.xi 
997*53ee8cc1Swenshuai.xi     if (u16Offset >= u16MaxOffset)
998*53ee8cc1Swenshuai.xi     {
999*53ee8cc1Swenshuai.xi         return E_PNL_FAIL;
1000*53ee8cc1Swenshuai.xi     }
1001*53ee8cc1Swenshuai.xi 
1002*53ee8cc1Swenshuai.xi     // If gamma is on, turn if off
1003*53ee8cc1Swenshuai.xi     if(SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_50_L, BIT(0)))
1004*53ee8cc1Swenshuai.xi     {
1005*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_50_L, FALSE, BIT(0));
1006*53ee8cc1Swenshuai.xi         u8BackupMainSubEnableFlag |= BIT(0);
1007*53ee8cc1Swenshuai.xi     }
1008*53ee8cc1Swenshuai.xi 
1009*53ee8cc1Swenshuai.xi     hal_PNL_WriteGamma12Bit(pInstance, u8Channel,bUsingBurstWrite, u16Offset, u16GammaValue);
1010*53ee8cc1Swenshuai.xi 
1011*53ee8cc1Swenshuai.xi     u16MaxGammaValue = SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, (REG_SC_BK10_7A_L + 2 * u8Channel), 0xFFF);
1012*53ee8cc1Swenshuai.xi     if (u16GammaValue > u16MaxGammaValue)
1013*53ee8cc1Swenshuai.xi     {
1014*53ee8cc1Swenshuai.xi         u16MaxGammaValue = u16GammaValue;
1015*53ee8cc1Swenshuai.xi     }
1016*53ee8cc1Swenshuai.xi 
1017*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, (REG_SC_BK10_7A_L + 4 * u8Channel), u16MaxGammaValue, 0xFFF);           // max. base 0
1018*53ee8cc1Swenshuai.xi     SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, (REG_SC_BK10_7B_L + 4 * u8Channel), u16MaxGammaValue, 0xFFF);           // max. base 1
1019*53ee8cc1Swenshuai.xi 
1020*53ee8cc1Swenshuai.xi     // Recovery gamma table
1021*53ee8cc1Swenshuai.xi     if( u8BackupMainSubEnableFlag & BIT(0) )
1022*53ee8cc1Swenshuai.xi     {
1023*53ee8cc1Swenshuai.xi         SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_50_L, BIT(0), BIT(0));
1024*53ee8cc1Swenshuai.xi     }
1025*53ee8cc1Swenshuai.xi 
1026*53ee8cc1Swenshuai.xi 
1027*53ee8cc1Swenshuai.xi     return E_PNL_OK;
1028*53ee8cc1Swenshuai.xi }
1029*53ee8cc1Swenshuai.xi 
MDrv_PNL_En(void * pInstance,MS_BOOL bPanelOn,MS_BOOL bCalEn)1030*53ee8cc1Swenshuai.xi PNL_Result MDrv_PNL_En(void *pInstance, MS_BOOL bPanelOn, MS_BOOL bCalEn)
1031*53ee8cc1Swenshuai.xi {
1032*53ee8cc1Swenshuai.xi     return MHal_PNL_En(pInstance, bPanelOn, bCalEn);
1033*53ee8cc1Swenshuai.xi }
1034*53ee8cc1Swenshuai.xi 
1035*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1036*53ee8cc1Swenshuai.xi // SSC
1037*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1038*53ee8cc1Swenshuai.xi // SPAN value, recommend value is 20KHz ~ 40KHz
1039*53ee8cc1Swenshuai.xi // STEP percent value, recommend is under 3%
1040*53ee8cc1Swenshuai.xi 
1041*53ee8cc1Swenshuai.xi // recommend value.
1042*53ee8cc1Swenshuai.xi // u16Periodx100Hz == 350, u16Percentx100 == 200
MDrv_PNL_SetSSC(void * pInstance,MS_U16 u16Fmodulation,MS_U16 u16Rdeviation,MS_BOOL bEnable)1043*53ee8cc1Swenshuai.xi PNL_Result MDrv_PNL_SetSSC(void *pInstance, MS_U16 u16Fmodulation, MS_U16 u16Rdeviation, MS_BOOL bEnable)
1044*53ee8cc1Swenshuai.xi {
1045*53ee8cc1Swenshuai.xi     MS_U16 u16Span;
1046*53ee8cc1Swenshuai.xi     MS_U16 u16Step;
1047*53ee8cc1Swenshuai.xi     MS_U32 u32PLL_SET;/// = MDrv_Read3Byte(L_BK_LPLL(0x0F));
1048*53ee8cc1Swenshuai.xi 
1049*53ee8cc1Swenshuai.xi 
1050*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_SSC, "[%s][%d]\n", __FUNCTION__, __LINE__);
1051*53ee8cc1Swenshuai.xi     MHal_PNL_Switch_LPLL_SubBank(pInstance, 0x00);
1052*53ee8cc1Swenshuai.xi     u32PLL_SET = R4BYTE(L_BK_LPLL(0x0F));
1053*53ee8cc1Swenshuai.xi     // Set SPAN
1054*53ee8cc1Swenshuai.xi     if(u16Fmodulation < 200 || u16Fmodulation > 400)
1055*53ee8cc1Swenshuai.xi         u16Fmodulation = 300;
1056*53ee8cc1Swenshuai.xi     u16Span =(((((MS_U64)LVDS_MPLL_CLOCK_MHZ*LVDS_SPAN_FACTOR ) / (u16Fmodulation) ) * 10000) / ((MS_U32)u32PLL_SET) ) ;
1057*53ee8cc1Swenshuai.xi 
1058*53ee8cc1Swenshuai.xi     // Set STEP
1059*53ee8cc1Swenshuai.xi     if(u16Rdeviation > 300)
1060*53ee8cc1Swenshuai.xi         u16Rdeviation = 300;
1061*53ee8cc1Swenshuai.xi     u16Step = ((MS_U32)u32PLL_SET*u16Rdeviation) / ((MS_U32)u16Span*10000);
1062*53ee8cc1Swenshuai.xi 
1063*53ee8cc1Swenshuai.xi     W2BYTE(L_BK_LPLL(0x17), u16Step & 0x03FF);// LPLL_STEP
1064*53ee8cc1Swenshuai.xi     W2BYTE(L_BK_LPLL(0x18), u16Span & 0x3FFF);// LPLL_SPAN
1065*53ee8cc1Swenshuai.xi     W2BYTEMSK((L_BK_LPLL(0x0D)), (bEnable << 11), BIT(11)); // Enable ssc
1066*53ee8cc1Swenshuai.xi 
1067*53ee8cc1Swenshuai.xi 
1068*53ee8cc1Swenshuai.xi     return E_PNL_OK;
1069*53ee8cc1Swenshuai.xi }
1070*53ee8cc1Swenshuai.xi 
1071*53ee8cc1Swenshuai.xi 
1072*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1073*53ee8cc1Swenshuai.xi // OSD SSC
1074*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1075*53ee8cc1Swenshuai.xi // SPAN value, recommend value is 20KHz ~ 40KHz
1076*53ee8cc1Swenshuai.xi // STEP percent value, recommend is under 3%
1077*53ee8cc1Swenshuai.xi // recommend value.
1078*53ee8cc1Swenshuai.xi // u16Periodx100Hz == 350, u16Percentx100 == 200
MDrv_PNL_SetOSDSSC(void * pInstance,MS_U16 u16Fmodulation,MS_U16 u16Rdeviation,MS_BOOL bEnable)1079*53ee8cc1Swenshuai.xi PNL_Result MDrv_PNL_SetOSDSSC(void *pInstance, MS_U16 u16Fmodulation, MS_U16 u16Rdeviation, MS_BOOL bEnable)
1080*53ee8cc1Swenshuai.xi {
1081*53ee8cc1Swenshuai.xi     MHal_PNL_SetOSDSSC(pInstance, u16Fmodulation, u16Rdeviation, bEnable);
1082*53ee8cc1Swenshuai.xi     return E_PNL_OK;
1083*53ee8cc1Swenshuai.xi }
1084*53ee8cc1Swenshuai.xi 
MDrv_PNL_SetOutputPattern(void * pInstance,MS_BOOL bEnable,MS_U16 u16Red,MS_U16 u16Green,MS_U16 u16Blue)1085*53ee8cc1Swenshuai.xi void MDrv_PNL_SetOutputPattern(void *pInstance, MS_BOOL bEnable, MS_U16 u16Red , MS_U16 u16Green, MS_U16 u16Blue)
1086*53ee8cc1Swenshuai.xi {
1087*53ee8cc1Swenshuai.xi 
1088*53ee8cc1Swenshuai.xi     //printf("MDrv_PNL_SetOutputPattern: bEnable = %u, R/G/B=0x%x, 0x%x, 0x%x\n", bEnable, u16Red , u16Green, u16Blue);
1089*53ee8cc1Swenshuai.xi     MHal_PNL_SetOutputPattern(pInstance, bEnable, u16Red , u16Green, u16Blue);
1090*53ee8cc1Swenshuai.xi }
1091*53ee8cc1Swenshuai.xi 
MDrv_PNL_SetOutputType(void * pInstance,PNL_OUTPUT_MODE eOutputMode,PNL_TYPE eLPLL_Type)1092*53ee8cc1Swenshuai.xi void MDrv_PNL_SetOutputType(void *pInstance, PNL_OUTPUT_MODE eOutputMode, PNL_TYPE eLPLL_Type)
1093*53ee8cc1Swenshuai.xi {
1094*53ee8cc1Swenshuai.xi     MHal_PNL_SetOutputType(pInstance, eOutputMode, eLPLL_Type);
1095*53ee8cc1Swenshuai.xi }
1096*53ee8cc1Swenshuai.xi 
1097*53ee8cc1Swenshuai.xi #define REG_TABLE_END   0xFFFFFFFF
MDrv_PNL_TCON_DumpSCRegTab(void * pInstance,MS_U8 * pu8TconTab)1098*53ee8cc1Swenshuai.xi void MDrv_PNL_TCON_DumpSCRegTab(void *pInstance, MS_U8* pu8TconTab)
1099*53ee8cc1Swenshuai.xi {
1100*53ee8cc1Swenshuai.xi     MS_U32 u32tabIdx = 0;
1101*53ee8cc1Swenshuai.xi     MS_U16 u16timeout = 0x3FFF;
1102*53ee8cc1Swenshuai.xi     MS_U32 u32Addr;
1103*53ee8cc1Swenshuai.xi     MS_U16 u16Mask;
1104*53ee8cc1Swenshuai.xi     MS_U16 u16Value;
1105*53ee8cc1Swenshuai.xi //    MS_BOOL bHiByte;
1106*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1107*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1108*53ee8cc1Swenshuai.xi 
1109*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "MDrv_PNL_TCON_DumpSCRegTab\n");
1110*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "tab: sc \n");
1111*53ee8cc1Swenshuai.xi 
1112*53ee8cc1Swenshuai.xi     if (pu8TconTab == NULL)
1113*53ee8cc1Swenshuai.xi     {
1114*53ee8cc1Swenshuai.xi         PNL_ASSERT(0, "[%s] TCONTable error \n.", __FUNCTION__);
1115*53ee8cc1Swenshuai.xi         return;
1116*53ee8cc1Swenshuai.xi     }
1117*53ee8cc1Swenshuai.xi 
1118*53ee8cc1Swenshuai.xi     while (--u16timeout)
1119*53ee8cc1Swenshuai.xi     {
1120*53ee8cc1Swenshuai.xi         u32Addr = ((pu8TconTab[u32tabIdx]<<24) + (pu8TconTab[(u32tabIdx +1)]<<16) + (pu8TconTab[(u32tabIdx +2)]<<8) + pu8TconTab[(u32tabIdx +3)]) & 0xFFFFFFFF;
1121*53ee8cc1Swenshuai.xi         u16Mask  = pu8TconTab[(u32tabIdx +4)] & 0xFF;
1122*53ee8cc1Swenshuai.xi         u16Value = pu8TconTab[(u32tabIdx +5)] & 0xFF;
1123*53ee8cc1Swenshuai.xi 
1124*53ee8cc1Swenshuai.xi         if (u32Addr == REG_TABLE_END) // check end of table
1125*53ee8cc1Swenshuai.xi         break;
1126*53ee8cc1Swenshuai.xi 
1127*53ee8cc1Swenshuai.xi #if 1
1128*53ee8cc1Swenshuai.xi         W1BYTEMSK(u32Addr, u16Value, u16Mask);
1129*53ee8cc1Swenshuai.xi #else
1130*53ee8cc1Swenshuai.xi         bHiByte = (u32Addr & 0x8000) ? TRUE : FALSE;
1131*53ee8cc1Swenshuai.xi         u32Addr = ((u32Addr & 0x7F00) | ((u32Addr & 0xFF) << 1));
1132*53ee8cc1Swenshuai.xi 
1133*53ee8cc1Swenshuai.xi         //PNL_DBG(PNL_DBGLEVEL_INIT, "[addr=%04lx, msk=%02x, val=%02x] \n", u32Addr, u16Mask, u16Value);
1134*53ee8cc1Swenshuai.xi         //PNL_DBG(PNL_DBGLEVEL_INIT, "[addr=%04lx, msk=%02x, val=%02x] \n", BK_SC((u32Addr & 0x00FF))|bHiByte, u16Mask, u16Value);
1135*53ee8cc1Swenshuai.xi 
1136*53ee8cc1Swenshuai.xi         if (bHiByte)
1137*53ee8cc1Swenshuai.xi         {
1138*53ee8cc1Swenshuai.xi             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, u32Addr, (u16Value << 8), (u16Mask << 8));
1139*53ee8cc1Swenshuai.xi         }
1140*53ee8cc1Swenshuai.xi         else
1141*53ee8cc1Swenshuai.xi         {
1142*53ee8cc1Swenshuai.xi             SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, u32Addr, u16Value, u16Mask);
1143*53ee8cc1Swenshuai.xi         }
1144*53ee8cc1Swenshuai.xi #endif
1145*53ee8cc1Swenshuai.xi         u32tabIdx = u32tabIdx + 6;
1146*53ee8cc1Swenshuai.xi     }
1147*53ee8cc1Swenshuai.xi     if (u16timeout==0)
1148*53ee8cc1Swenshuai.xi     {
1149*53ee8cc1Swenshuai.xi         PNL_ASSERT(0, "[%s] fails: timeout \n.", __FUNCTION__);
1150*53ee8cc1Swenshuai.xi     }
1151*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "MDrv_PNL_TCON_DumpSCRegTab end\n");
1152*53ee8cc1Swenshuai.xi }
1153*53ee8cc1Swenshuai.xi 
MDrv_PNL_TCON_DumpMODRegTab(void * pInstance,MS_U8 * pu8TconTab)1154*53ee8cc1Swenshuai.xi void MDrv_PNL_TCON_DumpMODRegTab(void *pInstance, MS_U8* pu8TconTab)
1155*53ee8cc1Swenshuai.xi {
1156*53ee8cc1Swenshuai.xi     MS_U32 u32tabIdx = 0;
1157*53ee8cc1Swenshuai.xi     MS_U16 u16timeout = 0x3FFF;
1158*53ee8cc1Swenshuai.xi     MS_U32 u32Addr;
1159*53ee8cc1Swenshuai.xi     MS_U16 u16Mask;
1160*53ee8cc1Swenshuai.xi     MS_U16 u16Value;
1161*53ee8cc1Swenshuai.xi //    MS_BOOL bHiByte;
1162*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1163*53ee8cc1Swenshuai.xi     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
1164*53ee8cc1Swenshuai.xi 
1165*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1166*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
1167*53ee8cc1Swenshuai.xi 
1168*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "MDrv_PNL_TCON_DumpMODRegTab\n");
1169*53ee8cc1Swenshuai.xi 
1170*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "tab: mod \n");
1171*53ee8cc1Swenshuai.xi 
1172*53ee8cc1Swenshuai.xi     if (pu8TconTab == NULL)
1173*53ee8cc1Swenshuai.xi     {
1174*53ee8cc1Swenshuai.xi         PNL_ASSERT(0, "[%s] TCONTable error \n.", __FUNCTION__);
1175*53ee8cc1Swenshuai.xi         return;
1176*53ee8cc1Swenshuai.xi     }
1177*53ee8cc1Swenshuai.xi 
1178*53ee8cc1Swenshuai.xi     pPNLResourcePrivate->stdrvPNL.g_bDrvPnl_UseTConTable_Mod = TRUE;
1179*53ee8cc1Swenshuai.xi 
1180*53ee8cc1Swenshuai.xi     while (--u16timeout)
1181*53ee8cc1Swenshuai.xi     {
1182*53ee8cc1Swenshuai.xi         u32Addr = ((pu8TconTab[u32tabIdx]<<24) + (pu8TconTab[(u32tabIdx +1)]<<16) + (pu8TconTab[(u32tabIdx +2)]<<8) + pu8TconTab[(u32tabIdx +3)]) & 0xFFFFFFFF;
1183*53ee8cc1Swenshuai.xi         u16Mask  = pu8TconTab[(u32tabIdx +4)] & 0xFF;
1184*53ee8cc1Swenshuai.xi         u16Value = pu8TconTab[(u32tabIdx +5)] & 0xFF;
1185*53ee8cc1Swenshuai.xi 
1186*53ee8cc1Swenshuai.xi         if (u32Addr == REG_TABLE_END) // check end of table
1187*53ee8cc1Swenshuai.xi         break;
1188*53ee8cc1Swenshuai.xi 
1189*53ee8cc1Swenshuai.xi         //printf("[addr=%04lx, msk=%02x, val=%02x] \n", u32Addr, u16Mask, u16Value);
1190*53ee8cc1Swenshuai.xi 
1191*53ee8cc1Swenshuai.xi         PNL_DBG(PNL_DBGLEVEL_INIT, "[addr=%04tx, msk=%02x, val=%02x] \n",(ptrdiff_t) u32Addr, u16Mask, u16Value);
1192*53ee8cc1Swenshuai.xi 
1193*53ee8cc1Swenshuai.xi         W1BYTEMSK(u32Addr, u16Value, u16Mask);
1194*53ee8cc1Swenshuai.xi 
1195*53ee8cc1Swenshuai.xi         u32tabIdx = u32tabIdx + 6;
1196*53ee8cc1Swenshuai.xi     }
1197*53ee8cc1Swenshuai.xi 
1198*53ee8cc1Swenshuai.xi     if (u16timeout==0)
1199*53ee8cc1Swenshuai.xi     {
1200*53ee8cc1Swenshuai.xi         PNL_ASSERT(0, "[%s] fails: timeout \n.", __FUNCTION__);
1201*53ee8cc1Swenshuai.xi     }
1202*53ee8cc1Swenshuai.xi     /// Add the TCON patch at here for different chip
1203*53ee8cc1Swenshuai.xi     MHal_PNL_TCON_Patch();
1204*53ee8cc1Swenshuai.xi 
1205*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "MDrv_PNL_TCON_DumpMODRegTab END: REG_MOD_BK00_6E_L=%X\n", MOD_R2BYTE(REG_MOD_BK00_6E_L));
1206*53ee8cc1Swenshuai.xi }
1207*53ee8cc1Swenshuai.xi 
MDrv_PNL_TCON_DumpGENRegTab(void * pInstance,MS_U8 * pu8TconTab)1208*53ee8cc1Swenshuai.xi void MDrv_PNL_TCON_DumpGENRegTab(void *pInstance, MS_U8* pu8TconTab)
1209*53ee8cc1Swenshuai.xi {
1210*53ee8cc1Swenshuai.xi     MS_U32 u32tabIdx = 0;
1211*53ee8cc1Swenshuai.xi     MS_U16 u16timeout = 0x3FFF;
1212*53ee8cc1Swenshuai.xi     MS_U32 u32Addr;
1213*53ee8cc1Swenshuai.xi     MS_U8 u8Mask;
1214*53ee8cc1Swenshuai.xi     MS_U8 u8Value;
1215*53ee8cc1Swenshuai.xi     MS_U16 u16TconSubBank;
1216*53ee8cc1Swenshuai.xi 
1217*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "MDrv_PNL_TCON_DumpGENRegTab\n");
1218*53ee8cc1Swenshuai.xi 
1219*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "tab: gen \n");
1220*53ee8cc1Swenshuai.xi 
1221*53ee8cc1Swenshuai.xi     if (pu8TconTab == NULL)
1222*53ee8cc1Swenshuai.xi     {
1223*53ee8cc1Swenshuai.xi         PNL_ASSERT(0, "[%s] TCONTable error \n.", __FUNCTION__);
1224*53ee8cc1Swenshuai.xi         return;
1225*53ee8cc1Swenshuai.xi     }
1226*53ee8cc1Swenshuai.xi 
1227*53ee8cc1Swenshuai.xi     u16TconSubBank = MHal_PNL_Read_TCON_SubBank(pInstance);
1228*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "u16TconSubBank=%x\n", u16TconSubBank);
1229*53ee8cc1Swenshuai.xi 
1230*53ee8cc1Swenshuai.xi     while (--u16timeout)
1231*53ee8cc1Swenshuai.xi     {
1232*53ee8cc1Swenshuai.xi         u32Addr = ((pu8TconTab[u32tabIdx]<<24) + (pu8TconTab[(u32tabIdx +1)]<<16) + (pu8TconTab[(u32tabIdx +2)]<<8) + pu8TconTab[(u32tabIdx +3)]) & 0xFFFFFFFF;
1233*53ee8cc1Swenshuai.xi         u8Mask  = pu8TconTab[(u32tabIdx +4)] & 0xFF;
1234*53ee8cc1Swenshuai.xi         u8Value = pu8TconTab[(u32tabIdx +5)] & 0xFF;
1235*53ee8cc1Swenshuai.xi 
1236*53ee8cc1Swenshuai.xi         if (u32Addr == REG_TABLE_END) // check end of table
1237*53ee8cc1Swenshuai.xi             break;
1238*53ee8cc1Swenshuai.xi 
1239*53ee8cc1Swenshuai.xi         PNL_DBG(PNL_DBGLEVEL_INIT, "[addr=%04tx, msk=%02x, val=%02x] \n", (ptrdiff_t)u32Addr, u8Mask, u8Value);
1240*53ee8cc1Swenshuai.xi 
1241*53ee8cc1Swenshuai.xi         W1BYTEMSK(u32Addr, u8Value, u8Mask);
1242*53ee8cc1Swenshuai.xi 
1243*53ee8cc1Swenshuai.xi         u32tabIdx = u32tabIdx + 6;
1244*53ee8cc1Swenshuai.xi     }
1245*53ee8cc1Swenshuai.xi 
1246*53ee8cc1Swenshuai.xi     MHal_PNL_Switch_TCON_SubBank(pInstance, u16TconSubBank);
1247*53ee8cc1Swenshuai.xi 
1248*53ee8cc1Swenshuai.xi     if (u16timeout==0)
1249*53ee8cc1Swenshuai.xi     {
1250*53ee8cc1Swenshuai.xi         PNL_ASSERT(0, "[%s] fails: timeout \n.", __FUNCTION__);
1251*53ee8cc1Swenshuai.xi     }
1252*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "MDrv_PNL_TCON_DumpGENRegTab end\n");
1253*53ee8cc1Swenshuai.xi }
1254*53ee8cc1Swenshuai.xi 
1255*53ee8cc1Swenshuai.xi #if 0 // mode to APP
1256*53ee8cc1Swenshuai.xi static void _MDrv_PNL_TCON_DumpPSRegTab(MS_U8 u8TconTab[TCON_TAB_MAX_SIZE], MS_U8 u8Tcontype, MS_U8 *pu8delay)
1257*53ee8cc1Swenshuai.xi {
1258*53ee8cc1Swenshuai.xi     MS_U32 u32tabIdx = 0;
1259*53ee8cc1Swenshuai.xi     MS_U16 u16timeout = 0x3FFF;
1260*53ee8cc1Swenshuai.xi     MS_U32 u32Addr;
1261*53ee8cc1Swenshuai.xi     MS_U16 u16Mask;
1262*53ee8cc1Swenshuai.xi     MS_U16 u16Value;
1263*53ee8cc1Swenshuai.xi     MS_U8  u8signal_type = 0;
1264*53ee8cc1Swenshuai.xi 
1265*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "tab: power sequence \n");
1266*53ee8cc1Swenshuai.xi 
1267*53ee8cc1Swenshuai.xi     if (u8TconTab == NULL)
1268*53ee8cc1Swenshuai.xi     {
1269*53ee8cc1Swenshuai.xi         PNL_ASSERT(0, "[%s] TCONTable error \n.", __FUNCTION__);
1270*53ee8cc1Swenshuai.xi         return;
1271*53ee8cc1Swenshuai.xi     }
1272*53ee8cc1Swenshuai.xi 
1273*53ee8cc1Swenshuai.xi     while (--u16timeout)
1274*53ee8cc1Swenshuai.xi     {
1275*53ee8cc1Swenshuai.xi         u32Addr = ((u8TconTab[u32tabIdx]<<8) + u8TconTab[(u32tabIdx +1)]) & 0xFFFF;
1276*53ee8cc1Swenshuai.xi         u16Mask  = u8TconTab[(u32tabIdx +2)] & 0xFF;
1277*53ee8cc1Swenshuai.xi         u16Value = u8TconTab[(u32tabIdx +3)] & 0xFF;
1278*53ee8cc1Swenshuai.xi         u8signal_type = u8TconTab[(u32tabIdx +6)];
1279*53ee8cc1Swenshuai.xi 
1280*53ee8cc1Swenshuai.xi         if (u32Addr == REG_TABLE_END) // check end of table
1281*53ee8cc1Swenshuai.xi             break;
1282*53ee8cc1Swenshuai.xi 
1283*53ee8cc1Swenshuai.xi         u32Addr = (u32Addr | 0x100000);
1284*53ee8cc1Swenshuai.xi 
1285*53ee8cc1Swenshuai.xi         if(u8Tcontype == u8signal_type)
1286*53ee8cc1Swenshuai.xi         {
1287*53ee8cc1Swenshuai.xi             PNL_DBG(PNL_DBGLEVEL_INIT, "[addr=%04lx, msk=%02x, val=%02x] \n", u32Addr, u16Mask, u16Value);
1288*53ee8cc1Swenshuai.xi 
1289*53ee8cc1Swenshuai.xi             if (u32Addr & 0x1)
1290*53ee8cc1Swenshuai.xi     {
1291*53ee8cc1Swenshuai.xi                 u32Addr --;
1292*53ee8cc1Swenshuai.xi                 W2BYTEMSK(u32Addr, (u16Value << 8), (u16Mask << 8));
1293*53ee8cc1Swenshuai.xi     }
1294*53ee8cc1Swenshuai.xi     else
1295*53ee8cc1Swenshuai.xi     {
1296*53ee8cc1Swenshuai.xi                 W2BYTEMSK(u32Addr, u16Value, u16Mask);
1297*53ee8cc1Swenshuai.xi     }
1298*53ee8cc1Swenshuai.xi             *pu8delay = u8TconTab[(u32tabIdx +5)];
1299*53ee8cc1Swenshuai.xi }
1300*53ee8cc1Swenshuai.xi         u32tabIdx = u32tabIdx + 7;
1301*53ee8cc1Swenshuai.xi     }
1302*53ee8cc1Swenshuai.xi 
1303*53ee8cc1Swenshuai.xi     if (u16timeout==0)
1304*53ee8cc1Swenshuai.xi     {
1305*53ee8cc1Swenshuai.xi         PNL_ASSERT(0, "[%s] fails: timeout \n.", __FUNCTION__);
1306*53ee8cc1Swenshuai.xi     }
1307*53ee8cc1Swenshuai.xi }
1308*53ee8cc1Swenshuai.xi #endif
1309*53ee8cc1Swenshuai.xi 
1310*53ee8cc1Swenshuai.xi 
MDrv_PNL_TCON_Count_Reset(void * pInstance,MS_BOOL bEnable)1311*53ee8cc1Swenshuai.xi void MDrv_PNL_TCON_Count_Reset(void *pInstance, MS_BOOL bEnable)
1312*53ee8cc1Swenshuai.xi {
1313*53ee8cc1Swenshuai.xi     UNUSED(pInstance);
1314*53ee8cc1Swenshuai.xi     W2BYTEMSK(L_BK_TCON(0x03), (bEnable << 14), BIT(14));
1315*53ee8cc1Swenshuai.xi }
1316*53ee8cc1Swenshuai.xi 
MDrv_PNL_TCON_Init(void * pInstance)1317*53ee8cc1Swenshuai.xi void MDrv_PNL_TCON_Init(void *pInstance)
1318*53ee8cc1Swenshuai.xi {
1319*53ee8cc1Swenshuai.xi     MHal_PNL_TCON_Init(pInstance);
1320*53ee8cc1Swenshuai.xi }
1321*53ee8cc1Swenshuai.xi 
1322*53ee8cc1Swenshuai.xi 
MDrv_PNL_GetDataFromRegister(void * pInstance,PNL_TimingInfo * PNLTiming)1323*53ee8cc1Swenshuai.xi MS_BOOL MDrv_PNL_GetDataFromRegister(void *pInstance, PNL_TimingInfo *PNLTiming)
1324*53ee8cc1Swenshuai.xi {
1325*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1326*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1327*53ee8cc1Swenshuai.xi 
1328*53ee8cc1Swenshuai.xi     if(NULL == PNLTiming)
1329*53ee8cc1Swenshuai.xi     {
1330*53ee8cc1Swenshuai.xi         return FALSE;
1331*53ee8cc1Swenshuai.xi     }
1332*53ee8cc1Swenshuai.xi 
1333*53ee8cc1Swenshuai.xi #if defined(PATCH_HW_VTT_LIMITATION)
1334*53ee8cc1Swenshuai.xi     if(R1BYTEMSK(REG_CHIP_REVISION,0xFF) < HW_VTT_LIMITATION_CHIPREV)
1335*53ee8cc1Swenshuai.xi     {
1336*53ee8cc1Swenshuai.xi         PNLTiming->u16VTotal    = SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK68_36_L, VOP_VTT_MASK);         // output vtotal
1337*53ee8cc1Swenshuai.xi     }
1338*53ee8cc1Swenshuai.xi     else
1339*53ee8cc1Swenshuai.xi #endif
1340*53ee8cc1Swenshuai.xi     {
1341*53ee8cc1Swenshuai.xi         //Vtotal
1342*53ee8cc1Swenshuai.xi         PNLTiming->u16VTotal    = SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_0D_L, VOP_VTT_MASK);         // output vtotal
1343*53ee8cc1Swenshuai.xi     }
1344*53ee8cc1Swenshuai.xi     PNLTiming->u16DEVStart  = SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_06_L, VOP_DE_VSTART_MASK);                                       // DE V start
1345*53ee8cc1Swenshuai.xi     PNLTiming->u16DEVEnd    = SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_07_L, VOP_DE_VEND_MASK);       // DE V end
1346*53ee8cc1Swenshuai.xi     PNLTiming->u16VSyncStart= SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_02_L, 0xFFF);       // DE V end
1347*53ee8cc1Swenshuai.xi     PNLTiming->u16VSyncEnd  = SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_03_L, VOP_VSYNC_END_MASK);       // DE V end
1348*53ee8cc1Swenshuai.xi 
1349*53ee8cc1Swenshuai.xi 
1350*53ee8cc1Swenshuai.xi     // Htotal
1351*53ee8cc1Swenshuai.xi     PNLTiming->u16HTotal    = SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_0C_L, VOP_HTT_MASK);         // output htotal
1352*53ee8cc1Swenshuai.xi     PNLTiming->u16DEHStart  = SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_04_L, VOP_DE_HSTART_MASK);                                       // DE H start
1353*53ee8cc1Swenshuai.xi     PNLTiming->u16DEHEnd    = SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_05_L, VOP_DE_HEND_MASK);        // DE H end
1354*53ee8cc1Swenshuai.xi     PNLTiming->u16HSyncWidth= SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_01_L, LBMASK);        // DE H end
1355*53ee8cc1Swenshuai.xi     PNLTiming->bIsPanelManualVysncMode = (MS_BOOL)(SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_10_L, BIT(15)) >> 15);
1356*53ee8cc1Swenshuai.xi 
1357*53ee8cc1Swenshuai.xi     PNLTiming->bInterlaceOutput = MHal_PNL_GetOutputInterlaceTiming(pInstance);
1358*53ee8cc1Swenshuai.xi     //printf("----MDrv_PNL_GetDataFromRegister().DAC flag------------%x,%x,%x\n", PM_R1BYTE(L_BK_DAC(REG_DAC_HD_CTRL),  0:0),
1359*53ee8cc1Swenshuai.xi     //                                        PM_R1BYTE(L_BK_DAC(REG_DAC_SD_CTRL),  2:0),
1360*53ee8cc1Swenshuai.xi     //                                        PM_R1BYTE(H_BK_HDMITX(REG_VE_CONFIG_01),  0:0));
1361*53ee8cc1Swenshuai.xi     return TRUE;
1362*53ee8cc1Swenshuai.xi }
1363*53ee8cc1Swenshuai.xi 
MDrv_PNL_SetSSC_En(void * pInstance,MS_BOOL bEnable)1364*53ee8cc1Swenshuai.xi void MDrv_PNL_SetSSC_En(void *pInstance, MS_BOOL bEnable)
1365*53ee8cc1Swenshuai.xi {
1366*53ee8cc1Swenshuai.xi     //printf("bEnable = %d\n", bEnable);
1367*53ee8cc1Swenshuai.xi     MHal_PNL_Switch_LPLL_SubBank(pInstance, 0x00);
1368*53ee8cc1Swenshuai.xi     W2BYTEMSK((L_BK_LPLL(0x0D)), (bEnable << 11), BIT(11)); // Enable ssc
1369*53ee8cc1Swenshuai.xi }
1370*53ee8cc1Swenshuai.xi 
MDrv_PNL_SetOSDSSC_En(void * pInstance,MS_BOOL bEnable)1371*53ee8cc1Swenshuai.xi void MDrv_PNL_SetOSDSSC_En(void *pInstance, MS_BOOL bEnable)
1372*53ee8cc1Swenshuai.xi {
1373*53ee8cc1Swenshuai.xi     MHal_PNL_SetOSDSSC_En(pInstance, bEnable);
1374*53ee8cc1Swenshuai.xi }
1375*53ee8cc1Swenshuai.xi 
MDrv_PNL_SetSSC_Fmodulation(void * pInstance,MS_U16 u16Fmodulation)1376*53ee8cc1Swenshuai.xi void MDrv_PNL_SetSSC_Fmodulation(void *pInstance, MS_U16 u16Fmodulation)
1377*53ee8cc1Swenshuai.xi {
1378*53ee8cc1Swenshuai.xi 
1379*53ee8cc1Swenshuai.xi #if 1
1380*53ee8cc1Swenshuai.xi     MS_U64 u64Span;
1381*53ee8cc1Swenshuai.xi     //MS_U16 u16Step;
1382*53ee8cc1Swenshuai.xi     MS_U32 u32PLL_SET;/// = MDrv_Read3Byte(L_BK_LPLL(0x0F));
1383*53ee8cc1Swenshuai.xi 
1384*53ee8cc1Swenshuai.xi     MHal_PNL_Switch_LPLL_SubBank(pInstance, 0x00);
1385*53ee8cc1Swenshuai.xi     u32PLL_SET = R4BYTE(L_BK_LPLL(0x0F));
1386*53ee8cc1Swenshuai.xi     //printf("u16Fmodulation = %d\n", u16Fmodulation );
1387*53ee8cc1Swenshuai.xi     u64Span = (((MS_U64)LVDS_MPLL_CLOCK_MHZ*LVDS_SPAN_FACTOR)/(u16Fmodulation) ) * 10000;
1388*53ee8cc1Swenshuai.xi     u64Span = (u64Span+(u32PLL_SET/2))/u32PLL_SET;
1389*53ee8cc1Swenshuai.xi     //u16Span =( ( (((MS_U32)LVDS_MPLL_CLOCK_MHZ*LVDS_SPAN_FACTOR ) / (u16Fmodulation) ) * 10000) + ((MS_U32)u32PLL_SET/2)) / ((MS_U32)u32PLL_SET)  ;
1390*53ee8cc1Swenshuai.xi     //printf("u64Span = 0x%x\n", u64Span);
1391*53ee8cc1Swenshuai.xi     W2BYTE(L_BK_LPLL(0x18), (MS_U16)u64Span & 0x3FFF);// LPLL_SPAN
1392*53ee8cc1Swenshuai.xi 
1393*53ee8cc1Swenshuai.xi #endif
1394*53ee8cc1Swenshuai.xi 
1395*53ee8cc1Swenshuai.xi }
1396*53ee8cc1Swenshuai.xi 
MDrv_PNL_SetOSDSSC_Fmodulation(void * pInstance,MS_U16 u16Fmodulation)1397*53ee8cc1Swenshuai.xi void MDrv_PNL_SetOSDSSC_Fmodulation(void *pInstance, MS_U16 u16Fmodulation)
1398*53ee8cc1Swenshuai.xi {
1399*53ee8cc1Swenshuai.xi #if 1
1400*53ee8cc1Swenshuai.xi     MS_U64 u64Span;
1401*53ee8cc1Swenshuai.xi     //MS_U16 u16Step;
1402*53ee8cc1Swenshuai.xi     MS_U32 u32PLL_SET;/// = MDrv_Read3Byte(L_BK_LPLL(0x0F));
1403*53ee8cc1Swenshuai.xi 
1404*53ee8cc1Swenshuai.xi     MHal_PNL_Switch_LPLL_SubBank(pInstance, 0x00);
1405*53ee8cc1Swenshuai.xi     u32PLL_SET = R4BYTE(L_BK_LPLL(0x48));
1406*53ee8cc1Swenshuai.xi     //printf("u16Fmodulation = %d\n", u16Fmodulation );
1407*53ee8cc1Swenshuai.xi     u64Span = (((MS_U64)LVDS_MPLL_CLOCK_MHZ*LVDS_SPAN_FACTOR)/(u16Fmodulation) ) * 10000;
1408*53ee8cc1Swenshuai.xi     u64Span = (u64Span+(u32PLL_SET/2))/u32PLL_SET;
1409*53ee8cc1Swenshuai.xi     //u16Span =( ( (((MS_U32)LVDS_MPLL_CLOCK_MHZ*LVDS_SPAN_FACTOR ) / (u16Fmodulation) ) * 10000) + ((MS_U32)u32PLL_SET/2)) / ((MS_U32)u32PLL_SET)  ;
1410*53ee8cc1Swenshuai.xi     //printf("u64Span = 0x%x\n", u64Span);
1411*53ee8cc1Swenshuai.xi     W2BYTE(L_BK_LPLL(0x4F),(MS_U16)u64Span& 0x3FFF);// LPLL_SPAN
1412*53ee8cc1Swenshuai.xi #endif
1413*53ee8cc1Swenshuai.xi }
1414*53ee8cc1Swenshuai.xi 
1415*53ee8cc1Swenshuai.xi 
MDrv_PNL_SetSSC_Rdeviation(void * pInstance,MS_U16 u16Rdeviation)1416*53ee8cc1Swenshuai.xi void MDrv_PNL_SetSSC_Rdeviation(void *pInstance, MS_U16 u16Rdeviation)
1417*53ee8cc1Swenshuai.xi {
1418*53ee8cc1Swenshuai.xi #if 1
1419*53ee8cc1Swenshuai.xi     MS_U16 u16Span;
1420*53ee8cc1Swenshuai.xi     MS_U16 u16Step;
1421*53ee8cc1Swenshuai.xi     MS_U32 u32PLL_SET;
1422*53ee8cc1Swenshuai.xi 
1423*53ee8cc1Swenshuai.xi     MHal_PNL_Switch_LPLL_SubBank(pInstance, 0x00);
1424*53ee8cc1Swenshuai.xi     u32PLL_SET = R4BYTE(L_BK_LPLL(0x0F));
1425*53ee8cc1Swenshuai.xi     u16Span =R2BYTE(L_BK_LPLL(0x18)) ;
1426*53ee8cc1Swenshuai.xi     //printf("u16Rdeviation = %d\n", u16Rdeviation);
1427*53ee8cc1Swenshuai.xi     u16Step = (((MS_U32)u32PLL_SET*u16Rdeviation) + ((MS_U32)u16Span*5000)) / ((MS_U32)u16Span*10000);
1428*53ee8cc1Swenshuai.xi     //printf("u16Step = 0x%x\n", u16Step);
1429*53ee8cc1Swenshuai.xi     W2BYTE(L_BK_LPLL(0x17), u16Step & 0x0FFF);// LPLL_STEP
1430*53ee8cc1Swenshuai.xi #endif
1431*53ee8cc1Swenshuai.xi }
1432*53ee8cc1Swenshuai.xi 
MDrv_PNL_SetOSDSSC_Rdeviation(void * pInstance,MS_U16 u16Rdeviation)1433*53ee8cc1Swenshuai.xi void MDrv_PNL_SetOSDSSC_Rdeviation(void *pInstance, MS_U16 u16Rdeviation)
1434*53ee8cc1Swenshuai.xi {
1435*53ee8cc1Swenshuai.xi #if 1
1436*53ee8cc1Swenshuai.xi     MS_U16 u16Span;
1437*53ee8cc1Swenshuai.xi     MS_U16 u16Step;
1438*53ee8cc1Swenshuai.xi     MS_U32 u32PLL_SET;
1439*53ee8cc1Swenshuai.xi 
1440*53ee8cc1Swenshuai.xi     MHal_PNL_Switch_LPLL_SubBank(pInstance, 0x00);
1441*53ee8cc1Swenshuai.xi     u32PLL_SET = R4BYTE(L_BK_LPLL(0x48));
1442*53ee8cc1Swenshuai.xi     u16Span =R2BYTE(L_BK_LPLL(0x4F)) ;
1443*53ee8cc1Swenshuai.xi     //printf("u16Rdeviation = %d\n", u16Rdeviation);
1444*53ee8cc1Swenshuai.xi     u16Step = (((MS_U32)u32PLL_SET*u16Rdeviation) + ((MS_U32)u16Span*5000)) / ((MS_U32)u16Span*10000);
1445*53ee8cc1Swenshuai.xi     //printf("u16Step = 0x%x\n", u16Step);
1446*53ee8cc1Swenshuai.xi     W2BYTE(L_BK_LPLL(0x4E), u16Step & 0x0FFF);// LPLL_STEP
1447*53ee8cc1Swenshuai.xi #endif
1448*53ee8cc1Swenshuai.xi }
1449*53ee8cc1Swenshuai.xi 
MDrv_Mod_Calibration_Init(void * pInstance,PNL_ModCali_InitData * pstModCaliInitData)1450*53ee8cc1Swenshuai.xi void MDrv_Mod_Calibration_Init(void *pInstance, PNL_ModCali_InitData *pstModCaliInitData)
1451*53ee8cc1Swenshuai.xi {
1452*53ee8cc1Swenshuai.xi     MHal_MOD_Calibration_Init(pInstance, pstModCaliInitData);
1453*53ee8cc1Swenshuai.xi }
1454*53ee8cc1Swenshuai.xi 
MDrv_BD_LVDS_Output_Type(void * pInstance,MS_U16 Type)1455*53ee8cc1Swenshuai.xi void MDrv_BD_LVDS_Output_Type(void *pInstance, MS_U16 Type)
1456*53ee8cc1Swenshuai.xi {
1457*53ee8cc1Swenshuai.xi     MHal_BD_LVDS_Output_Type(pInstance, Type);
1458*53ee8cc1Swenshuai.xi }
1459*53ee8cc1Swenshuai.xi 
MDrv_PNL_SkipTimingChange_GetCaps(void * pInstance)1460*53ee8cc1Swenshuai.xi MS_BOOL MDrv_PNL_SkipTimingChange_GetCaps(void *pInstance)
1461*53ee8cc1Swenshuai.xi {
1462*53ee8cc1Swenshuai.xi     return Hal_PNL_SkipTimingChange_GetCaps(pInstance);
1463*53ee8cc1Swenshuai.xi }
1464*53ee8cc1Swenshuai.xi 
MDrv_PNL_PreSetModeOn(void * pInstance,MS_BOOL bSetMode)1465*53ee8cc1Swenshuai.xi void  MDrv_PNL_PreSetModeOn(void *pInstance, MS_BOOL bSetMode)
1466*53ee8cc1Swenshuai.xi {
1467*53ee8cc1Swenshuai.xi     MHal_PNL_PreSetModeOn(pInstance, bSetMode);
1468*53ee8cc1Swenshuai.xi }
1469*53ee8cc1Swenshuai.xi 
MDrv_PNL_HWLVDSReservedtoLRFlag(void * pInstance,PNL_DrvHW_LVDSResInfo lvdsresinfo)1470*53ee8cc1Swenshuai.xi void MDrv_PNL_HWLVDSReservedtoLRFlag(void *pInstance, PNL_DrvHW_LVDSResInfo lvdsresinfo)
1471*53ee8cc1Swenshuai.xi {
1472*53ee8cc1Swenshuai.xi     MHal_PNL_HWLVDSReservedtoLRFlag(pInstance, lvdsresinfo);
1473*53ee8cc1Swenshuai.xi }
1474*53ee8cc1Swenshuai.xi 
MDrv_PNL_OverDriver_Init(void * pInstance,MS_PHY u32OD_MSB_Addr,MS_PHY u32OD_LSB_Addr,MS_U8 u8ODTbl[1056])1475*53ee8cc1Swenshuai.xi void MDrv_PNL_OverDriver_Init(void *pInstance, MS_PHY u32OD_MSB_Addr, MS_PHY u32OD_LSB_Addr, MS_U8 u8ODTbl[1056])
1476*53ee8cc1Swenshuai.xi {
1477*53ee8cc1Swenshuai.xi     MS_PHY u32OD_MSB_limit, u32OD_LSB_limit;
1478*53ee8cc1Swenshuai.xi 
1479*53ee8cc1Swenshuai.xi     MS_U8 u8MIUSel = 0;
1480*53ee8cc1Swenshuai.xi 
1481*53ee8cc1Swenshuai.xi #if defined(__AEONR2__)
1482*53ee8cc1Swenshuai.xi     if( u32OD_MSB_Addr > HAL_MIU1_BASE)
1483*53ee8cc1Swenshuai.xi     {
1484*53ee8cc1Swenshuai.xi         u32OD_MSB_Addr = u32OD_MSB_Addr - HAL_MIU1_BASE;
1485*53ee8cc1Swenshuai.xi         u8MIUSel = 1;
1486*53ee8cc1Swenshuai.xi     }
1487*53ee8cc1Swenshuai.xi 
1488*53ee8cc1Swenshuai.xi     if( u32OD_LSB_Addr > HAL_MIU1_BASE)
1489*53ee8cc1Swenshuai.xi     {
1490*53ee8cc1Swenshuai.xi         u32OD_LSB_Addr = u32OD_LSB_Addr - HAL_MIU1_BASE;
1491*53ee8cc1Swenshuai.xi     }
1492*53ee8cc1Swenshuai.xi #else
1493*53ee8cc1Swenshuai.xi     if( u32OD_MSB_Addr > HAL_MIU2_BASE)
1494*53ee8cc1Swenshuai.xi     {
1495*53ee8cc1Swenshuai.xi         u32OD_MSB_Addr = u32OD_MSB_Addr - HAL_MIU2_BASE;
1496*53ee8cc1Swenshuai.xi         u8MIUSel = 2;
1497*53ee8cc1Swenshuai.xi     }
1498*53ee8cc1Swenshuai.xi     else if( u32OD_MSB_Addr > HAL_MIU1_BASE)
1499*53ee8cc1Swenshuai.xi     {
1500*53ee8cc1Swenshuai.xi         u32OD_MSB_Addr = u32OD_MSB_Addr - HAL_MIU1_BASE;
1501*53ee8cc1Swenshuai.xi         u8MIUSel = 1;
1502*53ee8cc1Swenshuai.xi     }
1503*53ee8cc1Swenshuai.xi 
1504*53ee8cc1Swenshuai.xi     if( u32OD_LSB_Addr > HAL_MIU2_BASE)
1505*53ee8cc1Swenshuai.xi     {
1506*53ee8cc1Swenshuai.xi         u32OD_LSB_Addr = u32OD_LSB_Addr - HAL_MIU2_BASE;
1507*53ee8cc1Swenshuai.xi     }
1508*53ee8cc1Swenshuai.xi     else if( u32OD_LSB_Addr > HAL_MIU1_BASE)
1509*53ee8cc1Swenshuai.xi     {
1510*53ee8cc1Swenshuai.xi         u32OD_LSB_Addr = u32OD_LSB_Addr - HAL_MIU1_BASE;
1511*53ee8cc1Swenshuai.xi     }
1512*53ee8cc1Swenshuai.xi #endif
1513*53ee8cc1Swenshuai.xi     u32OD_MSB_Addr = (u32OD_MSB_Addr / OD_BYTE_PER_WORD) & 0xFFFFFFFF;
1514*53ee8cc1Swenshuai.xi     u32OD_MSB_limit = u32OD_MSB_Addr + (((1920 *1080 *15)/(8 * OD_BYTE_PER_WORD)) + (4096/OD_BYTE_PER_WORD) + 20 + 16024);
1515*53ee8cc1Swenshuai.xi     u32OD_LSB_Addr = (u32OD_LSB_Addr / OD_BYTE_PER_WORD) & 0xFFFFFFFF;
1516*53ee8cc1Swenshuai.xi     u32OD_LSB_limit = u32OD_LSB_Addr + (((1920 *1080 *6)/(8 * OD_BYTE_PER_WORD)) + 20 + 80);
1517*53ee8cc1Swenshuai.xi     if (SUPPORT_OVERDRIVE)
1518*53ee8cc1Swenshuai.xi     {
1519*53ee8cc1Swenshuai.xi         MHal_PNL_OverDriver_Init(pInstance, u32OD_MSB_Addr, u32OD_MSB_limit, u32OD_LSB_Addr, u32OD_LSB_limit, u8MIUSel);
1520*53ee8cc1Swenshuai.xi         MHal_PNL_OverDriver_TBL(pInstance, u8ODTbl);
1521*53ee8cc1Swenshuai.xi     }
1522*53ee8cc1Swenshuai.xi }
1523*53ee8cc1Swenshuai.xi 
MDrv_PNL_OverDriver_Enable(void * pInstance,MS_BOOL bEnable)1524*53ee8cc1Swenshuai.xi void MDrv_PNL_OverDriver_Enable(void *pInstance, MS_BOOL bEnable)
1525*53ee8cc1Swenshuai.xi {
1526*53ee8cc1Swenshuai.xi     if (SUPPORT_OVERDRIVE)
1527*53ee8cc1Swenshuai.xi     {
1528*53ee8cc1Swenshuai.xi         MHal_PNL_OverDriver_Enable(pInstance, bEnable);
1529*53ee8cc1Swenshuai.xi     }
1530*53ee8cc1Swenshuai.xi }
1531*53ee8cc1Swenshuai.xi 
MDrv_PNL_Is_SupportFRC(void * pInstance)1532*53ee8cc1Swenshuai.xi MS_BOOL MDrv_PNL_Is_SupportFRC(void *pInstance)
1533*53ee8cc1Swenshuai.xi {
1534*53ee8cc1Swenshuai.xi     UNUSED(pInstance);
1535*53ee8cc1Swenshuai.xi     return SUPPORT_FRC;
1536*53ee8cc1Swenshuai.xi }
1537*53ee8cc1Swenshuai.xi 
MDrv_PNL_Is_SupportTCON(void * pInstance)1538*53ee8cc1Swenshuai.xi MS_BOOL MDrv_PNL_Is_SupportTCON(void *pInstance)
1539*53ee8cc1Swenshuai.xi {
1540*53ee8cc1Swenshuai.xi     UNUSED(pInstance);
1541*53ee8cc1Swenshuai.xi     return (MS_BOOL)SUPPORT_TCON;
1542*53ee8cc1Swenshuai.xi }
1543*53ee8cc1Swenshuai.xi 
MDrv_FRC_MOD_ForcePairSwap(void * pInstance,MS_U32 u32Polarity)1544*53ee8cc1Swenshuai.xi void MDrv_FRC_MOD_ForcePairSwap(void *pInstance, MS_U32 u32Polarity)
1545*53ee8cc1Swenshuai.xi {
1546*53ee8cc1Swenshuai.xi     MHal_FRC_MOD_PairSwap_UserMode(pInstance, u32Polarity);
1547*53ee8cc1Swenshuai.xi }
1548*53ee8cc1Swenshuai.xi 
MDrv_PNL_Get_DEVstart(void * pInstance)1549*53ee8cc1Swenshuai.xi MS_U16 MDrv_PNL_Get_DEVstart(void *pInstance)
1550*53ee8cc1Swenshuai.xi {
1551*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1552*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1553*53ee8cc1Swenshuai.xi     return SC_R2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_06_L) & 0x1FFF; //pnl de vstart, B[12:0]
1554*53ee8cc1Swenshuai.xi }
1555*53ee8cc1Swenshuai.xi 
MDrv_PNL_Get_DEHstart(void * pInstance)1556*53ee8cc1Swenshuai.xi MS_U16 MDrv_PNL_Get_DEHstart(void *pInstance)
1557*53ee8cc1Swenshuai.xi {
1558*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1559*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1560*53ee8cc1Swenshuai.xi     return SC_R2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_04_L) & 0x3FFF; //pnl de vstart, B[13:0]
1561*53ee8cc1Swenshuai.xi }
1562*53ee8cc1Swenshuai.xi 
MDrv_PNL_isYUVOutput(void * pInstance)1563*53ee8cc1Swenshuai.xi MS_BOOL MDrv_PNL_isYUVOutput(void *pInstance)
1564*53ee8cc1Swenshuai.xi {
1565*53ee8cc1Swenshuai.xi     //Warning : this function is obsolete, please change to use MApi_XC_GetStatusEx
1566*53ee8cc1Swenshuai.xi     //Because if all HW CSC engine is off, then pnl output color space is same with the input signal
1567*53ee8cc1Swenshuai.xi     return MHal_PNL_IsYUVOutput(pInstance);
1568*53ee8cc1Swenshuai.xi }
1569*53ee8cc1Swenshuai.xi 
MDrv_PNL_GetDACOut(void * pInstance)1570*53ee8cc1Swenshuai.xi MS_BOOL MDrv_PNL_GetDACOut(void *pInstance)
1571*53ee8cc1Swenshuai.xi {
1572*53ee8cc1Swenshuai.xi     UNUSED(pInstance);
1573*53ee8cc1Swenshuai.xi     return IS_DAC_OUT;
1574*53ee8cc1Swenshuai.xi }
1575*53ee8cc1Swenshuai.xi 
MDrv_PNL_CalExtLPLLSETbyDClk(void * pInstance,MS_U8 u8LPLL_Mode,MS_U8 u8LPLL_Type,MS_U64 ldHz)1576*53ee8cc1Swenshuai.xi void MDrv_PNL_CalExtLPLLSETbyDClk(void *pInstance, MS_U8 u8LPLL_Mode, MS_U8 u8LPLL_Type, MS_U64 ldHz)
1577*53ee8cc1Swenshuai.xi {
1578*53ee8cc1Swenshuai.xi     //printf("u8LPLL_Mode=%u,u8LPLL_Type=%u, ldHz=%u\n",u8LPLL_Mode, u8LPLL_Type, ldHz);
1579*53ee8cc1Swenshuai.xi     MHal_PNL_CalExtLPLLSETbyDClk(pInstance, u8LPLL_Mode, u8LPLL_Type, ldHz);
1580*53ee8cc1Swenshuai.xi }
1581*53ee8cc1Swenshuai.xi 
MDrv_PNL_EnableInternalTermination(void * pInstance,MS_BOOL bEnable)1582*53ee8cc1Swenshuai.xi MS_BOOL MDrv_PNL_EnableInternalTermination(void *pInstance, MS_BOOL bEnable)
1583*53ee8cc1Swenshuai.xi {
1584*53ee8cc1Swenshuai.xi     UNUSED(pInstance);
1585*53ee8cc1Swenshuai.xi 
1586*53ee8cc1Swenshuai.xi     if(bEnable)
1587*53ee8cc1Swenshuai.xi     {
1588*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_75_L, 0x3FFF); //GCR_EN_RINT (internal termination open)
1589*53ee8cc1Swenshuai.xi     }
1590*53ee8cc1Swenshuai.xi     else
1591*53ee8cc1Swenshuai.xi     {
1592*53ee8cc1Swenshuai.xi         MOD_W2BYTE(REG_MOD_BK00_75_L, 0x0000); //GCR_EN_RINT (internal termination close)
1593*53ee8cc1Swenshuai.xi     }
1594*53ee8cc1Swenshuai.xi 
1595*53ee8cc1Swenshuai.xi     return TRUE;
1596*53ee8cc1Swenshuai.xi }
1597*53ee8cc1Swenshuai.xi 
MDrv_PNL_VBY1_Handshake(void * pInstance)1598*53ee8cc1Swenshuai.xi MS_BOOL MDrv_PNL_VBY1_Handshake(void *pInstance)
1599*53ee8cc1Swenshuai.xi {
1600*53ee8cc1Swenshuai.xi     return MHal_PNL_VBY1_Handshake(pInstance);
1601*53ee8cc1Swenshuai.xi }
1602*53ee8cc1Swenshuai.xi 
MDrv_PNL_VBY1_OC_Handshake(void * pInstance)1603*53ee8cc1Swenshuai.xi MS_BOOL MDrv_PNL_VBY1_OC_Handshake(void *pInstance)
1604*53ee8cc1Swenshuai.xi {
1605*53ee8cc1Swenshuai.xi     return MHal_PNL_VBY1_OC_Handshake(pInstance);
1606*53ee8cc1Swenshuai.xi }
1607*53ee8cc1Swenshuai.xi 
MDrv_PNL_SetOutputInterlaceTiming(void * pInstance,MS_BOOL bEnable)1608*53ee8cc1Swenshuai.xi PNL_Result MDrv_PNL_SetOutputInterlaceTiming(void *pInstance, MS_BOOL bEnable)
1609*53ee8cc1Swenshuai.xi {
1610*53ee8cc1Swenshuai.xi     return MHal_PNL_SetOutputInterlaceTiming(pInstance, bEnable);
1611*53ee8cc1Swenshuai.xi }
1612*53ee8cc1Swenshuai.xi 
MDrv_PNL_GetOutputInterlaceTiming(void * pInstance,MS_BOOL * bIsInterlaceOutput)1613*53ee8cc1Swenshuai.xi void MDrv_PNL_GetOutputInterlaceTiming(void *pInstance, MS_BOOL* bIsInterlaceOutput)
1614*53ee8cc1Swenshuai.xi {
1615*53ee8cc1Swenshuai.xi     *bIsInterlaceOutput = MHal_PNL_GetOutputInterlaceTiming(pInstance);
1616*53ee8cc1Swenshuai.xi }
1617*53ee8cc1Swenshuai.xi 
MDrv_PNL_SetOSDCOutputType(void * pInstance,MS_U16 eLPLL_Type,MS_U8 eOC_OutputFormat)1618*53ee8cc1Swenshuai.xi void MDrv_PNL_SetOSDCOutputType(void *pInstance, MS_U16 eLPLL_Type, MS_U8 eOC_OutputFormat)
1619*53ee8cc1Swenshuai.xi {
1620*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1621*53ee8cc1Swenshuai.xi     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
1622*53ee8cc1Swenshuai.xi 
1623*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1624*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
1625*53ee8cc1Swenshuai.xi     PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]\n", __FUNCTION__, __LINE__);
1626*53ee8cc1Swenshuai.xi 
1627*53ee8cc1Swenshuai.xi     if(((eLPLL_Type >= E_PNL_LPLL_VBY1_10BIT_4LANE)&&
1628*53ee8cc1Swenshuai.xi         (eLPLL_Type <= E_PNL_LPLL_VBY1_8BIT_8LANE))||
1629*53ee8cc1Swenshuai.xi       (eLPLL_Type == E_PNL_LPLL_VBY1_8BIT_4LANE_BYPASS_MODE) ||
1630*53ee8cc1Swenshuai.xi       (eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_4LANE_BYPASS_MODE))
1631*53ee8cc1Swenshuai.xi     {
1632*53ee8cc1Swenshuai.xi         if(MHal_PNL_VBY1_IsSupport_Hardware_TrainingMode(pInstance)!= TRUE)
1633*53ee8cc1Swenshuai.xi         {
1634*53ee8cc1Swenshuai.xi             pPNLResourcePrivate->stdrvPNL._stPnlInitData.bOSD_HW_Training_En = FALSE;
1635*53ee8cc1Swenshuai.xi             printf("[%s][%d] ATTENTION!!! Not support HW Training Mode\n\n", __FUNCTION__, __LINE__);
1636*53ee8cc1Swenshuai.xi         }
1637*53ee8cc1Swenshuai.xi     }
1638*53ee8cc1Swenshuai.xi 
1639*53ee8cc1Swenshuai.xi     MHal_PNL_SetOSDCOutputType(pInstance, (PNL_TYPE) eLPLL_Type, (E_PNL_OSDC_OUTPUT_FORMAT)eOC_OutputFormat);
1640*53ee8cc1Swenshuai.xi }
1641*53ee8cc1Swenshuai.xi 
MDrv_PNL_Get_Semaphore(void * pInstance,E_PNL_POOL_ID eID)1642*53ee8cc1Swenshuai.xi MS_U32 MDrv_PNL_Get_Semaphore(void *pInstance,E_PNL_POOL_ID eID)
1643*53ee8cc1Swenshuai.xi {
1644*53ee8cc1Swenshuai.xi     MS_U32 u32Return = UTOPIA_STATUS_FAIL;
1645*53ee8cc1Swenshuai.xi 
1646*53ee8cc1Swenshuai.xi     if (eID >= E_PNL_POOL_ID_MAX)
1647*53ee8cc1Swenshuai.xi     {
1648*53ee8cc1Swenshuai.xi         printf("[%s,%5d] Unknown PNL Pool ID\n",__func__, __LINE__);
1649*53ee8cc1Swenshuai.xi         return u32Return;
1650*53ee8cc1Swenshuai.xi     }
1651*53ee8cc1Swenshuai.xi 
1652*53ee8cc1Swenshuai.xi     if (pInstance == NULL)
1653*53ee8cc1Swenshuai.xi     {
1654*53ee8cc1Swenshuai.xi         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_PNL_Init() first\n",__FUNCTION__,__LINE__);
1655*53ee8cc1Swenshuai.xi         return u32Return;
1656*53ee8cc1Swenshuai.xi     }
1657*53ee8cc1Swenshuai.xi 
1658*53ee8cc1Swenshuai.xi     #if 0 // for Debug. It is important to check the tid
1659*53ee8cc1Swenshuai.xi     pid_t tid;
1660*53ee8cc1Swenshuai.xi     tid = syscall(SYS_gettid);
1661*53ee8cc1Swenshuai.xi     printf("tid = (%d)\n",tid);
1662*53ee8cc1Swenshuai.xi     #endif
1663*53ee8cc1Swenshuai.xi 
1664*53ee8cc1Swenshuai.xi     void* pModule = NULL;
1665*53ee8cc1Swenshuai.xi     UtopiaInstanceGetModule(pInstance, &pModule);
1666*53ee8cc1Swenshuai.xi     if(UtopiaResourceObtain(pModule, eID, &g_pPNLResource[eID]) != UTOPIA_STATUS_SUCCESS)
1667*53ee8cc1Swenshuai.xi     {
1668*53ee8cc1Swenshuai.xi         printf("UtopiaResourceObtain fail\n");
1669*53ee8cc1Swenshuai.xi         return UTOPIA_STATUS_ERR_RESOURCE;
1670*53ee8cc1Swenshuai.xi     }
1671*53ee8cc1Swenshuai.xi     u32Return = UTOPIA_STATUS_SUCCESS;
1672*53ee8cc1Swenshuai.xi     return u32Return;
1673*53ee8cc1Swenshuai.xi }
1674*53ee8cc1Swenshuai.xi 
MDrv_PNL_Release_Semaphore(void * pInstance,E_PNL_POOL_ID eID)1675*53ee8cc1Swenshuai.xi MS_U32 MDrv_PNL_Release_Semaphore(void *pInstance,E_PNL_POOL_ID eID)
1676*53ee8cc1Swenshuai.xi {
1677*53ee8cc1Swenshuai.xi     MS_U32 u32Return = UTOPIA_STATUS_FAIL;
1678*53ee8cc1Swenshuai.xi 
1679*53ee8cc1Swenshuai.xi     if (eID >= E_PNL_POOL_ID_MAX)
1680*53ee8cc1Swenshuai.xi     {
1681*53ee8cc1Swenshuai.xi         printf("[%s,%5d] Unknown PNL Pool ID\n",__func__, __LINE__);
1682*53ee8cc1Swenshuai.xi         return u32Return;
1683*53ee8cc1Swenshuai.xi     }
1684*53ee8cc1Swenshuai.xi     #if 0 // for Debug. It is important to check the tid
1685*53ee8cc1Swenshuai.xi     pid_t tid;
1686*53ee8cc1Swenshuai.xi     tid = syscall(SYS_gettid);
1687*53ee8cc1Swenshuai.xi     printf("tid = (%d)\n",tid);
1688*53ee8cc1Swenshuai.xi     #endif
1689*53ee8cc1Swenshuai.xi 
1690*53ee8cc1Swenshuai.xi     u32Return = UtopiaResourceRelease(g_pPNLResource[eID]);
1691*53ee8cc1Swenshuai.xi     return u32Return;
1692*53ee8cc1Swenshuai.xi }
1693*53ee8cc1Swenshuai.xi 
MDrv_PNL_GetDeviceNum(void)1694*53ee8cc1Swenshuai.xi MS_U32 MDrv_PNL_GetDeviceNum(void)
1695*53ee8cc1Swenshuai.xi {
1696*53ee8cc1Swenshuai.xi     return PNL_SUPPORT_DEVICE_NUM;
1697*53ee8cc1Swenshuai.xi }
1698*53ee8cc1Swenshuai.xi 
MDrv_PNL_GetPanelVStart(void)1699*53ee8cc1Swenshuai.xi MS_U16 MDrv_PNL_GetPanelVStart(void)
1700*53ee8cc1Swenshuai.xi {
1701*53ee8cc1Swenshuai.xi     return MHal_PNL_GetPanelVStart();
1702*53ee8cc1Swenshuai.xi }
1703*53ee8cc1Swenshuai.xi 
MDrv_PNL_Check_VBY1_Handshake_Status(void * pInstance)1704*53ee8cc1Swenshuai.xi MS_BOOL MDrv_PNL_Check_VBY1_Handshake_Status(void *pInstance)
1705*53ee8cc1Swenshuai.xi {
1706*53ee8cc1Swenshuai.xi     return MHal_PNL_Check_VBY1_Handshake_Status(pInstance);
1707*53ee8cc1Swenshuai.xi }
1708*53ee8cc1Swenshuai.xi 
MDrv_PNL_MOD_PECurrent_Setting(void * pInstance,MS_U16 u16Current_Level,MS_U16 u16Channel_Select)1709*53ee8cc1Swenshuai.xi void MDrv_PNL_MOD_PECurrent_Setting(void *pInstance, MS_U16 u16Current_Level, MS_U16 u16Channel_Select)
1710*53ee8cc1Swenshuai.xi {
1711*53ee8cc1Swenshuai.xi     MHal_PNL_MOD_PECurrent_Setting(pInstance, u16Current_Level, u16Channel_Select);
1712*53ee8cc1Swenshuai.xi }
1713*53ee8cc1Swenshuai.xi 
MDrv_PNL_VBY1_Hardware_TrainingMode_En(void * pInstance,MS_BOOL bIsVideoMode,MS_BOOL bEnable)1714*53ee8cc1Swenshuai.xi void MDrv_PNL_VBY1_Hardware_TrainingMode_En(void *pInstance, MS_BOOL bIsVideoMode ,MS_BOOL bEnable)
1715*53ee8cc1Swenshuai.xi {
1716*53ee8cc1Swenshuai.xi     MHal_PNL_VBY1_Hardware_TrainingMode_En(pInstance,bIsVideoMode,bEnable);
1717*53ee8cc1Swenshuai.xi }
1718*53ee8cc1Swenshuai.xi 
MDrv_PNL_GetName(void)1719*53ee8cc1Swenshuai.xi const char* MDrv_PNL_GetName(void)
1720*53ee8cc1Swenshuai.xi {
1721*53ee8cc1Swenshuai.xi     const char* pPanelName="";
1722*53ee8cc1Swenshuai.xi     if (pu32PNLInst == NULL)
1723*53ee8cc1Swenshuai.xi     {
1724*53ee8cc1Swenshuai.xi         return pPanelName;
1725*53ee8cc1Swenshuai.xi     }
1726*53ee8cc1Swenshuai.xi 
1727*53ee8cc1Swenshuai.xi     PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1728*53ee8cc1Swenshuai.xi     PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
1729*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pu32PNLInst, (void**)&pPNLInstancePrivate);
1730*53ee8cc1Swenshuai.xi     UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
1731*53ee8cc1Swenshuai.xi     pPanelName = pPNLResourcePrivate->stdrvPNL._stPnlInitData.pPanelName;
1732*53ee8cc1Swenshuai.xi     //printf("\033[1;31m ###***###[%s][%d]pPanelName = %s\033[0m\n",__func__,__LINE__,pPanelName);
1733*53ee8cc1Swenshuai.xi     return pPanelName;
1734*53ee8cc1Swenshuai.xi }
1735*53ee8cc1Swenshuai.xi 
1736