xref: /utopia/UTPA2-700.0.x/modules/graphic/drv/gopsc/drv_gop_sc.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 ////////////////////////////////////////////////////////////////////////////////#include <stdio.h>
94*53ee8cc1Swenshuai.xi #define DRV_GOP_SC_C
95*53ee8cc1Swenshuai.xi 
96*53ee8cc1Swenshuai.xi #include "MsCommon.h"
97*53ee8cc1Swenshuai.xi #include "MsOS.h"
98*53ee8cc1Swenshuai.xi 
99*53ee8cc1Swenshuai.xi #include "drv_gop_sc.h"
100*53ee8cc1Swenshuai.xi #include "mhal_gop_sc.h"
101*53ee8cc1Swenshuai.xi 
102*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
103*53ee8cc1Swenshuai.xi #include <linux/string.h>
104*53ee8cc1Swenshuai.xi #include <asm/div64.h>
105*53ee8cc1Swenshuai.xi #else
106*53ee8cc1Swenshuai.xi #include <string.h>
107*53ee8cc1Swenshuai.xi //#define do_div(x,y) ((x)/=(y))
108*53ee8cc1Swenshuai.xi #endif
109*53ee8cc1Swenshuai.xi 
110*53ee8cc1Swenshuai.xi 
111*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
112*53ee8cc1Swenshuai.xi //  Local Defines
113*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
114*53ee8cc1Swenshuai.xi #define DBG_GOP_SC(x) //x
115*53ee8cc1Swenshuai.xi 
116*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
117*53ee8cc1Swenshuai.xi //  Local Variables
118*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
119*53ee8cc1Swenshuai.xi static DRV_GOP_SC_INFO gGopSC_Info = {0};
120*53ee8cc1Swenshuai.xi static GOP_SC_REF         gGopSC_Ref = {0};
121*53ee8cc1Swenshuai.xi 
122*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
123*53ee8cc1Swenshuai.xi //  Local Functions
124*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
_GCD(MS_U32 u32A,MS_U32 u32B)125*53ee8cc1Swenshuai.xi static MS_U32 _GCD(MS_U32 u32A,MS_U32 u32B)
126*53ee8cc1Swenshuai.xi {
127*53ee8cc1Swenshuai.xi     MS_U32 u32R;
128*53ee8cc1Swenshuai.xi 
129*53ee8cc1Swenshuai.xi #ifdef  MSOS_TYPE_LINUX_KERNEL
130*53ee8cc1Swenshuai.xi     while((u32R=do_div(u32A,u32B))!=0)
131*53ee8cc1Swenshuai.xi #else
132*53ee8cc1Swenshuai.xi     while((u32R=u32A%u32B)!=0)
133*53ee8cc1Swenshuai.xi #endif
134*53ee8cc1Swenshuai.xi     {
135*53ee8cc1Swenshuai.xi         u32A=u32B;
136*53ee8cc1Swenshuai.xi         u32B=u32R;
137*53ee8cc1Swenshuai.xi     }
138*53ee8cc1Swenshuai.xi 
139*53ee8cc1Swenshuai.xi     return u32B;
140*53ee8cc1Swenshuai.xi }
141*53ee8cc1Swenshuai.xi 
_ReductionFrac(MS_U32 * pu32A,MS_U32 * pu32B)142*53ee8cc1Swenshuai.xi static MS_BOOL _ReductionFrac (MS_U32 *pu32A,MS_U32 *pu32B)
143*53ee8cc1Swenshuai.xi {
144*53ee8cc1Swenshuai.xi     MS_U32 u32GCD;
145*53ee8cc1Swenshuai.xi     while(1)
146*53ee8cc1Swenshuai.xi     {
147*53ee8cc1Swenshuai.xi         if( (*pu32A<3000) && (*pu32B<3000))  return TRUE;
148*53ee8cc1Swenshuai.xi         if( (u32GCD = _GCD(*pu32A,*pu32B))==1) return TRUE;
149*53ee8cc1Swenshuai.xi         *pu32A /= u32GCD;
150*53ee8cc1Swenshuai.xi         *pu32B /= u32GCD;
151*53ee8cc1Swenshuai.xi     }
152*53ee8cc1Swenshuai.xi     return TRUE;
153*53ee8cc1Swenshuai.xi }
154*53ee8cc1Swenshuai.xi 
_MultiplFrac(MS_U32 * pu32A,MS_U32 * pu32B)155*53ee8cc1Swenshuai.xi static MS_BOOL _MultiplFrac(MS_U32 *pu32A,MS_U32 *pu32B)
156*53ee8cc1Swenshuai.xi {
157*53ee8cc1Swenshuai.xi     while(1)
158*53ee8cc1Swenshuai.xi     {
159*53ee8cc1Swenshuai.xi         if( ( (*pu32A<<1)<3000) && ( (*pu32B<<1) <3000))
160*53ee8cc1Swenshuai.xi         {
161*53ee8cc1Swenshuai.xi              *pu32A<<=1;
162*53ee8cc1Swenshuai.xi              *pu32B<<=1;
163*53ee8cc1Swenshuai.xi         }
164*53ee8cc1Swenshuai.xi         else
165*53ee8cc1Swenshuai.xi         {
166*53ee8cc1Swenshuai.xi             return TRUE;
167*53ee8cc1Swenshuai.xi         }
168*53ee8cc1Swenshuai.xi     }
169*53ee8cc1Swenshuai.xi     return TRUE;
170*53ee8cc1Swenshuai.xi }
171*53ee8cc1Swenshuai.xi 
_MDrv_GOP_SC_Set_ScalingFac(VOID)172*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_GOP_SC_Set_ScalingFac(VOID)
173*53ee8cc1Swenshuai.xi {
174*53ee8cc1Swenshuai.xi     MS_U32 u32VscFac,u32HscFac;
175*53ee8cc1Swenshuai.xi 
176*53ee8cc1Swenshuai.xi     MS_U32 u32Fac ;
177*53ee8cc1Swenshuai.xi 
178*53ee8cc1Swenshuai.xi     DBG_GOP_SC(printf("[GOP_SC] _MDrv_GOP_SC_Set_ScalingFac\n");)
179*53ee8cc1Swenshuai.xi     DBG_GOP_SC(printf("[GOP_SC] VdeIn = %x \t H=%x\n",gGopSC_Info.InCfg.u16VdeIn,gGopSC_Ref.u16ValidH);)
180*53ee8cc1Swenshuai.xi     DBG_GOP_SC(printf("[GOP_SC] ValidV = %x\t HdeIn=%x\n",gGopSC_Ref.u16ValidV,gGopSC_Info.InCfg.u16HdeIn);)
181*53ee8cc1Swenshuai.xi 
182*53ee8cc1Swenshuai.xi     u32Fac = gGopSC_Info.InCfg.u16VdeIn;
183*53ee8cc1Swenshuai.xi     u32VscFac =(MS_U32) V_ScalingDownRatio(u32Fac, gGopSC_Ref.u16ValidV);
184*53ee8cc1Swenshuai.xi 
185*53ee8cc1Swenshuai.xi     //If H in = H out , must disable H Scaling
186*53ee8cc1Swenshuai.xi     if(gGopSC_Ref.u16ValidH == gGopSC_Info.InCfg.u16HdeIn)
187*53ee8cc1Swenshuai.xi         u32HscFac = 0;
188*53ee8cc1Swenshuai.xi     else
189*53ee8cc1Swenshuai.xi     {
190*53ee8cc1Swenshuai.xi         u32Fac = gGopSC_Ref.u16ValidH;
191*53ee8cc1Swenshuai.xi         u32HscFac = (MS_U32) H_ScalingDownRatio(u32Fac, gGopSC_Info.InCfg.u16HdeIn);
192*53ee8cc1Swenshuai.xi     }
193*53ee8cc1Swenshuai.xi 
194*53ee8cc1Swenshuai.xi     DBG_GOP_SC(printf("[GOP_SC] Scalilng FacV = %lx \t Scaling FacH = %lx\n",u32VscFac,u32HscFac);)
195*53ee8cc1Swenshuai.xi 
196*53ee8cc1Swenshuai.xi     //_XC_ENTRY();
197*53ee8cc1Swenshuai.xi     HAL_GOP_SC_Set_ScalingFac(u32VscFac,u32HscFac);
198*53ee8cc1Swenshuai.xi     //_XC_RETURN();
199*53ee8cc1Swenshuai.xi 
200*53ee8cc1Swenshuai.xi     return TRUE;
201*53ee8cc1Swenshuai.xi }
202*53ee8cc1Swenshuai.xi 
_MDrv_GOP_SC_AheadMode(VOID)203*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_GOP_SC_AheadMode(VOID)
204*53ee8cc1Swenshuai.xi {
205*53ee8cc1Swenshuai.xi     MS_U16 u16VRatio,u16Mod;
206*53ee8cc1Swenshuai.xi     MS_BOOL bEnMode = TRUE;
207*53ee8cc1Swenshuai.xi 
208*53ee8cc1Swenshuai.xi     #ifdef MSOS_TYPE_LINUX_KERNEL
209*53ee8cc1Swenshuai.xi     u16VRatio = gGopSC_Info.InCfg.u16VdeIn;
210*53ee8cc1Swenshuai.xi     u16Mod = do_div(u16VRatio,  gGopSC_Ref.u16ValidV);
211*53ee8cc1Swenshuai.xi     #else
212*53ee8cc1Swenshuai.xi     u16VRatio = gGopSC_Info.InCfg.u16VdeIn / gGopSC_Ref.u16ValidV;
213*53ee8cc1Swenshuai.xi     u16Mod = gGopSC_Info.InCfg.u16VdeIn - (u16VRatio* gGopSC_Ref.u16ValidV);
214*53ee8cc1Swenshuai.xi     #endif
215*53ee8cc1Swenshuai.xi 
216*53ee8cc1Swenshuai.xi     bEnMode = ( ((u16Mod>0) && (u16VRatio>=2))) ? FALSE : TRUE;
217*53ee8cc1Swenshuai.xi 
218*53ee8cc1Swenshuai.xi     DBG_GOP_SC(printf("[GOP_SC] Vratio =%d \t Mod = %d\n",u16VRatio,u16Mod);)
219*53ee8cc1Swenshuai.xi     DBG_GOP_SC(printf("[GOP_SC] AheadMode =%d\n",bEnMode);)
220*53ee8cc1Swenshuai.xi 
221*53ee8cc1Swenshuai.xi     //_XC_ENTRY();
222*53ee8cc1Swenshuai.xi     HAL_GOP_SC_AheadMode(bEnMode);
223*53ee8cc1Swenshuai.xi     //_XC_RETURN();
224*53ee8cc1Swenshuai.xi 
225*53ee8cc1Swenshuai.xi     if( u16VRatio>=2)
226*53ee8cc1Swenshuai.xi     {
227*53ee8cc1Swenshuai.xi         gGopSC_Ref.u16VFacInt = 3;
228*53ee8cc1Swenshuai.xi         gGopSC_Ref.u16VFacFrac = 5;
229*53ee8cc1Swenshuai.xi     }
230*53ee8cc1Swenshuai.xi     else
231*53ee8cc1Swenshuai.xi     {
232*53ee8cc1Swenshuai.xi         gGopSC_Ref.u16VFacInt = 2;
233*53ee8cc1Swenshuai.xi         gGopSC_Ref.u16VFacFrac = 0;
234*53ee8cc1Swenshuai.xi     }
235*53ee8cc1Swenshuai.xi 
236*53ee8cc1Swenshuai.xi     return TRUE;
237*53ee8cc1Swenshuai.xi }
238*53ee8cc1Swenshuai.xi 
_MDrv_GOP_SC_FreqSync(VOID)239*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_GOP_SC_FreqSync(VOID)
240*53ee8cc1Swenshuai.xi {
241*53ee8cc1Swenshuai.xi     //idclk_div & odclk_div
242*53ee8cc1Swenshuai.xi     MS_U32 u32FreqIn,u32FreqOut;
243*53ee8cc1Swenshuai.xi 
244*53ee8cc1Swenshuai.xi     u32FreqIn   = gGopSC_Info.InCfg.u16VttIn  *  gGopSC_Info.InCfg.u16HttIn;
245*53ee8cc1Swenshuai.xi     u32FreqOut = ((MS_U32)(gGopSC_Info.OutCfg.u16VttOut)* (MS_U32)(gGopSC_Info.OutCfg.u16HttOut))*4;
246*53ee8cc1Swenshuai.xi     if(!gGopSC_Info.OutCfg.bInterlace)
247*53ee8cc1Swenshuai.xi         u32FreqOut *= 2;
248*53ee8cc1Swenshuai.xi 
249*53ee8cc1Swenshuai.xi     DBG_GOP_SC(printf("[GOP_SC] _MDrv_GOP_SC_FreqSync\n"););
250*53ee8cc1Swenshuai.xi     DBG_GOP_SC(printf("[GOP_SC] 32FreqIn=%lx \t u32FreqOut=%lx \n",u32FreqIn,u32FreqOut););
251*53ee8cc1Swenshuai.xi 
252*53ee8cc1Swenshuai.xi     _ReductionFrac(&u32FreqIn, &u32FreqOut);
253*53ee8cc1Swenshuai.xi     _MultiplFrac(&u32FreqIn,&u32FreqOut);
254*53ee8cc1Swenshuai.xi 
255*53ee8cc1Swenshuai.xi     gGopSC_Ref.u32IDclk  = u32FreqIn;
256*53ee8cc1Swenshuai.xi     gGopSC_Ref.u32ODclk =  u32FreqOut;
257*53ee8cc1Swenshuai.xi 
258*53ee8cc1Swenshuai.xi     if(gGopSC_Ref.u32IDclk>0xFFFFFF || gGopSC_Ref.u32ODclk>0xFFFFFF )
259*53ee8cc1Swenshuai.xi             DBG_GOP_SC(printf("[GOP_SC] ASSERT !!! idclk/odclk overflow\n");)
260*53ee8cc1Swenshuai.xi 
261*53ee8cc1Swenshuai.xi     DBG_GOP_SC(printf("[GOP_SC] idclk=%lx \t odclk=%lx\n",gGopSC_Ref.u32IDclk,gGopSC_Ref.u32ODclk););
262*53ee8cc1Swenshuai.xi 
263*53ee8cc1Swenshuai.xi     //_XC_ENTRY();
264*53ee8cc1Swenshuai.xi     HAL_GOP_SC_FreqSync((gGopSC_Ref.u32IDclk&0xFFFFFF),(gGopSC_Ref.u32ODclk&0xFFFFFF));
265*53ee8cc1Swenshuai.xi     //_XC_RETURN();
266*53ee8cc1Swenshuai.xi 
267*53ee8cc1Swenshuai.xi     return TRUE;
268*53ee8cc1Swenshuai.xi }
269*53ee8cc1Swenshuai.xi 
_MDrv_GOP_SC_PhaseSync(VOID)270*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_GOP_SC_PhaseSync(VOID)
271*53ee8cc1Swenshuai.xi {
272*53ee8cc1Swenshuai.xi     DBG_GOP_SC(printf("[GOP_SC]_MDrv_GOP_SC_PhaseSync\n"););
273*53ee8cc1Swenshuai.xi 
274*53ee8cc1Swenshuai.xi     //ivs_ref
275*53ee8cc1Swenshuai.xi     MS_U32 u32TotalOffset;
276*53ee8cc1Swenshuai.xi     MS_U32 u32IntY,u32ModF;
277*53ee8cc1Swenshuai.xi     MS_U32 u32OffsetY,u32OffsetX;
278*53ee8cc1Swenshuai.xi 
279*53ee8cc1Swenshuai.xi     u32TotalOffset =  gGopSC_Ref.u16VFacInt *10 + gGopSC_Ref.u16VFacFrac ;
280*53ee8cc1Swenshuai.xi     u32TotalOffset *= (gGopSC_Ref.u16ValidV/(1+gGopSC_Info.OutCfg.bInterlace));
281*53ee8cc1Swenshuai.xi 
282*53ee8cc1Swenshuai.xi     #ifdef MSOS_TYPE_LINUX_KERNEL
283*53ee8cc1Swenshuai.xi     u32IntY = u32TotalOffset;
284*53ee8cc1Swenshuai.xi     u32ModF = do_div(u32IntY,  (gGopSC_Info.InCfg.u16VdeIn*10));
285*53ee8cc1Swenshuai.xi     #else
286*53ee8cc1Swenshuai.xi     u32IntY = (u32TotalOffset / (gGopSC_Info.InCfg.u16VdeIn*10)) ;
287*53ee8cc1Swenshuai.xi     u32ModF = u32TotalOffset - (u32IntY* gGopSC_Info.InCfg.u16VdeIn*10);
288*53ee8cc1Swenshuai.xi     #endif
289*53ee8cc1Swenshuai.xi 
290*53ee8cc1Swenshuai.xi     u32OffsetY = u32IntY;
291*53ee8cc1Swenshuai.xi     u32OffsetX = ((u32ModF<<7) *2 *gGopSC_Info.OutCfg.u16HttOut)/(gGopSC_Info.InCfg.u16VdeIn*10);
292*53ee8cc1Swenshuai.xi     u32OffsetX >>=7;
293*53ee8cc1Swenshuai.xi 
294*53ee8cc1Swenshuai.xi     DBG_GOP_SC(printf("[GOP_SC] Offset_line=%ld\t Offset_pixel=%ld\n",u32OffsetY,u32OffsetX);)
295*53ee8cc1Swenshuai.xi     DBG_GOP_SC(printf("[GOP_SC] u8SkipV=%d\t u8SkipH=%d\n",gGopSC_Ref.u8SkipV,gGopSC_Ref.u8SkipH);)
296*53ee8cc1Swenshuai.xi 
297*53ee8cc1Swenshuai.xi     if(u32OffsetX>255)
298*53ee8cc1Swenshuai.xi     {
299*53ee8cc1Swenshuai.xi         gGopSC_Ref.u16VE_RefY= 23-(u32OffsetY+1)-(gGopSC_Ref.u8SkipV/(2*(1+gGopSC_Info.OutCfg.bInterlace)));
300*53ee8cc1Swenshuai.xi         gGopSC_Ref.u16VE_RefX = 255 + 2* gGopSC_Info.OutCfg.u16HttOut-u32OffsetX;
301*53ee8cc1Swenshuai.xi     }
302*53ee8cc1Swenshuai.xi     else
303*53ee8cc1Swenshuai.xi     {
304*53ee8cc1Swenshuai.xi         gGopSC_Ref.u16VE_RefY = 23-u32OffsetY-(gGopSC_Ref.u8SkipV/(2*(1+gGopSC_Info.OutCfg.bInterlace)));
305*53ee8cc1Swenshuai.xi         gGopSC_Ref.u16VE_RefX = 255 -u32OffsetX;
306*53ee8cc1Swenshuai.xi     }
307*53ee8cc1Swenshuai.xi 
308*53ee8cc1Swenshuai.xi     DBG_GOP_SC(printf("[GOP_SC] u16VE_RefY=%d\t u16VE_RefX=%d\n",gGopSC_Ref.u16VE_RefY,gGopSC_Ref.u16VE_RefX);)
309*53ee8cc1Swenshuai.xi 
310*53ee8cc1Swenshuai.xi     if(gGopSC_Info.u8TVSystem == 2) //EN_GOP_SC_PAL_M
311*53ee8cc1Swenshuai.xi     {
312*53ee8cc1Swenshuai.xi         gGopSC_Ref.u16VE_RefY-=3;
313*53ee8cc1Swenshuai.xi     }
314*53ee8cc1Swenshuai.xi 
315*53ee8cc1Swenshuai.xi     //_XC_ENTRY();
316*53ee8cc1Swenshuai.xi     HAL_GOP_SC_PhaseSync(gGopSC_Ref.u16VE_RefY ,gGopSC_Ref.u16VE_RefX,
317*53ee8cc1Swenshuai.xi                   gGopSC_Info.InCfg.u16Hde_St, gGopSC_Info.InCfg.u16Vde_St,gGopSC_Info.InCfg.u16HttIn);
318*53ee8cc1Swenshuai.xi     //_XC_RETURN();
319*53ee8cc1Swenshuai.xi 
320*53ee8cc1Swenshuai.xi     return TRUE;
321*53ee8cc1Swenshuai.xi }
322*53ee8cc1Swenshuai.xi 
_MDrv_GOP_SC_CheckSyncDone(VOID)323*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_GOP_SC_CheckSyncDone(VOID)
324*53ee8cc1Swenshuai.xi {
325*53ee8cc1Swenshuai.xi     //Check lock_done
326*53ee8cc1Swenshuai.xi     MS_U32 u32Time,u32TimeOut;
327*53ee8cc1Swenshuai.xi     MS_U8 u8Status;
328*53ee8cc1Swenshuai.xi     u32Time = MsOS_GetSystemTime();
329*53ee8cc1Swenshuai.xi     u32TimeOut = 5000;
330*53ee8cc1Swenshuai.xi 
331*53ee8cc1Swenshuai.xi     while(1)
332*53ee8cc1Swenshuai.xi     {
333*53ee8cc1Swenshuai.xi         u8Status= HAL_VEPLL_Check_LockDone();
334*53ee8cc1Swenshuai.xi         if( u8Status == 0x01)
335*53ee8cc1Swenshuai.xi         {
336*53ee8cc1Swenshuai.xi             //printf("[%s]-[%d] : Lock done. \n", __FUNCTION__, __LINE__);
337*53ee8cc1Swenshuai.xi             return TRUE;
338*53ee8cc1Swenshuai.xi         }
339*53ee8cc1Swenshuai.xi 
340*53ee8cc1Swenshuai.xi         if ( ( MsOS_GetSystemTime() - u32Time) >= u32TimeOut )
341*53ee8cc1Swenshuai.xi         {
342*53ee8cc1Swenshuai.xi             printf("[%s]-[%d] : Timeout . \n", __FUNCTION__, __LINE__);
343*53ee8cc1Swenshuai.xi             return FALSE;
344*53ee8cc1Swenshuai.xi         }
345*53ee8cc1Swenshuai.xi     }
346*53ee8cc1Swenshuai.xi     return TRUE;
347*53ee8cc1Swenshuai.xi }
348*53ee8cc1Swenshuai.xi 
_MDrv_GOP_SC_SkipFun(VOID)349*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_GOP_SC_SkipFun(VOID)
350*53ee8cc1Swenshuai.xi {
351*53ee8cc1Swenshuai.xi     MS_U32 u32VttIn=0 ,u32VttOut=0 ;
352*53ee8cc1Swenshuai.xi     MS_U32 u32ValidV= 0,u32ValidH= 0;
353*53ee8cc1Swenshuai.xi 
354*53ee8cc1Swenshuai.xi     u32VttIn   = gGopSC_Info.InCfg.u16VttIn;
355*53ee8cc1Swenshuai.xi     u32VttOut = gGopSC_Info.OutCfg.u16VttOut;
356*53ee8cc1Swenshuai.xi 
357*53ee8cc1Swenshuai.xi     u32ValidV = (gGopSC_Info.InCfg.u16VdeIn*u32VttOut) / u32VttIn;
358*53ee8cc1Swenshuai.xi     u32ValidH = (u32ValidV*gGopSC_Info.OutCfg.u16HdeOut) / gGopSC_Info.OutCfg.u16VdeOut;
359*53ee8cc1Swenshuai.xi 
360*53ee8cc1Swenshuai.xi     //ASSERT((u32ValidV<g_GOP_SC_Info.u16VdeOut)||(u32ValidH<g_GOP_SC_Info.u16HdeOut));
361*53ee8cc1Swenshuai.xi 
362*53ee8cc1Swenshuai.xi     gGopSC_Ref.u16ValidH = (MS_U16)(u32ValidH);
363*53ee8cc1Swenshuai.xi     gGopSC_Ref.u16ValidV = (MS_U16)(u32ValidV);
364*53ee8cc1Swenshuai.xi 
365*53ee8cc1Swenshuai.xi     gGopSC_Ref.u8SkipH = (MS_U8)(u32ValidH-gGopSC_Info.OutCfg.u16HdeOut);
366*53ee8cc1Swenshuai.xi     gGopSC_Ref.u8SkipV = (MS_U8)(u32ValidV-gGopSC_Info.OutCfg.u16VdeOut);
367*53ee8cc1Swenshuai.xi 
368*53ee8cc1Swenshuai.xi     //_XC_ENTRY();
369*53ee8cc1Swenshuai.xi     HAL_GOP_SC_SkipFun(gGopSC_Ref.u8SkipV,gGopSC_Ref.u8SkipH,
370*53ee8cc1Swenshuai.xi                                     gGopSC_Ref.u16ValidV,gGopSC_Ref.u16ValidH);
371*53ee8cc1Swenshuai.xi     //_XC_RETURN();
372*53ee8cc1Swenshuai.xi     DBG_GOP_SC(printf("[GOP_SC] ValidV = %ld \t ValidH = %ld\n",u32ValidV,u32ValidH);)
373*53ee8cc1Swenshuai.xi     DBG_GOP_SC(printf("[GOP_SC] u8SkipV=%d\t u8SkipH=%d\n",gGopSC_Ref.u8SkipV,gGopSC_Ref.u8SkipH);)
374*53ee8cc1Swenshuai.xi 
375*53ee8cc1Swenshuai.xi     return TRUE;
376*53ee8cc1Swenshuai.xi }
377*53ee8cc1Swenshuai.xi 
_MDrv_GOP_SC_SetHVSP(VOID)378*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_GOP_SC_SetHVSP(VOID)
379*53ee8cc1Swenshuai.xi {
380*53ee8cc1Swenshuai.xi     //_XC_ENTRY();
381*53ee8cc1Swenshuai.xi     HAL_GOP_SC_SetHVSP(gGopSC_Info.InCfg.u16HdeIn, gGopSC_Info.InCfg.u16VdeIn,
382*53ee8cc1Swenshuai.xi                                     gGopSC_Info.OutCfg.u16HdeOut,gGopSC_Ref.u16ValidV);
383*53ee8cc1Swenshuai.xi     //_XC_RETURN();
384*53ee8cc1Swenshuai.xi     DBG_GOP_SC(printf("[GOP_SC] src_wd=%d\t src_ht=%d\n",gGopSC_Info.InCfg.u16HdeIn,gGopSC_Info.InCfg.u16VdeIn);)
385*53ee8cc1Swenshuai.xi     DBG_GOP_SC(printf("[GOP_SC] dst_wd=%d\t dst_ht=%d\n",gGopSC_Info.OutCfg.u16HdeOut,gGopSC_Ref.u16ValidV);)
386*53ee8cc1Swenshuai.xi     return TRUE;
387*53ee8cc1Swenshuai.xi 
388*53ee8cc1Swenshuai.xi }
389*53ee8cc1Swenshuai.xi 
_MDrv_GOP_SC_P2I(MS_U8 u8EnMode)390*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_GOP_SC_P2I(MS_U8 u8EnMode)
391*53ee8cc1Swenshuai.xi {
392*53ee8cc1Swenshuai.xi     HAL_GOP_SC_P2I(u8EnMode);
393*53ee8cc1Swenshuai.xi     return TRUE;
394*53ee8cc1Swenshuai.xi }
395*53ee8cc1Swenshuai.xi 
396*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
397*53ee8cc1Swenshuai.xi //  Global Functions
398*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_GOP_SC_Init(void)399*53ee8cc1Swenshuai.xi MS_BOOL MDrv_GOP_SC_Init(void)
400*53ee8cc1Swenshuai.xi {
401*53ee8cc1Swenshuai.xi     //Initial Local Variable
402*53ee8cc1Swenshuai.xi     memset(&gGopSC_Ref, 0 , sizeof(GOP_SC_REF) );
403*53ee8cc1Swenshuai.xi     memset(&gGopSC_Info, 0 , sizeof(DRV_GOP_SC_INFO) );
404*53ee8cc1Swenshuai.xi 
405*53ee8cc1Swenshuai.xi     HAL_GOP_SC_SetClock(EN_DST_FBL);        //Default is FBL case , VEPLL mode
406*53ee8cc1Swenshuai.xi     HAL_VEPLL_Reset(TRUE);
407*53ee8cc1Swenshuai.xi 
408*53ee8cc1Swenshuai.xi     //default setting
409*53ee8cc1Swenshuai.xi     HAL_VEPLL_PLL_Ctrl(0x08,0x08,0x02);     //0x288
410*53ee8cc1Swenshuai.xi     HAL_VEPLL_PllSet(0x19999999);             //initial PLL set
411*53ee8cc1Swenshuai.xi 
412*53ee8cc1Swenshuai.xi     //[FSYNC]
413*53ee8cc1Swenshuai.xi     HAL_GOP_SC_Set_PllCfg();
414*53ee8cc1Swenshuai.xi 
415*53ee8cc1Swenshuai.xi     HAL_VEPLL_Reset(FALSE);
416*53ee8cc1Swenshuai.xi     HAL_VEPLL_PowerDown(FALSE);             //Disable PowerDown LPLL
417*53ee8cc1Swenshuai.xi 
418*53ee8cc1Swenshuai.xi     return TRUE;
419*53ee8cc1Swenshuai.xi }
420*53ee8cc1Swenshuai.xi 
MDrv_GOP_SC_Init_riu_base(MS_VIRT vriu_base)421*53ee8cc1Swenshuai.xi VOID MDrv_GOP_SC_Init_riu_base( MS_VIRT vriu_base )
422*53ee8cc1Swenshuai.xi {
423*53ee8cc1Swenshuai.xi     HAL_GOP_SC_Init_riu_base(vriu_base);
424*53ee8cc1Swenshuai.xi     return;
425*53ee8cc1Swenshuai.xi }
426*53ee8cc1Swenshuai.xi 
427*53ee8cc1Swenshuai.xi 
MDrv_GOP_SC_MuxSel(MS_U8 u8Source)428*53ee8cc1Swenshuai.xi MS_BOOL MDrv_GOP_SC_MuxSel(MS_U8 u8Source)
429*53ee8cc1Swenshuai.xi {
430*53ee8cc1Swenshuai.xi     //_XC_ENTRY();
431*53ee8cc1Swenshuai.xi     gGopSC_Info.u8MuxSel = u8Source;
432*53ee8cc1Swenshuai.xi     HAL_GOP_SC_MuxSel(u8Source);
433*53ee8cc1Swenshuai.xi     //_XC_RETURN();
434*53ee8cc1Swenshuai.xi     return TRUE;
435*53ee8cc1Swenshuai.xi }
436*53ee8cc1Swenshuai.xi 
MDrv_GOP_SC_SetParams(DRV_GOP_SC_InCfg * pInCfg,DRV_GOP_SC_OutCfg * pOutCfg,MS_U8 u8TvSys)437*53ee8cc1Swenshuai.xi VOID MDrv_GOP_SC_SetParams(DRV_GOP_SC_InCfg *pInCfg,DRV_GOP_SC_OutCfg *pOutCfg,MS_U8 u8TvSys)
438*53ee8cc1Swenshuai.xi {
439*53ee8cc1Swenshuai.xi     gGopSC_Info.u8TVSystem = u8TvSys;
440*53ee8cc1Swenshuai.xi     memcpy(&gGopSC_Info.InCfg,pInCfg,sizeof(DRV_GOP_SC_InCfg));
441*53ee8cc1Swenshuai.xi     memcpy(&gGopSC_Info.OutCfg,pOutCfg,sizeof(DRV_GOP_SC_OutCfg));
442*53ee8cc1Swenshuai.xi }
443*53ee8cc1Swenshuai.xi 
MDrv_GOP_SC_SetCfg(VOID)444*53ee8cc1Swenshuai.xi MS_BOOL  MDrv_GOP_SC_SetCfg(VOID)
445*53ee8cc1Swenshuai.xi {
446*53ee8cc1Swenshuai.xi     //Scaling & Skip Fun
447*53ee8cc1Swenshuai.xi     _MDrv_GOP_SC_SkipFun();
448*53ee8cc1Swenshuai.xi     _MDrv_GOP_SC_SetHVSP();
449*53ee8cc1Swenshuai.xi     _MDrv_GOP_SC_Set_ScalingFac();
450*53ee8cc1Swenshuai.xi     _MDrv_GOP_SC_AheadMode();
451*53ee8cc1Swenshuai.xi     _MDrv_GOP_SC_P2I(TRUE);
452*53ee8cc1Swenshuai.xi 
453*53ee8cc1Swenshuai.xi     return TRUE;
454*53ee8cc1Swenshuai.xi }
455*53ee8cc1Swenshuai.xi 
MDrv_GOP_SC_SetDst(DRV_GOP_SC_Dst stDst)456*53ee8cc1Swenshuai.xi MS_BOOL MDrv_GOP_SC_SetDst(DRV_GOP_SC_Dst stDst)
457*53ee8cc1Swenshuai.xi {
458*53ee8cc1Swenshuai.xi     gGopSC_Info.stDst = stDst;
459*53ee8cc1Swenshuai.xi 
460*53ee8cc1Swenshuai.xi     switch(stDst)
461*53ee8cc1Swenshuai.xi     {
462*53ee8cc1Swenshuai.xi         case EN_DST_FB : //case 2
463*53ee8cc1Swenshuai.xi             HAL_VEPLL_PowerDown(TRUE);  //PowerDown LPLL
464*53ee8cc1Swenshuai.xi             HAL_GOP_SC_SetClock(EN_DST_FB);
465*53ee8cc1Swenshuai.xi             HAL_GOP_SC_Vsync(EN_VSYNC_VE);
466*53ee8cc1Swenshuai.xi             break;
467*53ee8cc1Swenshuai.xi 
468*53ee8cc1Swenshuai.xi         case EN_DST_FBL: //case 3, 4
469*53ee8cc1Swenshuai.xi             HAL_VEPLL_Limit_d5d6d7(0x00000100);     //limit d5d6d7
470*53ee8cc1Swenshuai.xi             HAL_VEPLL_FPLL_Enable(FALSE);
471*53ee8cc1Swenshuai.xi 
472*53ee8cc1Swenshuai.xi             //initial PLL set
473*53ee8cc1Swenshuai.xi #if (VEPLL_FIXED_PLL)
474*53ee8cc1Swenshuai.xi             if(gGopSC_Info.InCfg.u16HdeIn > 720 ) //HD timing
475*53ee8cc1Swenshuai.xi             {
476*53ee8cc1Swenshuai.xi                 HAL_VEPLL_PLL_Ctrl(0x08,0x08,0x02);
477*53ee8cc1Swenshuai.xi                 HAL_VEPLL_PllSet(0x19999999);
478*53ee8cc1Swenshuai.xi             }
479*53ee8cc1Swenshuai.xi             else
480*53ee8cc1Swenshuai.xi             {
481*53ee8cc1Swenshuai.xi                 MS_U32 u32HdmiPll = HAL_VEPLL_Get_HdmiPllSet();
482*53ee8cc1Swenshuai.xi                 HAL_VEPLL_PLL_Ctrl(0x00,0x01,0x03);
483*53ee8cc1Swenshuai.xi                 HAL_VEPLL_PllSet(u32HdmiPll);
484*53ee8cc1Swenshuai.xi             }
485*53ee8cc1Swenshuai.xi #else
486*53ee8cc1Swenshuai.xi             HAL_VEPLL_PLL_Ctrl(0x08,0x08,0x02);
487*53ee8cc1Swenshuai.xi             HAL_VEPLL_PllSet(0x19999999);
488*53ee8cc1Swenshuai.xi #endif
489*53ee8cc1Swenshuai.xi             HAL_GOP_SC_Vsync(EN_VSYNC_SC);
490*53ee8cc1Swenshuai.xi             break;
491*53ee8cc1Swenshuai.xi 
492*53ee8cc1Swenshuai.xi         default :
493*53ee8cc1Swenshuai.xi             DBG_GOP_SC(printf("[GOP_SC] Fail GOP_SC Path!\n"));
494*53ee8cc1Swenshuai.xi             break;
495*53ee8cc1Swenshuai.xi     }
496*53ee8cc1Swenshuai.xi     return TRUE;
497*53ee8cc1Swenshuai.xi }
498*53ee8cc1Swenshuai.xi 
MDrv_GOP_SC_SetLock(VOID)499*53ee8cc1Swenshuai.xi MS_BOOL MDrv_GOP_SC_SetLock(VOID)
500*53ee8cc1Swenshuai.xi {
501*53ee8cc1Swenshuai.xi     _MDrv_GOP_SC_FreqSync();
502*53ee8cc1Swenshuai.xi     _MDrv_GOP_SC_PhaseSync();
503*53ee8cc1Swenshuai.xi 
504*53ee8cc1Swenshuai.xi     return TRUE;
505*53ee8cc1Swenshuai.xi }
506*53ee8cc1Swenshuai.xi 
MDrv_GOP_SC_SetFPLL_Enable(MS_BOOL bEnable)507*53ee8cc1Swenshuai.xi MS_BOOL MDrv_GOP_SC_SetFPLL_Enable(MS_BOOL bEnable)
508*53ee8cc1Swenshuai.xi {
509*53ee8cc1Swenshuai.xi     MS_BOOL bStatus = FALSE;
510*53ee8cc1Swenshuai.xi 
511*53ee8cc1Swenshuai.xi #if (VEPLL_FIXED_PLL)
512*53ee8cc1Swenshuai.xi     if(gGopSC_Info.InCfg.u16HdeIn > 720 ) //HD timing
513*53ee8cc1Swenshuai.xi     {
514*53ee8cc1Swenshuai.xi         HAL_VEPLL_PllSet(0x19999999);
515*53ee8cc1Swenshuai.xi     }
516*53ee8cc1Swenshuai.xi     else
517*53ee8cc1Swenshuai.xi     {
518*53ee8cc1Swenshuai.xi         MS_U32 u32HdmiPll = HAL_VEPLL_Get_HdmiPllSet();
519*53ee8cc1Swenshuai.xi         HAL_VEPLL_PllSet(u32HdmiPll);
520*53ee8cc1Swenshuai.xi     }
521*53ee8cc1Swenshuai.xi #else
522*53ee8cc1Swenshuai.xi     HAL_VEPLL_PllSet(0x19999999);
523*53ee8cc1Swenshuai.xi #endif
524*53ee8cc1Swenshuai.xi 
525*53ee8cc1Swenshuai.xi     HAL_VEPLL_LockFreq_Enable(bEnable);
526*53ee8cc1Swenshuai.xi     HAL_VEPLL_FPLL_Enable(bEnable);
527*53ee8cc1Swenshuai.xi 
528*53ee8cc1Swenshuai.xi     bStatus = _MDrv_GOP_SC_CheckSyncDone();
529*53ee8cc1Swenshuai.xi 
530*53ee8cc1Swenshuai.xi #if (VEPLL_FIXED_PLL)
531*53ee8cc1Swenshuai.xi     if( (gGopSC_Info.InCfg.u16HdeIn <= 720) && bStatus ) //SD timing
532*53ee8cc1Swenshuai.xi     {
533*53ee8cc1Swenshuai.xi         HAL_VEPLL_Limit_d5d6d7(0x00000000);     //limit d5d6d7
534*53ee8cc1Swenshuai.xi     }
535*53ee8cc1Swenshuai.xi #endif
536*53ee8cc1Swenshuai.xi 
537*53ee8cc1Swenshuai.xi     return TRUE;
538*53ee8cc1Swenshuai.xi }
539*53ee8cc1Swenshuai.xi 
540