xref: /utopia/UTPA2-700.0.x/modules/mvop/hal/k6/mvop/halMVOP.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 //  Include Files
98*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
99*53ee8cc1Swenshuai.xi // Common Definition
100*53ee8cc1Swenshuai.xi #include "MsCommon.h"
101*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
102*53ee8cc1Swenshuai.xi #include <string.h>
103*53ee8cc1Swenshuai.xi #endif
104*53ee8cc1Swenshuai.xi #include "MsTypes.h"
105*53ee8cc1Swenshuai.xi #include "MsIRQ.h"
106*53ee8cc1Swenshuai.xi #include "MsOS.h"
107*53ee8cc1Swenshuai.xi #include "drvMVOP.h"
108*53ee8cc1Swenshuai.xi #include "drvMIU.h"
109*53ee8cc1Swenshuai.xi 
110*53ee8cc1Swenshuai.xi // Internal Definition
111*53ee8cc1Swenshuai.xi #include "regMVOP.h"
112*53ee8cc1Swenshuai.xi #include "halMVOP.h"
113*53ee8cc1Swenshuai.xi 
114*53ee8cc1Swenshuai.xi #ifndef ANDROID
115*53ee8cc1Swenshuai.xi #define MVOP_PRINTF printf
116*53ee8cc1Swenshuai.xi #else
117*53ee8cc1Swenshuai.xi #include <sys/mman.h>
118*53ee8cc1Swenshuai.xi #include <cutils/ashmem.h>
119*53ee8cc1Swenshuai.xi #include <cutils/log.h>
120*53ee8cc1Swenshuai.xi 
121*53ee8cc1Swenshuai.xi #define MVOP_PRINTF ALOGD
122*53ee8cc1Swenshuai.xi #endif
123*53ee8cc1Swenshuai.xi 
124*53ee8cc1Swenshuai.xi // Common
125*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
126*53ee8cc1Swenshuai.xi #include <asm/div64.h>
127*53ee8cc1Swenshuai.xi #else
128*53ee8cc1Swenshuai.xi #define do_div(x,y) ((x)/=(y))
129*53ee8cc1Swenshuai.xi #define do_mod(x,y) ((x)%=(y))
130*53ee8cc1Swenshuai.xi #endif
131*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
132*53ee8cc1Swenshuai.xi //  Driver Compiler Options
133*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
134*53ee8cc1Swenshuai.xi 
135*53ee8cc1Swenshuai.xi 
136*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
137*53ee8cc1Swenshuai.xi //  Local Defines
138*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
139*53ee8cc1Swenshuai.xi #define MPLL_CLOCK           (432000000ULL)
140*53ee8cc1Swenshuai.xi 
141*53ee8cc1Swenshuai.xi #define BIT0    BIT(0)
142*53ee8cc1Swenshuai.xi #define BIT1    BIT(1)
143*53ee8cc1Swenshuai.xi #define BIT2    BIT(2)
144*53ee8cc1Swenshuai.xi #define BIT3    BIT(3)
145*53ee8cc1Swenshuai.xi #define BIT4    BIT(4)
146*53ee8cc1Swenshuai.xi #define BIT5    BIT(5)
147*53ee8cc1Swenshuai.xi #define BIT6    BIT(6)
148*53ee8cc1Swenshuai.xi #define BIT7    BIT(7)
149*53ee8cc1Swenshuai.xi #define BIT15   BIT(15)
150*53ee8cc1Swenshuai.xi 
151*53ee8cc1Swenshuai.xi #define ALIGN_UPTO_16(x)  ((((x) + 15) >> 4) << 4)
152*53ee8cc1Swenshuai.xi #define ALIGN_UPTO_4(x)   ((((x) + 3) >> 2) << 2)
153*53ee8cc1Swenshuai.xi #define ALIGN_UPTO_2(x)   ((((x) + 1) >> 1) << 1)
154*53ee8cc1Swenshuai.xi 
155*53ee8cc1Swenshuai.xi #define MVOP_VBlank               45
156*53ee8cc1Swenshuai.xi #define MVOP_HBlank_SD            200
157*53ee8cc1Swenshuai.xi #define MVOP_HBlank_HD            300
158*53ee8cc1Swenshuai.xi 
159*53ee8cc1Swenshuai.xi #if 0
160*53ee8cc1Swenshuai.xi static MS_U32 u32RiuBaseAdd=0;
161*53ee8cc1Swenshuai.xi static MS_BOOL bMirrorModeVer = 0;
162*53ee8cc1Swenshuai.xi static MS_BOOL bMirrorModeHor = 0;
163*53ee8cc1Swenshuai.xi static MS_BOOL bMirrorMode=0;
164*53ee8cc1Swenshuai.xi static MS_BOOL bSubMirrorModeVer = 0;
165*53ee8cc1Swenshuai.xi static MS_BOOL bSubMirrorModeHor = 0;
166*53ee8cc1Swenshuai.xi static MS_BOOL bSubMirrorMode=0;
167*53ee8cc1Swenshuai.xi static MS_BOOL bEnableFreerunMode = FALSE;
168*53ee8cc1Swenshuai.xi static MS_BOOL bSubEnableFreerunMode = FALSE;
169*53ee8cc1Swenshuai.xi static MS_BOOL b3DLRMode=0;    /// 3D L/R dual buffer mode
170*53ee8cc1Swenshuai.xi static MS_BOOL bSub3DLRMode=0;
171*53ee8cc1Swenshuai.xi static MS_BOOL b3DLRAltOutput = FALSE;    /// 3D L/R line alternative output
172*53ee8cc1Swenshuai.xi static MS_BOOL bNewVSyncMode = FALSE;
173*53ee8cc1Swenshuai.xi static MVOP_RptFldMode eRepeatField = E_MVOP_RPTFLD_NONE;      /// mvop output repeating fields for single field input.
174*53ee8cc1Swenshuai.xi static MVOP_RptFldMode eSubRepeatField = E_MVOP_RPTFLD_NONE;   /// mvop output repeating fields for single field input.
175*53ee8cc1Swenshuai.xi static MVOP_RgbFormat eMainRgbFmt = E_MVOP_RGB_NONE;
176*53ee8cc1Swenshuai.xi static MVOP_RgbFormat eSubRgbFmt = E_MVOP_RGB_NONE;
177*53ee8cc1Swenshuai.xi #endif
178*53ee8cc1Swenshuai.xi 
179*53ee8cc1Swenshuai.xi typedef struct
180*53ee8cc1Swenshuai.xi {
181*53ee8cc1Swenshuai.xi 
182*53ee8cc1Swenshuai.xi     MS_BOOL bMirrorModeVer;
183*53ee8cc1Swenshuai.xi     MS_BOOL bMirrorModeHor;
184*53ee8cc1Swenshuai.xi     MS_BOOL bMirrorMode;
185*53ee8cc1Swenshuai.xi     MS_BOOL bEnableFreerunMode;
186*53ee8cc1Swenshuai.xi     MS_BOOL b3DLRMode;    /// 3D L/R dual buffer mode
187*53ee8cc1Swenshuai.xi     MS_BOOL b3DLRAltOutput;    /// 3D L/R line alternative output
188*53ee8cc1Swenshuai.xi     MS_BOOL b3DLRAltSBSOutput; /// 3D L/R side by side output
189*53ee8cc1Swenshuai.xi     MS_BOOL bNewVSyncMode;
190*53ee8cc1Swenshuai.xi     MVOP_RptFldMode eRepeatField;      /// mvop output repeating fields for single field input.
191*53ee8cc1Swenshuai.xi     MVOP_RgbFormat eMainRgbFmt;
192*53ee8cc1Swenshuai.xi     MS_BOOL bIsInit;
193*53ee8cc1Swenshuai.xi     MS_BOOL bRptPreVsync;
194*53ee8cc1Swenshuai.xi     MS_BOOL bIs422;
195*53ee8cc1Swenshuai.xi     MS_BOOL bIsH265;
196*53ee8cc1Swenshuai.xi     MS_BOOL bIsHS;
197*53ee8cc1Swenshuai.xi     MS_U16  u16CropXStart;
198*53ee8cc1Swenshuai.xi     MS_U16  u16CropYStart;
199*53ee8cc1Swenshuai.xi     MS_U16  u16CropXSize;
200*53ee8cc1Swenshuai.xi     MS_U16  u16CropYSize;
201*53ee8cc1Swenshuai.xi     MS_BOOL bIsSetCrop;
202*53ee8cc1Swenshuai.xi     MS_BOOL bIsXcTrig;
203*53ee8cc1Swenshuai.xi     MS_U32 u32MVOPFixClk;
204*53ee8cc1Swenshuai.xi     MS_BOOL bIsEnable;
205*53ee8cc1Swenshuai.xi     MS_BOOL bIs2p;
206*53ee8cc1Swenshuai.xi     MVOP_OutputImodeType eInterlaceType;
207*53ee8cc1Swenshuai.xi     MS_U16  u16ECONum;
208*53ee8cc1Swenshuai.xi     MS_BOOL bDramRdContd;
209*53ee8cc1Swenshuai.xi     MS_BOOL bIsEnLSB;
210*53ee8cc1Swenshuai.xi     MS_BOOL bIsMCUMfdec;
211*53ee8cc1Swenshuai.xi     MS_U8   u8LumaMIU;
212*53ee8cc1Swenshuai.xi     MS_U8   u8ChromaMIU;
213*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
214*53ee8cc1Swenshuai.xi     MS_BOOL bSubMirrorModeVer;
215*53ee8cc1Swenshuai.xi     MS_BOOL bSubMirrorModeHor;
216*53ee8cc1Swenshuai.xi     MS_BOOL bSubMirrorMode;
217*53ee8cc1Swenshuai.xi     MS_BOOL bSubEnableFreerunMode;
218*53ee8cc1Swenshuai.xi     MS_BOOL bSub3DLRMode;
219*53ee8cc1Swenshuai.xi     MS_BOOL bSubNewVSyncMode;
220*53ee8cc1Swenshuai.xi     MVOP_RptFldMode eSubRepeatField;   /// mvop output repeating fields for single field input.
221*53ee8cc1Swenshuai.xi     MVOP_RgbFormat eSubRgbFmt;
222*53ee8cc1Swenshuai.xi     MS_BOOL bSubIsInit;
223*53ee8cc1Swenshuai.xi     MS_BOOL bSubRptPreVsync;
224*53ee8cc1Swenshuai.xi     MS_BOOL bSubIs422;
225*53ee8cc1Swenshuai.xi     MS_BOOL bSubIsH265;
226*53ee8cc1Swenshuai.xi     MS_BOOL bSub3DLRAltOutput;    /// 3D L/R line alternative output
227*53ee8cc1Swenshuai.xi     MS_BOOL bSub3DLRAltSBSOutput;
228*53ee8cc1Swenshuai.xi     MS_BOOL bSubIsHS;
229*53ee8cc1Swenshuai.xi     MS_U16  u16SubCropXStart;
230*53ee8cc1Swenshuai.xi     MS_U16  u16SubCropYStart;
231*53ee8cc1Swenshuai.xi     MS_U16  u16SubCropXSize;
232*53ee8cc1Swenshuai.xi     MS_U16  u16SubCropYSize;
233*53ee8cc1Swenshuai.xi     MS_BOOL bSubIsSetCrop;
234*53ee8cc1Swenshuai.xi     MS_BOOL bSubIsXcTrig;
235*53ee8cc1Swenshuai.xi     MS_U32 u32SubMVOPFixClk;
236*53ee8cc1Swenshuai.xi     MS_BOOL bIsSubEnable;
237*53ee8cc1Swenshuai.xi     MS_BOOL bSubIs2p;
238*53ee8cc1Swenshuai.xi     MVOP_OutputImodeType eSubInterlaceType;
239*53ee8cc1Swenshuai.xi     MS_BOOL bSubDramRdContd;
240*53ee8cc1Swenshuai.xi     MS_BOOL bSubIsEnLSB;
241*53ee8cc1Swenshuai.xi     MS_BOOL bSubIsMCUMfdec;
242*53ee8cc1Swenshuai.xi     MS_U8   u8SubLumaMIU;
243*53ee8cc1Swenshuai.xi     MS_U8   u8SubChromaMIU;
244*53ee8cc1Swenshuai.xi #endif
245*53ee8cc1Swenshuai.xi }MVOP_CTX_HAL;
246*53ee8cc1Swenshuai.xi 
247*53ee8cc1Swenshuai.xi static MVOP_CTX_HAL *g_pHalMVOPCtx = NULL;
248*53ee8cc1Swenshuai.xi static MS_VIRT u32RiuBaseAdd=0;
249*53ee8cc1Swenshuai.xi 
250*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX
251*53ee8cc1Swenshuai.xi     MVOP_CTX_HAL g_stmvopHalCtx;
252*53ee8cc1Swenshuai.xi #endif
253*53ee8cc1Swenshuai.xi #define RIU_MAP u32RiuBaseAdd  //obtained in init
254*53ee8cc1Swenshuai.xi 
255*53ee8cc1Swenshuai.xi #define RIU8    ((unsigned char  volatile *) RIU_MAP)
256*53ee8cc1Swenshuai.xi #define RIU16    ((MS_U16  volatile *) RIU_MAP)
257*53ee8cc1Swenshuai.xi #define MST_MACRO_START     do {
258*53ee8cc1Swenshuai.xi #define MST_MACRO_END       } while (0)
259*53ee8cc1Swenshuai.xi 
260*53ee8cc1Swenshuai.xi #define HAL_WriteByte( u32Reg, u8Val )                                                 \
261*53ee8cc1Swenshuai.xi     MST_MACRO_START                                                                     \
262*53ee8cc1Swenshuai.xi     if ( __builtin_constant_p( u32Reg ) )                                               \
263*53ee8cc1Swenshuai.xi     {                                                                                   \
264*53ee8cc1Swenshuai.xi         RIU8[((u32Reg) * 2) - ((u32Reg) & 1)] = u8Val;                                  \
265*53ee8cc1Swenshuai.xi     }                                                                                   \
266*53ee8cc1Swenshuai.xi     else                                                                                \
267*53ee8cc1Swenshuai.xi     {                                                                                   \
268*53ee8cc1Swenshuai.xi         RIU8[(u32Reg << 1) - (u32Reg & 1)] = u8Val;                                     \
269*53ee8cc1Swenshuai.xi     }                                                                                   \
270*53ee8cc1Swenshuai.xi     MST_MACRO_END
271*53ee8cc1Swenshuai.xi 
272*53ee8cc1Swenshuai.xi #define HAL_ReadByte( u32Reg )                                                         \
273*53ee8cc1Swenshuai.xi     (__builtin_constant_p( u32Reg ) ?                                                   \
274*53ee8cc1Swenshuai.xi         (((u32Reg) & 0x01) ? RIU8[(u32Reg) * 2 - 1] : RIU8[(u32Reg) * 2]) :             \
275*53ee8cc1Swenshuai.xi         (RIU8[(u32Reg << 1) - (u32Reg & 1)]))
276*53ee8cc1Swenshuai.xi 
277*53ee8cc1Swenshuai.xi #define HAL_Read2Byte( u32Reg )                                                         \
278*53ee8cc1Swenshuai.xi             (RIU16[u32Reg])
279*53ee8cc1Swenshuai.xi 
280*53ee8cc1Swenshuai.xi #define HAL_ReadRegBit( u32Reg, u8Mask )                                               \
281*53ee8cc1Swenshuai.xi         (RIU8[(u32Reg) * 2 - ((u32Reg) & 1)] & (u8Mask))
282*53ee8cc1Swenshuai.xi 
283*53ee8cc1Swenshuai.xi #define HAL_WriteRegBit( u32Reg, bEnable, u8Mask )                                     \
284*53ee8cc1Swenshuai.xi     MST_MACRO_START                                                                     \
285*53ee8cc1Swenshuai.xi     MS_U32 u32Reg8 = ((u32Reg) * 2) - ((u32Reg) & 1);                                   \
286*53ee8cc1Swenshuai.xi     RIU8[u32Reg8] = (bEnable) ? (RIU8[u32Reg8] |  (u8Mask)) :                           \
287*53ee8cc1Swenshuai.xi                                 (RIU8[u32Reg8] & ~(u8Mask));                            \
288*53ee8cc1Swenshuai.xi     MST_MACRO_END
289*53ee8cc1Swenshuai.xi 
290*53ee8cc1Swenshuai.xi #define HAL_WriteByteMask( u32Reg, u8Val, u8Msk )                                      \
291*53ee8cc1Swenshuai.xi     MST_MACRO_START                                                                     \
292*53ee8cc1Swenshuai.xi     MS_U32 u32Reg8 = ((u32Reg) * 2) - ((u32Reg) & 1);                                   \
293*53ee8cc1Swenshuai.xi     RIU8[u32Reg8] = (RIU8[u32Reg8] & ~(u8Msk)) | ((u8Val) & (u8Msk));                   \
294*53ee8cc1Swenshuai.xi     MST_MACRO_END
295*53ee8cc1Swenshuai.xi 
296*53ee8cc1Swenshuai.xi #define HAL_Write2Byte(u32Reg, u16Val)                                                       \
297*53ee8cc1Swenshuai.xi             RIU16[u32Reg] = u16Val;
298*53ee8cc1Swenshuai.xi 
299*53ee8cc1Swenshuai.xi #define HAL_Write2ByteMask( u32Reg, u16Val, u16Msk )                                      \
300*53ee8cc1Swenshuai.xi     MST_MACRO_START                                                                     \
301*53ee8cc1Swenshuai.xi     RIU16[u32Reg] = (RIU16[u32Reg] & ~(u16Msk)) | ((u16Val) & (u16Msk));              \
302*53ee8cc1Swenshuai.xi     MST_MACRO_END
303*53ee8cc1Swenshuai.xi #define SUB_REG(x)         (x-MVOP_REG_BASE+MVOP_SUB_REG_BASE)
304*53ee8cc1Swenshuai.xi 
305*53ee8cc1Swenshuai.xi #define _FUNC_NOT_USED()        do {} while ( 0 )
306*53ee8cc1Swenshuai.xi #ifndef UNUSED
307*53ee8cc1Swenshuai.xi #define UNUSED(x) (void)(x)
308*53ee8cc1Swenshuai.xi #endif
309*53ee8cc1Swenshuai.xi 
310*53ee8cc1Swenshuai.xi #define LOWBYTE(u16)            ((MS_U8)(u16))
311*53ee8cc1Swenshuai.xi #define HIGHBYTE(u16)           ((MS_U8)((u16) >> 8))
312*53ee8cc1Swenshuai.xi 
313*53ee8cc1Swenshuai.xi 
314*53ee8cc1Swenshuai.xi #define VOP_ON_MIU1                     ((HAL_ReadByte(0x12F9) & BIT2) == BIT2)
315*53ee8cc1Swenshuai.xi #define _MaskMiuReq_MVOP_R( m )         HAL_WriteRegBit(0x12C7, m, BIT2)
316*53ee8cc1Swenshuai.xi #define _MaskMiu1Req_MVOP_R( m )        HAL_WriteRegBit(0x06C7, m, BIT2)
317*53ee8cc1Swenshuai.xi 
318*53ee8cc1Swenshuai.xi #define HAL_MIU_SetReqMask( miu_clients, mask ) \
319*53ee8cc1Swenshuai.xi    do { \
320*53ee8cc1Swenshuai.xi        if (VOP_ON_MIU1 == 0) \
321*53ee8cc1Swenshuai.xi            _MaskMiuReq_##miu_clients( mask ); \
322*53ee8cc1Swenshuai.xi        else \
323*53ee8cc1Swenshuai.xi            _MaskMiu1Req_##miu_clients( mask ); \
324*53ee8cc1Swenshuai.xi    }while(0)
325*53ee8cc1Swenshuai.xi 
326*53ee8cc1Swenshuai.xi #define SUBVOP_ON_MIU1                  ((HAL_ReadByte(0x12F9) & BIT2) == BIT2)
327*53ee8cc1Swenshuai.xi #define _MaskMiuReq_SUBMVOP_R( m )         HAL_WriteRegBit(0x12C7, m, BIT2)
328*53ee8cc1Swenshuai.xi #define _MaskMiu1Req_SUBMVOP_R( m )        HAL_WriteRegBit(0x06C7, m, BIT2)
329*53ee8cc1Swenshuai.xi 
330*53ee8cc1Swenshuai.xi #define HAL_MIU_SubSetReqMask( miu_clients, mask ) \
331*53ee8cc1Swenshuai.xi    do { \
332*53ee8cc1Swenshuai.xi        if (SUBVOP_ON_MIU1 == 0) \
333*53ee8cc1Swenshuai.xi            _MaskMiuReq_##miu_clients( mask ); \
334*53ee8cc1Swenshuai.xi        else \
335*53ee8cc1Swenshuai.xi            _MaskMiu1Req_##miu_clients( mask ); \
336*53ee8cc1Swenshuai.xi    }while(0)
337*53ee8cc1Swenshuai.xi 
338*53ee8cc1Swenshuai.xi #define MVOP_DBG_ENABLE 0
339*53ee8cc1Swenshuai.xi #if MVOP_DBG_ENABLE
340*53ee8cc1Swenshuai.xi #define MVOP_DBG(fmt, args...)       MVOP_PRINTF(fmt, ##args)
341*53ee8cc1Swenshuai.xi #else
342*53ee8cc1Swenshuai.xi #define MVOP_DBG(fmt, args...)       {}
343*53ee8cc1Swenshuai.xi #endif
344*53ee8cc1Swenshuai.xi 
345*53ee8cc1Swenshuai.xi typedef enum
346*53ee8cc1Swenshuai.xi {
347*53ee8cc1Swenshuai.xi     E_MVOP_INIT_OK            = 0,
348*53ee8cc1Swenshuai.xi     E_MVOP_INIT_FAIL          = 1,
349*53ee8cc1Swenshuai.xi     E_MVOP_INIT_ALREADY_EXIST = 2
350*53ee8cc1Swenshuai.xi } MVOP_HalInitCtxResults;
351*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
352*53ee8cc1Swenshuai.xi //  Local Structures
353*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
354*53ee8cc1Swenshuai.xi 
355*53ee8cc1Swenshuai.xi 
356*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
357*53ee8cc1Swenshuai.xi //  Global Variables
358*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
359*53ee8cc1Swenshuai.xi 
360*53ee8cc1Swenshuai.xi #define Y_INFO 0
361*53ee8cc1Swenshuai.xi #define UV_INFO 1
362*53ee8cc1Swenshuai.xi 
363*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
364*53ee8cc1Swenshuai.xi //  Local Variables
365*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
366*53ee8cc1Swenshuai.xi 
367*53ee8cc1Swenshuai.xi 
368*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
369*53ee8cc1Swenshuai.xi //  Debug Functions
370*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
371*53ee8cc1Swenshuai.xi 
372*53ee8cc1Swenshuai.xi 
373*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
374*53ee8cc1Swenshuai.xi //  Local Functions
375*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
376*53ee8cc1Swenshuai.xi 
377*53ee8cc1Swenshuai.xi 
378*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
379*53ee8cc1Swenshuai.xi //  Global Functions
380*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
381*53ee8cc1Swenshuai.xi 
_HAL_MVOP_InitVarCtx(void)382*53ee8cc1Swenshuai.xi void _HAL_MVOP_InitVarCtx(void)
383*53ee8cc1Swenshuai.xi {
384*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bMirrorModeVer = 0;
385*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bMirrorModeHor = 0;
386*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bMirrorMode=0;
387*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bEnableFreerunMode = FALSE;
388*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->b3DLRMode=0;    /// 3D L/R dual buffer mode
389*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->b3DLRAltOutput = FALSE;    /// 3D L/R line alternative output
390*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->b3DLRAltSBSOutput = FALSE;
391*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bNewVSyncMode = FALSE;
392*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->eRepeatField = E_MVOP_RPTFLD_NONE;      /// mvop output repeating fields for single field input.
393*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->eMainRgbFmt = E_MVOP_RGB_NONE;
394*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsInit = 0;
395*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bRptPreVsync = 0;
396*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIs422 = 0;
397*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsH265 = 0;
398*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsHS = FALSE;
399*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16CropXStart = 0;
400*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16CropYStart = 0;
401*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16CropXSize = 0;
402*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16CropYSize = 0;
403*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsSetCrop = FALSE;
404*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsXcTrig = TRUE;
405*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u32MVOPFixClk = 0;
406*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsEnable = 0;
407*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIs2p = 0;
408*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->eInterlaceType = E_MVOP_PRO;
409*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16ECONum = 0;
410*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u8LumaMIU = 0;
411*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u8SubChromaMIU = 0;
412*53ee8cc1Swenshuai.xi }
413*53ee8cc1Swenshuai.xi 
_HAL_MVOP_SubInitVarCtx(void)414*53ee8cc1Swenshuai.xi void _HAL_MVOP_SubInitVarCtx(void)
415*53ee8cc1Swenshuai.xi {
416*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
417*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubMirrorModeVer = 0;
418*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubMirrorModeHor = 0;
419*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubMirrorMode=0;
420*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubEnableFreerunMode = FALSE;
421*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSub3DLRMode=0;
422*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubNewVSyncMode = FALSE;
423*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->eSubRepeatField = E_MVOP_RPTFLD_NONE;   /// mvop output repeating fields for single field input.
424*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->eSubRgbFmt = E_MVOP_RGB_NONE;
425*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsInit = 0;
426*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubRptPreVsync = 0;
427*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIs422 = 0;
428*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsH265 = 0;
429*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSub3DLRAltOutput = FALSE;    /// 3D L/R line alternative output
430*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSub3DLRAltSBSOutput = FALSE;
431*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsHS = FALSE;
432*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16SubCropXStart = 0;
433*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16SubCropYStart = 0;
434*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16SubCropXSize = 0;
435*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16SubCropYSize = 0;
436*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsSetCrop = FALSE;
437*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsXcTrig = TRUE;
438*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u32SubMVOPFixClk = 0;
439*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsSubEnable = 0;
440*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIs2p = 0;
441*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->eSubInterlaceType = E_MVOP_PRO;
442*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u8SubLumaMIU = 0;
443*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u8SubChromaMIU = 0;
444*53ee8cc1Swenshuai.xi #endif
445*53ee8cc1Swenshuai.xi }
446*53ee8cc1Swenshuai.xi 
_HAL_MVOP_InitContext(MS_BOOL * pbFirstDrvInstant)447*53ee8cc1Swenshuai.xi MVOP_HalInitCtxResults _HAL_MVOP_InitContext(MS_BOOL *pbFirstDrvInstant)
448*53ee8cc1Swenshuai.xi {
449*53ee8cc1Swenshuai.xi     MS_BOOL bNeedInitShared = FALSE;
450*53ee8cc1Swenshuai.xi 
451*53ee8cc1Swenshuai.xi //check first init by MsOS_SHM_GetId / MSOS_SHM_QUERY
452*53ee8cc1Swenshuai.xi #if 0
453*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx)
454*53ee8cc1Swenshuai.xi     {
455*53ee8cc1Swenshuai.xi         // The context instance has been created already
456*53ee8cc1Swenshuai.xi         // before somewhere sometime in the same process.
457*53ee8cc1Swenshuai.xi         *pbFirstDrvInstant = bNeedInitShared;
458*53ee8cc1Swenshuai.xi         //return E_MVOP_INIT_FAIL;
459*53ee8cc1Swenshuai.xi         return E_MVOP_INIT_OK;
460*53ee8cc1Swenshuai.xi     }
461*53ee8cc1Swenshuai.xi #endif
462*53ee8cc1Swenshuai.xi 
463*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
464*53ee8cc1Swenshuai.xi     MS_U32 u32ShmId;
465*53ee8cc1Swenshuai.xi     MS_VIRT u32Addr;
466*53ee8cc1Swenshuai.xi     MS_U32 u32BufSize;
467*53ee8cc1Swenshuai.xi 
468*53ee8cc1Swenshuai.xi     //MsOS_SHM_Init(); init in msos_init
469*53ee8cc1Swenshuai.xi     if (FALSE == MsOS_SHM_GetId((MS_U8*)"Linux MVOP HAL driver", sizeof(MVOP_CTX_HAL), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_QUERY))
470*53ee8cc1Swenshuai.xi     {
471*53ee8cc1Swenshuai.xi         if (FALSE == MsOS_SHM_GetId((MS_U8*)"Linux MVOP HAL driver", sizeof(MVOP_CTX_HAL), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_CREATE))
472*53ee8cc1Swenshuai.xi         {
473*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("MVOP: SHM allocation failed!\n");)
474*53ee8cc1Swenshuai.xi             return E_MVOP_INIT_FAIL;
475*53ee8cc1Swenshuai.xi         }
476*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("MVOP: [%s][%d] This is first initial 0x%08lx\n", __FUNCTION__, __LINE__, u32Addr);)
477*53ee8cc1Swenshuai.xi         memset( (MS_U8*)u32Addr, 0, sizeof(MVOP_CTX_HAL));
478*53ee8cc1Swenshuai.xi         bNeedInitShared = TRUE;
479*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx = (MVOP_CTX_HAL*)u32Addr;
480*53ee8cc1Swenshuai.xi         _HAL_MVOP_InitVarCtx();
481*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
482*53ee8cc1Swenshuai.xi         _HAL_MVOP_SubInitVarCtx();
483*53ee8cc1Swenshuai.xi #endif
484*53ee8cc1Swenshuai.xi     }
485*53ee8cc1Swenshuai.xi     else
486*53ee8cc1Swenshuai.xi     {
487*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx = (MVOP_CTX_HAL*)u32Addr;
488*53ee8cc1Swenshuai.xi         bNeedInitShared = FALSE;
489*53ee8cc1Swenshuai.xi         *pbFirstDrvInstant = bNeedInitShared;
490*53ee8cc1Swenshuai.xi 
491*53ee8cc1Swenshuai.xi         return E_MVOP_INIT_ALREADY_EXIST;
492*53ee8cc1Swenshuai.xi     }
493*53ee8cc1Swenshuai.xi #else
494*53ee8cc1Swenshuai.xi       g_pHalMVOPCtx =  &g_stmvopHalCtx;
495*53ee8cc1Swenshuai.xi       bNeedInitShared = TRUE;
496*53ee8cc1Swenshuai.xi #endif
497*53ee8cc1Swenshuai.xi       *pbFirstDrvInstant = bNeedInitShared;
498*53ee8cc1Swenshuai.xi 
499*53ee8cc1Swenshuai.xi     if (bNeedInitShared)
500*53ee8cc1Swenshuai.xi     {
501*53ee8cc1Swenshuai.xi         memset(g_pHalMVOPCtx, 0, sizeof(*g_pHalMVOPCtx));
502*53ee8cc1Swenshuai.xi     }
503*53ee8cc1Swenshuai.xi 
504*53ee8cc1Swenshuai.xi       return E_MVOP_INIT_OK;
505*53ee8cc1Swenshuai.xi }
506*53ee8cc1Swenshuai.xi 
_HAL_MVOP_IsSupport4k2k2P(void)507*53ee8cc1Swenshuai.xi MS_BOOL _HAL_MVOP_IsSupport4k2k2P(void)
508*53ee8cc1Swenshuai.xi {
509*53ee8cc1Swenshuai.xi     return TRUE;
510*53ee8cc1Swenshuai.xi }
511*53ee8cc1Swenshuai.xi 
HAL_MVOP_RegSetBase(MS_VIRT u32Base)512*53ee8cc1Swenshuai.xi void HAL_MVOP_RegSetBase(MS_VIRT u32Base)
513*53ee8cc1Swenshuai.xi {
514*53ee8cc1Swenshuai.xi     u32RiuBaseAdd = u32Base;
515*53ee8cc1Swenshuai.xi }
516*53ee8cc1Swenshuai.xi 
HAL_MVOP_InitMirrorMode(MS_BOOL bMir)517*53ee8cc1Swenshuai.xi void HAL_MVOP_InitMirrorMode(MS_BOOL bMir)
518*53ee8cc1Swenshuai.xi {
519*53ee8cc1Swenshuai.xi     //set bit[3:7] to support mirror mode
520*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG, bMir, VOP_MIRROR_CFG_ENABLE);
521*53ee8cc1Swenshuai.xi }
522*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetVerticalMirrorMode(MS_BOOL bEnable)523*53ee8cc1Swenshuai.xi void HAL_MVOP_SetVerticalMirrorMode(MS_BOOL bEnable)
524*53ee8cc1Swenshuai.xi {
525*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
526*53ee8cc1Swenshuai.xi     {
527*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
528*53ee8cc1Swenshuai.xi         return;
529*53ee8cc1Swenshuai.xi     }
530*53ee8cc1Swenshuai.xi 
531*53ee8cc1Swenshuai.xi     if (VOP_MIRROR_CFG_ENABLE != HAL_ReadRegBit(VOP_MIRROR_CFG, VOP_MIRROR_CFG_ENABLE))
532*53ee8cc1Swenshuai.xi     {
533*53ee8cc1Swenshuai.xi         //MVOP_PRINTF("Setup mirror mode\n");
534*53ee8cc1Swenshuai.xi         HAL_MVOP_InitMirrorMode(TRUE);
535*53ee8cc1Swenshuai.xi     }
536*53ee8cc1Swenshuai.xi 
537*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG, bEnable, VOP_MIRROR_CFG_VEN);
538*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bMirrorModeVer = bEnable;
539*53ee8cc1Swenshuai.xi }
540*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetHorizontallMirrorMode(MS_BOOL bEnable)541*53ee8cc1Swenshuai.xi void HAL_MVOP_SetHorizontallMirrorMode(MS_BOOL bEnable)
542*53ee8cc1Swenshuai.xi {
543*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
544*53ee8cc1Swenshuai.xi     {
545*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
546*53ee8cc1Swenshuai.xi         return;
547*53ee8cc1Swenshuai.xi     }
548*53ee8cc1Swenshuai.xi 
549*53ee8cc1Swenshuai.xi     if (VOP_MIRROR_CFG_ENABLE != HAL_ReadRegBit(VOP_MIRROR_CFG, VOP_MIRROR_CFG_ENABLE))
550*53ee8cc1Swenshuai.xi     {
551*53ee8cc1Swenshuai.xi         //MVOP_PRINTF("Setup mirror mode\n");
552*53ee8cc1Swenshuai.xi         HAL_MVOP_InitMirrorMode(TRUE);
553*53ee8cc1Swenshuai.xi     }
554*53ee8cc1Swenshuai.xi 
555*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG, bEnable, VOP_MIRROR_CFG_HEN);
556*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bMirrorModeHor = bEnable;
557*53ee8cc1Swenshuai.xi }
558*53ee8cc1Swenshuai.xi 
HAL_MVOP_Init(void)559*53ee8cc1Swenshuai.xi void HAL_MVOP_Init(void)
560*53ee8cc1Swenshuai.xi {
561*53ee8cc1Swenshuai.xi     MVOP_HalInitCtxResults eRet;
562*53ee8cc1Swenshuai.xi     MS_BOOL pbFirstDrvInstant;
563*53ee8cc1Swenshuai.xi 
564*53ee8cc1Swenshuai.xi     eRet = _HAL_MVOP_InitContext(&pbFirstDrvInstant);
565*53ee8cc1Swenshuai.xi     if(eRet == E_MVOP_INIT_FAIL)
566*53ee8cc1Swenshuai.xi     {
567*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("[%s] MVOP Context Init failed!\n",__FUNCTION__);)
568*53ee8cc1Swenshuai.xi         return;
569*53ee8cc1Swenshuai.xi     }
570*53ee8cc1Swenshuai.xi     else if(eRet == E_MVOP_INIT_ALREADY_EXIST)
571*53ee8cc1Swenshuai.xi     {
572*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->bIsInit)
573*53ee8cc1Swenshuai.xi         {
574*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("[%s] Main MVOP Context has Initialized!\n",__FUNCTION__);)
575*53ee8cc1Swenshuai.xi             return;
576*53ee8cc1Swenshuai.xi         }
577*53ee8cc1Swenshuai.xi     }
578*53ee8cc1Swenshuai.xi 
579*53ee8cc1Swenshuai.xi     HAL_MVOP_InitMirrorMode(TRUE);
580*53ee8cc1Swenshuai.xi     //Enable dynamic clock gating
581*53ee8cc1Swenshuai.xi     //Note: cannot enable VOP_GCLK_VCLK_ON, or hsync cannot be sent out.
582*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_GCLK, VOP_GCLK_MIU_ON, VOP_GCLK_MIU_ON|VOP_GCLK_VCLK_ON);
583*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsInit = 1;
584*53ee8cc1Swenshuai.xi }
585*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetFieldInverse(MS_BOOL b2MVD,MS_BOOL b2IP)586*53ee8cc1Swenshuai.xi void HAL_MVOP_SetFieldInverse(MS_BOOL b2MVD, MS_BOOL b2IP)
587*53ee8cc1Swenshuai.xi {
588*53ee8cc1Swenshuai.xi     // Set fld inv & ofld_inv
589*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL0+1, b2MVD, BIT3); //inverse the field to MVD
590*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL0+1, b2IP, BIT4);  //inverse the field to IP
591*53ee8cc1Swenshuai.xi }
592*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetChromaWeighting(MS_BOOL bEnable)593*53ee8cc1Swenshuai.xi void HAL_MVOP_SetChromaWeighting(MS_BOOL bEnable)
594*53ee8cc1Swenshuai.xi {
595*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WEIGHT_CTRL, bEnable, BIT1);
596*53ee8cc1Swenshuai.xi }
597*53ee8cc1Swenshuai.xi 
598*53ee8cc1Swenshuai.xi //load new value into active registers 0x20-0x26
HAL_MVOP_LoadReg(void)599*53ee8cc1Swenshuai.xi void HAL_MVOP_LoadReg(void)
600*53ee8cc1Swenshuai.xi {
601*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, 1, BIT0);
602*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, 0, BIT0);
603*53ee8cc1Swenshuai.xi 
604*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, 1, BIT4);
605*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, 0, BIT4);
606*53ee8cc1Swenshuai.xi }
607*53ee8cc1Swenshuai.xi 
608*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetMIUReqMask(MS_BOOL bEnable)609*53ee8cc1Swenshuai.xi void HAL_MVOP_SetMIUReqMask(MS_BOOL bEnable)
610*53ee8cc1Swenshuai.xi {
611*53ee8cc1Swenshuai.xi #if 0   //[FIXME]
612*53ee8cc1Swenshuai.xi     if (bEnable)
613*53ee8cc1Swenshuai.xi     {   // mask MVOP2MI to protect MIU
614*53ee8cc1Swenshuai.xi         HAL_MIU_SetReqMask(MVOP_R, 1);
615*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
616*53ee8cc1Swenshuai.xi     }
617*53ee8cc1Swenshuai.xi     else
618*53ee8cc1Swenshuai.xi     {   // unmask MVOP2MI
619*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
620*53ee8cc1Swenshuai.xi         HAL_MIU_SetReqMask(MVOP_R, 0);
621*53ee8cc1Swenshuai.xi     }
622*53ee8cc1Swenshuai.xi #endif
623*53ee8cc1Swenshuai.xi     MS_U8 u8Miu;
624*53ee8cc1Swenshuai.xi 
625*53ee8cc1Swenshuai.xi     if(HAL_MVOP_GetIsOnlyMiuIPControl() == TRUE)
626*53ee8cc1Swenshuai.xi     {
627*53ee8cc1Swenshuai.xi         // mask msb mvop
628*53ee8cc1Swenshuai.xi         u8Miu = (HAL_ReadByte(VOP_MIU_SEL) & VOP_MSB_BUF0_MIU_SEL) >> 4;
629*53ee8cc1Swenshuai.xi     }
630*53ee8cc1Swenshuai.xi     else
631*53ee8cc1Swenshuai.xi     {
632*53ee8cc1Swenshuai.xi         u8Miu = VOP_ON_MIU1;
633*53ee8cc1Swenshuai.xi     }
634*53ee8cc1Swenshuai.xi     eMIUClientID eClientID = MIU_CLIENT_MVOP_128BIT_R;
635*53ee8cc1Swenshuai.xi     //MVOP_PRINTF("Enter %s bEnable=%x ReqMask=0x%x, 0x%x\n", __FUNCTION__, bEnable,
636*53ee8cc1Swenshuai.xi     //    HAL_ReadByte(0x1266), HAL_ReadByte(0x0666));
637*53ee8cc1Swenshuai.xi     if (bEnable)
638*53ee8cc1Swenshuai.xi     {   // mask MVOP2MI to protect MIU
639*53ee8cc1Swenshuai.xi         MDrv_MIU_MaskReq(u8Miu,eClientID);
640*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
641*53ee8cc1Swenshuai.xi     }
642*53ee8cc1Swenshuai.xi     else
643*53ee8cc1Swenshuai.xi     {   // unmask MVOP2MI
644*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
645*53ee8cc1Swenshuai.xi         MDrv_MIU_UnMaskReq(u8Miu,eClientID);
646*53ee8cc1Swenshuai.xi     }
647*53ee8cc1Swenshuai.xi 
648*53ee8cc1Swenshuai.xi     //MVOP_PRINTF(">Exit %s bEnable=%x ReqMask=0x%x, 0x%x\n", __FUNCTION__, bEnable,
649*53ee8cc1Swenshuai.xi     //    HAL_ReadByte(0x1266), HAL_ReadByte(0x0666));
650*53ee8cc1Swenshuai.xi }
651*53ee8cc1Swenshuai.xi 
HAL_MVOP_Rst(void)652*53ee8cc1Swenshuai.xi void HAL_MVOP_Rst(void)
653*53ee8cc1Swenshuai.xi {
654*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL0, 0, BIT0);
655*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL0, 1, BIT0);
656*53ee8cc1Swenshuai.xi 
657*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL0, 0, BIT4);
658*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL0, 1, BIT4);
659*53ee8cc1Swenshuai.xi 
660*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsEnable = 1;
661*53ee8cc1Swenshuai.xi }
662*53ee8cc1Swenshuai.xi 
HAL_MVOP_Enable(MS_BOOL bEnable,MS_U8 u8Framerate)663*53ee8cc1Swenshuai.xi void HAL_MVOP_Enable(MS_BOOL bEnable, MS_U8 u8Framerate)
664*53ee8cc1Swenshuai.xi {
665*53ee8cc1Swenshuai.xi     MS_U8 regval;
666*53ee8cc1Swenshuai.xi 
667*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(VOP_CTRL0);
668*53ee8cc1Swenshuai.xi 
669*53ee8cc1Swenshuai.xi     if ( bEnable )
670*53ee8cc1Swenshuai.xi     {
671*53ee8cc1Swenshuai.xi         regval |= 0x1;
672*53ee8cc1Swenshuai.xi     }
673*53ee8cc1Swenshuai.xi     else
674*53ee8cc1Swenshuai.xi     {
675*53ee8cc1Swenshuai.xi         regval &= ~0x1;
676*53ee8cc1Swenshuai.xi     }
677*53ee8cc1Swenshuai.xi 
678*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsEnable = bEnable;
679*53ee8cc1Swenshuai.xi 
680*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_CTRL0, regval);
681*53ee8cc1Swenshuai.xi }
682*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetEnableState(void)683*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetEnableState(void)
684*53ee8cc1Swenshuai.xi {
685*53ee8cc1Swenshuai.xi     return (HAL_ReadRegBit(VOP_CTRL0, BIT0));
686*53ee8cc1Swenshuai.xi }
687*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetMaxFreerunClk(void)688*53ee8cc1Swenshuai.xi HALMVOPFREQUENCY HAL_MVOP_GetMaxFreerunClk(void)
689*53ee8cc1Swenshuai.xi {
690*53ee8cc1Swenshuai.xi     return HALMVOP_160MHZ;
691*53ee8cc1Swenshuai.xi }
692*53ee8cc1Swenshuai.xi 
HAL_MVOP_Get4k2kClk(void)693*53ee8cc1Swenshuai.xi HALMVOPFREQUENCY HAL_MVOP_Get4k2kClk(void)
694*53ee8cc1Swenshuai.xi {
695*53ee8cc1Swenshuai.xi     return HALMVOP_320MHZ;
696*53ee8cc1Swenshuai.xi }
697*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetFrequency(HALMVOPFREQUENCY enFrequency)698*53ee8cc1Swenshuai.xi void HAL_MVOP_SetFrequency(HALMVOPFREQUENCY enFrequency)
699*53ee8cc1Swenshuai.xi {
700*53ee8cc1Swenshuai.xi     // clear
701*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(REG_CKG_DC0, 0, CKG_DC0_MASK);
702*53ee8cc1Swenshuai.xi     switch(enFrequency)
703*53ee8cc1Swenshuai.xi     {
704*53ee8cc1Swenshuai.xi         case HALMVOP_SYNCMODE:
705*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_SYNCHRONOUS, CKG_DC0_MASK);
706*53ee8cc1Swenshuai.xi             break;
707*53ee8cc1Swenshuai.xi         case HALMVOP_FREERUNMODE:
708*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_FREERUN, CKG_DC0_MASK);
709*53ee8cc1Swenshuai.xi             break;
710*53ee8cc1Swenshuai.xi         case HALMVOP_320MHZ:
711*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_320MHZ, CKG_DC0_MASK);
712*53ee8cc1Swenshuai.xi             break;
713*53ee8cc1Swenshuai.xi         case HALMVOP_108MHZ:
714*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_108MHZ, CKG_DC0_MASK);
715*53ee8cc1Swenshuai.xi             break;
716*53ee8cc1Swenshuai.xi         case HALMVOP_123MHZ:
717*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_123MHZ, CKG_DC0_MASK);
718*53ee8cc1Swenshuai.xi             break;
719*53ee8cc1Swenshuai.xi         case HALMVOP_144MHZ:
720*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_144MHZ, CKG_DC0_MASK);
721*53ee8cc1Swenshuai.xi             break;
722*53ee8cc1Swenshuai.xi         case HALMVOP_160MHZ:
723*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_160MHZ, CKG_DC0_MASK);
724*53ee8cc1Swenshuai.xi             break;
725*53ee8cc1Swenshuai.xi         case HALMVOP_192MHZ:
726*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_192MHZ, CKG_DC0_MASK);
727*53ee8cc1Swenshuai.xi             break;
728*53ee8cc1Swenshuai.xi         default:
729*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_160MHZ, CKG_DC0_MASK);
730*53ee8cc1Swenshuai.xi             MVOP_PRINTF("Attention! In HAL_MVOP_SetFrequency default 160MHz!\n");
731*53ee8cc1Swenshuai.xi             break;
732*53ee8cc1Swenshuai.xi     }
733*53ee8cc1Swenshuai.xi }
734*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetMaximumClk(void)735*53ee8cc1Swenshuai.xi HALMVOPFREQUENCY HAL_MVOP_GetMaximumClk(void)
736*53ee8cc1Swenshuai.xi {
737*53ee8cc1Swenshuai.xi     return HALMVOP_320MHZ;
738*53ee8cc1Swenshuai.xi }
739*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetCurrentClk(void)740*53ee8cc1Swenshuai.xi HALMVOPFREQUENCY HAL_MVOP_GetCurrentClk(void)
741*53ee8cc1Swenshuai.xi {
742*53ee8cc1Swenshuai.xi     MS_U8 u8DC0Clk;
743*53ee8cc1Swenshuai.xi     HALMVOPFREQUENCY mvopFreq;
744*53ee8cc1Swenshuai.xi 
745*53ee8cc1Swenshuai.xi     u8DC0Clk = HAL_ReadByte(REG_CKG_DC0)&CKG_DC0_MASK;
746*53ee8cc1Swenshuai.xi 
747*53ee8cc1Swenshuai.xi     switch(u8DC0Clk)
748*53ee8cc1Swenshuai.xi     {
749*53ee8cc1Swenshuai.xi         case CKG_DC0_SYNCHRONOUS:
750*53ee8cc1Swenshuai.xi             mvopFreq = HALMVOP_SYNCMODE;
751*53ee8cc1Swenshuai.xi             break;
752*53ee8cc1Swenshuai.xi         case CKG_DC0_FREERUN:
753*53ee8cc1Swenshuai.xi             mvopFreq = HALMVOP_FREERUNMODE;
754*53ee8cc1Swenshuai.xi             break;
755*53ee8cc1Swenshuai.xi         case CKG_DC0_144MHZ:
756*53ee8cc1Swenshuai.xi             mvopFreq = HALMVOP_144MHZ;
757*53ee8cc1Swenshuai.xi             break;
758*53ee8cc1Swenshuai.xi         case CKG_DC0_160MHZ:
759*53ee8cc1Swenshuai.xi             mvopFreq = HALMVOP_160MHZ;
760*53ee8cc1Swenshuai.xi             break;
761*53ee8cc1Swenshuai.xi         case CKG_DC0_320MHZ:
762*53ee8cc1Swenshuai.xi             mvopFreq = HALMVOP_320MHZ;
763*53ee8cc1Swenshuai.xi             break;
764*53ee8cc1Swenshuai.xi         default:
765*53ee8cc1Swenshuai.xi             mvopFreq = 0;
766*53ee8cc1Swenshuai.xi             break;
767*53ee8cc1Swenshuai.xi     }
768*53ee8cc1Swenshuai.xi     return mvopFreq;
769*53ee8cc1Swenshuai.xi }
770*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetOutputInterlace(MS_BOOL bEnable,MS_U16 u16ECOVersion)771*53ee8cc1Swenshuai.xi void HAL_MVOP_SetOutputInterlace(MS_BOOL bEnable, MS_U16 u16ECOVersion)
772*53ee8cc1Swenshuai.xi {
773*53ee8cc1Swenshuai.xi     MS_U8 regval;
774*53ee8cc1Swenshuai.xi 
775*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(VOP_CTRL0);
776*53ee8cc1Swenshuai.xi 
777*53ee8cc1Swenshuai.xi     if ( bEnable )
778*53ee8cc1Swenshuai.xi     {
779*53ee8cc1Swenshuai.xi         regval |= 0x80;
780*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_BW_SAVE, 0, VOP_420_BW_SAVE_EX);
781*53ee8cc1Swenshuai.xi         if(u16ECOVersion == 0)
782*53ee8cc1Swenshuai.xi         {
783*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC_SRAM, 0x4, CKG_DC0_SRAM);//Dc0 enable & dc0_mfdec_en =0  57[3:0]= 0x4, others  57[3:0]=0x0
784*53ee8cc1Swenshuai.xi         }
785*53ee8cc1Swenshuai.xi     }
786*53ee8cc1Swenshuai.xi     else
787*53ee8cc1Swenshuai.xi     {
788*53ee8cc1Swenshuai.xi         regval &= ~0x80;
789*53ee8cc1Swenshuai.xi     }
790*53ee8cc1Swenshuai.xi     //Kano patch for GOP
791*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_TST_IMG, bEnable, VOP_SC_VS_INV);
792*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_CTRL0, regval);
793*53ee8cc1Swenshuai.xi }
794*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetPattern(MVOP_Pattern enMVOPPattern)795*53ee8cc1Swenshuai.xi void HAL_MVOP_SetPattern(MVOP_Pattern enMVOPPattern)
796*53ee8cc1Swenshuai.xi {
797*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_TST_IMG, enMVOPPattern, BIT2 | BIT1 | BIT0);
798*53ee8cc1Swenshuai.xi }
799*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetTileFormat(MVOP_TileFormat eTileFmt)800*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SetTileFormat(MVOP_TileFormat eTileFmt)
801*53ee8cc1Swenshuai.xi {
802*53ee8cc1Swenshuai.xi     if (eTileFmt == E_MVOP_TILE_8x32)
803*53ee8cc1Swenshuai.xi     {
804*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_WR, 0, BIT1);
805*53ee8cc1Swenshuai.xi         return TRUE;
806*53ee8cc1Swenshuai.xi     }
807*53ee8cc1Swenshuai.xi     else if (eTileFmt == E_MVOP_TILE_16x32)
808*53ee8cc1Swenshuai.xi     {
809*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_WR, 1, BIT1);
810*53ee8cc1Swenshuai.xi         return TRUE;
811*53ee8cc1Swenshuai.xi     }
812*53ee8cc1Swenshuai.xi     else if (eTileFmt == E_MVOP_TILE_32x16)
813*53ee8cc1Swenshuai.xi     {
814*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_WR, 0, BIT1);
815*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_INPUT_SWITCH0, 1, EVD_ENABLE);
816*53ee8cc1Swenshuai.xi         return TRUE;
817*53ee8cc1Swenshuai.xi     }
818*53ee8cc1Swenshuai.xi     else if (eTileFmt == E_MVOP_TILE_32x32)
819*53ee8cc1Swenshuai.xi     {
820*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_WR, 0, BIT1);
821*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_INPUT_SWITCH0, 0, EVD_ENABLE);
822*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_INPUT_SWITCH0, 1, VOP_TILE_32x32);
823*53ee8cc1Swenshuai.xi         return TRUE;
824*53ee8cc1Swenshuai.xi     }
825*53ee8cc1Swenshuai.xi     else
826*53ee8cc1Swenshuai.xi     {
827*53ee8cc1Swenshuai.xi         return FALSE;
828*53ee8cc1Swenshuai.xi     }
829*53ee8cc1Swenshuai.xi }
830*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetSupportRgbFormat(MVOP_RgbFormat eRgbFmt)831*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetSupportRgbFormat(MVOP_RgbFormat eRgbFmt)
832*53ee8cc1Swenshuai.xi {
833*53ee8cc1Swenshuai.xi     if ((eRgbFmt == E_MVOP_RGB_565) || (eRgbFmt == E_MVOP_RGB_888))
834*53ee8cc1Swenshuai.xi     {
835*53ee8cc1Swenshuai.xi         return TRUE;
836*53ee8cc1Swenshuai.xi     }
837*53ee8cc1Swenshuai.xi     return FALSE;
838*53ee8cc1Swenshuai.xi }
839*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetRgbFormat(MVOP_RgbFormat eRgbFmt)840*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SetRgbFormat(MVOP_RgbFormat eRgbFmt)
841*53ee8cc1Swenshuai.xi {
842*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
843*53ee8cc1Swenshuai.xi 
844*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
845*53ee8cc1Swenshuai.xi     {
846*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
847*53ee8cc1Swenshuai.xi         return FALSE;
848*53ee8cc1Swenshuai.xi     }
849*53ee8cc1Swenshuai.xi 
850*53ee8cc1Swenshuai.xi     if (eRgbFmt == E_MVOP_RGB_NONE)
851*53ee8cc1Swenshuai.xi     {
852*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_RGB_FMT, 0, VOP_RGB_FMT_SEL);
853*53ee8cc1Swenshuai.xi         bRet = TRUE;
854*53ee8cc1Swenshuai.xi     }
855*53ee8cc1Swenshuai.xi     else if (eRgbFmt == E_MVOP_RGB_565)
856*53ee8cc1Swenshuai.xi     {
857*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_RGB_FMT, VOP_RGB_FMT_565, VOP_RGB_FMT_SEL);
858*53ee8cc1Swenshuai.xi         bRet = TRUE;
859*53ee8cc1Swenshuai.xi     }
860*53ee8cc1Swenshuai.xi     else if (eRgbFmt == E_MVOP_RGB_888)
861*53ee8cc1Swenshuai.xi     {
862*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_RGB_FMT, VOP_RGB_FMT_888, VOP_RGB_FMT_SEL);
863*53ee8cc1Swenshuai.xi         bRet = TRUE;
864*53ee8cc1Swenshuai.xi     }
865*53ee8cc1Swenshuai.xi 
866*53ee8cc1Swenshuai.xi     if (bRet == TRUE)
867*53ee8cc1Swenshuai.xi     {
868*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->eMainRgbFmt = eRgbFmt;
869*53ee8cc1Swenshuai.xi     }
870*53ee8cc1Swenshuai.xi     return bRet;
871*53ee8cc1Swenshuai.xi }
872*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetBlackBG(void)873*53ee8cc1Swenshuai.xi void HAL_MVOP_SetBlackBG(void)
874*53ee8cc1Swenshuai.xi {
875*53ee8cc1Swenshuai.xi     MS_U8 regval;
876*53ee8cc1Swenshuai.xi 
877*53ee8cc1Swenshuai.xi     //set MVOP test pattern to black
878*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_TST_IMG + 1), 0x10);
879*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_U_PAT      , 0x80);
880*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_U_PAT   + 1), 0x80);
881*53ee8cc1Swenshuai.xi 
882*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(VOP_TST_IMG);
883*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_TST_IMG, 0x02, BIT2 | BIT1 | BIT0);
884*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_TST_IMG, 0x00, BIT2 | BIT1 | BIT0);
885*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_TST_IMG, regval, BIT2 | BIT1 | BIT0);
886*53ee8cc1Swenshuai.xi }
887*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetCropWindow(MVOP_InputCfg * pparam)888*53ee8cc1Swenshuai.xi void HAL_MVOP_SetCropWindow(MVOP_InputCfg *pparam)
889*53ee8cc1Swenshuai.xi {
890*53ee8cc1Swenshuai.xi #if 1
891*53ee8cc1Swenshuai.xi     UNUSED(pparam);
892*53ee8cc1Swenshuai.xi #else // enable it when test code is ready
893*53ee8cc1Swenshuai.xi     MS_U32 x, y;
894*53ee8cc1Swenshuai.xi     MS_U32 u32offset;
895*53ee8cc1Swenshuai.xi 
896*53ee8cc1Swenshuai.xi     if(!pparam)
897*53ee8cc1Swenshuai.xi     {
898*53ee8cc1Swenshuai.xi         return;
899*53ee8cc1Swenshuai.xi     }
900*53ee8cc1Swenshuai.xi     //set MVOP test pattern to black
901*53ee8cc1Swenshuai.xi     HAL_MVOP_SetBlackBG();
902*53ee8cc1Swenshuai.xi #if 0
903*53ee8cc1Swenshuai.xi     if((pparam->enVideoType == MVOP_H264) && (pparam->u16StripSize == 1920))
904*53ee8cc1Swenshuai.xi     {
905*53ee8cc1Swenshuai.xi         pparam->u16StripSize = 1952;
906*53ee8cc1Swenshuai.xi     }
907*53ee8cc1Swenshuai.xi #endif
908*53ee8cc1Swenshuai.xi     if((pparam->enVideoType == MVOP_MPG) || (pparam->enVideoType == MVOP_MPEG4))
909*53ee8cc1Swenshuai.xi     {
910*53ee8cc1Swenshuai.xi         pparam->u16CropX = (pparam->u16CropX >> 3) << 3; // 8 bytes align
911*53ee8cc1Swenshuai.xi         pparam->u16CropY = (pparam->u16CropY >> 6) << 6; // 64 bytes align
912*53ee8cc1Swenshuai.xi     }
913*53ee8cc1Swenshuai.xi     else if((pparam->enVideoType == MVOP_H264) || (pparam->enVideoType == MVOP_RM))
914*53ee8cc1Swenshuai.xi     {
915*53ee8cc1Swenshuai.xi         pparam->u16CropX = (pparam->u16CropX >> 4) << 4; // 16 bytes align
916*53ee8cc1Swenshuai.xi         pparam->u16CropY = (pparam->u16CropY >> 6) << 6; // 64 bytes align
917*53ee8cc1Swenshuai.xi     }
918*53ee8cc1Swenshuai.xi     else
919*53ee8cc1Swenshuai.xi     {
920*53ee8cc1Swenshuai.xi         MS_ASSERT(0);
921*53ee8cc1Swenshuai.xi     }
922*53ee8cc1Swenshuai.xi 
923*53ee8cc1Swenshuai.xi     x = (MS_U32)pparam->u16CropX;
924*53ee8cc1Swenshuai.xi     y = (MS_U32)pparam->u16CropY;
925*53ee8cc1Swenshuai.xi 
926*53ee8cc1Swenshuai.xi     // y offset
927*53ee8cc1Swenshuai.xi     u32offset = ((y * pparam->u16StripSize + (x << 5)) >> 3);
928*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_L    ), (MS_U8)(u32offset));
929*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_L + 1), (MS_U8)(u32offset >> 8));
930*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_H    ), (MS_U8)(u32offset >> 16));
931*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_H + 1), (MS_U8)((u32offset >> 24) & VOP_YUV_STR_HIBITS));
932*53ee8cc1Swenshuai.xi 
933*53ee8cc1Swenshuai.xi     // uv offset
934*53ee8cc1Swenshuai.xi     u32offset = ((y >> 1) * pparam->u16StripSize + (x << 5)) >> 3;
935*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_UVSTR0_L    ), (MS_U8)(u32offset));
936*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_UVSTR0_L + 1), (MS_U8)(u32offset >> 8));
937*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_UVSTR0_H    ), (MS_U8)(u32offset >> 16));
938*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_UVSTR0_H + 1), (MS_U8)((u32offset >> 24) & VOP_YUV_STR_HIBITS));
939*53ee8cc1Swenshuai.xi 
940*53ee8cc1Swenshuai.xi     pparam->u16CropWidth= (pparam->u16CropWidth >> 3) << 3;
941*53ee8cc1Swenshuai.xi     // HSize, VSize
942*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_HSIZE    ), LOWBYTE(pparam->u16CropWidth ));
943*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_HSIZE + 1), HIGHBYTE(pparam->u16CropWidth ));
944*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_VSIZE    ), LOWBYTE(pparam->u16CropHeight));
945*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_VSIZE + 1), HIGHBYTE(pparam->u16CropHeight ));
946*53ee8cc1Swenshuai.xi 
947*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_MPG_JPG_SWITCH, BIT0, BIT1|BIT0);
948*53ee8cc1Swenshuai.xi 
949*53ee8cc1Swenshuai.xi     // clear extend strip len bit by default
950*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
951*53ee8cc1Swenshuai.xi     if((pparam->enVideoType == MVOP_MPG) || (pparam->enVideoType == MVOP_MPEG4))
952*53ee8cc1Swenshuai.xi     {
953*53ee8cc1Swenshuai.xi         // Disable H264 or RM Input
954*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_INPUT_SWITCH1, 0, BIT2|BIT3);
955*53ee8cc1Swenshuai.xi         //8*32 tile format
956*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_WR, 0, BIT1);
957*53ee8cc1Swenshuai.xi     }
958*53ee8cc1Swenshuai.xi     else if((pparam->enVideoType == MVOP_H264) || (pparam->enVideoType == MVOP_RM))
959*53ee8cc1Swenshuai.xi     {
960*53ee8cc1Swenshuai.xi         //16*32 tile format
961*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_WR, 1, BIT1);
962*53ee8cc1Swenshuai.xi         // SVD mode enable
963*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_INPUT_SWITCH1, BIT3, BIT2|BIT3);
964*53ee8cc1Swenshuai.xi         // set mvop to 64bit interface
965*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_MIU_IF, VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
966*53ee8cc1Swenshuai.xi     }
967*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
968*53ee8cc1Swenshuai.xi #endif
969*53ee8cc1Swenshuai.xi }
970*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetRepeatField(MVOP_RptFldMode eMode)971*53ee8cc1Swenshuai.xi void HAL_MVOP_SetRepeatField(MVOP_RptFldMode eMode)
972*53ee8cc1Swenshuai.xi {
973*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
974*53ee8cc1Swenshuai.xi     {
975*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
976*53ee8cc1Swenshuai.xi         return;
977*53ee8cc1Swenshuai.xi     }
978*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->eRepeatField = eMode;
979*53ee8cc1Swenshuai.xi }
980*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetFDMaskFromMVD(MS_BOOL bEnable)981*53ee8cc1Swenshuai.xi void HAL_MVOP_SetFDMaskFromMVD(MS_BOOL bEnable)
982*53ee8cc1Swenshuai.xi {
983*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_FD_MASK_SEL, bEnable, BIT5); //FD MASK from MVD
984*53ee8cc1Swenshuai.xi }
985*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetInputMode(VOPINPUTMODE mode,MVOP_InputCfg * pparam,MS_U16 u16ECOVersion)986*53ee8cc1Swenshuai.xi void HAL_MVOP_SetInputMode( VOPINPUTMODE mode, MVOP_InputCfg *pparam, MS_U16 u16ECOVersion)
987*53ee8cc1Swenshuai.xi {
988*53ee8cc1Swenshuai.xi     MS_U8 regval;
989*53ee8cc1Swenshuai.xi     MS_U16 u16strip, u16strip_lsb;
990*53ee8cc1Swenshuai.xi 
991*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
992*53ee8cc1Swenshuai.xi     {
993*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
994*53ee8cc1Swenshuai.xi         return;
995*53ee8cc1Swenshuai.xi     }
996*53ee8cc1Swenshuai.xi #if 0
997*53ee8cc1Swenshuai.xi     /*****************************************************/
998*53ee8cc1Swenshuai.xi     // Reset MVOP setting
999*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_TST_IMG, 0x40); //reset test pattern or BG
1000*53ee8cc1Swenshuai.xi     HAL_MVOP_Set3DLRAltOutput_VHalfScaling(DISABLE); //reset to default: disable 3D L/R alternative output.
1001*53ee8cc1Swenshuai.xi     HAL_MVOP_Set3DLR2ndCfg(DISABLE);    //reset to default: disable 3D L/R 2nd pitch.
1002*53ee8cc1Swenshuai.xi     HAL_MVOP_SetRgbFormat(E_MVOP_RGB_NONE); //reset rgb format
1003*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL1, 0, VOP_MVD_VS_MD); //default use original vsync
1004*53ee8cc1Swenshuai.xi     //stb series
1005*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_422_OUT_EN, 1, BIT0);
1006*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_HANDSHAKE, 1, VOP_HANDSHAKE_MODE);
1007*53ee8cc1Swenshuai.xi     HAL_MVOP_SetTimingFromXC(E_MVOP_DEV_0, TRUE);
1008*53ee8cc1Swenshuai.xi 
1009*53ee8cc1Swenshuai.xi     //set MVOP test pattern to black
1010*53ee8cc1Swenshuai.xi     HAL_MVOP_SetBlackBG();
1011*53ee8cc1Swenshuai.xi 
1012*53ee8cc1Swenshuai.xi     // clear extend strip len bit by default
1013*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
1014*53ee8cc1Swenshuai.xi 
1015*53ee8cc1Swenshuai.xi     // set mvop to 128bit_i128 interface
1016*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_MIU_IF, VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
1017*53ee8cc1Swenshuai.xi 
1018*53ee8cc1Swenshuai.xi     // Disable H264 or RM Input
1019*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INPUT_SWITCH1, 0, BIT2|BIT3);
1020*53ee8cc1Swenshuai.xi     // Clear 422 Flag
1021*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIs422 = 0;
1022*53ee8cc1Swenshuai.xi     //8*32 tile format
1023*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, 0, BIT1);
1024*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG_HI, 0, VOP_REF_SELF_FLD);
1025*53ee8cc1Swenshuai.xi 
1026*53ee8cc1Swenshuai.xi     // EVD mode disable
1027*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INPUT_SWITCH0, 0, EVD_ENABLE);
1028*53ee8cc1Swenshuai.xi     // Clear evd Flag for interlace mode setting
1029*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsH265 = 0;
1030*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INFO_FROM_CODEC_L, 1, BIT3);
1031*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG, 1, BIT5);
1032*53ee8cc1Swenshuai.xi     // EVD 10 bits disable
1033*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_REG_MASK, BIT1, VOP_LSB_REQ_MASK);
1034*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_EVD_10B_EN, 0, VOP_EVD_10B_Y_EN);
1035*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_EVD_10B_EN, 0, VOP_EVD_10B_UV_EN);
1036*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_UV_SHIFT, 1, VOP_GCLK_MIU_ON);
1037*53ee8cc1Swenshuai.xi     // Disable 420 BW Saving mode
1038*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_DUMMY, 0, VOP_420_BW_SAVE);
1039*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_BW_SAVE, 0, VOP_420_BW_SAVE_EX);
1040*53ee8cc1Swenshuai.xi     // Disable New Vsync Mode
1041*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bNewVSyncMode = FALSE;
1042*53ee8cc1Swenshuai.xi     // Disable 2p mode
1043*53ee8cc1Swenshuai.xi     HAL_MVOP_SetEnable4k2k2P(FALSE);
1044*53ee8cc1Swenshuai.xi     /* only for STB DC */
1045*53ee8cc1Swenshuai.xi     // Handshake mode chip need to set from MVD: Kappa (maybe fix in after project)
1046*53ee8cc1Swenshuai.xi     HAL_MVOP_SetFDMaskFromMVD(ENABLE);
1047*53ee8cc1Swenshuai.xi     // Use frame sync (CLK_DC1 domain) to reset CLK_DC0 and CLK_MIU domain every frame
1048*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_FRAME_RST+1, 0, BIT7); // reg_frame_rst = 0
1049*53ee8cc1Swenshuai.xi 
1050*53ee8cc1Swenshuai.xi     // Kappa do not need to invert DC2SC field; the inverse was setted in SC XC_BK02_33[3]=1
1051*53ee8cc1Swenshuai.xi     HAL_MVOP_SetFieldInverse(ENABLE, DISABLE);
1052*53ee8cc1Swenshuai.xi     // kappa U02 need to bypass field from mvd to xc for FCR.
1053*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_DUMMY_3D_1, 1, VOP_RGB_FILED_BYPASS);
1054*53ee8cc1Swenshuai.xi 
1055*53ee8cc1Swenshuai.xi     // Clippers temp patch: New diu interface, waiting for decoder adding diu setting.
1056*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_INFO_FROM_CODEC_H, 0, VOP_INFO_FROM_CODEC_MIU_BUF0_SEL | VOP_INFO_FROM_CODEC_MIU_BUF1_SEL | VOP_INFO_FROM_CODEC_10BIT);
1057*53ee8cc1Swenshuai.xi 
1058*53ee8cc1Swenshuai.xi     //Change MIU BW Default Value to 0x241C (after Einstein)
1059*53ee8cc1Swenshuai.xi     //FIFO threshold
1060*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_DMA0, 0x08, VOP_FORCE_HIGH|VOP_HI_TSH|VOP_BURST_EXT);
1061*53ee8cc1Swenshuai.xi     //burst and priority
1062*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_DMA1, 0x22, VOP_FORCE_HIGH|VOP_HI_TSH|VOP_BURST_EXT);
1063*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_BURST_CTRL0, 0x02);
1064*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_BURST_CTRL1, 0x00);
1065*53ee8cc1Swenshuai.xi     //// clippers crop sw patch /////
1066*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_SINGLE_3D_L, 0, VOP_FORCE_SKIP);
1067*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_REG_SINGLE_3D_L, 0, VOP_SKIP_SIZE_LVIEW);
1068*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_REG_SINGLE_3D_H, 0, VOP_SKIP_SIZE_RVIEW);
1069*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_ENABLE_SKIP, 0, VOP_SKIP_LVIEW);
1070*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_ENABLE_SKIP, 0, VOP_SKIP_RVIEW);
1071*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->g_u16SetStartX = 0;
1072*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->g_u16SetStartY = 0;
1073*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->g_u16SetXSize = 0;
1074*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->g_u16SetYSize = 0;
1075*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->g_bIsY4Align = FALSE;
1076*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->g_bIsSetCrop = FALSE;
1077*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsXcTrig = FALSE;
1078*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsXcTrig = FALSE;
1079*53ee8cc1Swenshuai.xi     /*****************************************************/
1080*53ee8cc1Swenshuai.xi #endif
1081*53ee8cc1Swenshuai.xi 
1082*53ee8cc1Swenshuai.xi     //regval = HAL_ReadByte(VOP_MPG_JPG_SWITCH);
1083*53ee8cc1Swenshuai.xi     regval = 0;
1084*53ee8cc1Swenshuai.xi     regval |= ( mode & 0x3 );
1085*53ee8cc1Swenshuai.xi 
1086*53ee8cc1Swenshuai.xi     if ( mode == VOPINPUT_HARDWIRE )
1087*53ee8cc1Swenshuai.xi     {
1088*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_MPG_JPG_SWITCH, regval);
1089*53ee8cc1Swenshuai.xi     }
1090*53ee8cc1Swenshuai.xi     else if ( mode == VOPINPUT_HARDWIRECLIP )
1091*53ee8cc1Swenshuai.xi     {
1092*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_MPG_JPG_SWITCH, regval);
1093*53ee8cc1Swenshuai.xi 
1094*53ee8cc1Swenshuai.xi         // HSize, VSize
1095*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_HSIZE    , LOWBYTE( pparam->u16HSize ));
1096*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_HSIZE + 1), HIGHBYTE( pparam->u16HSize ));
1097*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_VSIZE    , LOWBYTE( pparam->u16VSize ));
1098*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_VSIZE + 1), HIGHBYTE( pparam->u16VSize ));
1099*53ee8cc1Swenshuai.xi     }
1100*53ee8cc1Swenshuai.xi     else if (mode == VOPINPUT_MCUCTRL)
1101*53ee8cc1Swenshuai.xi     {
1102*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bMirrorMode = (g_pHalMVOPCtx->bMirrorModeVer||g_pHalMVOPCtx->bMirrorModeHor);
1103*53ee8cc1Swenshuai.xi         if ( pparam->bProgressive )
1104*53ee8cc1Swenshuai.xi             regval |= 0x4;
1105*53ee8cc1Swenshuai.xi         else
1106*53ee8cc1Swenshuai.xi         {
1107*53ee8cc1Swenshuai.xi             regval &= ~0x4;
1108*53ee8cc1Swenshuai.xi             regval |= 0x1;  //reg_dc_md=b'11 for interlace input
1109*53ee8cc1Swenshuai.xi             if (E_MVOP_RPTFLD_NONE == g_pHalMVOPCtx->eRepeatField)
1110*53ee8cc1Swenshuai.xi             {
1111*53ee8cc1Swenshuai.xi                 MVOP_DBG("%s normal NOT repeat field %x\n", __FUNCTION__, g_pHalMVOPCtx->eRepeatField);
1112*53ee8cc1Swenshuai.xi                 //To support mcu mode interlace, need to set h'3B[9]=1,
1113*53ee8cc1Swenshuai.xi                 //h'11[12]=0, and Y1/UV1 address equal to Y0/UV0 address.
1114*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_MIRROR_CFG_HI, 1, VOP_REF_SELF_FLD);
1115*53ee8cc1Swenshuai.xi                 //HAL_MVOP_SetFieldInverse(ENABLE, DISABLE); //do not inverse in kano: mvop gen timing + hsk mode
1116*53ee8cc1Swenshuai.xi                 // mheg5, mcu mode for i mode, do not bypass, 0x11[6] = 0: mvop t/b toggle
1117*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_REG_DUMMY_3D_1, 0, VOP_RGB_FILED_BYPASS);
1118*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_CTRL0, 0, VOP_EXTFLD_EN);
1119*53ee8cc1Swenshuai.xi             }
1120*53ee8cc1Swenshuai.xi         }
1121*53ee8cc1Swenshuai.xi         // disable from wb
1122*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_MFDEC_2_L, 0, VOP_MF_FROM_WB);
1123*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_INPUT_SWITCH0, 0, VOP_R2_WISHBONE);
1124*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_DUMMY, 0, VOP_32x32_WB);
1125*53ee8cc1Swenshuai.xi 
1126*53ee8cc1Swenshuai.xi         if ( pparam->bYUV422 )
1127*53ee8cc1Swenshuai.xi             regval |= 0x10;
1128*53ee8cc1Swenshuai.xi         else
1129*53ee8cc1Swenshuai.xi             regval &= ~0x10;
1130*53ee8cc1Swenshuai.xi 
1131*53ee8cc1Swenshuai.xi         if ( pparam->b422pack )
1132*53ee8cc1Swenshuai.xi             regval |= 0x80;
1133*53ee8cc1Swenshuai.xi 
1134*53ee8cc1Swenshuai.xi         if ( pparam->bDramRdContd == 1 )
1135*53ee8cc1Swenshuai.xi             regval |= 0x20;
1136*53ee8cc1Swenshuai.xi         else
1137*53ee8cc1Swenshuai.xi             regval &= ~0x20;
1138*53ee8cc1Swenshuai.xi 
1139*53ee8cc1Swenshuai.xi         // for backward compatable to saturn
1140*53ee8cc1Swenshuai.xi         // [3] UV-7bit mode don't care
1141*53ee8cc1Swenshuai.xi         // [5] dram_rd_md =0
1142*53ee8cc1Swenshuai.xi         // [6] Fld don't care
1143*53ee8cc1Swenshuai.xi         // [7] 422pack don'care
1144*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_MPG_JPG_SWITCH, regval);
1145*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bIs422 = pparam->bYUV422;
1146*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_DUMMY, !(pparam->bYUV422), VOP_420_BW_SAVE);
1147*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_BW_SAVE, !(pparam->bYUV422), VOP_420_BW_SAVE_EX);
1148*53ee8cc1Swenshuai.xi 
1149*53ee8cc1Swenshuai.xi         if (pparam->u16StripSize == 0)
1150*53ee8cc1Swenshuai.xi         {
1151*53ee8cc1Swenshuai.xi             if (pparam->bSD)
1152*53ee8cc1Swenshuai.xi             {
1153*53ee8cc1Swenshuai.xi                 u16strip = 720;
1154*53ee8cc1Swenshuai.xi                 u16strip_lsb = 720;
1155*53ee8cc1Swenshuai.xi             }
1156*53ee8cc1Swenshuai.xi             else
1157*53ee8cc1Swenshuai.xi             {
1158*53ee8cc1Swenshuai.xi                 u16strip = 1920;
1159*53ee8cc1Swenshuai.xi                 u16strip_lsb = 1920;
1160*53ee8cc1Swenshuai.xi             }
1161*53ee8cc1Swenshuai.xi         }
1162*53ee8cc1Swenshuai.xi         else
1163*53ee8cc1Swenshuai.xi         {
1164*53ee8cc1Swenshuai.xi             u16strip = pparam->u16StripSize;
1165*53ee8cc1Swenshuai.xi             u16strip_lsb = pparam->u16StripSize;
1166*53ee8cc1Swenshuai.xi         }
1167*53ee8cc1Swenshuai.xi 
1168*53ee8cc1Swenshuai.xi         // set dc_strip[7:0]
1169*53ee8cc1Swenshuai.xi         if ( pparam->bDramRdContd == 0 )
1170*53ee8cc1Swenshuai.xi         {
1171*53ee8cc1Swenshuai.xi             u16strip = (u16strip + 31) / 32 * 32; //need align for monaco
1172*53ee8cc1Swenshuai.xi             u16strip = u16strip/8;
1173*53ee8cc1Swenshuai.xi             u16strip_lsb = (u16strip_lsb+127)/128;
1174*53ee8cc1Swenshuai.xi             u16strip_lsb *= 4;
1175*53ee8cc1Swenshuai.xi 
1176*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("[MVOP]%s enVideoType = 0x%x\n", __FUNCTION__,pparam->enVideoType);)
1177*53ee8cc1Swenshuai.xi 
1178*53ee8cc1Swenshuai.xi             if(pparam->enVideoType == MVOP_H264)
1179*53ee8cc1Swenshuai.xi             {
1180*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_INPUT_SWITCH0, 1, VOP_TILE_32x32);//mantis:1144345 mustang h264 default 32x32.
1181*53ee8cc1Swenshuai.xi             }
1182*53ee8cc1Swenshuai.xi             else
1183*53ee8cc1Swenshuai.xi             {
1184*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_INPUT_SWITCH0, 0, VOP_TILE_32x32);//MVD can not 32x32.
1185*53ee8cc1Swenshuai.xi             }
1186*53ee8cc1Swenshuai.xi         }
1187*53ee8cc1Swenshuai.xi         else
1188*53ee8cc1Swenshuai.xi         {
1189*53ee8cc1Swenshuai.xi             if ( pparam->b422pack )
1190*53ee8cc1Swenshuai.xi             {
1191*53ee8cc1Swenshuai.xi                 if (E_MVOP_RGB_888 == g_pHalMVOPCtx->eMainRgbFmt)
1192*53ee8cc1Swenshuai.xi                 {
1193*53ee8cc1Swenshuai.xi                     u16strip *= 2; //4bytes/pixel (yuv422:2bytes/pixel)
1194*53ee8cc1Swenshuai.xi                 }
1195*53ee8cc1Swenshuai.xi                 //VOP_REG_STRIP_ALIGN and Mirror mode are mutually exclusive, after M10(support mirror), VOP_DC_STRIP_H
1196*53ee8cc1Swenshuai.xi                 //replace VOP_REG_STRIP_ALIGN, which supported maximun Hsize is 8188
1197*53ee8cc1Swenshuai.xi #if 0
1198*53ee8cc1Swenshuai.xi                 // [071016 Andy] support YUV422 pack mode
1199*53ee8cc1Swenshuai.xi                 if ((u16strip < 1024) || g_pHalMVOPCtx->bMirrorMode)
1200*53ee8cc1Swenshuai.xi                 {
1201*53ee8cc1Swenshuai.xi                     u16strip = u16strip/4;
1202*53ee8cc1Swenshuai.xi                     // dont extend strip len
1203*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
1204*53ee8cc1Swenshuai.xi                 }
1205*53ee8cc1Swenshuai.xi                 else
1206*53ee8cc1Swenshuai.xi                 {
1207*53ee8cc1Swenshuai.xi                     u16strip = u16strip/8;
1208*53ee8cc1Swenshuai.xi                     // extend strip len to 2048
1209*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 1, BIT0);
1210*53ee8cc1Swenshuai.xi                 }
1211*53ee8cc1Swenshuai.xi #endif
1212*53ee8cc1Swenshuai.xi                 u16strip = u16strip/4;
1213*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
1214*53ee8cc1Swenshuai.xi             }
1215*53ee8cc1Swenshuai.xi             else
1216*53ee8cc1Swenshuai.xi             {
1217*53ee8cc1Swenshuai.xi                 u16strip = u16strip/8;
1218*53ee8cc1Swenshuai.xi             }
1219*53ee8cc1Swenshuai.xi         }
1220*53ee8cc1Swenshuai.xi 
1221*53ee8cc1Swenshuai.xi         if (u16strip >= 256 )
1222*53ee8cc1Swenshuai.xi         {
1223*53ee8cc1Swenshuai.xi             HAL_WriteByte(VOP_DC_STRIP_H, (u16strip>>8));
1224*53ee8cc1Swenshuai.xi             //reg_dc_strip_h[2:0] = reg_dc_strip[10:8]
1225*53ee8cc1Swenshuai.xi         }
1226*53ee8cc1Swenshuai.xi         else
1227*53ee8cc1Swenshuai.xi         {
1228*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(VOP_DC_STRIP_H, 0, BIT0 | BIT1 | BIT2);
1229*53ee8cc1Swenshuai.xi         }
1230*53ee8cc1Swenshuai.xi 
1231*53ee8cc1Swenshuai.xi         regval = u16strip;
1232*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_DC_STRIP, regval);
1233*53ee8cc1Swenshuai.xi         //LSB strip
1234*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_DC_STRIP_LSB, u16strip_lsb & 0x3ff);
1235*53ee8cc1Swenshuai.xi 
1236*53ee8cc1Swenshuai.xi 
1237*53ee8cc1Swenshuai.xi         HAL_MVOP_SetYUVBaseAdd(pparam->u32YOffset, pparam->u32UVOffset,
1238*53ee8cc1Swenshuai.xi                                pparam->bProgressive, pparam->b422pack);
1239*53ee8cc1Swenshuai.xi 
1240*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_NONE != g_pHalMVOPCtx->eRepeatField)
1241*53ee8cc1Swenshuai.xi         {
1242*53ee8cc1Swenshuai.xi             MVOP_DBG("%s reset eRepeatField=%x ==>", __FUNCTION__, g_pHalMVOPCtx->eRepeatField);
1243*53ee8cc1Swenshuai.xi             //To output the same field for single field input,
1244*53ee8cc1Swenshuai.xi             //do NOT set h'3B[9]=1 and h'11[12]=0
1245*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->eRepeatField = E_MVOP_RPTFLD_NONE;    //reset the flag to repeat field
1246*53ee8cc1Swenshuai.xi             MVOP_DBG(" %x\n", g_pHalMVOPCtx->eRepeatField);
1247*53ee8cc1Swenshuai.xi         }
1248*53ee8cc1Swenshuai.xi 
1249*53ee8cc1Swenshuai.xi         // HSize
1250*53ee8cc1Swenshuai.xi         MS_U16 u16HSize = ALIGN_UPTO_16(pparam->u16HSize);
1251*53ee8cc1Swenshuai.xi         if (u16HSize != pparam->u16HSize)
1252*53ee8cc1Swenshuai.xi         {
1253*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("\n\n Change HSize %d to %d\n", pparam->u16HSize, u16HSize);)
1254*53ee8cc1Swenshuai.xi         }
1255*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_HSIZE    , LOWBYTE( u16HSize ));
1256*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_HSIZE + 1), HIGHBYTE( u16HSize ));
1257*53ee8cc1Swenshuai.xi 
1258*53ee8cc1Swenshuai.xi         // VSize
1259*53ee8cc1Swenshuai.xi         MS_U16 u16VSize = pparam->u16VSize;
1260*53ee8cc1Swenshuai.xi         if (g_pHalMVOPCtx->bMirrorModeVer)
1261*53ee8cc1Swenshuai.xi         {
1262*53ee8cc1Swenshuai.xi             u16VSize = ALIGN_UPTO_4(pparam->u16VSize);
1263*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("\n\n Change VSize %d to %d\n", pparam->u16VSize, u16VSize);)
1264*53ee8cc1Swenshuai.xi         }
1265*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_VSIZE    , LOWBYTE( u16VSize ));
1266*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_VSIZE + 1), HIGHBYTE( u16VSize ));
1267*53ee8cc1Swenshuai.xi     }
1268*53ee8cc1Swenshuai.xi 
1269*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
1270*53ee8cc1Swenshuai.xi }
1271*53ee8cc1Swenshuai.xi 
1272*53ee8cc1Swenshuai.xi 
HAL_MVOP_EnableUVShift(MS_BOOL bEnable)1273*53ee8cc1Swenshuai.xi void HAL_MVOP_EnableUVShift(MS_BOOL bEnable)
1274*53ee8cc1Swenshuai.xi {
1275*53ee8cc1Swenshuai.xi     MS_U8 regval;
1276*53ee8cc1Swenshuai.xi 
1277*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(VOP_MPG_JPG_SWITCH);
1278*53ee8cc1Swenshuai.xi 
1279*53ee8cc1Swenshuai.xi     if (((regval & BIT4) == BIT4) && ((regval & 0x3)== 0x2))
1280*53ee8cc1Swenshuai.xi     {   // 422 with MCU control mode
1281*53ee8cc1Swenshuai.xi         if (bEnable)
1282*53ee8cc1Swenshuai.xi         {
1283*53ee8cc1Swenshuai.xi             MS_ASSERT(0);
1284*53ee8cc1Swenshuai.xi         }
1285*53ee8cc1Swenshuai.xi     }
1286*53ee8cc1Swenshuai.xi 
1287*53ee8cc1Swenshuai.xi     // output 420 and interlace
1288*53ee8cc1Swenshuai.xi     //[IP - Sheet] : Main Page --- 420CUP
1289*53ee8cc1Swenshuai.xi     //[Project] :  Titania2
1290*53ee8cc1Swenshuai.xi     //[Description]:   Chroma artifacts when 420to422 is applied duplicate method.
1291*53ee8cc1Swenshuai.xi     //[Root cause]: Apply 420to422 average algorithm to all DTV input cases.
1292*53ee8cc1Swenshuai.xi     //The average algorithm must cooperate with MVOP.
1293*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_UV_SHIFT, (bEnable)?1:0, 0x3);
1294*53ee8cc1Swenshuai.xi }
1295*53ee8cc1Swenshuai.xi 
1296*53ee8cc1Swenshuai.xi static MS_BOOL _bEnable60P = false;
HAL_MVOP_SetEnable60P(MS_BOOL bEnable)1297*53ee8cc1Swenshuai.xi void HAL_MVOP_SetEnable60P(MS_BOOL bEnable)
1298*53ee8cc1Swenshuai.xi {
1299*53ee8cc1Swenshuai.xi     _bEnable60P = bEnable;
1300*53ee8cc1Swenshuai.xi }
1301*53ee8cc1Swenshuai.xi 
1302*53ee8cc1Swenshuai.xi static MS_BOOL _bEnable4k2kClk = false;
HAL_MVOP_SetEnable4k2kClk(MS_BOOL bEnable)1303*53ee8cc1Swenshuai.xi void HAL_MVOP_SetEnable4k2kClk(MS_BOOL bEnable)
1304*53ee8cc1Swenshuai.xi {
1305*53ee8cc1Swenshuai.xi     _bEnable4k2kClk = bEnable;
1306*53ee8cc1Swenshuai.xi }
1307*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetEnable4k2k2P(MS_BOOL bEnable)1308*53ee8cc1Swenshuai.xi void HAL_MVOP_SetEnable4k2k2P(MS_BOOL bEnable)
1309*53ee8cc1Swenshuai.xi {
1310*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIs2p = bEnable;
1311*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_4K2K_2P, bEnable, VOP_4K2K_2P);
1312*53ee8cc1Swenshuai.xi     HAL_MVOP_Set420BWSaveMode(bEnable);
1313*53ee8cc1Swenshuai.xi }
1314*53ee8cc1Swenshuai.xi 
HAL_MVOP_Get4k2k2PMode(MVOP_DevID eID)1315*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Get4k2k2PMode(MVOP_DevID eID)
1316*53ee8cc1Swenshuai.xi {
1317*53ee8cc1Swenshuai.xi     MS_BOOL bEnable4k2k2P = FALSE;
1318*53ee8cc1Swenshuai.xi     switch(eID)
1319*53ee8cc1Swenshuai.xi     {
1320*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
1321*53ee8cc1Swenshuai.xi             bEnable4k2k2P = g_pHalMVOPCtx->bIs2p;
1322*53ee8cc1Swenshuai.xi             break;
1323*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
1324*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
1325*53ee8cc1Swenshuai.xi             bEnable4k2k2P = g_pHalMVOPCtx->bSubIs2p;
1326*53ee8cc1Swenshuai.xi             break;
1327*53ee8cc1Swenshuai.xi #endif
1328*53ee8cc1Swenshuai.xi         default:
1329*53ee8cc1Swenshuai.xi             MVOP_PRINTF("Attention! %s Not support eID=%u yet\n", __FUNCTION__, eID);
1330*53ee8cc1Swenshuai.xi             break;
1331*53ee8cc1Swenshuai.xi     }
1332*53ee8cc1Swenshuai.xi     return bEnable4k2k2P;
1333*53ee8cc1Swenshuai.xi }
1334*53ee8cc1Swenshuai.xi 
1335*53ee8cc1Swenshuai.xi static MS_BOOL _bEnableFixClk = false;
HAL_MVOP_SetEnableFixClk(MS_BOOL bEnable)1336*53ee8cc1Swenshuai.xi void HAL_MVOP_SetEnableFixClk(MS_BOOL bEnable)
1337*53ee8cc1Swenshuai.xi {
1338*53ee8cc1Swenshuai.xi     _bEnableFixClk = bEnable;
1339*53ee8cc1Swenshuai.xi }
1340*53ee8cc1Swenshuai.xi 
HAL_MVOP_EnableFreerunMode(MS_BOOL bEnable)1341*53ee8cc1Swenshuai.xi void HAL_MVOP_EnableFreerunMode(MS_BOOL bEnable)
1342*53ee8cc1Swenshuai.xi {
1343*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
1344*53ee8cc1Swenshuai.xi     {
1345*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1346*53ee8cc1Swenshuai.xi         return;
1347*53ee8cc1Swenshuai.xi     }
1348*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bEnableFreerunMode = bEnable;
1349*53ee8cc1Swenshuai.xi }
1350*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetVSyncMode(MS_U8 u8Mode)1351*53ee8cc1Swenshuai.xi void HAL_MVOP_SetVSyncMode(MS_U8 u8Mode)
1352*53ee8cc1Swenshuai.xi {
1353*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
1354*53ee8cc1Swenshuai.xi     {
1355*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1356*53ee8cc1Swenshuai.xi         return;
1357*53ee8cc1Swenshuai.xi     }
1358*53ee8cc1Swenshuai.xi     if (1==u8Mode)
1359*53ee8cc1Swenshuai.xi     {
1360*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bNewVSyncMode = TRUE;
1361*53ee8cc1Swenshuai.xi     }
1362*53ee8cc1Swenshuai.xi     else
1363*53ee8cc1Swenshuai.xi     {
1364*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bNewVSyncMode = FALSE;
1365*53ee8cc1Swenshuai.xi     }
1366*53ee8cc1Swenshuai.xi }
1367*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetOutputTiming(MVOP_Timing * ptiming)1368*53ee8cc1Swenshuai.xi void HAL_MVOP_SetOutputTiming( MVOP_Timing *ptiming )
1369*53ee8cc1Swenshuai.xi {
1370*53ee8cc1Swenshuai.xi     MS_U8 regval;
1371*53ee8cc1Swenshuai.xi 
1372*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
1373*53ee8cc1Swenshuai.xi     {
1374*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1375*53ee8cc1Swenshuai.xi         return;
1376*53ee8cc1Swenshuai.xi     }
1377*53ee8cc1Swenshuai.xi 
1378*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_FRAME_VCOUNT    , LOWBYTE( ptiming->u16V_TotalCount ));
1379*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_FRAME_VCOUNT + 1), HIGHBYTE( ptiming->u16V_TotalCount ));
1380*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_FRAME_HCOUNT    , LOWBYTE( ptiming->u16H_TotalCount ));
1381*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_FRAME_HCOUNT + 1), HIGHBYTE( ptiming->u16H_TotalCount ));
1382*53ee8cc1Swenshuai.xi 
1383*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_VB0_STR     ), LOWBYTE( ptiming->u16VBlank0_Start ));
1384*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_VB0_STR  + 1), HIGHBYTE( ptiming->u16VBlank0_Start ));
1385*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_VB0_END     ), LOWBYTE( ptiming->u16VBlank0_End ));
1386*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_VB0_END  + 1), HIGHBYTE( ptiming->u16VBlank0_End ));
1387*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_VB1_STR     ), LOWBYTE( ptiming->u16VBlank1_Start ));
1388*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_VB1_STR  + 1), HIGHBYTE( ptiming->u16VBlank1_Start ));
1389*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_VB1_END     ), LOWBYTE( ptiming->u16VBlank1_End ));
1390*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_VB1_END  + 1), HIGHBYTE( ptiming->u16VBlank1_End ));
1391*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_TF_STR      ), LOWBYTE( ptiming->u16TopField_Start ));
1392*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_TF_STR   + 1), HIGHBYTE( ptiming->u16TopField_Start ));
1393*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_BF_STR      ), LOWBYTE( ptiming->u16BottomField_Start ));
1394*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_BF_STR   + 1), HIGHBYTE( ptiming->u16BottomField_Start ));
1395*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_HACT_STR    ), LOWBYTE( ptiming->u16HActive_Start ));
1396*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_HACT_STR + 1), HIGHBYTE( ptiming->u16HActive_Start ));
1397*53ee8cc1Swenshuai.xi 
1398*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_TF_VS      ), LOWBYTE( ptiming->u16TopField_VS ));
1399*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_TF_VS   + 1), HIGHBYTE( ptiming->u16TopField_VS ));
1400*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_BF_VS      ), LOWBYTE( ptiming->u16BottomField_VS ));
1401*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_BF_VS   + 1), HIGHBYTE( ptiming->u16BottomField_VS ));
1402*53ee8cc1Swenshuai.xi 
1403*53ee8cc1Swenshuai.xi     //if(((ptiming->u16V_TotalCount > 2160) || (ptiming->u16H_TotalCount > 3840)) && (ptiming->u8Framerate >= 30))
1404*53ee8cc1Swenshuai.xi     if((!g_pHalMVOPCtx->bIsXcTrig) && (g_pHalMVOPCtx->bIsHS))
1405*53ee8cc1Swenshuai.xi     {
1406*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bNewVSyncMode = TRUE;
1407*53ee8cc1Swenshuai.xi     }
1408*53ee8cc1Swenshuai.xi 
1409*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx->bNewVSyncMode)
1410*53ee8cc1Swenshuai.xi     {
1411*53ee8cc1Swenshuai.xi         #define NEW_VSYNC_MODE_ADVANCE_LINECNT 30
1412*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("MVOP use new vync mode, forwarding %d lines\n",NEW_VSYNC_MODE_ADVANCE_LINECNT);)
1413*53ee8cc1Swenshuai.xi 
1414*53ee8cc1Swenshuai.xi         MS_U16 u16BottomField_VS2MVD = ptiming->u16BottomField_VS - NEW_VSYNC_MODE_ADVANCE_LINECNT;
1415*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("BottomField VS ori=0x%x, new=0x%x\n", ptiming->u16BottomField_VS, u16BottomField_VS2MVD);)
1416*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_BF_VS_MVD    ), LOWBYTE( u16BottomField_VS2MVD ));
1417*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_BF_VS_MVD + 1), HIGHBYTE( u16BottomField_VS2MVD ));
1418*53ee8cc1Swenshuai.xi 
1419*53ee8cc1Swenshuai.xi         MS_U16 u16TopField_VS2MVD = ptiming->u16V_TotalCount - NEW_VSYNC_MODE_ADVANCE_LINECNT;
1420*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("TopField VS Vtt=0x%x, new=0x%x\n", ptiming->u16V_TotalCount, u16TopField_VS2MVD);)
1421*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_TF_VS_MVD    ), LOWBYTE( u16TopField_VS2MVD ));
1422*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_TF_VS_MVD + 1), HIGHBYTE( u16TopField_VS2MVD ));
1423*53ee8cc1Swenshuai.xi 
1424*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_GCLK, 0, VOP_GCLK_MIU_ON);
1425*53ee8cc1Swenshuai.xi 
1426*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_CTRL1, 1, VOP_MVD_VS_MD); //Use new vsync
1427*53ee8cc1Swenshuai.xi 
1428*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bNewVSyncMode = FALSE; //restore to original mode
1429*53ee8cc1Swenshuai.xi     }
1430*53ee8cc1Swenshuai.xi     else
1431*53ee8cc1Swenshuai.xi     {
1432*53ee8cc1Swenshuai.xi         MS_U16 u16BottomField_VS2MVD = 0x200;
1433*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_BF_VS_MVD    ), LOWBYTE( u16BottomField_VS2MVD ));
1434*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_BF_VS_MVD + 1), HIGHBYTE( u16BottomField_VS2MVD ));
1435*53ee8cc1Swenshuai.xi 
1436*53ee8cc1Swenshuai.xi         MS_U16 u16TopField_VS2MVD = 0x200;
1437*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_TF_VS_MVD    ), LOWBYTE( u16TopField_VS2MVD ));
1438*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_TF_VS_MVD + 1), HIGHBYTE( u16TopField_VS2MVD ));
1439*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_CTRL1, 0, VOP_MVD_VS_MD);
1440*53ee8cc1Swenshuai.xi     }
1441*53ee8cc1Swenshuai.xi 
1442*53ee8cc1Swenshuai.xi 
1443*53ee8cc1Swenshuai.xi     /* Clippers sw patch: sbs + handshake mode video not stable*/
1444*53ee8cc1Swenshuai.xi     if(g_pHalMVOPCtx->b3DLRAltSBSOutput)
1445*53ee8cc1Swenshuai.xi     {
1446*53ee8cc1Swenshuai.xi         ptiming->u16VImg_Start0 = 0xfff;
1447*53ee8cc1Swenshuai.xi         ptiming->u16VImg_Start1 = 0xfff;
1448*53ee8cc1Swenshuai.xi     }
1449*53ee8cc1Swenshuai.xi 
1450*53ee8cc1Swenshuai.xi     // + S3, set default IMG_HSTR, IMG_VSTR0, IMG_VSTR1
1451*53ee8cc1Swenshuai.xi #ifdef _SUPPORT_IMG_OFFSET_
1452*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_HSTR    ), LOWBYTE( ptiming->u16HImg_Start));
1453*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_HSTR + 1), HIGHBYTE( ptiming->u16HImg_Start ));
1454*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_VSTR0   ), LOWBYTE( ptiming->u16VImg_Start0));
1455*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_VSTR0+ 1), HIGHBYTE( ptiming->u16VImg_Start0 ));
1456*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_VSTR1   ), LOWBYTE( ptiming->u16VImg_Start1 ));
1457*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_VSTR1+ 1), HIGHBYTE( ptiming->u16VImg_Start1 ));
1458*53ee8cc1Swenshuai.xi #else
1459*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_HSTR    ), LOWBYTE( ptiming->u16HActive_Start ));
1460*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_HSTR + 1), HIGHBYTE( ptiming->u16HActive_Start ));
1461*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_VSTR0   ), LOWBYTE( ptiming->u16VBlank0_End ));
1462*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_VSTR0+ 1), HIGHBYTE( ptiming->u16VBlank0_End ));
1463*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_VSTR1   ), LOWBYTE( ptiming->u16VBlank1_End ));
1464*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_VSTR1+ 1), HIGHBYTE( ptiming->u16VBlank1_End ));
1465*53ee8cc1Swenshuai.xi #endif
1466*53ee8cc1Swenshuai.xi     // select mvop output from frame color(black)
1467*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_TST_IMG + 1), 0x10);
1468*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_U_PAT      ), 0x80);
1469*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_U_PAT   + 1), 0x80);
1470*53ee8cc1Swenshuai.xi     // set mvop src to test pattern
1471*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(VOP_TST_IMG);
1472*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_TST_IMG, 0x02, BIT2 | BIT1 | BIT0);
1473*53ee8cc1Swenshuai.xi     // make changed registers take effect
1474*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
1475*53ee8cc1Swenshuai.xi 
1476*53ee8cc1Swenshuai.xi     HAL_MVOP_SetMIUReqMask(TRUE);
1477*53ee8cc1Swenshuai.xi     // reset mvop to avoid timing change cause mvop hang-up
1478*53ee8cc1Swenshuai.xi     HAL_MVOP_Rst();
1479*53ee8cc1Swenshuai.xi     HAL_MVOP_SetMIUReqMask(FALSE);
1480*53ee8cc1Swenshuai.xi 
1481*53ee8cc1Swenshuai.xi     // select mvop output from mvd
1482*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_TST_IMG, 0x00, BIT2 | BIT1 | BIT0);
1483*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_TST_IMG, regval, BIT2 | BIT1 | BIT0);
1484*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL0, ptiming->bHDuplicate, BIT2);// H pixel duplicate
1485*53ee8cc1Swenshuai.xi 
1486*53ee8cc1Swenshuai.xi #if 0
1487*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF("\nMVOP SetOutputTiming\n");)
1488*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" VTot=%u,\t",ptiming->u16V_TotalCount);)
1489*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" HTot=%u,\t",ptiming->u16H_TotalCount);)
1490*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" I/P=%u\n",ptiming->bInterlace);)
1491*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" W=%u,\t",ptiming->u16Width);)
1492*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" H=%u,\t",ptiming->u16Height);)
1493*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" FRate=%u,\t",ptiming->u8Framerate);)
1494*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" HFreq=%u\n",ptiming->u16H_Freq);)
1495*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" Num=0x%x,\t",ptiming->u16Num);)
1496*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" Den=0x%x,\t",ptiming->u16Den);)
1497*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" u16ExpFRate=%u #\n\n", ptiming->u16ExpFrameRate);)
1498*53ee8cc1Swenshuai.xi #endif
1499*53ee8cc1Swenshuai.xi }
1500*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetDCClk(MS_U8 clkNum,MS_BOOL bEnable)1501*53ee8cc1Swenshuai.xi void HAL_MVOP_SetDCClk(MS_U8 clkNum, MS_BOOL bEnable)
1502*53ee8cc1Swenshuai.xi {
1503*53ee8cc1Swenshuai.xi     MS_ASSERT( (clkNum==0) || (clkNum==1) );
1504*53ee8cc1Swenshuai.xi     if (clkNum==0)
1505*53ee8cc1Swenshuai.xi     {
1506*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_CKG_DC0, !bEnable, CKG_DC0_GATED);
1507*53ee8cc1Swenshuai.xi     }
1508*53ee8cc1Swenshuai.xi }
1509*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetDCSRAMClk(MS_U8 clkNum,MS_BOOL bEnable)1510*53ee8cc1Swenshuai.xi void HAL_MVOP_SetDCSRAMClk(MS_U8 clkNum, MS_BOOL bEnable)
1511*53ee8cc1Swenshuai.xi {
1512*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF("[%s] eco num = %d\n",__FUNCTION__,g_pHalMVOPCtx->u16ECONum);)
1513*53ee8cc1Swenshuai.xi     MS_ASSERT( (clkNum==0) || (clkNum==1) );
1514*53ee8cc1Swenshuai.xi     if (clkNum==0)
1515*53ee8cc1Swenshuai.xi     {
1516*53ee8cc1Swenshuai.xi         if(bEnable)
1517*53ee8cc1Swenshuai.xi         {
1518*53ee8cc1Swenshuai.xi             if(g_pHalMVOPCtx->u16ECONum == 0)
1519*53ee8cc1Swenshuai.xi             {
1520*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(REG_CKG_DC_SRAM, 0x4, CKG_DC0_SRAM);//Dc0 enable & dc0_mfdec_en =0  57[3:0]= 0x4, others  57[3:0]=0x0
1521*53ee8cc1Swenshuai.xi             }
1522*53ee8cc1Swenshuai.xi             else // k6 eco for mfdec sram clock switch.
1523*53ee8cc1Swenshuai.xi             {
1524*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(REG_CKG_DC_SRAM, 0x0, CKG_DC0_SRAM);
1525*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(VOP_REG_DUMMY_5D, 0x0, VOP_SRAM_CLK_AUTO);
1526*53ee8cc1Swenshuai.xi                 HAL_MVOP_LoadReg();
1527*53ee8cc1Swenshuai.xi             }
1528*53ee8cc1Swenshuai.xi         }
1529*53ee8cc1Swenshuai.xi         else
1530*53ee8cc1Swenshuai.xi         {
1531*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC_SRAM, 0x0, CKG_DC0_SRAM);
1532*53ee8cc1Swenshuai.xi         }
1533*53ee8cc1Swenshuai.xi     }
1534*53ee8cc1Swenshuai.xi }
1535*53ee8cc1Swenshuai.xi 
1536*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetSynClk(MVOP_Timing * ptiming)1537*53ee8cc1Swenshuai.xi void HAL_MVOP_SetSynClk(MVOP_Timing *ptiming)
1538*53ee8cc1Swenshuai.xi {
1539*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
1540*53ee8cc1Swenshuai.xi     {
1541*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1542*53ee8cc1Swenshuai.xi         return;
1543*53ee8cc1Swenshuai.xi     }
1544*53ee8cc1Swenshuai.xi 
1545*53ee8cc1Swenshuai.xi     if(g_pHalMVOPCtx->u32MVOPFixClk != 0)
1546*53ee8cc1Swenshuai.xi     {
1547*53ee8cc1Swenshuai.xi         HAL_MVOP_SetFrequency(g_pHalMVOPCtx->u32MVOPFixClk);
1548*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->b3DLRMode)//4k1k mvc
1549*53ee8cc1Swenshuai.xi         {
1550*53ee8cc1Swenshuai.xi             //burst and priority
1551*53ee8cc1Swenshuai.xi             HAL_WriteByte(VOP_DMA1, 0x26);
1552*53ee8cc1Swenshuai.xi             HAL_WriteByte(VOP_BURST_CTRL0, 0x05);
1553*53ee8cc1Swenshuai.xi             HAL_WriteByte(VOP_BURST_CTRL1, 0x00);
1554*53ee8cc1Swenshuai.xi         }
1555*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("[MVOP][DBG] Set Fix clock\n");)
1556*53ee8cc1Swenshuai.xi     }
1557*53ee8cc1Swenshuai.xi     else if(g_pHalMVOPCtx->bEnableFreerunMode)
1558*53ee8cc1Swenshuai.xi     {
1559*53ee8cc1Swenshuai.xi         MS_U64 u64mpll_clock = MPLL_CLOCK << 27 ;
1560*53ee8cc1Swenshuai.xi         do_div(u64mpll_clock, ((MS_U32)ptiming->u16H_TotalCount * (MS_U32)ptiming->u16V_TotalCount * (MS_U32)ptiming->u8Framerate));
1561*53ee8cc1Swenshuai.xi         MS_U32 u32FreerunClk = (MS_U32)u64mpll_clock;
1562*53ee8cc1Swenshuai.xi         HAL_MVOP_SetFrequency(HALMVOP_FREERUNMODE);
1563*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC0_FREERUN_CW_L  ), LOWBYTE((MS_U16)u32FreerunClk));
1564*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC0_FREERUN_CW_L+1), HIGHBYTE((MS_U16)u32FreerunClk));
1565*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC0_FREERUN_CW_H  ), LOWBYTE((MS_U16)(u32FreerunClk >> 16)));
1566*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC0_FREERUN_CW_H+1), HIGHBYTE((MS_U16)(u32FreerunClk >> 16)));
1567*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_UPDATE_DC0_CW, 1, UPDATE_DC0_FREERUN_CW);
1568*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_UPDATE_DC0_CW, 0, UPDATE_DC0_FREERUN_CW);
1569*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("[MVOP][DBG] Set Freerun clock\n");)
1570*53ee8cc1Swenshuai.xi     }
1571*53ee8cc1Swenshuai.xi     else if (_bEnable60P)
1572*53ee8cc1Swenshuai.xi     {
1573*53ee8cc1Swenshuai.xi         HAL_MVOP_SetFrequency(HAL_MVOP_GetMaxFreerunClk());
1574*53ee8cc1Swenshuai.xi 
1575*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_FRAME_RST, 0, BIT15); // reg_frame_rst = 0
1576*53ee8cc1Swenshuai.xi 
1577*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_CTRL0, DISABLE, VOP_FSYNC_EN); // frame sync disable
1578*53ee8cc1Swenshuai.xi 
1579*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->b3DLRMode)//4k1k mvc
1580*53ee8cc1Swenshuai.xi         {
1581*53ee8cc1Swenshuai.xi             //burst and priority
1582*53ee8cc1Swenshuai.xi             HAL_WriteByte(VOP_DMA1, 0x26);
1583*53ee8cc1Swenshuai.xi             HAL_WriteByte(VOP_BURST_CTRL0, 0x05);
1584*53ee8cc1Swenshuai.xi             HAL_WriteByte(VOP_BURST_CTRL1, 0x00);
1585*53ee8cc1Swenshuai.xi         }
1586*53ee8cc1Swenshuai.xi 
1587*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("[MVOP][DBG] Set 160MHz clock\n");)
1588*53ee8cc1Swenshuai.xi     }
1589*53ee8cc1Swenshuai.xi     else if (_bEnable4k2kClk)
1590*53ee8cc1Swenshuai.xi     {
1591*53ee8cc1Swenshuai.xi         HAL_MVOP_SetFrequency(HAL_MVOP_Get4k2kClk());
1592*53ee8cc1Swenshuai.xi 
1593*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_FRAME_RST, 0, BIT15); // reg_frame_rst = 0
1594*53ee8cc1Swenshuai.xi 
1595*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_CTRL0, DISABLE, VOP_FSYNC_EN); // frame sync disable
1596*53ee8cc1Swenshuai.xi         // Clippers sync wz xc: 4k2k default 2p mode enable(xc output 50 or 60)
1597*53ee8cc1Swenshuai.xi         HAL_MVOP_SetEnable4k2k2P(TRUE);
1598*53ee8cc1Swenshuai.xi         //Change MIU BW Default Value to 0x241C (after Einstein)
1599*53ee8cc1Swenshuai.xi         //FIFO threshold
1600*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_DMA0, 0x10);
1601*53ee8cc1Swenshuai.xi         //burst and priority
1602*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_DMA1, 0x26);
1603*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_BURST_CTRL0, 0x05);
1604*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_BURST_CTRL1, 0x00);
1605*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("[MVOP][DBG] Set 4k2k clock\n");)
1606*53ee8cc1Swenshuai.xi     }
1607*53ee8cc1Swenshuai.xi     else
1608*53ee8cc1Swenshuai.xi     {
1609*53ee8cc1Swenshuai.xi         HAL_MVOP_SetFrequency(HALMVOP_SYNCMODE);
1610*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC0_NUM  ), LOWBYTE( ptiming->u16Num));
1611*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC0_NUM+1), HIGHBYTE(ptiming->u16Num));
1612*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC0_DEN  ), LOWBYTE( ptiming->u16Den));
1613*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC0_DEN+1), HIGHBYTE(ptiming->u16Den));
1614*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_UPDATE_DC0_CW, 1, UPDATE_DC0_SYNC_CW);
1615*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_UPDATE_DC0_CW, 0, UPDATE_DC0_SYNC_CW);
1616*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("[MVOP][DBG] Set Sync clock\n");)
1617*53ee8cc1Swenshuai.xi     }
1618*53ee8cc1Swenshuai.xi }
1619*53ee8cc1Swenshuai.xi 
1620*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetMonoMode(MS_BOOL bEnable)1621*53ee8cc1Swenshuai.xi void HAL_MVOP_SetMonoMode(MS_BOOL bEnable)
1622*53ee8cc1Swenshuai.xi {
1623*53ee8cc1Swenshuai.xi     if(bEnable)
1624*53ee8cc1Swenshuai.xi     {
1625*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_U_PAT  , 0x80);
1626*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_U_PAT+1), 0x80);
1627*53ee8cc1Swenshuai.xi 
1628*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_INPUT_SWITCH1, 1, BIT1);    // Mono mode enable
1629*53ee8cc1Swenshuai.xi     }
1630*53ee8cc1Swenshuai.xi     else
1631*53ee8cc1Swenshuai.xi     {
1632*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_INPUT_SWITCH1, 0, BIT1);    //Mono mode disable
1633*53ee8cc1Swenshuai.xi     }
1634*53ee8cc1Swenshuai.xi }
1635*53ee8cc1Swenshuai.xi 
1636*53ee8cc1Swenshuai.xi /******************************************************************************/
1637*53ee8cc1Swenshuai.xi /// Set MVOP for H264  Hardwire Mode
1638*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SetH264HardwireMode(MS_U16 u16ECOVersion)1639*53ee8cc1Swenshuai.xi void HAL_MVOP_SetH264HardwireMode(MS_U16 u16ECOVersion)
1640*53ee8cc1Swenshuai.xi {
1641*53ee8cc1Swenshuai.xi     // Hardwire mode
1642*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_MPG_JPG_SWITCH, 0x00);
1643*53ee8cc1Swenshuai.xi 
1644*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
1645*53ee8cc1Swenshuai.xi 
1646*53ee8cc1Swenshuai.xi     //16*32 tile format
1647*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, 1, BIT1);
1648*53ee8cc1Swenshuai.xi 
1649*53ee8cc1Swenshuai.xi     // SVD mode enable
1650*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_INPUT_SWITCH1, BIT3, BIT2|BIT3);
1651*53ee8cc1Swenshuai.xi 
1652*53ee8cc1Swenshuai.xi     // set mvop to 128bit_i128 interface
1653*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_MIU_IF, VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
1654*53ee8cc1Swenshuai.xi 
1655*53ee8cc1Swenshuai.xi     // Only for Monaco: Disable deciding bot by top address + 2
1656*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG, 0, VOP_FIELD_FROM_ADDR);
1657*53ee8cc1Swenshuai.xi 
1658*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_DUMMY, 1, VOP_32x32_WB); //32x32 from wb
1659*53ee8cc1Swenshuai.xi     if(u16ECOVersion == 0)
1660*53ee8cc1Swenshuai.xi     {
1661*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(REG_CKG_DC_SRAM, 0x0, CKG_DC0_SRAM);//Dc0 enable & dc0_mfdec_en =0  57[3:0]= 0x4, others  57[3:0]=0x0
1662*53ee8cc1Swenshuai.xi     }
1663*53ee8cc1Swenshuai.xi     // Write trigger
1664*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
1665*53ee8cc1Swenshuai.xi }
1666*53ee8cc1Swenshuai.xi 
1667*53ee8cc1Swenshuai.xi /******************************************************************************/
1668*53ee8cc1Swenshuai.xi /// Set MVOP for RM  Hardwire Mode
1669*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SetRMHardwireMode(MS_U16 u16ECOVersion)1670*53ee8cc1Swenshuai.xi void HAL_MVOP_SetRMHardwireMode(MS_U16 u16ECOVersion)
1671*53ee8cc1Swenshuai.xi {
1672*53ee8cc1Swenshuai.xi     HAL_MVOP_SetH264HardwireMode(u16ECOVersion);
1673*53ee8cc1Swenshuai.xi     if(u16ECOVersion == 0)
1674*53ee8cc1Swenshuai.xi     {
1675*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(REG_CKG_DC_SRAM, 0x4, CKG_DC0_SRAM);//Dc0 enable & dc0_mfdec_en =0  57[3:0]= 0x4, others  57[3:0]=0x0
1676*53ee8cc1Swenshuai.xi     }
1677*53ee8cc1Swenshuai.xi }
1678*53ee8cc1Swenshuai.xi 
1679*53ee8cc1Swenshuai.xi /******************************************************************************/
1680*53ee8cc1Swenshuai.xi /// Set MVOP for JPEG Hardwire Mode
1681*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SetJpegHardwireMode(void)1682*53ee8cc1Swenshuai.xi void HAL_MVOP_SetJpegHardwireMode(void)
1683*53ee8cc1Swenshuai.xi {
1684*53ee8cc1Swenshuai.xi     MS_U8 regval = 0x00;
1685*53ee8cc1Swenshuai.xi 
1686*53ee8cc1Swenshuai.xi     regval |= 0x80; // packmode
1687*53ee8cc1Swenshuai.xi     regval |= 0x20; // Dram Rd Contd
1688*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_MPG_JPG_SWITCH, regval);
1689*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIs422 = 1;
1690*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_DUMMY, 0, VOP_420_BW_SAVE);
1691*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_BW_SAVE, 0, VOP_420_BW_SAVE_EX);
1692*53ee8cc1Swenshuai.xi 
1693*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_INFO_FROM_CODEC_H, 0x00, VOP_INFO_FROM_CODEC_MIU_BUF0_SEL|VOP_INFO_FROM_CODEC_MIU_BUF1_SEL);
1694*53ee8cc1Swenshuai.xi 
1695*53ee8cc1Swenshuai.xi     // Write trigger
1696*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
1697*53ee8cc1Swenshuai.xi }
1698*53ee8cc1Swenshuai.xi 
1699*53ee8cc1Swenshuai.xi /******************************************************************************/
1700*53ee8cc1Swenshuai.xi /// Set MVOP for EVD Hardwire Mode
1701*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SetEVDHardwireMode(MS_U16 u16ECOVersion)1702*53ee8cc1Swenshuai.xi void HAL_MVOP_SetEVDHardwireMode(MS_U16 u16ECOVersion)
1703*53ee8cc1Swenshuai.xi {
1704*53ee8cc1Swenshuai.xi     // Hardwire mode
1705*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_MPG_JPG_SWITCH, 0x00);
1706*53ee8cc1Swenshuai.xi 
1707*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
1708*53ee8cc1Swenshuai.xi 
1709*53ee8cc1Swenshuai.xi     //16*32 tile format
1710*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, 1, BIT1);
1711*53ee8cc1Swenshuai.xi 
1712*53ee8cc1Swenshuai.xi     // SVD mode enable
1713*53ee8cc1Swenshuai.xi     // EVD use HVD interface
1714*53ee8cc1Swenshuai.xi     //HAL_WriteByteMask(VOP_INPUT_SWITCH1, BIT3, BIT2|BIT3);
1715*53ee8cc1Swenshuai.xi 
1716*53ee8cc1Swenshuai.xi     // EVD mode enable
1717*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INPUT_SWITCH0, 1, EVD_ENABLE);
1718*53ee8cc1Swenshuai.xi 
1719*53ee8cc1Swenshuai.xi     // set mvop to 128bit_i128 interface
1720*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_MIU_IF, VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
1721*53ee8cc1Swenshuai.xi 
1722*53ee8cc1Swenshuai.xi     // set evd flag for interlace mode setting
1723*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsH265 = 1;
1724*53ee8cc1Swenshuai.xi 
1725*53ee8cc1Swenshuai.xi     // 10 bits from wb
1726*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INFO_FROM_CODEC_H, 1, VOP_INFO_FROM_CODEC_10BIT);
1727*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_REG_MASK, 0, VOP_LSB_REQ_MASK);
1728*53ee8cc1Swenshuai.xi 
1729*53ee8cc1Swenshuai.xi     if(u16ECOVersion == 0)
1730*53ee8cc1Swenshuai.xi     {
1731*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(REG_CKG_DC_SRAM, 0x0, CKG_DC0_SRAM);//Dc0 enable & dc0_mfdec_en =0  57[3:0]= 0x4, others  57[3:0]=0x0
1732*53ee8cc1Swenshuai.xi     }
1733*53ee8cc1Swenshuai.xi 
1734*53ee8cc1Swenshuai.xi 
1735*53ee8cc1Swenshuai.xi     // Write trigger
1736*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
1737*53ee8cc1Swenshuai.xi }
1738*53ee8cc1Swenshuai.xi 
1739*53ee8cc1Swenshuai.xi /******************************************************************************/
1740*53ee8cc1Swenshuai.xi /// Set MVOP for VP9 Hardwire Mode
1741*53ee8cc1Swenshuai.xi /// vp9 hw change in Manhathan: tile mode 16x32
1742*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SetVP9HardwireMode(MS_U16 u16ECOVersion)1743*53ee8cc1Swenshuai.xi void HAL_MVOP_SetVP9HardwireMode(MS_U16 u16ECOVersion)
1744*53ee8cc1Swenshuai.xi {
1745*53ee8cc1Swenshuai.xi     HAL_MVOP_SetEVDHardwireMode(u16ECOVersion);
1746*53ee8cc1Swenshuai.xi }
1747*53ee8cc1Swenshuai.xi 
1748*53ee8cc1Swenshuai.xi /******************************************************************************/
1749*53ee8cc1Swenshuai.xi /// Set MVOP for EVD MCU Mode
1750*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SetEVDFeature(MVOP_DevID eID,MVOP_EVDFeature * stEVDInput)1751*53ee8cc1Swenshuai.xi void HAL_MVOP_SetEVDFeature(MVOP_DevID eID, MVOP_EVDFeature* stEVDInput)
1752*53ee8cc1Swenshuai.xi {
1753*53ee8cc1Swenshuai.xi     switch(eID)
1754*53ee8cc1Swenshuai.xi     {
1755*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
1756*53ee8cc1Swenshuai.xi 
1757*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_INPUT_SWITCH0, stEVDInput->bEnableEVD, EVD_ENABLE);// 32x32 enable
1758*53ee8cc1Swenshuai.xi 
1759*53ee8cc1Swenshuai.xi             switch(stEVDInput->eEVDBit[Y_INFO])
1760*53ee8cc1Swenshuai.xi             {
1761*53ee8cc1Swenshuai.xi                 case E_MVOP_EVD_8BIT:
1762*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(VOP_EVD_10B_EN, 0, VOP_EVD_10B_Y_EN);
1763*53ee8cc1Swenshuai.xi                     break;
1764*53ee8cc1Swenshuai.xi                 case E_MVOP_EVD_10BIT:
1765*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(VOP_EVD_10B_EN, 1, VOP_EVD_10B_Y_EN);
1766*53ee8cc1Swenshuai.xi                     break;
1767*53ee8cc1Swenshuai.xi                 default:
1768*53ee8cc1Swenshuai.xi                     break;
1769*53ee8cc1Swenshuai.xi             }
1770*53ee8cc1Swenshuai.xi 
1771*53ee8cc1Swenshuai.xi             switch(stEVDInput->eEVDBit[UV_INFO])
1772*53ee8cc1Swenshuai.xi             {
1773*53ee8cc1Swenshuai.xi                 case E_MVOP_EVD_8BIT:
1774*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(VOP_EVD_10B_EN, 0, VOP_EVD_10B_UV_EN);
1775*53ee8cc1Swenshuai.xi                     break;
1776*53ee8cc1Swenshuai.xi                 case E_MVOP_EVD_10BIT:
1777*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(VOP_EVD_10B_EN, 1, VOP_EVD_10B_UV_EN);
1778*53ee8cc1Swenshuai.xi                     break;
1779*53ee8cc1Swenshuai.xi                 default:
1780*53ee8cc1Swenshuai.xi                     break;
1781*53ee8cc1Swenshuai.xi             }
1782*53ee8cc1Swenshuai.xi 
1783*53ee8cc1Swenshuai.xi             //LSB BW Discard MASK
1784*53ee8cc1Swenshuai.xi             if(stEVDInput->eEVDBit[Y_INFO] || stEVDInput->eEVDBit[UV_INFO])
1785*53ee8cc1Swenshuai.xi             {
1786*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(VOP_REG_MASK, 0, VOP_LSB_REQ_MASK);
1787*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_UV_SHIFT, 0, VOP_GCLK_MIU_ON);
1788*53ee8cc1Swenshuai.xi                 MVOP_DBG(MVOP_PRINTF("[Debug] 10 bits display\n"););
1789*53ee8cc1Swenshuai.xi             }
1790*53ee8cc1Swenshuai.xi             else
1791*53ee8cc1Swenshuai.xi             {
1792*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(VOP_REG_MASK, BIT1, VOP_LSB_REQ_MASK);
1793*53ee8cc1Swenshuai.xi             }
1794*53ee8cc1Swenshuai.xi 
1795*53ee8cc1Swenshuai.xi             // Write trigger
1796*53ee8cc1Swenshuai.xi             HAL_MVOP_LoadReg();
1797*53ee8cc1Swenshuai.xi             break;
1798*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
1799*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
1800*53ee8cc1Swenshuai.xi 
1801*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), stEVDInput->bEnableEVD, EVD_ENABLE);// 32x32 enable
1802*53ee8cc1Swenshuai.xi 
1803*53ee8cc1Swenshuai.xi             switch(stEVDInput->eEVDBit[Y_INFO])
1804*53ee8cc1Swenshuai.xi             {
1805*53ee8cc1Swenshuai.xi                 case E_MVOP_EVD_8BIT:
1806*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(SUB_REG(VOP_EVD_10B_EN), 0, VOP_EVD_10B_Y_EN);
1807*53ee8cc1Swenshuai.xi                     break;
1808*53ee8cc1Swenshuai.xi                 case E_MVOP_EVD_10BIT:
1809*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(SUB_REG(VOP_EVD_10B_EN), 1, VOP_EVD_10B_Y_EN);
1810*53ee8cc1Swenshuai.xi                     break;
1811*53ee8cc1Swenshuai.xi                 default:
1812*53ee8cc1Swenshuai.xi                     break;
1813*53ee8cc1Swenshuai.xi             }
1814*53ee8cc1Swenshuai.xi 
1815*53ee8cc1Swenshuai.xi             switch(stEVDInput->eEVDBit[UV_INFO])
1816*53ee8cc1Swenshuai.xi             {
1817*53ee8cc1Swenshuai.xi                 case E_MVOP_EVD_8BIT:
1818*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(SUB_REG(VOP_EVD_10B_EN), 0, VOP_EVD_10B_UV_EN);
1819*53ee8cc1Swenshuai.xi                     break;
1820*53ee8cc1Swenshuai.xi                 case E_MVOP_EVD_10BIT:
1821*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(SUB_REG(VOP_EVD_10B_EN), 1, VOP_EVD_10B_UV_EN);
1822*53ee8cc1Swenshuai.xi                     break;
1823*53ee8cc1Swenshuai.xi                 default:
1824*53ee8cc1Swenshuai.xi                     break;
1825*53ee8cc1Swenshuai.xi             }
1826*53ee8cc1Swenshuai.xi 
1827*53ee8cc1Swenshuai.xi             //LSB BW Discard MASK
1828*53ee8cc1Swenshuai.xi             if(stEVDInput->eEVDBit[Y_INFO] || stEVDInput->eEVDBit[UV_INFO])
1829*53ee8cc1Swenshuai.xi             {
1830*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(SUB_REG(VOP_REG_MASK), 0, VOP_LSB_REQ_MASK);
1831*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_UV_SHIFT), 0, VOP_GCLK_MIU_ON);
1832*53ee8cc1Swenshuai.xi                 MVOP_DBG(MVOP_PRINTF("[Debug] 10 bits display\n"););
1833*53ee8cc1Swenshuai.xi             }
1834*53ee8cc1Swenshuai.xi             else
1835*53ee8cc1Swenshuai.xi             {
1836*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(SUB_REG(VOP_REG_MASK), BIT1, VOP_LSB_REQ_MASK);
1837*53ee8cc1Swenshuai.xi             }
1838*53ee8cc1Swenshuai.xi             // Write trigger
1839*53ee8cc1Swenshuai.xi             HAL_MVOP_SubLoadReg();
1840*53ee8cc1Swenshuai.xi #endif
1841*53ee8cc1Swenshuai.xi             break;
1842*53ee8cc1Swenshuai.xi             default:
1843*53ee8cc1Swenshuai.xi                 break;
1844*53ee8cc1Swenshuai.xi     }
1845*53ee8cc1Swenshuai.xi 
1846*53ee8cc1Swenshuai.xi }
1847*53ee8cc1Swenshuai.xi 
1848*53ee8cc1Swenshuai.xi 
1849*53ee8cc1Swenshuai.xi ///Enable 3D L/R dual buffer mode
HAL_MVOP_Enable3DLR(MS_BOOL bEnable)1850*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Enable3DLR(MS_BOOL bEnable)
1851*53ee8cc1Swenshuai.xi {
1852*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
1853*53ee8cc1Swenshuai.xi     {
1854*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1855*53ee8cc1Swenshuai.xi         return FALSE;
1856*53ee8cc1Swenshuai.xi     }
1857*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MULTI_WIN_CFG0, bEnable, VOP_LR_BUF_MODE);
1858*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->b3DLRMode = bEnable;
1859*53ee8cc1Swenshuai.xi     if(bEnable)
1860*53ee8cc1Swenshuai.xi     {
1861*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_BW_SAVE, 0, VOP_420_BW_SAVE_EX);
1862*53ee8cc1Swenshuai.xi     }
1863*53ee8cc1Swenshuai.xi     return TRUE;
1864*53ee8cc1Swenshuai.xi }
1865*53ee8cc1Swenshuai.xi 
1866*53ee8cc1Swenshuai.xi ///Get if 3D L/R mode is enabled
HAL_MVOP_Get3DLRMode(void)1867*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Get3DLRMode(void)
1868*53ee8cc1Swenshuai.xi {
1869*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
1870*53ee8cc1Swenshuai.xi     {
1871*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1872*53ee8cc1Swenshuai.xi         return FALSE;
1873*53ee8cc1Swenshuai.xi     }
1874*53ee8cc1Swenshuai.xi     return g_pHalMVOPCtx->b3DLRMode;
1875*53ee8cc1Swenshuai.xi }
1876*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetTimingInfoFromRegisters(MVOP_TimingInfo_FromRegisters * pMvopTimingInfo)1877*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetTimingInfoFromRegisters(MVOP_TimingInfo_FromRegisters *pMvopTimingInfo)
1878*53ee8cc1Swenshuai.xi {
1879*53ee8cc1Swenshuai.xi     if(NULL == pMvopTimingInfo)
1880*53ee8cc1Swenshuai.xi     {
1881*53ee8cc1Swenshuai.xi         MVOP_PRINTF("HAL_MVOP_GetTimingInfoFromRegisters():pMvopTimingInfo is NULL\n");
1882*53ee8cc1Swenshuai.xi         return FALSE;
1883*53ee8cc1Swenshuai.xi     }
1884*53ee8cc1Swenshuai.xi     if(HAL_MVOP_GetEnableState() == FALSE)
1885*53ee8cc1Swenshuai.xi     {
1886*53ee8cc1Swenshuai.xi         MVOP_PRINTF("MVOP is not enabled!\n");
1887*53ee8cc1Swenshuai.xi         pMvopTimingInfo->bEnabled = FALSE;
1888*53ee8cc1Swenshuai.xi         return FALSE;
1889*53ee8cc1Swenshuai.xi     }
1890*53ee8cc1Swenshuai.xi     pMvopTimingInfo->bEnabled = TRUE;
1891*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16H_TotalCount = (HAL_ReadByte((VOP_FRAME_HCOUNT + 1))<< 8) | (HAL_ReadByte((VOP_FRAME_HCOUNT)));
1892*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16V_TotalCount = (HAL_ReadByte((VOP_FRAME_VCOUNT + 1))<< 8) | (HAL_ReadByte((VOP_FRAME_VCOUNT)));
1893*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16VBlank0_Start = (HAL_ReadByte((VOP_VB0_STR + 1))<< 8) | (HAL_ReadByte((VOP_VB0_STR)));
1894*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16VBlank0_End = (HAL_ReadByte((VOP_VB0_END + 1))<< 8) | (HAL_ReadByte((VOP_VB0_END)));
1895*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16VBlank1_Start = (HAL_ReadByte((VOP_VB1_STR + 1))<< 8) | (HAL_ReadByte((VOP_VB1_STR)));
1896*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16VBlank1_End = (HAL_ReadByte((VOP_VB1_END + 1))<< 8) | (HAL_ReadByte((VOP_VB1_END)));
1897*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16TopField_Start = (HAL_ReadByte((VOP_TF_STR + 1))<< 8) | (HAL_ReadByte((VOP_TF_STR)));
1898*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16BottomField_Start = (HAL_ReadByte((VOP_BF_STR + 1))<< 8) | (HAL_ReadByte((VOP_BF_STR)));
1899*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16HActive_Start = (HAL_ReadByte((VOP_HACT_STR + 1))<< 8) | (HAL_ReadByte((VOP_HACT_STR)));
1900*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16TopField_VS = (HAL_ReadByte((VOP_TF_VS + 1))<< 8) | (HAL_ReadByte((VOP_TF_VS)));
1901*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16BottomField_VS = (HAL_ReadByte((VOP_BF_VS + 1))<< 8) | (HAL_ReadByte((VOP_BF_VS)));
1902*53ee8cc1Swenshuai.xi     pMvopTimingInfo->bInterlace = (HAL_ReadRegBit(VOP_CTRL0, BIT7) == BIT7);
1903*53ee8cc1Swenshuai.xi     return TRUE;
1904*53ee8cc1Swenshuai.xi }
1905*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetYUVBaseAdd(MS_PHY u32YOffset,MS_PHY u32UVOffset,MS_BOOL bProgressive,MS_BOOL b422pack)1906*53ee8cc1Swenshuai.xi void HAL_MVOP_SetYUVBaseAdd(MS_PHY u32YOffset, MS_PHY u32UVOffset, MS_BOOL bProgressive, MS_BOOL b422pack)
1907*53ee8cc1Swenshuai.xi {
1908*53ee8cc1Swenshuai.xi     MS_PHY u64tmp = 0;
1909*53ee8cc1Swenshuai.xi 
1910*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
1911*53ee8cc1Swenshuai.xi     {
1912*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1913*53ee8cc1Swenshuai.xi         return;
1914*53ee8cc1Swenshuai.xi     }
1915*53ee8cc1Swenshuai.xi     // Y offset
1916*53ee8cc1Swenshuai.xi     u64tmp = u32YOffset >> 3;
1917*53ee8cc1Swenshuai.xi     if ( !bProgressive )
1918*53ee8cc1Swenshuai.xi     {   //Refine Y offset for interlace repeat bottom field
1919*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
1920*53ee8cc1Swenshuai.xi         {
1921*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
1922*53ee8cc1Swenshuai.xi             u64tmp += 2;
1923*53ee8cc1Swenshuai.xi         }
1924*53ee8cc1Swenshuai.xi         else
1925*53ee8cc1Swenshuai.xi         {
1926*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is TOP or NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
1927*53ee8cc1Swenshuai.xi         }
1928*53ee8cc1Swenshuai.xi     }
1929*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_JPG_YSTR0_L, u64tmp & 0xff);
1930*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_L+1), (u64tmp >> 8) & 0xff);
1931*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_L+2), (u64tmp >> 16) & 0xff);
1932*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_L+3), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
1933*53ee8cc1Swenshuai.xi 
1934*53ee8cc1Swenshuai.xi     if (!bProgressive )
1935*53ee8cc1Swenshuai.xi     {   //Y offset of bottom field if interlace
1936*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_YSTR1_L, u64tmp & 0xff);
1937*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR1_L+1), (u64tmp >> 8) & 0xff);
1938*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR1_L+2), (u64tmp >> 16) & 0xff);
1939*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR1_L+3), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
1940*53ee8cc1Swenshuai.xi     }
1941*53ee8cc1Swenshuai.xi 
1942*53ee8cc1Swenshuai.xi     if (b422pack)
1943*53ee8cc1Swenshuai.xi     {
1944*53ee8cc1Swenshuai.xi         u32UVOffset = u32YOffset + 16; //add 16 for 128bit; add 8 for 64bit
1945*53ee8cc1Swenshuai.xi     }
1946*53ee8cc1Swenshuai.xi     // UV offset
1947*53ee8cc1Swenshuai.xi     u64tmp = u32UVOffset >> 3;
1948*53ee8cc1Swenshuai.xi     if( !bProgressive )
1949*53ee8cc1Swenshuai.xi     {  //Refine UV offset for interlace repeat bottom field
1950*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
1951*53ee8cc1Swenshuai.xi         {
1952*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
1953*53ee8cc1Swenshuai.xi             u64tmp += 2;
1954*53ee8cc1Swenshuai.xi         }
1955*53ee8cc1Swenshuai.xi         else
1956*53ee8cc1Swenshuai.xi         {
1957*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is TOP/NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
1958*53ee8cc1Swenshuai.xi         }
1959*53ee8cc1Swenshuai.xi     }
1960*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_JPG_UVSTR0_L, u64tmp & 0xff);
1961*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_UVSTR0_L+1), (u64tmp >> 8) & 0xff);
1962*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_UVSTR0_L+2), (u64tmp >> 16) & 0xff);
1963*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_UVSTR0_L+3), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
1964*53ee8cc1Swenshuai.xi 
1965*53ee8cc1Swenshuai.xi     if( !bProgressive )
1966*53ee8cc1Swenshuai.xi     {  //UV offset of bottom field if interlace
1967*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_UVSTR1_L, u64tmp & 0xff);
1968*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR1_L+1), (u64tmp >> 8) & 0xff);
1969*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR1_L+2), (u64tmp >> 16) & 0xff);
1970*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR1_L+3), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
1971*53ee8cc1Swenshuai.xi     }
1972*53ee8cc1Swenshuai.xi 
1973*53ee8cc1Swenshuai.xi     return;
1974*53ee8cc1Swenshuai.xi }
1975*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetYUVBaseAddMultiView(MVOP_BaseAddInput * stBaseAddInfo)1976*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SetYUVBaseAddMultiView(MVOP_BaseAddInput *stBaseAddInfo)
1977*53ee8cc1Swenshuai.xi {
1978*53ee8cc1Swenshuai.xi     MS_PHY u64tmpY = 0;
1979*53ee8cc1Swenshuai.xi     MS_PHY u64tmpUV = 0;
1980*53ee8cc1Swenshuai.xi 
1981*53ee8cc1Swenshuai.xi     if (stBaseAddInfo == NULL)
1982*53ee8cc1Swenshuai.xi     {
1983*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s stBaseAddInfo is NULL pointer\n", __FUNCTION__);)
1984*53ee8cc1Swenshuai.xi         return FALSE;
1985*53ee8cc1Swenshuai.xi     }
1986*53ee8cc1Swenshuai.xi     // Y offset
1987*53ee8cc1Swenshuai.xi     u64tmpY = (stBaseAddInfo->u32YOffset) >> 3;
1988*53ee8cc1Swenshuai.xi     // UV offset
1989*53ee8cc1Swenshuai.xi     u64tmpUV = (stBaseAddInfo->u32UVOffset) >> 3;
1990*53ee8cc1Swenshuai.xi 
1991*53ee8cc1Swenshuai.xi     switch(stBaseAddInfo->eView)
1992*53ee8cc1Swenshuai.xi     {
1993*53ee8cc1Swenshuai.xi     case E_MVOP_MAIN_VIEW:
1994*53ee8cc1Swenshuai.xi         // Y offset
1995*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_YSTR0_L, u64tmpY & 0xff);
1996*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR0_L+1), (u64tmpY >> 8) & 0xff);
1997*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR0_L+2), (u64tmpY >> 16) & 0xff);
1998*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR0_L+3), (u64tmpY >> 24) & VOP_YUV_STR_HIBITS);
1999*53ee8cc1Swenshuai.xi 
2000*53ee8cc1Swenshuai.xi         // UV offset
2001*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_UVSTR0_L, u64tmpUV & 0xff);
2002*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR0_L+1), (u64tmpUV >> 8) & 0xff);
2003*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR0_L+2), (u64tmpUV >> 16) & 0xff);
2004*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR0_L+3), (u64tmpUV >> 24) & VOP_YUV_STR_HIBITS);
2005*53ee8cc1Swenshuai.xi         break;
2006*53ee8cc1Swenshuai.xi     case E_MVOP_2ND_VIEW:
2007*53ee8cc1Swenshuai.xi         // Y offset
2008*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_YSTR1_L, u64tmpY & 0xff);
2009*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR1_L+1), (u64tmpY >> 8) & 0xff);
2010*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR1_L+2), (u64tmpY >> 16) & 0xff);
2011*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR1_L+3), (u64tmpY >> 24) & VOP_YUV_STR_HIBITS);
2012*53ee8cc1Swenshuai.xi 
2013*53ee8cc1Swenshuai.xi         //UV offset
2014*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_UVSTR1_L, u64tmpUV & 0xff);
2015*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR1_L+1), (u64tmpUV >> 8) & 0xff);
2016*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR1_L+2), (u64tmpUV >> 16) & 0xff);
2017*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR1_L+3), (u64tmpUV >> 24) & VOP_YUV_STR_HIBITS);
2018*53ee8cc1Swenshuai.xi         break;
2019*53ee8cc1Swenshuai.xi     default:
2020*53ee8cc1Swenshuai.xi         break;
2021*53ee8cc1Swenshuai.xi     }
2022*53ee8cc1Swenshuai.xi     return TRUE;
2023*53ee8cc1Swenshuai.xi }
2024*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetYBaseAdd(void)2025*53ee8cc1Swenshuai.xi MS_PHY HAL_MVOP_GetYBaseAdd(void)
2026*53ee8cc1Swenshuai.xi {
2027*53ee8cc1Swenshuai.xi     MS_PHY u64YOffset = 0;
2028*53ee8cc1Swenshuai.xi     u64YOffset = HAL_ReadByte(VOP_JPG_YSTR0_L)&0xff;
2029*53ee8cc1Swenshuai.xi     u64YOffset |=((HAL_ReadByte((VOP_JPG_YSTR0_L+1))<<8)&0xff00);
2030*53ee8cc1Swenshuai.xi     u64YOffset |=((HAL_ReadByte((VOP_JPG_YSTR0_L+2))<<16)&0xff0000);
2031*53ee8cc1Swenshuai.xi     u64YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR0_L+3)) & VOP_YUV_STR_HIBITS) <<24);
2032*53ee8cc1Swenshuai.xi     return u64YOffset;
2033*53ee8cc1Swenshuai.xi }
2034*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetUVBaseAdd(void)2035*53ee8cc1Swenshuai.xi MS_PHY HAL_MVOP_GetUVBaseAdd(void)
2036*53ee8cc1Swenshuai.xi {
2037*53ee8cc1Swenshuai.xi     MS_PHY u64UVOffset = 0;
2038*53ee8cc1Swenshuai.xi     u64UVOffset = HAL_ReadByte(VOP_JPG_UVSTR0_L)&0xff;
2039*53ee8cc1Swenshuai.xi     u64UVOffset |=((HAL_ReadByte((VOP_JPG_UVSTR0_L+1))<<8)&0xff00);
2040*53ee8cc1Swenshuai.xi     u64UVOffset |=((HAL_ReadByte((VOP_JPG_UVSTR0_L+2))<<16)&0xff0000);
2041*53ee8cc1Swenshuai.xi     u64UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR0_L+3)) & VOP_YUV_STR_HIBITS) <<24);
2042*53ee8cc1Swenshuai.xi     return u64UVOffset;
2043*53ee8cc1Swenshuai.xi }
2044*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetYBaseAddMultiView(MVOP_3DView eView)2045*53ee8cc1Swenshuai.xi MS_PHY HAL_MVOP_GetYBaseAddMultiView(MVOP_3DView eView)
2046*53ee8cc1Swenshuai.xi {
2047*53ee8cc1Swenshuai.xi     MS_PHY u64YOffset = 0;
2048*53ee8cc1Swenshuai.xi     switch(eView)
2049*53ee8cc1Swenshuai.xi     {
2050*53ee8cc1Swenshuai.xi         case E_MVOP_MAIN_VIEW:
2051*53ee8cc1Swenshuai.xi             u64YOffset = HAL_ReadByte(VOP_JPG_YSTR0_L)&0xff;
2052*53ee8cc1Swenshuai.xi             u64YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR0_L+1))<<8)&0xff00);
2053*53ee8cc1Swenshuai.xi             u64YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR0_L+2))<<16)&0xff0000);
2054*53ee8cc1Swenshuai.xi             u64YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR0_L+3)) & VOP_YUV_STR_HIBITS) <<24);
2055*53ee8cc1Swenshuai.xi             break;
2056*53ee8cc1Swenshuai.xi         case E_MVOP_2ND_VIEW:
2057*53ee8cc1Swenshuai.xi             u64YOffset = HAL_ReadByte(VOP_JPG_YSTR1_L)&0xff;
2058*53ee8cc1Swenshuai.xi             u64YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR1_L+1))<<8)&0xff00);
2059*53ee8cc1Swenshuai.xi             u64YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR1_L+2))<<16)&0xff0000);
2060*53ee8cc1Swenshuai.xi             u64YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR1_L+3))<<24)&0x7000000);
2061*53ee8cc1Swenshuai.xi             break;
2062*53ee8cc1Swenshuai.xi         default:
2063*53ee8cc1Swenshuai.xi             u64YOffset = 0;
2064*53ee8cc1Swenshuai.xi             break;
2065*53ee8cc1Swenshuai.xi     }
2066*53ee8cc1Swenshuai.xi     return u64YOffset;
2067*53ee8cc1Swenshuai.xi }
2068*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetUVBaseAddMultiView(MVOP_3DView eView)2069*53ee8cc1Swenshuai.xi MS_PHY HAL_MVOP_GetUVBaseAddMultiView(MVOP_3DView eView)
2070*53ee8cc1Swenshuai.xi {
2071*53ee8cc1Swenshuai.xi     MS_PHY u64UVOffset = 0;
2072*53ee8cc1Swenshuai.xi     switch(eView)
2073*53ee8cc1Swenshuai.xi     {
2074*53ee8cc1Swenshuai.xi         case E_MVOP_MAIN_VIEW:
2075*53ee8cc1Swenshuai.xi             u64UVOffset = HAL_ReadByte(VOP_JPG_UVSTR0_L)&0xff;
2076*53ee8cc1Swenshuai.xi             u64UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR0_L+1))<<8)&0xff00);
2077*53ee8cc1Swenshuai.xi             u64UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR0_L+2))<<16)&0xff0000);
2078*53ee8cc1Swenshuai.xi             u64UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR0_L+3)) & VOP_YUV_STR_HIBITS) <<24);
2079*53ee8cc1Swenshuai.xi             break;
2080*53ee8cc1Swenshuai.xi         case E_MVOP_2ND_VIEW:
2081*53ee8cc1Swenshuai.xi             u64UVOffset = HAL_ReadByte(VOP_JPG_UVSTR1_L)&0xff;
2082*53ee8cc1Swenshuai.xi             u64UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR1_L+1))<<8)&0xff00);
2083*53ee8cc1Swenshuai.xi             u64UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR1_L+2))<<16)&0xff0000);
2084*53ee8cc1Swenshuai.xi             u64UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR1_L+3))<<24)&0x7000000);
2085*53ee8cc1Swenshuai.xi             break;
2086*53ee8cc1Swenshuai.xi         default:
2087*53ee8cc1Swenshuai.xi             u64UVOffset = 0;
2088*53ee8cc1Swenshuai.xi             break;
2089*53ee8cc1Swenshuai.xi     }
2090*53ee8cc1Swenshuai.xi     return u64UVOffset;
2091*53ee8cc1Swenshuai.xi }
2092*53ee8cc1Swenshuai.xi 
HAL_MVOP_Set3DLRAltOutput_VHalfScaling(MS_BOOL bEnable)2093*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Set3DLRAltOutput_VHalfScaling(MS_BOOL bEnable)
2094*53ee8cc1Swenshuai.xi {
2095*53ee8cc1Swenshuai.xi     MS_BOOL bEnDualBuff = bEnable ? ENABLE : DISABLE;     //enable dual buffer
2096*53ee8cc1Swenshuai.xi     MS_BOOL bEnSWDualBuff = bEnable ? DISABLE : ENABLE;   //buffer controlled by HK instead of FW
2097*53ee8cc1Swenshuai.xi     MS_BOOL bEnMirrMaskBase = bEnable ? DISABLE : ENABLE; //do not mask LSB
2098*53ee8cc1Swenshuai.xi     MS_BOOL bEnHwFldBase = bEnable ? DISABLE : ENABLE;    //hardware calculate field jump base address
2099*53ee8cc1Swenshuai.xi 
2100*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
2101*53ee8cc1Swenshuai.xi     {
2102*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
2103*53ee8cc1Swenshuai.xi         return FALSE;
2104*53ee8cc1Swenshuai.xi     }
2105*53ee8cc1Swenshuai.xi     //Set 0x27[2] = 1 (enable SW dual buffer mode)
2106*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, bEnDualBuff, VOP_BUF_DUAL);
2107*53ee8cc1Swenshuai.xi 
2108*53ee8cc1Swenshuai.xi     //Set 0x38[8] = 0 (use SW dual buffer mode)
2109*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INFO_FROM_CODEC_H, bEnSWDualBuff, VOP_INFO_FROM_CODEC_DUAL_BUFF);
2110*53ee8cc1Swenshuai.xi 
2111*53ee8cc1Swenshuai.xi     //Set 0x3b[7] = 0 (use MVD/HVD firmware send base)
2112*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG, bEnMirrMaskBase, VOP_MASK_BASE_LSB);
2113*53ee8cc1Swenshuai.xi 
2114*53ee8cc1Swenshuai.xi     //Set 0x3b[5] = 0 (hardware calculate field jump base address)
2115*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG, bEnHwFldBase, VOP_HW_FLD_BASE);
2116*53ee8cc1Swenshuai.xi 
2117*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->b3DLRAltOutput = bEnable;
2118*53ee8cc1Swenshuai.xi     return TRUE;
2119*53ee8cc1Swenshuai.xi }
2120*53ee8cc1Swenshuai.xi 
HAL_MVOP_Set3DLRAltOutput(MS_BOOL bEnable)2121*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Set3DLRAltOutput(MS_BOOL bEnable)
2122*53ee8cc1Swenshuai.xi {
2123*53ee8cc1Swenshuai.xi     //Set 0x3C[2] = 1 (enable 3D L/R dual buffer line alternative output)
2124*53ee8cc1Swenshuai.xi     //it works when 0x3C[0] = 1
2125*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MULTI_WIN_CFG0, bEnable, VOP_LR_LA_OUT);
2126*53ee8cc1Swenshuai.xi     // bw saving not support: LA/SBS
2127*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_DUMMY, 0, VOP_420_BW_SAVE);
2128*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_BW_SAVE, 0, VOP_420_BW_SAVE_EX);
2129*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
2130*53ee8cc1Swenshuai.xi 
2131*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->b3DLRAltOutput = bEnable;
2132*53ee8cc1Swenshuai.xi     return TRUE;
2133*53ee8cc1Swenshuai.xi }
2134*53ee8cc1Swenshuai.xi 
HAL_MVOP_Set3DLRAltSBSOutput(MS_BOOL bEnable)2135*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Set3DLRAltSBSOutput(MS_BOOL bEnable)
2136*53ee8cc1Swenshuai.xi {
2137*53ee8cc1Swenshuai.xi     //it works when 0x3C[0] = 1 and 0x3C[2] = 1
2138*53ee8cc1Swenshuai.xi     //Set 0x3C[3] = 1 (3D L/R line alternative read, side-by-side output)
2139*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MULTI_WIN_CFG0, bEnable, VOP_LR_LA2SBS_OUT);
2140*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->b3DLRAltSBSOutput = bEnable;
2141*53ee8cc1Swenshuai.xi     return TRUE;
2142*53ee8cc1Swenshuai.xi }
2143*53ee8cc1Swenshuai.xi 
HAL_MVOP_Get3DLRAltOutput(void)2144*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Get3DLRAltOutput(void)
2145*53ee8cc1Swenshuai.xi {
2146*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
2147*53ee8cc1Swenshuai.xi     {
2148*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
2149*53ee8cc1Swenshuai.xi         return FALSE;
2150*53ee8cc1Swenshuai.xi     }
2151*53ee8cc1Swenshuai.xi     return g_pHalMVOPCtx->b3DLRAltOutput;
2152*53ee8cc1Swenshuai.xi }
2153*53ee8cc1Swenshuai.xi 
HAL_MVOP_Get3DLRAltSBSOutput(void)2154*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Get3DLRAltSBSOutput(void)
2155*53ee8cc1Swenshuai.xi {
2156*53ee8cc1Swenshuai.xi     return g_pHalMVOPCtx->b3DLRAltSBSOutput;
2157*53ee8cc1Swenshuai.xi }
2158*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetOutput3DType(void)2159*53ee8cc1Swenshuai.xi EN_MVOP_Output_3D_TYPE HAL_MVOP_GetOutput3DType(void)
2160*53ee8cc1Swenshuai.xi {
2161*53ee8cc1Swenshuai.xi     EN_MVOP_Output_3D_TYPE en3DType = E_MVOP_OUTPUT_3D_NONE;
2162*53ee8cc1Swenshuai.xi     if(g_pHalMVOPCtx->b3DLRMode)
2163*53ee8cc1Swenshuai.xi     {
2164*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->b3DLRAltSBSOutput)
2165*53ee8cc1Swenshuai.xi         {
2166*53ee8cc1Swenshuai.xi             en3DType = E_MVOP_OUTPUT_3D_SBS;
2167*53ee8cc1Swenshuai.xi         }
2168*53ee8cc1Swenshuai.xi         else
2169*53ee8cc1Swenshuai.xi         {
2170*53ee8cc1Swenshuai.xi             en3DType = E_MVOP_OUTPUT_3D_TB;
2171*53ee8cc1Swenshuai.xi         }
2172*53ee8cc1Swenshuai.xi     }
2173*53ee8cc1Swenshuai.xi     else if(g_pHalMVOPCtx->b3DLRAltOutput)
2174*53ee8cc1Swenshuai.xi     {
2175*53ee8cc1Swenshuai.xi         en3DType = E_MVOP_OUTPUT_3D_LA;
2176*53ee8cc1Swenshuai.xi     }
2177*53ee8cc1Swenshuai.xi     return en3DType;
2178*53ee8cc1Swenshuai.xi }
2179*53ee8cc1Swenshuai.xi 
HAL_MVOP_Set3DLR2ndCfg(MS_BOOL bEnable)2180*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Set3DLR2ndCfg(MS_BOOL bEnable)
2181*53ee8cc1Swenshuai.xi {
2182*53ee8cc1Swenshuai.xi     //Set 0x3c[7] as 1 to enable
2183*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MULTI_WIN_CFG0, bEnable, VOP_LR_DIFF_SIZE);
2184*53ee8cc1Swenshuai.xi     return TRUE;
2185*53ee8cc1Swenshuai.xi }
2186*53ee8cc1Swenshuai.xi 
HAL_MVOP_Get3DLR2ndCfg(void)2187*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Get3DLR2ndCfg(void)
2188*53ee8cc1Swenshuai.xi {
2189*53ee8cc1Swenshuai.xi     MS_BOOL bEnable = FALSE;
2190*53ee8cc1Swenshuai.xi     if (VOP_LR_DIFF_SIZE == (VOP_LR_DIFF_SIZE & HAL_ReadRegBit(VOP_MULTI_WIN_CFG0, VOP_LR_DIFF_SIZE)))
2191*53ee8cc1Swenshuai.xi     {
2192*53ee8cc1Swenshuai.xi         bEnable = TRUE;
2193*53ee8cc1Swenshuai.xi     }
2194*53ee8cc1Swenshuai.xi     return bEnable;
2195*53ee8cc1Swenshuai.xi }
2196*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetMirrorMode(MVOP_DevID eID)2197*53ee8cc1Swenshuai.xi MVOP_DrvMirror HAL_MVOP_GetMirrorMode(MVOP_DevID eID)
2198*53ee8cc1Swenshuai.xi {
2199*53ee8cc1Swenshuai.xi     MVOP_DrvMirror enMirror = E_VOPMIRROR_NONE;
2200*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
2201*53ee8cc1Swenshuai.xi     {
2202*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
2203*53ee8cc1Swenshuai.xi         return FALSE;
2204*53ee8cc1Swenshuai.xi     }
2205*53ee8cc1Swenshuai.xi     switch(eID)
2206*53ee8cc1Swenshuai.xi     {
2207*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
2208*53ee8cc1Swenshuai.xi             if(g_pHalMVOPCtx->bMirrorModeVer && g_pHalMVOPCtx->bMirrorModeHor)
2209*53ee8cc1Swenshuai.xi             {
2210*53ee8cc1Swenshuai.xi                 enMirror = E_VOPMIRROR_HVBOTH;
2211*53ee8cc1Swenshuai.xi             }
2212*53ee8cc1Swenshuai.xi             else if(g_pHalMVOPCtx->bMirrorModeHor)
2213*53ee8cc1Swenshuai.xi             {
2214*53ee8cc1Swenshuai.xi                 enMirror = E_VOPMIRROR_HORIZONTALL;
2215*53ee8cc1Swenshuai.xi             }
2216*53ee8cc1Swenshuai.xi             else if(g_pHalMVOPCtx->bMirrorModeVer)
2217*53ee8cc1Swenshuai.xi             {
2218*53ee8cc1Swenshuai.xi                 enMirror = E_VOPMIRROR_VERTICAL;
2219*53ee8cc1Swenshuai.xi             }
2220*53ee8cc1Swenshuai.xi             break;
2221*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
2222*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2223*53ee8cc1Swenshuai.xi             if(g_pHalMVOPCtx->bSubMirrorModeVer &&g_pHalMVOPCtx-> bSubMirrorModeHor)
2224*53ee8cc1Swenshuai.xi             {
2225*53ee8cc1Swenshuai.xi                 enMirror = E_VOPMIRROR_HVBOTH;
2226*53ee8cc1Swenshuai.xi             }
2227*53ee8cc1Swenshuai.xi             else if(g_pHalMVOPCtx->bSubMirrorModeHor)
2228*53ee8cc1Swenshuai.xi             {
2229*53ee8cc1Swenshuai.xi                 enMirror = E_VOPMIRROR_HORIZONTALL;
2230*53ee8cc1Swenshuai.xi             }
2231*53ee8cc1Swenshuai.xi             else if(g_pHalMVOPCtx->bSubMirrorModeVer)
2232*53ee8cc1Swenshuai.xi             {
2233*53ee8cc1Swenshuai.xi                 enMirror = E_VOPMIRROR_VERTICAL;
2234*53ee8cc1Swenshuai.xi             }
2235*53ee8cc1Swenshuai.xi #endif
2236*53ee8cc1Swenshuai.xi             break;
2237*53ee8cc1Swenshuai.xi         default:
2238*53ee8cc1Swenshuai.xi             break;
2239*53ee8cc1Swenshuai.xi     }
2240*53ee8cc1Swenshuai.xi     return enMirror;
2241*53ee8cc1Swenshuai.xi }
2242*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetVerDup(MS_BOOL bEnable)2243*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SetVerDup(MS_BOOL bEnable)
2244*53ee8cc1Swenshuai.xi {
2245*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL0, bEnable, BIT3);// V line duplicate
2246*53ee8cc1Swenshuai.xi     return TRUE;
2247*53ee8cc1Swenshuai.xi }
2248*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetVerDup(void)2249*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetVerDup(void)
2250*53ee8cc1Swenshuai.xi {
2251*53ee8cc1Swenshuai.xi     return (HAL_ReadRegBit(VOP_CTRL0, BIT3) == BIT3);
2252*53ee8cc1Swenshuai.xi }
2253*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetVerx4Dup(MS_BOOL bEnable)2254*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SetVerx4Dup(MS_BOOL bEnable)
2255*53ee8cc1Swenshuai.xi {
2256*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL0, bEnable, BIT3);// x4 duplicate should raise V line duplicate first
2257*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_RGB_FMT, bEnable, BIT3);// V line x4 duplicate
2258*53ee8cc1Swenshuai.xi     return TRUE;
2259*53ee8cc1Swenshuai.xi }
2260*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetHorx4Dup(MS_BOOL bEnable)2261*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SetHorx4Dup(MS_BOOL bEnable)
2262*53ee8cc1Swenshuai.xi {
2263*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL0, bEnable, BIT2);// x4 duplicate should raise H pixel duplicate first
2264*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_RGB_FMT, bEnable, BIT2);// H line x4 duplicate
2265*53ee8cc1Swenshuai.xi     return TRUE;
2266*53ee8cc1Swenshuai.xi }
2267*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetVerx4Dup(void)2268*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetVerx4Dup(void)
2269*53ee8cc1Swenshuai.xi {
2270*53ee8cc1Swenshuai.xi     return ((HAL_ReadRegBit(VOP_RGB_FMT, BIT3) & HAL_ReadRegBit(VOP_CTRL0, BIT3)) == BIT3);
2271*53ee8cc1Swenshuai.xi }
2272*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetHorx4Dup(void)2273*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetHorx4Dup(void)
2274*53ee8cc1Swenshuai.xi {
2275*53ee8cc1Swenshuai.xi     return ((HAL_ReadRegBit(VOP_RGB_FMT, BIT2) & HAL_ReadRegBit(VOP_CTRL0, BIT2)) == BIT2);
2276*53ee8cc1Swenshuai.xi }
2277*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetTopVStart(MVOP_DevID eID)2278*53ee8cc1Swenshuai.xi MS_U16 HAL_MVOP_GetTopVStart(MVOP_DevID eID)
2279*53ee8cc1Swenshuai.xi {
2280*53ee8cc1Swenshuai.xi     MS_U16 u16TopVStart = 0;
2281*53ee8cc1Swenshuai.xi     switch(eID)
2282*53ee8cc1Swenshuai.xi     {
2283*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
2284*53ee8cc1Swenshuai.xi             u16TopVStart = HAL_Read2Byte(VOP_IMG_VSTR0)&0x1fff;
2285*53ee8cc1Swenshuai.xi             break;
2286*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
2287*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2288*53ee8cc1Swenshuai.xi             u16TopVStart = HAL_Read2Byte(SUB_REG(VOP_IMG_VSTR0))&0x1fff;
2289*53ee8cc1Swenshuai.xi #endif
2290*53ee8cc1Swenshuai.xi             break;
2291*53ee8cc1Swenshuai.xi         default:
2292*53ee8cc1Swenshuai.xi             break;
2293*53ee8cc1Swenshuai.xi     }
2294*53ee8cc1Swenshuai.xi     return u16TopVStart;
2295*53ee8cc1Swenshuai.xi }
2296*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetBottomVStart(MVOP_DevID eID)2297*53ee8cc1Swenshuai.xi MS_U16 HAL_MVOP_GetBottomVStart(MVOP_DevID eID)
2298*53ee8cc1Swenshuai.xi {
2299*53ee8cc1Swenshuai.xi     MS_U16 u16BotVStart = 0;
2300*53ee8cc1Swenshuai.xi     switch(eID)
2301*53ee8cc1Swenshuai.xi     {
2302*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
2303*53ee8cc1Swenshuai.xi             u16BotVStart = HAL_Read2Byte(VOP_IMG_VSTR1)&0x1fff;
2304*53ee8cc1Swenshuai.xi             break;
2305*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
2306*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2307*53ee8cc1Swenshuai.xi             u16BotVStart = HAL_Read2Byte(SUB_REG(VOP_IMG_VSTR1))&0x1fff;
2308*53ee8cc1Swenshuai.xi #endif
2309*53ee8cc1Swenshuai.xi             break;
2310*53ee8cc1Swenshuai.xi         default:
2311*53ee8cc1Swenshuai.xi             break;
2312*53ee8cc1Swenshuai.xi     }
2313*53ee8cc1Swenshuai.xi     return u16BotVStart;
2314*53ee8cc1Swenshuai.xi }
2315*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetVCount(MVOP_DevID eID)2316*53ee8cc1Swenshuai.xi MS_U16 HAL_MVOP_GetVCount(MVOP_DevID eID)
2317*53ee8cc1Swenshuai.xi {
2318*53ee8cc1Swenshuai.xi     MS_U16 u16VCount = 0;
2319*53ee8cc1Swenshuai.xi     switch(eID)
2320*53ee8cc1Swenshuai.xi     {
2321*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
2322*53ee8cc1Swenshuai.xi             u16VCount = HAL_Read2Byte(VOP_DEBUG_2A)&0x1fff;
2323*53ee8cc1Swenshuai.xi             break;
2324*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
2325*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2326*53ee8cc1Swenshuai.xi             u16VCount = HAL_Read2Byte(SUB_REG(VOP_DEBUG_2A))&0x1fff;
2327*53ee8cc1Swenshuai.xi #endif
2328*53ee8cc1Swenshuai.xi             break;
2329*53ee8cc1Swenshuai.xi         default:
2330*53ee8cc1Swenshuai.xi             break;
2331*53ee8cc1Swenshuai.xi     }
2332*53ee8cc1Swenshuai.xi     return u16VCount;
2333*53ee8cc1Swenshuai.xi }
2334*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetVC1RangeMap(MVOP_DevID eID,MVOP_VC1RangeMapInfo * stVC1RangeMapInfo)2335*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SetVC1RangeMap(MVOP_DevID eID, MVOP_VC1RangeMapInfo *stVC1RangeMapInfo)
2336*53ee8cc1Swenshuai.xi {
2337*53ee8cc1Swenshuai.xi     MS_U32 u8Luma = 0;
2338*53ee8cc1Swenshuai.xi     MS_U32 u8Chroma = 0;
2339*53ee8cc1Swenshuai.xi 
2340*53ee8cc1Swenshuai.xi     if (stVC1RangeMapInfo == NULL)
2341*53ee8cc1Swenshuai.xi     {
2342*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s stBaseAddInfo is NULL pointer\n", __FUNCTION__);)
2343*53ee8cc1Swenshuai.xi         return FALSE;
2344*53ee8cc1Swenshuai.xi     }
2345*53ee8cc1Swenshuai.xi 
2346*53ee8cc1Swenshuai.xi     // Luma value
2347*53ee8cc1Swenshuai.xi     u8Luma = stVC1RangeMapInfo->u8LumaValue;
2348*53ee8cc1Swenshuai.xi     // Chroma value
2349*53ee8cc1Swenshuai.xi     u8Chroma = stVC1RangeMapInfo->u8ChromaValue;
2350*53ee8cc1Swenshuai.xi 
2351*53ee8cc1Swenshuai.xi     switch(eID)
2352*53ee8cc1Swenshuai.xi     {
2353*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
2354*53ee8cc1Swenshuai.xi             //set VC1 Luma value
2355*53ee8cc1Swenshuai.xi             if(stVC1RangeMapInfo->bIsEnableLuma)
2356*53ee8cc1Swenshuai.xi             {
2357*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_RAMAP_LUMA, 1, BIT7);
2358*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(VOP_RAMAP_LUMA, u8Luma, VOP_RAMAP_LUMA_VAL);
2359*53ee8cc1Swenshuai.xi             }
2360*53ee8cc1Swenshuai.xi             else //disable
2361*53ee8cc1Swenshuai.xi             {
2362*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_RAMAP_LUMA, 0, BIT7);
2363*53ee8cc1Swenshuai.xi             }
2364*53ee8cc1Swenshuai.xi 
2365*53ee8cc1Swenshuai.xi             //set VC1 Chroma value
2366*53ee8cc1Swenshuai.xi             if(stVC1RangeMapInfo->bIsEnableChroma)
2367*53ee8cc1Swenshuai.xi             {
2368*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_RAMAP_CHROMA, 1, BIT7);
2369*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(VOP_RAMAP_CHROMA, u8Chroma, VOP_RAMAP_CHROMA_VAL);
2370*53ee8cc1Swenshuai.xi             }
2371*53ee8cc1Swenshuai.xi             else
2372*53ee8cc1Swenshuai.xi             {
2373*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_RAMAP_CHROMA, 0, BIT7);
2374*53ee8cc1Swenshuai.xi             }
2375*53ee8cc1Swenshuai.xi             break;
2376*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
2377*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2378*53ee8cc1Swenshuai.xi             //set VC1 Luma value
2379*53ee8cc1Swenshuai.xi             if(stVC1RangeMapInfo->bIsEnableLuma)
2380*53ee8cc1Swenshuai.xi             {
2381*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_RAMAP_LUMA), 1, BIT7);
2382*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(SUB_REG(VOP_RAMAP_LUMA), u8Luma, VOP_RAMAP_LUMA_VAL);
2383*53ee8cc1Swenshuai.xi             }
2384*53ee8cc1Swenshuai.xi             else //disable
2385*53ee8cc1Swenshuai.xi             {
2386*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_RAMAP_LUMA), 0, BIT7);
2387*53ee8cc1Swenshuai.xi             }
2388*53ee8cc1Swenshuai.xi 
2389*53ee8cc1Swenshuai.xi             //set VC1 Chroma value
2390*53ee8cc1Swenshuai.xi             if(stVC1RangeMapInfo->bIsEnableChroma)
2391*53ee8cc1Swenshuai.xi             {
2392*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_RAMAP_CHROMA), 1, BIT7);
2393*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(SUB_REG(VOP_RAMAP_CHROMA), u8Chroma, VOP_RAMAP_CHROMA_VAL);
2394*53ee8cc1Swenshuai.xi             }
2395*53ee8cc1Swenshuai.xi             else
2396*53ee8cc1Swenshuai.xi             {
2397*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_RAMAP_CHROMA), 0, BIT7);
2398*53ee8cc1Swenshuai.xi             }
2399*53ee8cc1Swenshuai.xi #endif
2400*53ee8cc1Swenshuai.xi             break;
2401*53ee8cc1Swenshuai.xi         default:
2402*53ee8cc1Swenshuai.xi                 break;
2403*53ee8cc1Swenshuai.xi     }
2404*53ee8cc1Swenshuai.xi     return TRUE;
2405*53ee8cc1Swenshuai.xi }
2406*53ee8cc1Swenshuai.xi 
2407*53ee8cc1Swenshuai.xi MS_U16 g_u16SetStartX = 0;
2408*53ee8cc1Swenshuai.xi MS_U16 g_u16SetStartY = 0;
2409*53ee8cc1Swenshuai.xi MS_BOOL g_bIsY4Align = 0;
2410*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetStartX(MVOP_DevID eID,MS_U16 u16XPos)2411*53ee8cc1Swenshuai.xi void HAL_MVOP_SetStartX(MVOP_DevID eID, MS_U16 u16XPos)
2412*53ee8cc1Swenshuai.xi {
2413*53ee8cc1Swenshuai.xi     switch(eID)
2414*53ee8cc1Swenshuai.xi     {
2415*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_0:
2416*53ee8cc1Swenshuai.xi #if 0 //tv setting
2417*53ee8cc1Swenshuai.xi         u16XPos = ALIGN_UPTO_2(u16XPos);
2418*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_REG_CROP_HSTART, u16XPos & 0xff);
2419*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_REG_CROP_HSTART + 1),((u16XPos) >> (8)) & (0x1f));
2420*53ee8cc1Swenshuai.xi         if(0 == u16XPos)
2421*53ee8cc1Swenshuai.xi         {
2422*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropXStart = 0;
2423*53ee8cc1Swenshuai.xi         }
2424*53ee8cc1Swenshuai.xi         else
2425*53ee8cc1Swenshuai.xi         {
2426*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropXStart += u16XPos;
2427*53ee8cc1Swenshuai.xi         }
2428*53ee8cc1Swenshuai.xi #endif
2429*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx == NULL)
2430*53ee8cc1Swenshuai.xi         {
2431*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
2432*53ee8cc1Swenshuai.xi             return;
2433*53ee8cc1Swenshuai.xi         }
2434*53ee8cc1Swenshuai.xi         u16XPos = ALIGN_UPTO_2(u16XPos);
2435*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->u16CropXStart = u16XPos;
2436*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_REG_CROP_HSTART, u16XPos);
2437*53ee8cc1Swenshuai.xi         HAL_WriteByteMask((VOP_REG_CROP_HSTART + 1),((u16XPos) >> (8)) & (0x1f), 0x1f);
2438*53ee8cc1Swenshuai.xi         // Write trigger
2439*53ee8cc1Swenshuai.xi         HAL_MVOP_LoadReg();
2440*53ee8cc1Swenshuai.xi         break;
2441*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_1:
2442*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2443*53ee8cc1Swenshuai.xi #if 0 //tv setting
2444*53ee8cc1Swenshuai.xi         u16XPos = ALIGN_UPTO_2(u16XPos);
2445*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_REG_CROP_HSTART), u16XPos & 0xff);
2446*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG((VOP_REG_CROP_HSTART + 1)),((u16XPos) >> (8)) & (0x1f));
2447*53ee8cc1Swenshuai.xi         if(0 == u16XPos)
2448*53ee8cc1Swenshuai.xi         {
2449*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropXStart = 0;
2450*53ee8cc1Swenshuai.xi         }
2451*53ee8cc1Swenshuai.xi         else
2452*53ee8cc1Swenshuai.xi         {
2453*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropXStart += u16XPos;
2454*53ee8cc1Swenshuai.xi         }
2455*53ee8cc1Swenshuai.xi #endif
2456*53ee8cc1Swenshuai.xi         u16XPos = ALIGN_UPTO_2(u16XPos);
2457*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->u16SubCropXStart = u16XPos;
2458*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_REG_CROP_HSTART), u16XPos);
2459*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_REG_CROP_HSTART + 1),((u16XPos) >> (8)) & (0x1f), 0x1f);
2460*53ee8cc1Swenshuai.xi         // Write trigger
2461*53ee8cc1Swenshuai.xi         HAL_MVOP_SubLoadReg();
2462*53ee8cc1Swenshuai.xi #endif
2463*53ee8cc1Swenshuai.xi         break;
2464*53ee8cc1Swenshuai.xi         default:
2465*53ee8cc1Swenshuai.xi                 break;
2466*53ee8cc1Swenshuai.xi     }
2467*53ee8cc1Swenshuai.xi }
2468*53ee8cc1Swenshuai.xi 
2469*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetStartY(MVOP_DevID eID,MS_U16 u16YPos,MS_BOOL bIsInterlace)2470*53ee8cc1Swenshuai.xi void HAL_MVOP_SetStartY(MVOP_DevID eID, MS_U16 u16YPos, MS_BOOL bIsInterlace)
2471*53ee8cc1Swenshuai.xi {
2472*53ee8cc1Swenshuai.xi     switch(eID)
2473*53ee8cc1Swenshuai.xi     {
2474*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_0:
2475*53ee8cc1Swenshuai.xi #if 0
2476*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_REG_CROP_VSTART, u16YPos & 0xff, 0xff);
2477*53ee8cc1Swenshuai.xi         HAL_WriteByteMask((VOP_REG_CROP_VSTART + 1), ((u16YPos) >> (8)) & (0x1f), 0x1f);
2478*53ee8cc1Swenshuai.xi         if(0 == u16YPos)
2479*53ee8cc1Swenshuai.xi         {
2480*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropYStart = 0;
2481*53ee8cc1Swenshuai.xi         }
2482*53ee8cc1Swenshuai.xi         else
2483*53ee8cc1Swenshuai.xi         {
2484*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropYStart += u16YPos;
2485*53ee8cc1Swenshuai.xi         }
2486*53ee8cc1Swenshuai.xi #endif
2487*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx == NULL)
2488*53ee8cc1Swenshuai.xi         {
2489*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
2490*53ee8cc1Swenshuai.xi             return;
2491*53ee8cc1Swenshuai.xi         }
2492*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->u16CropYStart = u16YPos;
2493*53ee8cc1Swenshuai.xi         if(u16YPos == 0)
2494*53ee8cc1Swenshuai.xi             u16YPos |= 0x6000;
2495*53ee8cc1Swenshuai.xi         else
2496*53ee8cc1Swenshuai.xi             u16YPos |= 0x2000;
2497*53ee8cc1Swenshuai.xi 
2498*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_REG_CROP_VSTART, u16YPos);
2499*53ee8cc1Swenshuai.xi         HAL_WriteByteMask((VOP_REG_CROP_VSTART + 1), ((u16YPos) >> (8)) & (0x7f), 0x7f);
2500*53ee8cc1Swenshuai.xi         // Write trigger
2501*53ee8cc1Swenshuai.xi         HAL_MVOP_LoadReg();
2502*53ee8cc1Swenshuai.xi         break;
2503*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_1:
2504*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2505*53ee8cc1Swenshuai.xi #if 0
2506*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_REG_CROP_VSTART), u16YPos & 0xff, 0xff);
2507*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG((VOP_REG_CROP_VSTART + 1)), ((u16YPos) >> (8)) & (0x1f), 0x1f);
2508*53ee8cc1Swenshuai.xi         if(0 == u16YPos)
2509*53ee8cc1Swenshuai.xi         {
2510*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropYStart = 0;
2511*53ee8cc1Swenshuai.xi         }
2512*53ee8cc1Swenshuai.xi         else
2513*53ee8cc1Swenshuai.xi         {
2514*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropYStart += u16YPos;
2515*53ee8cc1Swenshuai.xi         }
2516*53ee8cc1Swenshuai.xi #endif
2517*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx == NULL)
2518*53ee8cc1Swenshuai.xi         {
2519*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
2520*53ee8cc1Swenshuai.xi             return;
2521*53ee8cc1Swenshuai.xi         }
2522*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->u16SubCropYStart = u16YPos;
2523*53ee8cc1Swenshuai.xi         if(u16YPos == 0)
2524*53ee8cc1Swenshuai.xi             u16YPos |= 0x6000;
2525*53ee8cc1Swenshuai.xi         else
2526*53ee8cc1Swenshuai.xi             u16YPos |= 0x2000;
2527*53ee8cc1Swenshuai.xi 
2528*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_REG_CROP_VSTART), u16YPos);
2529*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_REG_CROP_VSTART + 1), ((u16YPos) >> (8)) & (0x7f), 0x7f);
2530*53ee8cc1Swenshuai.xi         // Write trigger
2531*53ee8cc1Swenshuai.xi         HAL_MVOP_SubLoadReg();
2532*53ee8cc1Swenshuai.xi #endif
2533*53ee8cc1Swenshuai.xi         break;
2534*53ee8cc1Swenshuai.xi         default:
2535*53ee8cc1Swenshuai.xi                 break;
2536*53ee8cc1Swenshuai.xi     }
2537*53ee8cc1Swenshuai.xi }
2538*53ee8cc1Swenshuai.xi 
2539*53ee8cc1Swenshuai.xi //-----------------------------------------
2540*53ee8cc1Swenshuai.xi //STB chip set crop size is from image (0,0) ,
2541*53ee8cc1Swenshuai.xi //including startx,y
2542*53ee8cc1Swenshuai.xi //Kano hw crop before mirror
2543*53ee8cc1Swenshuai.xi //-----------------------------------------
HAL_MVOP_SetPicWidthMinus(MVOP_DevID eID,MS_U16 u16XSizes,MS_U16 u16Width)2544*53ee8cc1Swenshuai.xi void HAL_MVOP_SetPicWidthMinus(MVOP_DevID eID, MS_U16 u16XSizes, MS_U16 u16Width)
2545*53ee8cc1Swenshuai.xi {
2546*53ee8cc1Swenshuai.xi     EN_MVOP_Output_3D_TYPE en3DType = E_MVOP_OUTPUT_3D_NONE;
2547*53ee8cc1Swenshuai.xi 
2548*53ee8cc1Swenshuai.xi     switch(eID)
2549*53ee8cc1Swenshuai.xi     {
2550*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx == NULL)
2551*53ee8cc1Swenshuai.xi         {
2552*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
2553*53ee8cc1Swenshuai.xi             return;
2554*53ee8cc1Swenshuai.xi         }
2555*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_0:
2556*53ee8cc1Swenshuai.xi         if(0 == u16XSizes)
2557*53ee8cc1Swenshuai.xi         {
2558*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropXSize = 0;
2559*53ee8cc1Swenshuai.xi         }
2560*53ee8cc1Swenshuai.xi         else
2561*53ee8cc1Swenshuai.xi         {
2562*53ee8cc1Swenshuai.xi             u16XSizes = u16XSizes + 1 - g_pHalMVOPCtx->u16CropXStart ;
2563*53ee8cc1Swenshuai.xi             u16XSizes = ALIGN_UPTO_2(u16XSizes);
2564*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropXSize = u16XSizes;
2565*53ee8cc1Swenshuai.xi         }
2566*53ee8cc1Swenshuai.xi         en3DType = HAL_MVOP_GetOutput3DType();
2567*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("[MVOP][DBG] 3D FORMAT = %d\n",en3DType);)
2568*53ee8cc1Swenshuai.xi         if(en3DType == E_MVOP_OUTPUT_3D_SBS)
2569*53ee8cc1Swenshuai.xi         {
2570*53ee8cc1Swenshuai.xi             u16XSizes = u16XSizes >> 1;
2571*53ee8cc1Swenshuai.xi         }
2572*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_REG_CROP_HSIZE, u16XSizes);
2573*53ee8cc1Swenshuai.xi         HAL_WriteByteMask((VOP_REG_CROP_HSIZE + 1), ((u16XSizes) >> (8)) & (0x1f), 0x1f);
2574*53ee8cc1Swenshuai.xi         // Write trigger
2575*53ee8cc1Swenshuai.xi         HAL_MVOP_LoadReg();
2576*53ee8cc1Swenshuai.xi         break;
2577*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_1:
2578*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2579*53ee8cc1Swenshuai.xi 
2580*53ee8cc1Swenshuai.xi         if(0 == u16XSizes)
2581*53ee8cc1Swenshuai.xi         {
2582*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropXSize = 0;
2583*53ee8cc1Swenshuai.xi         }
2584*53ee8cc1Swenshuai.xi         else
2585*53ee8cc1Swenshuai.xi         {
2586*53ee8cc1Swenshuai.xi             u16XSizes = u16XSizes + 1 - g_pHalMVOPCtx->u16SubCropXStart ;
2587*53ee8cc1Swenshuai.xi             u16XSizes = ALIGN_UPTO_2(u16XSizes);
2588*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropXSize = u16XSizes;
2589*53ee8cc1Swenshuai.xi         }
2590*53ee8cc1Swenshuai.xi         en3DType = HAL_MVOP_SubGetOutput3DType();
2591*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("[MVOP][DBG] 3D FORMAT = %d\n",en3DType);)
2592*53ee8cc1Swenshuai.xi         if(en3DType == E_MVOP_OUTPUT_3D_SBS)
2593*53ee8cc1Swenshuai.xi         {
2594*53ee8cc1Swenshuai.xi             u16XSizes = u16XSizes >> 1;
2595*53ee8cc1Swenshuai.xi         }
2596*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_REG_CROP_HSIZE), u16XSizes);
2597*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_REG_CROP_HSIZE + 1), ((u16XSizes) >> (8)) & (0x1f), 0x1f);
2598*53ee8cc1Swenshuai.xi         // Write trigger
2599*53ee8cc1Swenshuai.xi         HAL_MVOP_SubLoadReg();
2600*53ee8cc1Swenshuai.xi #endif
2601*53ee8cc1Swenshuai.xi             break;
2602*53ee8cc1Swenshuai.xi         default:
2603*53ee8cc1Swenshuai.xi                 break;
2604*53ee8cc1Swenshuai.xi     }
2605*53ee8cc1Swenshuai.xi }
2606*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetPicHeightMinus(MVOP_DevID eID,MS_U16 u16YSizes,MS_U16 u16Height)2607*53ee8cc1Swenshuai.xi void HAL_MVOP_SetPicHeightMinus(MVOP_DevID eID, MS_U16 u16YSizes, MS_U16 u16Height)
2608*53ee8cc1Swenshuai.xi {
2609*53ee8cc1Swenshuai.xi     EN_MVOP_Output_3D_TYPE en3DType = E_MVOP_OUTPUT_3D_NONE;
2610*53ee8cc1Swenshuai.xi 
2611*53ee8cc1Swenshuai.xi     switch(eID)
2612*53ee8cc1Swenshuai.xi     {
2613*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx == NULL)
2614*53ee8cc1Swenshuai.xi         {
2615*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
2616*53ee8cc1Swenshuai.xi             return;
2617*53ee8cc1Swenshuai.xi         }
2618*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_0:
2619*53ee8cc1Swenshuai.xi         if(0 == u16YSizes)
2620*53ee8cc1Swenshuai.xi         {
2621*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropYSize = 0;
2622*53ee8cc1Swenshuai.xi         }
2623*53ee8cc1Swenshuai.xi         else
2624*53ee8cc1Swenshuai.xi         {
2625*53ee8cc1Swenshuai.xi             u16YSizes = u16YSizes + 1 - g_pHalMVOPCtx->u16CropYStart ;
2626*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropYSize = u16YSizes;
2627*53ee8cc1Swenshuai.xi         }
2628*53ee8cc1Swenshuai.xi         en3DType = HAL_MVOP_GetOutput3DType();
2629*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("[MVOP][DBG] 3D FORMAT = %d\n",en3DType);)
2630*53ee8cc1Swenshuai.xi         if((en3DType == E_MVOP_OUTPUT_3D_TB) || (en3DType == E_MVOP_OUTPUT_3D_LA))
2631*53ee8cc1Swenshuai.xi         {
2632*53ee8cc1Swenshuai.xi             u16YSizes = u16YSizes >> 1;
2633*53ee8cc1Swenshuai.xi         }
2634*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_REG_CROP_VSIZE, u16YSizes);
2635*53ee8cc1Swenshuai.xi         HAL_WriteByteMask((VOP_REG_CROP_VSIZE + 1), ((u16YSizes) >> (8)) & (0x1f), 0x1f);
2636*53ee8cc1Swenshuai.xi         // Write trigger
2637*53ee8cc1Swenshuai.xi         HAL_MVOP_LoadReg();
2638*53ee8cc1Swenshuai.xi         break;
2639*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_1:
2640*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2641*53ee8cc1Swenshuai.xi         if(0 == u16YSizes)
2642*53ee8cc1Swenshuai.xi         {
2643*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropYSize = 0;
2644*53ee8cc1Swenshuai.xi         }
2645*53ee8cc1Swenshuai.xi         else
2646*53ee8cc1Swenshuai.xi         {
2647*53ee8cc1Swenshuai.xi             u16YSizes = u16YSizes + 1 - g_pHalMVOPCtx->u16CropYStart ;
2648*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropYSize = u16YSizes;
2649*53ee8cc1Swenshuai.xi         }
2650*53ee8cc1Swenshuai.xi         en3DType = HAL_MVOP_SubGetOutput3DType();
2651*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("[MVOP][DBG] 3D FORMAT = %d\n",en3DType);)
2652*53ee8cc1Swenshuai.xi         if((en3DType == E_MVOP_OUTPUT_3D_TB) || (en3DType == E_MVOP_OUTPUT_3D_LA))
2653*53ee8cc1Swenshuai.xi         {
2654*53ee8cc1Swenshuai.xi             u16YSizes = u16YSizes >> 1;
2655*53ee8cc1Swenshuai.xi         }
2656*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_REG_CROP_VSIZE), u16YSizes);
2657*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_REG_CROP_VSIZE + 1), ((u16YSizes) >> (8)) & (0x1f), 0x1f);
2658*53ee8cc1Swenshuai.xi         // Write trigger
2659*53ee8cc1Swenshuai.xi         HAL_MVOP_SubLoadReg();
2660*53ee8cc1Swenshuai.xi 
2661*53ee8cc1Swenshuai.xi #endif
2662*53ee8cc1Swenshuai.xi             break;
2663*53ee8cc1Swenshuai.xi         default:
2664*53ee8cc1Swenshuai.xi                 break;
2665*53ee8cc1Swenshuai.xi     }
2666*53ee8cc1Swenshuai.xi }
2667*53ee8cc1Swenshuai.xi 
2668*53ee8cc1Swenshuai.xi 
2669*53ee8cc1Swenshuai.xi /******************************************************************************/
2670*53ee8cc1Swenshuai.xi /// Set MVOP Saving BW Mode
2671*53ee8cc1Swenshuai.xi /// @ Napoli this command should be set after MDrv_MVOP_SetOutputCfg
2672*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_Set420BWSaveMode(MS_BOOL bEnable)2673*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Set420BWSaveMode(MS_BOOL bEnable)
2674*53ee8cc1Swenshuai.xi {
2675*53ee8cc1Swenshuai.xi     MS_BOOL bValue = FALSE;
2676*53ee8cc1Swenshuai.xi 
2677*53ee8cc1Swenshuai.xi     //hw limtation: 3DLA/3DSBS/422/p mode in, i mode out/i mode in, p mode out(only need to check in MCU mode)
2678*53ee8cc1Swenshuai.xi     bValue = (g_pHalMVOPCtx->b3DLRAltSBSOutput || g_pHalMVOPCtx->b3DLRAltOutput /*|| g_pHalMVOPCtx->b3DLRMode*/ || g_pHalMVOPCtx->bIs422 );
2679*53ee8cc1Swenshuai.xi 
2680*53ee8cc1Swenshuai.xi     if(bValue)
2681*53ee8cc1Swenshuai.xi     {
2682*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s Hit the limitation of saving bw, disable BW Saving mode\n", __FUNCTION__);)
2683*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_DUMMY, 0, VOP_420_BW_SAVE);
2684*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_BW_SAVE, 0, VOP_420_BW_SAVE_EX);
2685*53ee8cc1Swenshuai.xi         HAL_MVOP_LoadReg();
2686*53ee8cc1Swenshuai.xi         return FALSE;
2687*53ee8cc1Swenshuai.xi     }
2688*53ee8cc1Swenshuai.xi     else
2689*53ee8cc1Swenshuai.xi     {
2690*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_DUMMY, bEnable, VOP_420_BW_SAVE);
2691*53ee8cc1Swenshuai.xi         if( g_pHalMVOPCtx->b3DLRMode == FALSE)
2692*53ee8cc1Swenshuai.xi         {
2693*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_REG_BW_SAVE, bEnable, VOP_420_BW_SAVE_EX);
2694*53ee8cc1Swenshuai.xi         }
2695*53ee8cc1Swenshuai.xi 
2696*53ee8cc1Swenshuai.xi         HAL_MVOP_LoadReg();
2697*53ee8cc1Swenshuai.xi         return TRUE;
2698*53ee8cc1Swenshuai.xi     }
2699*53ee8cc1Swenshuai.xi }
2700*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetEVDYUVBaseAdd(MVOP_EVDBaseAddInput * stEVDBaseAddInfo)2701*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SetEVDYUVBaseAdd(MVOP_EVDBaseAddInput *stEVDBaseAddInfo)
2702*53ee8cc1Swenshuai.xi {
2703*53ee8cc1Swenshuai.xi     //----------------------------------------------------
2704*53ee8cc1Swenshuai.xi     // Set MSB YUV Address
2705*53ee8cc1Swenshuai.xi     //----------------------------------------------------
2706*53ee8cc1Swenshuai.xi 
2707*53ee8cc1Swenshuai.xi     MS_PHY u64tmp = 0;
2708*53ee8cc1Swenshuai.xi 
2709*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
2710*53ee8cc1Swenshuai.xi     {
2711*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
2712*53ee8cc1Swenshuai.xi         return FALSE;
2713*53ee8cc1Swenshuai.xi     }
2714*53ee8cc1Swenshuai.xi     // Y offset
2715*53ee8cc1Swenshuai.xi     u64tmp = stEVDBaseAddInfo->u32MSBYOffset >> 3;
2716*53ee8cc1Swenshuai.xi     if ( !stEVDBaseAddInfo->bProgressive)
2717*53ee8cc1Swenshuai.xi     {   //Refine Y offset for interlace repeat bottom field
2718*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
2719*53ee8cc1Swenshuai.xi         {
2720*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
2721*53ee8cc1Swenshuai.xi             u64tmp += 2;
2722*53ee8cc1Swenshuai.xi         }
2723*53ee8cc1Swenshuai.xi         else
2724*53ee8cc1Swenshuai.xi         {
2725*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is TOP or NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
2726*53ee8cc1Swenshuai.xi         }
2727*53ee8cc1Swenshuai.xi     }
2728*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_JPG_YSTR0_L, u64tmp & 0xff);
2729*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_L+1), (u64tmp >> 8) & 0xff);
2730*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_H), (u64tmp >> 16) & 0xff);
2731*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
2732*53ee8cc1Swenshuai.xi 
2733*53ee8cc1Swenshuai.xi     if (!stEVDBaseAddInfo->bProgressive )
2734*53ee8cc1Swenshuai.xi     {   //Y offset of bottom field if interlace
2735*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_YSTR1_L, u64tmp & 0xff);
2736*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR1_L+1), (u64tmp >> 8) & 0xff);
2737*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR1_H), (u64tmp >> 16) & 0xff);
2738*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR1_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
2739*53ee8cc1Swenshuai.xi     }
2740*53ee8cc1Swenshuai.xi 
2741*53ee8cc1Swenshuai.xi     if (stEVDBaseAddInfo->b422Pack)
2742*53ee8cc1Swenshuai.xi     {
2743*53ee8cc1Swenshuai.xi         stEVDBaseAddInfo->u32MSBUVOffset = stEVDBaseAddInfo->u32MSBYOffset + 16; //add 16 for 128bit; add 8 for 64bit
2744*53ee8cc1Swenshuai.xi     }
2745*53ee8cc1Swenshuai.xi     // UV offset
2746*53ee8cc1Swenshuai.xi     u64tmp = stEVDBaseAddInfo->u32MSBUVOffset >> 3;
2747*53ee8cc1Swenshuai.xi     if( !stEVDBaseAddInfo->bProgressive )
2748*53ee8cc1Swenshuai.xi     {  //Refine UV offset for interlace repeat bottom field
2749*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
2750*53ee8cc1Swenshuai.xi         {
2751*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
2752*53ee8cc1Swenshuai.xi             u64tmp += 2;
2753*53ee8cc1Swenshuai.xi         }
2754*53ee8cc1Swenshuai.xi         else
2755*53ee8cc1Swenshuai.xi         {
2756*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is TOP/NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
2757*53ee8cc1Swenshuai.xi         }
2758*53ee8cc1Swenshuai.xi     }
2759*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_UVSTR0_L, u64tmp & 0xff);
2760*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR0_L+1), (u64tmp >> 8) & 0xff);
2761*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR0_H), (u64tmp >> 16) & 0xff);
2762*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR0_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
2763*53ee8cc1Swenshuai.xi 
2764*53ee8cc1Swenshuai.xi     if( !stEVDBaseAddInfo->bProgressive )
2765*53ee8cc1Swenshuai.xi     {  //UV offset of bottom field if interlace
2766*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_UVSTR1_L, u64tmp & 0xff);
2767*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR1_L+1), (u64tmp >> 8) & 0xff);
2768*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR1_H), (u64tmp >> 16) & 0xff);
2769*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR1_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
2770*53ee8cc1Swenshuai.xi     }
2771*53ee8cc1Swenshuai.xi 
2772*53ee8cc1Swenshuai.xi     //----------------------------------------------------
2773*53ee8cc1Swenshuai.xi     // Set MSB YUV Address
2774*53ee8cc1Swenshuai.xi     //----------------------------------------------------
2775*53ee8cc1Swenshuai.xi     if(stEVDBaseAddInfo->bEnLSB)
2776*53ee8cc1Swenshuai.xi     {
2777*53ee8cc1Swenshuai.xi         //Enable LSB
2778*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_EVD_10B_EN, 1, VOP_EVD_10B_Y_EN);
2779*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_EVD_10B_EN, 1, VOP_EVD_10B_UV_EN);
2780*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_MASK, 0, VOP_LSB_REQ_MASK);
2781*53ee8cc1Swenshuai.xi 
2782*53ee8cc1Swenshuai.xi         // Y offset
2783*53ee8cc1Swenshuai.xi         u64tmp = stEVDBaseAddInfo->u32LSBYOffset >> 3;
2784*53ee8cc1Swenshuai.xi         if ( !stEVDBaseAddInfo->bProgressive)
2785*53ee8cc1Swenshuai.xi         {   //Refine Y offset for interlace repeat bottom field
2786*53ee8cc1Swenshuai.xi             if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
2787*53ee8cc1Swenshuai.xi             {
2788*53ee8cc1Swenshuai.xi                 MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
2789*53ee8cc1Swenshuai.xi                 u64tmp += 2;
2790*53ee8cc1Swenshuai.xi             }
2791*53ee8cc1Swenshuai.xi             else
2792*53ee8cc1Swenshuai.xi             {
2793*53ee8cc1Swenshuai.xi                 MVOP_DBG("%d eRepeatField(%x) is TOP or NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
2794*53ee8cc1Swenshuai.xi             }
2795*53ee8cc1Swenshuai.xi         }
2796*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_LSB_YSTR0_L, u64tmp & 0xff);
2797*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_LSB_YSTR0_L+1), (u64tmp >> 8) & 0xff);
2798*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_LSB_YSTR0_L), (u64tmp >> 16) & 0xff);
2799*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_LSB_YSTR0_L+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
2800*53ee8cc1Swenshuai.xi 
2801*53ee8cc1Swenshuai.xi         if (!stEVDBaseAddInfo->bProgressive )
2802*53ee8cc1Swenshuai.xi         {   //Y offset of bottom field if interlace
2803*53ee8cc1Swenshuai.xi             HAL_WriteByte(VOP_LSB_YSTR1_L, u64tmp & 0xff);
2804*53ee8cc1Swenshuai.xi             HAL_WriteByte((VOP_LSB_YSTR1_L+1), (u64tmp >> 8) & 0xff);
2805*53ee8cc1Swenshuai.xi             HAL_WriteByte((VOP_LSB_YSTR1_H), (u64tmp >> 16) & 0xff);
2806*53ee8cc1Swenshuai.xi             HAL_WriteByte((VOP_LSB_YSTR1_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
2807*53ee8cc1Swenshuai.xi         }
2808*53ee8cc1Swenshuai.xi 
2809*53ee8cc1Swenshuai.xi         if (stEVDBaseAddInfo->b422Pack)
2810*53ee8cc1Swenshuai.xi         {
2811*53ee8cc1Swenshuai.xi             stEVDBaseAddInfo->u32LSBUVOffset = stEVDBaseAddInfo->u32LSBYOffset + 16; //add 16 for 128bit; add 8 for 64bit
2812*53ee8cc1Swenshuai.xi         }
2813*53ee8cc1Swenshuai.xi         // UV offset
2814*53ee8cc1Swenshuai.xi         u64tmp = stEVDBaseAddInfo->u32LSBUVOffset >> 3;
2815*53ee8cc1Swenshuai.xi         if( !stEVDBaseAddInfo->bProgressive )
2816*53ee8cc1Swenshuai.xi         {  //Refine UV offset for interlace repeat bottom field
2817*53ee8cc1Swenshuai.xi             if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
2818*53ee8cc1Swenshuai.xi             {
2819*53ee8cc1Swenshuai.xi                 MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
2820*53ee8cc1Swenshuai.xi                 u64tmp += 2;
2821*53ee8cc1Swenshuai.xi             }
2822*53ee8cc1Swenshuai.xi             else
2823*53ee8cc1Swenshuai.xi             {
2824*53ee8cc1Swenshuai.xi                 MVOP_DBG("%d eRepeatField(%x) is TOP/NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
2825*53ee8cc1Swenshuai.xi             }
2826*53ee8cc1Swenshuai.xi         }
2827*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_LSB_UVSTR0_L, u64tmp & 0xff);
2828*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_LSB_UVSTR0_L+1), (u64tmp >> 8) & 0xff);
2829*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_LSB_UVSTR0_H), (u64tmp >> 16) & 0xff);
2830*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_LSB_UVSTR0_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
2831*53ee8cc1Swenshuai.xi 
2832*53ee8cc1Swenshuai.xi         if( !stEVDBaseAddInfo->bProgressive )
2833*53ee8cc1Swenshuai.xi         {  //UV offset of bottom field if interlace
2834*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_LSB_UVSTR1_L, u64tmp & 0xff);
2835*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_LSB_UVSTR1_L+1), (u64tmp >> 8) & 0xff);
2836*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_LSB_UVSTR1_H), (u64tmp >> 16) & 0xff);
2837*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_LSB_UVSTR1_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
2838*53ee8cc1Swenshuai.xi         }
2839*53ee8cc1Swenshuai.xi     }
2840*53ee8cc1Swenshuai.xi 
2841*53ee8cc1Swenshuai.xi     return TRUE;
2842*53ee8cc1Swenshuai.xi }
2843*53ee8cc1Swenshuai.xi 
2844*53ee8cc1Swenshuai.xi /******************************************************************************/
2845*53ee8cc1Swenshuai.xi /// Set MVOP repeat previous frame IF VDEC can not finish vsync.
2846*53ee8cc1Swenshuai.xi /// this command should be set disable as call VDEC Exit.
2847*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SetRptPreVsyncFrame(MVOP_DevID eID,MS_BOOL bEnable)2848*53ee8cc1Swenshuai.xi void HAL_MVOP_SetRptPreVsyncFrame(MVOP_DevID eID, MS_BOOL bEnable)
2849*53ee8cc1Swenshuai.xi {
2850*53ee8cc1Swenshuai.xi     switch(eID)
2851*53ee8cc1Swenshuai.xi     {
2852*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
2853*53ee8cc1Swenshuai.xi         {
2854*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->bRptPreVsync = bEnable;
2855*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_MIRROR_CFG_HI, bEnable, BIT3);
2856*53ee8cc1Swenshuai.xi             break;
2857*53ee8cc1Swenshuai.xi         }
2858*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
2859*53ee8cc1Swenshuai.xi         {
2860*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2861*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->bSubRptPreVsync = bEnable;
2862*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG_HI), bEnable, BIT3);
2863*53ee8cc1Swenshuai.xi #endif
2864*53ee8cc1Swenshuai.xi             break;
2865*53ee8cc1Swenshuai.xi         }
2866*53ee8cc1Swenshuai.xi         default:
2867*53ee8cc1Swenshuai.xi             MVOP_PRINTF("[Warning] MVOP_DevID not support!\n");
2868*53ee8cc1Swenshuai.xi             break;
2869*53ee8cc1Swenshuai.xi     }
2870*53ee8cc1Swenshuai.xi }
2871*53ee8cc1Swenshuai.xi 
HAL_MVOP_PowerStateSuspend(void)2872*53ee8cc1Swenshuai.xi void HAL_MVOP_PowerStateSuspend(void)
2873*53ee8cc1Swenshuai.xi {
2874*53ee8cc1Swenshuai.xi     MS_BOOL bFirstDrvInstant = FALSE;
2875*53ee8cc1Swenshuai.xi     MVOP_HalInitCtxResults eRet = _HAL_MVOP_InitContext(&bFirstDrvInstant);
2876*53ee8cc1Swenshuai.xi     if(eRet == E_MVOP_INIT_FAIL)
2877*53ee8cc1Swenshuai.xi     {
2878*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("[%s] MVOP Context Init failed!\n",__FUNCTION__);)
2879*53ee8cc1Swenshuai.xi         return;
2880*53ee8cc1Swenshuai.xi     }
2881*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsInit = 0;
2882*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2883*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsInit = 0;
2884*53ee8cc1Swenshuai.xi #endif
2885*53ee8cc1Swenshuai.xi }
2886*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetHandShakeMode(MVOP_DevID eID)2887*53ee8cc1Swenshuai.xi MVOP_HSMode HAL_MVOP_GetHandShakeMode(MVOP_DevID eID)
2888*53ee8cc1Swenshuai.xi {
2889*53ee8cc1Swenshuai.xi     MVOP_HSMode eRet = E_MVOP_HS_NOT_SUPPORT;
2890*53ee8cc1Swenshuai.xi 
2891*53ee8cc1Swenshuai.xi     switch(eID)
2892*53ee8cc1Swenshuai.xi     {
2893*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
2894*53ee8cc1Swenshuai.xi             if(HAL_ReadRegBit(VOP_HANDSHAKE, BIT0))
2895*53ee8cc1Swenshuai.xi             {
2896*53ee8cc1Swenshuai.xi                 eRet = E_MVOP_HS_ENABLE;
2897*53ee8cc1Swenshuai.xi             }
2898*53ee8cc1Swenshuai.xi             else
2899*53ee8cc1Swenshuai.xi             {
2900*53ee8cc1Swenshuai.xi                 eRet = E_MVOP_HS_DISABLE;
2901*53ee8cc1Swenshuai.xi             }
2902*53ee8cc1Swenshuai.xi             break;
2903*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
2904*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2905*53ee8cc1Swenshuai.xi             if(HAL_ReadRegBit(SUB_REG(VOP_HANDSHAKE), BIT0))
2906*53ee8cc1Swenshuai.xi             {
2907*53ee8cc1Swenshuai.xi                 eRet = E_MVOP_HS_ENABLE;
2908*53ee8cc1Swenshuai.xi             }
2909*53ee8cc1Swenshuai.xi             else
2910*53ee8cc1Swenshuai.xi             {
2911*53ee8cc1Swenshuai.xi                 eRet = E_MVOP_HS_DISABLE;
2912*53ee8cc1Swenshuai.xi             }
2913*53ee8cc1Swenshuai.xi #endif
2914*53ee8cc1Swenshuai.xi             break;
2915*53ee8cc1Swenshuai.xi         default:
2916*53ee8cc1Swenshuai.xi             eRet = E_MVOP_HS_INVALID_PARAM;
2917*53ee8cc1Swenshuai.xi             break;
2918*53ee8cc1Swenshuai.xi     }
2919*53ee8cc1Swenshuai.xi     return eRet;
2920*53ee8cc1Swenshuai.xi }
2921*53ee8cc1Swenshuai.xi 
HAL_MVOP_CheckSTCCW(void)2922*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_CheckSTCCW(void)
2923*53ee8cc1Swenshuai.xi {
2924*53ee8cc1Swenshuai.xi     MS_U16 u16STC_CW_L = 0;
2925*53ee8cc1Swenshuai.xi     MS_U16 u16STC_CW_H = 0;
2926*53ee8cc1Swenshuai.xi     MS_BOOL u16STC_CW_SEL = 0;
2927*53ee8cc1Swenshuai.xi     MS_BOOL u16TSP_CLK_EN = 0;
2928*53ee8cc1Swenshuai.xi 
2929*53ee8cc1Swenshuai.xi     u16STC_CW_L = HAL_Read2Byte(REG_STC0_CW_L)&0xffff;
2930*53ee8cc1Swenshuai.xi     u16STC_CW_H = HAL_Read2Byte(REG_STC0_CW_H)&0xffff;
2931*53ee8cc1Swenshuai.xi 
2932*53ee8cc1Swenshuai.xi     u16STC_CW_SEL = (HAL_ReadRegBit(REG_STC_CW_SLE_L, BIT1) == BIT1);
2933*53ee8cc1Swenshuai.xi     u16TSP_CLK_EN = !(HAL_ReadRegBit(REG_TSP_CLK, BIT0) == BIT0);
2934*53ee8cc1Swenshuai.xi 
2935*53ee8cc1Swenshuai.xi     if((((u16STC_CW_L || u16STC_CW_H) == 0) && (u16STC_CW_SEL == 0)) || ((u16STC_CW_SEL == 1) && (u16TSP_CLK_EN == 0)))
2936*53ee8cc1Swenshuai.xi         return FALSE;
2937*53ee8cc1Swenshuai.xi     else
2938*53ee8cc1Swenshuai.xi         return TRUE;
2939*53ee8cc1Swenshuai.xi 
2940*53ee8cc1Swenshuai.xi }
2941*53ee8cc1Swenshuai.xi 
2942*53ee8cc1Swenshuai.xi #define MIU1_REG_BASE       0x0600
HAL_MVOP_GetIsMiuIPControl(HALMVOPMIUCLIENTINFO stInfo)2943*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetIsMiuIPControl(HALMVOPMIUCLIENTINFO stInfo)
2944*53ee8cc1Swenshuai.xi {
2945*53ee8cc1Swenshuai.xi     MS_U32 u32RegMiu = 0;
2946*53ee8cc1Swenshuai.xi     MS_U16 u16Mask = 0;
2947*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
2948*53ee8cc1Swenshuai.xi 
2949*53ee8cc1Swenshuai.xi     u32RegMiu = MIU1_REG_BASE + (0xF0+(stInfo.u8Gp * 2));
2950*53ee8cc1Swenshuai.xi     if(stInfo.u8BitPos < 8)
2951*53ee8cc1Swenshuai.xi     {
2952*53ee8cc1Swenshuai.xi         u16Mask = 1<<stInfo.u8BitPos;
2953*53ee8cc1Swenshuai.xi     }
2954*53ee8cc1Swenshuai.xi     else
2955*53ee8cc1Swenshuai.xi     {
2956*53ee8cc1Swenshuai.xi         u16Mask = 1<<(stInfo.u8BitPos-8);
2957*53ee8cc1Swenshuai.xi         u32RegMiu += 1;
2958*53ee8cc1Swenshuai.xi     }
2959*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF("[%s] u32RegMiu = 0x%lx, u16Mask = 0x%x\n",__FUNCTION__, u32RegMiu,u16Mask);)
2960*53ee8cc1Swenshuai.xi     if(HAL_ReadRegBit(u32RegMiu, u16Mask))
2961*53ee8cc1Swenshuai.xi     {
2962*53ee8cc1Swenshuai.xi         bRet = TRUE;
2963*53ee8cc1Swenshuai.xi     }
2964*53ee8cc1Swenshuai.xi 
2965*53ee8cc1Swenshuai.xi     return bRet;
2966*53ee8cc1Swenshuai.xi }
2967*53ee8cc1Swenshuai.xi 
HAL_MVOP_SelMIU(MVOP_DevID eDevID,HALMVOPMIUSEL eMiuMSB0,HALMVOPMIUSEL eMiuMSB1,HALMVOPMIUSEL eMiuLSB0,HALMVOPMIUSEL eMiuLSB1)2968*53ee8cc1Swenshuai.xi void HAL_MVOP_SelMIU(MVOP_DevID eDevID, HALMVOPMIUSEL eMiuMSB0, HALMVOPMIUSEL eMiuMSB1, HALMVOPMIUSEL eMiuLSB0, HALMVOPMIUSEL eMiuLSB1)
2969*53ee8cc1Swenshuai.xi {
2970*53ee8cc1Swenshuai.xi     MS_U8 u8MSBVlue = 0;
2971*53ee8cc1Swenshuai.xi     MS_U8 u8LSBVlue = 0;
2972*53ee8cc1Swenshuai.xi 
2973*53ee8cc1Swenshuai.xi     if(eMiuMSB0 != eMiuMSB1)
2974*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_MIU_SEL, TRUE, BIT0);
2975*53ee8cc1Swenshuai.xi     else
2976*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_MIU_SEL, FALSE, BIT0);
2977*53ee8cc1Swenshuai.xi 
2978*53ee8cc1Swenshuai.xi     if(eMiuLSB0 != eMiuLSB1)
2979*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_MIU_SEL, TRUE, BIT1);
2980*53ee8cc1Swenshuai.xi     else
2981*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_MIU_SEL, FALSE, BIT1);
2982*53ee8cc1Swenshuai.xi 
2983*53ee8cc1Swenshuai.xi     u8MSBVlue |= (eMiuMSB0 << 4);
2984*53ee8cc1Swenshuai.xi     u8MSBVlue |= (eMiuMSB1 << 6);
2985*53ee8cc1Swenshuai.xi 
2986*53ee8cc1Swenshuai.xi     u8LSBVlue |= (eMiuLSB0 << 4);
2987*53ee8cc1Swenshuai.xi     u8LSBVlue |= (eMiuLSB1 << 6);
2988*53ee8cc1Swenshuai.xi 
2989*53ee8cc1Swenshuai.xi     switch(eDevID)
2990*53ee8cc1Swenshuai.xi     {
2991*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
2992*53ee8cc1Swenshuai.xi         {
2993*53ee8cc1Swenshuai.xi             // MSB
2994*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(VOP_MIU_SEL, u8MSBVlue, VOP_MSB_BUF0_MIU_SEL | VOP_MSB_BUF1_MIU_SEL);
2995*53ee8cc1Swenshuai.xi             // LSB
2996*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(VOP_MIU_SEL_LSB, u8LSBVlue, VOP_LSB_BUF0_MIU_SEL | VOP_LSB_BUF1_MIU_SEL);
2997*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u8LumaMIU = eMiuMSB0;
2998*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u8ChromaMIU = eMiuMSB1;
2999*53ee8cc1Swenshuai.xi             break;
3000*53ee8cc1Swenshuai.xi         }
3001*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3002*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
3003*53ee8cc1Swenshuai.xi         {
3004*53ee8cc1Swenshuai.xi             // MSB
3005*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(SUB_REG(VOP_MIU_SEL), u8MSBVlue, VOP_MSB_BUF0_MIU_SEL | VOP_MSB_BUF1_MIU_SEL);
3006*53ee8cc1Swenshuai.xi             // LSB
3007*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(SUB_REG(VOP_MIU_SEL_LSB), u8LSBVlue, VOP_LSB_BUF0_MIU_SEL | VOP_LSB_BUF1_MIU_SEL);
3008*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u8SubLumaMIU = eMiuMSB0;
3009*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u8SubChromaMIU = eMiuMSB1;
3010*53ee8cc1Swenshuai.xi             break;
3011*53ee8cc1Swenshuai.xi         }
3012*53ee8cc1Swenshuai.xi #endif
3013*53ee8cc1Swenshuai.xi         default:
3014*53ee8cc1Swenshuai.xi             break;
3015*53ee8cc1Swenshuai.xi     }
3016*53ee8cc1Swenshuai.xi }
3017*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetIsOnlyMiuIPControl(void)3018*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetIsOnlyMiuIPControl(void)
3019*53ee8cc1Swenshuai.xi {
3020*53ee8cc1Swenshuai.xi     return TRUE;
3021*53ee8cc1Swenshuai.xi }
3022*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetDefaultClk(MVOP_DevID eDevID)3023*53ee8cc1Swenshuai.xi HALMVOPFREQUENCY HAL_MVOP_SetDefaultClk(MVOP_DevID eDevID)
3024*53ee8cc1Swenshuai.xi {
3025*53ee8cc1Swenshuai.xi     HALMVOPFREQUENCY eRet = HALMVOP_160MHZ;
3026*53ee8cc1Swenshuai.xi     switch(eDevID)
3027*53ee8cc1Swenshuai.xi     {
3028*53ee8cc1Swenshuai.xi             case E_MVOP_DEV_0:
3029*53ee8cc1Swenshuai.xi             {
3030*53ee8cc1Swenshuai.xi                 if(g_pHalMVOPCtx->bIsXcTrig == FALSE)
3031*53ee8cc1Swenshuai.xi                 {
3032*53ee8cc1Swenshuai.xi                     MVOP_PRINTF("[%s] HALMVOP_SYNCMODE\n",__FUNCTION__);
3033*53ee8cc1Swenshuai.xi                     eRet = HALMVOP_SYNCMODE;
3034*53ee8cc1Swenshuai.xi                 }
3035*53ee8cc1Swenshuai.xi                 break;
3036*53ee8cc1Swenshuai.xi             }
3037*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3038*53ee8cc1Swenshuai.xi             case E_MVOP_DEV_1:
3039*53ee8cc1Swenshuai.xi             {
3040*53ee8cc1Swenshuai.xi                 if(g_pHalMVOPCtx->bSubIsXcTrig == FALSE)
3041*53ee8cc1Swenshuai.xi                 {
3042*53ee8cc1Swenshuai.xi                     MVOP_PRINTF("[%s] HALMVOP_SYNCMODE\n",__FUNCTION__);
3043*53ee8cc1Swenshuai.xi                     eRet = HALMVOP_SYNCMODE;
3044*53ee8cc1Swenshuai.xi                 }
3045*53ee8cc1Swenshuai.xi                 break;
3046*53ee8cc1Swenshuai.xi             }
3047*53ee8cc1Swenshuai.xi #endif
3048*53ee8cc1Swenshuai.xi             default:
3049*53ee8cc1Swenshuai.xi             break;
3050*53ee8cc1Swenshuai.xi     }
3051*53ee8cc1Swenshuai.xi 
3052*53ee8cc1Swenshuai.xi         MVOP_PRINTF("[%s] clock = %d\n",__FUNCTION__,eRet);
3053*53ee8cc1Swenshuai.xi         return eRet;
3054*53ee8cc1Swenshuai.xi }
3055*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetMaxFramerate(MVOP_DevID eDevID,MVOP_GetMaxFps * stStreamInfo)3056*53ee8cc1Swenshuai.xi void HAL_MVOP_GetMaxFramerate(MVOP_DevID eDevID, MVOP_GetMaxFps* stStreamInfo)
3057*53ee8cc1Swenshuai.xi {
3058*53ee8cc1Swenshuai.xi     MS_U64 u64MaxClk = 0;
3059*53ee8cc1Swenshuai.xi     MS_U16 u16HsizeTiming = 0;
3060*53ee8cc1Swenshuai.xi     MS_U16 u16VsizeTiming = 0;
3061*53ee8cc1Swenshuai.xi 
3062*53ee8cc1Swenshuai.xi     if(NULL == stStreamInfo)
3063*53ee8cc1Swenshuai.xi     {
3064*53ee8cc1Swenshuai.xi         MVOP_PRINTF("[%s] Input parameter is NULL!\n",__FUNCTION__);
3065*53ee8cc1Swenshuai.xi         return;
3066*53ee8cc1Swenshuai.xi     }
3067*53ee8cc1Swenshuai.xi 
3068*53ee8cc1Swenshuai.xi     switch(eDevID)
3069*53ee8cc1Swenshuai.xi     {
3070*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
3071*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3072*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
3073*53ee8cc1Swenshuai.xi #endif
3074*53ee8cc1Swenshuai.xi         {
3075*53ee8cc1Swenshuai.xi             if(_HAL_MVOP_IsSupport4k2k2P())
3076*53ee8cc1Swenshuai.xi             {
3077*53ee8cc1Swenshuai.xi                 u16HsizeTiming = stStreamInfo->u16HSize >> 1;
3078*53ee8cc1Swenshuai.xi             }
3079*53ee8cc1Swenshuai.xi             else
3080*53ee8cc1Swenshuai.xi             {
3081*53ee8cc1Swenshuai.xi                 u16HsizeTiming = stStreamInfo->u16HSize;
3082*53ee8cc1Swenshuai.xi                 u16HsizeTiming = ALIGN_UPTO_2(u16HsizeTiming);
3083*53ee8cc1Swenshuai.xi             }
3084*53ee8cc1Swenshuai.xi             if(stStreamInfo->b3DSBS)
3085*53ee8cc1Swenshuai.xi             {
3086*53ee8cc1Swenshuai.xi                 u16HsizeTiming *= 2;
3087*53ee8cc1Swenshuai.xi             }
3088*53ee8cc1Swenshuai.xi             if(stStreamInfo->u16HSize > 720)
3089*53ee8cc1Swenshuai.xi             {
3090*53ee8cc1Swenshuai.xi                 u16HsizeTiming +=  MVOP_HBlank_HD;
3091*53ee8cc1Swenshuai.xi             }
3092*53ee8cc1Swenshuai.xi             else
3093*53ee8cc1Swenshuai.xi             {
3094*53ee8cc1Swenshuai.xi                 u16HsizeTiming +=  MVOP_HBlank_SD;
3095*53ee8cc1Swenshuai.xi             }
3096*53ee8cc1Swenshuai.xi 
3097*53ee8cc1Swenshuai.xi             u64MaxClk = HAL_MVOP_GetMaximumClk();
3098*53ee8cc1Swenshuai.xi             if(stStreamInfo->b3DTB)
3099*53ee8cc1Swenshuai.xi             {
3100*53ee8cc1Swenshuai.xi                 u16VsizeTiming = stStreamInfo->u16VSize*2 + MVOP_VBlank;
3101*53ee8cc1Swenshuai.xi             }
3102*53ee8cc1Swenshuai.xi             else
3103*53ee8cc1Swenshuai.xi             {
3104*53ee8cc1Swenshuai.xi                 u16VsizeTiming = stStreamInfo->u16VSize + MVOP_VBlank;
3105*53ee8cc1Swenshuai.xi             }
3106*53ee8cc1Swenshuai.xi 
3107*53ee8cc1Swenshuai.xi             stStreamInfo->u32Framerate = (u64MaxClk / u16HsizeTiming / u16VsizeTiming)*1000;
3108*53ee8cc1Swenshuai.xi         }
3109*53ee8cc1Swenshuai.xi             break;
3110*53ee8cc1Swenshuai.xi         default:
3111*53ee8cc1Swenshuai.xi             break;
3112*53ee8cc1Swenshuai.xi     }
3113*53ee8cc1Swenshuai.xi 
3114*53ee8cc1Swenshuai.xi }
3115*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetIsSendingData(MVOP_DevID eDevID)3116*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetIsSendingData(MVOP_DevID eDevID)
3117*53ee8cc1Swenshuai.xi {
3118*53ee8cc1Swenshuai.xi      MS_U8 u8IsSend = 0;
3119*53ee8cc1Swenshuai.xi 
3120*53ee8cc1Swenshuai.xi     if(eDevID == E_MVOP_DEV_0)
3121*53ee8cc1Swenshuai.xi     {
3122*53ee8cc1Swenshuai.xi         u8IsSend = HAL_ReadByte(VOP_DEBUG_2D_H) & VOP_DMA_STATUS;
3123*53ee8cc1Swenshuai.xi         if(u8IsSend)
3124*53ee8cc1Swenshuai.xi             return TRUE;
3125*53ee8cc1Swenshuai.xi         else
3126*53ee8cc1Swenshuai.xi             return FALSE;
3127*53ee8cc1Swenshuai.xi     }
3128*53ee8cc1Swenshuai.xi     else
3129*53ee8cc1Swenshuai.xi     {
3130*53ee8cc1Swenshuai.xi         MVOP_PRINTF("[Warning] not support device %d\n",eDevID);
3131*53ee8cc1Swenshuai.xi         return FALSE;
3132*53ee8cc1Swenshuai.xi     }
3133*53ee8cc1Swenshuai.xi }
3134*53ee8cc1Swenshuai.xi 
3135*53ee8cc1Swenshuai.xi /******************************************************************************/
3136*53ee8cc1Swenshuai.xi /// Set MVOP Handshake Mode, XC should be synchronous with MVOP.
3137*53ee8cc1Swenshuai.xi /// this command should be before mvop enable.(before 1st frame)
3138*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SetTimingFromXC(MVOP_DevID eID,MS_BOOL bEnable)3139*53ee8cc1Swenshuai.xi void HAL_MVOP_SetTimingFromXC(MVOP_DevID eID, MS_BOOL bEnable)
3140*53ee8cc1Swenshuai.xi {
3141*53ee8cc1Swenshuai.xi     switch(eID)
3142*53ee8cc1Swenshuai.xi     {
3143*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("[MVOP] HAL_MVOP_SetTimingFromXC = %d\n",bEnable);)
3144*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
3145*53ee8cc1Swenshuai.xi         {
3146*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->bIsXcTrig = bEnable;
3147*53ee8cc1Swenshuai.xi             if(bEnable)
3148*53ee8cc1Swenshuai.xi             {
3149*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(VOP_HANDSHAKE, 0x06, VOP_TRIG_FROM_XC|VOP_VSUNC_FROM_XC);
3150*53ee8cc1Swenshuai.xi                 //HAL_WriteRegBit(VOP_CTRL1, 0, BIT4); // disable inverse the field to IP - not in kano
3151*53ee8cc1Swenshuai.xi 
3152*53ee8cc1Swenshuai.xi             }
3153*53ee8cc1Swenshuai.xi             else
3154*53ee8cc1Swenshuai.xi             {
3155*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(VOP_HANDSHAKE, 0x00, VOP_TRIG_FROM_XC|VOP_VSUNC_FROM_XC);
3156*53ee8cc1Swenshuai.xi                 //HAL_WriteRegBit(VOP_CTRL1, 1, BIT4);  // inverse the field to IP - not in kano
3157*53ee8cc1Swenshuai.xi             }
3158*53ee8cc1Swenshuai.xi             HAL_MVOP_LoadReg();
3159*53ee8cc1Swenshuai.xi             break;
3160*53ee8cc1Swenshuai.xi         }
3161*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
3162*53ee8cc1Swenshuai.xi         {
3163*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3164*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->bSubIsXcTrig = bEnable;
3165*53ee8cc1Swenshuai.xi             if(bEnable)
3166*53ee8cc1Swenshuai.xi             {
3167*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(SUB_REG(VOP_HANDSHAKE), 0x06, VOP_TRIG_FROM_XC|VOP_VSUNC_FROM_XC);
3168*53ee8cc1Swenshuai.xi             }
3169*53ee8cc1Swenshuai.xi             else
3170*53ee8cc1Swenshuai.xi             {
3171*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(SUB_REG(VOP_HANDSHAKE), 0x00, VOP_TRIG_FROM_XC|VOP_VSUNC_FROM_XC);
3172*53ee8cc1Swenshuai.xi             }
3173*53ee8cc1Swenshuai.xi             HAL_MVOP_SubLoadReg();
3174*53ee8cc1Swenshuai.xi #endif
3175*53ee8cc1Swenshuai.xi             break;
3176*53ee8cc1Swenshuai.xi         }
3177*53ee8cc1Swenshuai.xi         default:
3178*53ee8cc1Swenshuai.xi             MVOP_PRINTF("[Warning] MVOP_DevID not support!\n");
3179*53ee8cc1Swenshuai.xi             break;
3180*53ee8cc1Swenshuai.xi     }
3181*53ee8cc1Swenshuai.xi }
3182*53ee8cc1Swenshuai.xi 
HAL_MVOP_ResetReg(MVOP_DevID eDevID,MS_U16 u16ECONumber)3183*53ee8cc1Swenshuai.xi void HAL_MVOP_ResetReg(MVOP_DevID eDevID, MS_U16 u16ECONumber)
3184*53ee8cc1Swenshuai.xi {
3185*53ee8cc1Swenshuai.xi 
3186*53ee8cc1Swenshuai.xi     switch(eDevID)
3187*53ee8cc1Swenshuai.xi     {
3188*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_0:
3189*53ee8cc1Swenshuai.xi     {
3190*53ee8cc1Swenshuai.xi #if ENABLE_3D_LR_MODE
3191*53ee8cc1Swenshuai.xi         HAL_MVOP_Enable3DLR(DISABLE);
3192*53ee8cc1Swenshuai.xi #endif
3193*53ee8cc1Swenshuai.xi #if SUPPORT_3DLR_ALT_SBS
3194*53ee8cc1Swenshuai.xi         HAL_MVOP_Set3DLRAltOutput(DISABLE);
3195*53ee8cc1Swenshuai.xi         HAL_MVOP_Set3DLRAltSBSOutput(DISABLE);
3196*53ee8cc1Swenshuai.xi #endif
3197*53ee8cc1Swenshuai.xi 
3198*53ee8cc1Swenshuai.xi     /*****************************************************/
3199*53ee8cc1Swenshuai.xi     // Reset MVOP setting
3200*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_TST_IMG, 0x00, BIT2 | BIT1 | BIT0);//reset test pattern or BG
3201*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_TST_IMG, BIT6, BIT6);//reset test pattern or BG
3202*53ee8cc1Swenshuai.xi     HAL_MVOP_Set3DLRAltOutput_VHalfScaling(DISABLE); //reset to default: disable 3D L/R alternative output.
3203*53ee8cc1Swenshuai.xi     HAL_MVOP_Set3DLR2ndCfg(DISABLE);    //reset to default: disable 3D L/R 2nd pitch.
3204*53ee8cc1Swenshuai.xi     HAL_MVOP_SetRgbFormat(E_MVOP_RGB_NONE); //reset rgb format
3205*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL1, 0, VOP_MVD_VS_MD); //default use original vsync
3206*53ee8cc1Swenshuai.xi     //stb series: default hsk
3207*53ee8cc1Swenshuai.xi     //HAL_WriteRegBit(VOP_REG_422_OUT_EN, 1, BIT0); //kano ip2 444
3208*53ee8cc1Swenshuai.xi     //apple for debug
3209*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_HANDSHAKE, 1, VOP_HANDSHAKE_MODE);
3210*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsHS = TRUE;
3211*53ee8cc1Swenshuai.xi     HAL_MVOP_SetTimingFromXC(E_MVOP_DEV_0, TRUE);
3212*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG_HI, ENABLE, VOP_HK_MASK); //default hsk mode bk background
3213*53ee8cc1Swenshuai.xi 
3214*53ee8cc1Swenshuai.xi     // Kano hsk default 2p
3215*53ee8cc1Swenshuai.xi     HAL_MVOP_SetEnable4k2k2P(TRUE);
3216*53ee8cc1Swenshuai.xi 
3217*53ee8cc1Swenshuai.xi     HAL_MVOP_SetBlackBG();//set MVOP test pattern to black
3218*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);// clear extend strip len bit by default
3219*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_MIU_IF, VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);// set mvop to 128bit_i128 interface
3220*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INPUT_SWITCH1, 0, BIT2|BIT3);// Disable H264 or RM Input
3221*53ee8cc1Swenshuai.xi 
3222*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, 0, BIT1);//8*32 tile format
3223*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG_HI, 0, VOP_REF_SELF_FLD);
3224*53ee8cc1Swenshuai.xi 
3225*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIs422 = 0;// Clear 422 Flag
3226*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INPUT_SWITCH0, 0, EVD_ENABLE);// EVD mode disable
3227*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsH265 = 0;
3228*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INT_TYPE, 0, VOP_EVD_INT_SEP);// Clear evd Flag for interlace mode setting
3229*53ee8cc1Swenshuai.xi 
3230*53ee8cc1Swenshuai.xi 
3231*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_MASK, 0, VOP_LSB_REQ_MASK);// EVD 10 bits disable
3232*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_EVD_10B_EN, 0, VOP_EVD_10B_Y_EN);
3233*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_EVD_10B_EN, 0, VOP_EVD_10B_UV_EN);
3234*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_UV_SHIFT, 1, VOP_GCLK_MIU_ON);
3235*53ee8cc1Swenshuai.xi 
3236*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_DUMMY, 1, VOP_420_BW_SAVE);
3237*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_BW_SAVE, 1, VOP_420_BW_SAVE_EX);
3238*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg(); //kano patch, mantis: 0997677
3239*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bNewVSyncMode = FALSE;// Disable New Vsync Mode
3240*53ee8cc1Swenshuai.xi 
3241*53ee8cc1Swenshuai.xi     /* only for STB DC */
3242*53ee8cc1Swenshuai.xi     // Handshake mode chip need to set from MVD: Kappa (maybe fix in after project)
3243*53ee8cc1Swenshuai.xi     HAL_MVOP_SetFDMaskFromMVD(ENABLE);
3244*53ee8cc1Swenshuai.xi     // Use frame sync (CLK_DC1 domain) to reset CLK_DC0 and CLK_MIU domain every frame
3245*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_FRAME_RST+1, 0, BIT7); // reg_frame_rst = 0
3246*53ee8cc1Swenshuai.xi 
3247*53ee8cc1Swenshuai.xi     // Warning: set from tv, clippers HAL_MVOP_SetFieldInverse(ENABLE, DISABLE);
3248*53ee8cc1Swenshuai.xi     HAL_MVOP_SetFieldInverse(ENABLE, ENABLE);
3249*53ee8cc1Swenshuai.xi     // Warning: kappa U02 need to bypass field from mvd to xc for FCR.
3250*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_DUMMY_3D_1, 1, VOP_RGB_FILED_BYPASS);
3251*53ee8cc1Swenshuai.xi 
3252*53ee8cc1Swenshuai.xi     //Change MIU BW Default Value to 0x241C (after Einstein)
3253*53ee8cc1Swenshuai.xi     //FIFO threshold
3254*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_DMA0, 0x08);
3255*53ee8cc1Swenshuai.xi     //burst and priority
3256*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_DMA1, 0x22);
3257*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_BURST_CTRL0, 0x02);
3258*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_BURST_CTRL1, 0x00);
3259*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_REG_MFDEC_0_L, 0x70, VOP_MF1_BURST|VOP_MF0_BURST|VOP_MFDEC_EN);// Setting MF burst len
3260*53ee8cc1Swenshuai.xi     // Only for monaco: Disable mfdec setting from wb
3261*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_MFDEC_2_L, 1, VOP_MF_FROM_WB);
3262*53ee8cc1Swenshuai.xi     // All codec use WISHBONE(R2) interface in muji
3263*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INPUT_SWITCH0, 1, VOP_R2_WISHBONE);
3264*53ee8cc1Swenshuai.xi     // Disable 10 bits from codec
3265*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INFO_FROM_CODEC_H, 0, VOP_INFO_FROM_CODEC_10BIT);
3266*53ee8cc1Swenshuai.xi     //// clippers crop sw patch /////
3267*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_SINGLE_3D_L, 0, VOP_FORCE_SKIP);
3268*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_REG_SINGLE_3D_L, 0, VOP_SKIP_SIZE_LVIEW);
3269*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_REG_SINGLE_3D_H, 0, VOP_SKIP_SIZE_RVIEW);
3270*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_ENABLE_SKIP, 0, VOP_SKIP_LVIEW);
3271*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_ENABLE_SKIP, 0, VOP_SKIP_RVIEW);
3272*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16CropXStart = 0;
3273*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16CropYStart = 0;
3274*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16CropXSize = 0;
3275*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16CropYSize = 0;
3276*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsSetCrop = FALSE;
3277*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u32MVOPFixClk = 0;
3278*53ee8cc1Swenshuai.xi     // MIU select from WB
3279*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_INFO_FROM_CODEC_H, 0x30, VOP_INFO_FROM_CODEC_MIU_BUF0_SEL|VOP_INFO_FROM_CODEC_MIU_BUF1_SEL);
3280*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_UV_SHIFT, 0, VOP_GCLK_MIU_ON);// yc seperate can not enable
3281*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->eInterlaceType = E_MVOP_PRO;
3282*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_REG_BLK_VCNT_L, 0x00);//mantis: 0986938
3283*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_REG_BLK_VCNT_H, 0x01, BIT0);
3284*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(REG_CKG_FBDEC, 0x0, VOP_SEL_CLK_432); //default disable mfdec clock.
3285*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INPUT_SWITCH0, 0, VOP_TILE_32x32);
3286*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
3287*53ee8cc1Swenshuai.xi     /*****************************************************/
3288*53ee8cc1Swenshuai.xi         break;
3289*53ee8cc1Swenshuai.xi     }
3290*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3291*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_1:
3292*53ee8cc1Swenshuai.xi     {
3293*53ee8cc1Swenshuai.xi #if ENABLE_3D_LR_MODE
3294*53ee8cc1Swenshuai.xi         HAL_MVOP_SubEnable3DLR(DISABLE);
3295*53ee8cc1Swenshuai.xi #endif
3296*53ee8cc1Swenshuai.xi #if SUPPORT_3DLR_ALT_SBS
3297*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSet3DLRAltOutput(DISABLE);
3298*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSet3DLRAltSBSOutput(DISABLE);
3299*53ee8cc1Swenshuai.xi #endif
3300*53ee8cc1Swenshuai.xi         HAL_MVOP_SubEnableMVDInterface(FALSE);
3301*53ee8cc1Swenshuai.xi 
3302*53ee8cc1Swenshuai.xi         /*****************************************************/
3303*53ee8cc1Swenshuai.xi         // Reset MVOP setting
3304*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_TST_IMG), 0x00, BIT2 | BIT1 | BIT0);//reset test pattern or BG
3305*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_TST_IMG), BIT6, BIT6);//reset test pattern or BG
3306*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetRgbFormat(E_MVOP_RGB_NONE);
3307*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_CTRL1), 0, VOP_MVD_VS_MD); //default use original vsync
3308*53ee8cc1Swenshuai.xi         //stb series: default hsk
3309*53ee8cc1Swenshuai.xi         //HAL_WriteRegBit(SUB_REG(VOP_REG_422_OUT_EN), 1, BIT0); //kano ip2 444
3310*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_HANDSHAKE), 1, VOP_HANDSHAKE_MODE);
3311*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubIsHS = TRUE;
3312*53ee8cc1Swenshuai.xi         HAL_MVOP_SetTimingFromXC(E_MVOP_DEV_1, TRUE);
3313*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG_HI), ENABLE, VOP_HK_MASK); //default hsk mode bk background
3314*53ee8cc1Swenshuai.xi         // Kano hsk default 2p
3315*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetEnable4k2k2P(TRUE);
3316*53ee8cc1Swenshuai.xi 
3317*53ee8cc1Swenshuai.xi         // Only for Monaco: Enable deciding bot by top address + 2
3318*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), 1, VOP_FIELD_FROM_ADDR);
3319*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetMonoMode(FALSE);// Reset Mono mode
3320*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetBlackBG();//set MVOP test pattern to black
3321*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_STRIP_ALIGN), 0, BIT0);// clear extend strip len bit by default
3322*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_MIU_IF), VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);// set mvop to 128bit_i128 interface
3323*53ee8cc1Swenshuai.xi         /* only for STB DC */
3324*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetFDMaskFromMVD(ENABLE);
3325*53ee8cc1Swenshuai.xi         // Use frame sync (CLK_DC1 domain) to reset CLK_DC0 and CLK_MIU domain every frame
3326*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_FRAME_RST+1), 0, BIT7); // reg_frame_rst = 0
3327*53ee8cc1Swenshuai.xi 
3328*53ee8cc1Swenshuai.xi         // Warning: set from tv, clippers HAL_MVOP_SetFieldInverse(ENABLE, DISABLE);
3329*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetFieldInverse(ENABLE, ENABLE);
3330*53ee8cc1Swenshuai.xi         // Warning: kappa U02 need to bypass field from mvd to xc for FCR.
3331*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_DUMMY_3D_1), 1, VOP_RGB_FILED_BYPASS);
3332*53ee8cc1Swenshuai.xi 
3333*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH1), 0, BIT2|BIT3);// Disable H264 or RM Input
3334*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubIs422 = 0;// Clear 422 Flag
3335*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubIsH265 = 0;// Clear evd Flag for interlace mode setting
3336*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 0, EVD_ENABLE);
3337*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INT_TYPE), 0, VOP_EVD_INT_SEP);
3338*53ee8cc1Swenshuai.xi 
3339*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 0, BIT1);//8*32 tile format
3340*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG_HI), 0, VOP_REF_SELF_FLD);
3341*53ee8cc1Swenshuai.xi 
3342*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_MASK), 0, VOP_LSB_REQ_MASK);// EVD 10 bits
3343*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_EVD_10B_EN), 0, VOP_EVD_10B_Y_EN);
3344*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_EVD_10B_EN), 0, VOP_EVD_10B_UV_EN);
3345*53ee8cc1Swenshuai.xi         // Disable 420 BW Saving mode
3346*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_DUMMY), 1, VOP_420_BW_SAVE);
3347*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_BW_SAVE), 1, VOP_420_BW_SAVE_EX);
3348*53ee8cc1Swenshuai.xi         HAL_MVOP_SubLoadReg(); //kano patch, mantis: 0997677
3349*53ee8cc1Swenshuai.xi         // VP9 MODE disable
3350*53ee8cc1Swenshuai.xi         //HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 0, VOP_R2_WISHBONE);
3351*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_MPG_JPG_SWITCH), 0, VOP_DRAM_RD_MODE);
3352*53ee8cc1Swenshuai.xi 
3353*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubNewVSyncMode = FALSE;// Disable New Vsync Mode
3354*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INFO_FROM_CODEC_H), 1, VOP_INFO_FROM_CODEC_DS_IDX);// Sub mvop ds idx from DIU
3355*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_REG_MFDEC_0_L), 0x70, VOP_MF1_BURST|VOP_MF0_BURST|VOP_MFDEC_EN);// Setting MF burst len
3356*53ee8cc1Swenshuai.xi         // Only for monaco: Disable mfdec setting from wb
3357*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_MFDEC_2_L), 1, VOP_MF_FROM_WB);
3358*53ee8cc1Swenshuai.xi         // All codec use WISHBONE(R2) interface in muji
3359*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 1, VOP_R2_WISHBONE);
3360*53ee8cc1Swenshuai.xi         // Disable 10 bits from codec
3361*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INFO_FROM_CODEC_H), 0, VOP_INFO_FROM_CODEC_10BIT);
3362*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->u16SubCropXStart = 0;
3363*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->u16CropYStart = 0;
3364*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->u16CropXSize = 0;
3365*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->u16CropYSize = 0;
3366*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubIsSetCrop = FALSE;
3367*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->u32SubMVOPFixClk = 0;
3368*53ee8cc1Swenshuai.xi         // MIU select from WB
3369*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_INFO_FROM_CODEC_H), 0x30, VOP_INFO_FROM_CODEC_MIU_BUF0_SEL|VOP_INFO_FROM_CODEC_MIU_BUF1_SEL);
3370*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_UV_SHIFT), 0, VOP_GCLK_MIU_ON);// yc seperate can not enable
3371*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->eSubInterlaceType = E_MVOP_PRO;
3372*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_REG_BLK_VCNT_L), 0x00);//mantis: 0986938
3373*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_REG_BLK_VCNT_H), 0x01, BIT0);
3374*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(REG_CKG_FBDEC), 0x0, VOP_SEL_CLK_432); //default disable mfdec clock.
3375*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 0, VOP_TILE_32x32);
3376*53ee8cc1Swenshuai.xi         HAL_MVOP_SubLoadReg();
3377*53ee8cc1Swenshuai.xi         /*****************************************************/
3378*53ee8cc1Swenshuai.xi         break;
3379*53ee8cc1Swenshuai.xi     }
3380*53ee8cc1Swenshuai.xi #endif
3381*53ee8cc1Swenshuai.xi     default:
3382*53ee8cc1Swenshuai.xi         MVOP_PRINTF("[%s] Input Device ID is Error!\n",__FUNCTION__);
3383*53ee8cc1Swenshuai.xi         break;
3384*53ee8cc1Swenshuai.xi     }
3385*53ee8cc1Swenshuai.xi }
3386*53ee8cc1Swenshuai.xi 
3387*53ee8cc1Swenshuai.xi /******************************************************************************/
3388*53ee8cc1Swenshuai.xi /// Set MVOP Handshake Mode, XC should be synchronous with MVOP.
3389*53ee8cc1Swenshuai.xi /// this command should be before mvop enable.(before 1st frame)
3390*53ee8cc1Swenshuai.xi /// kano hsk disable, xc gen timing need to disable.
3391*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SetHandShakeMode(MVOP_DevID eID,MS_BOOL bEnable,MS_U8 u8Framerate)3392*53ee8cc1Swenshuai.xi void HAL_MVOP_SetHandShakeMode(MVOP_DevID eID, MS_BOOL bEnable, MS_U8 u8Framerate)
3393*53ee8cc1Swenshuai.xi {
3394*53ee8cc1Swenshuai.xi     switch(eID)
3395*53ee8cc1Swenshuai.xi     {
3396*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
3397*53ee8cc1Swenshuai.xi         {
3398*53ee8cc1Swenshuai.xi             if(!((bEnable == FALSE) && (g_pHalMVOPCtx->bIsHS == FALSE))) //prevent switch VOP_CTRL0 (mvop enable), for MHEG5 verify
3399*53ee8cc1Swenshuai.xi             {
3400*53ee8cc1Swenshuai.xi                 MVOP_DBG(MVOP_PRINTF("[MVOP][DBG] HAL_MVOP_SetHandShakeMode = %d\n",bEnable);)
3401*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_CTRL0, 0, BIT0);
3402*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->bIsHS = bEnable;
3403*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_HANDSHAKE, bEnable, VOP_HANDSHAKE_MODE);
3404*53ee8cc1Swenshuai.xi                 if(bEnable == FALSE)
3405*53ee8cc1Swenshuai.xi                 {
3406*53ee8cc1Swenshuai.xi                     HAL_MVOP_SetTimingFromXC(E_MVOP_DEV_0, FALSE);
3407*53ee8cc1Swenshuai.xi                 }
3408*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_CTRL0, bEnable, BIT4);
3409*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_MIRROR_CFG_HI, bEnable, VOP_HK_MASK); //bk background
3410*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_CTRL0, 1, BIT0);
3411*53ee8cc1Swenshuai.xi                 HAL_MVOP_LoadReg();
3412*53ee8cc1Swenshuai.xi             }
3413*53ee8cc1Swenshuai.xi             break;
3414*53ee8cc1Swenshuai.xi         }
3415*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
3416*53ee8cc1Swenshuai.xi         {
3417*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3418*53ee8cc1Swenshuai.xi             if(!((bEnable == FALSE) && (g_pHalMVOPCtx->bSubIsHS == FALSE))) //prevent switch VOP_CTRL0 (mvop enable), for MHEG5 verify
3419*53ee8cc1Swenshuai.xi             {
3420*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_CTRL0), 0, BIT0);
3421*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->bSubIsHS = bEnable;
3422*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_HANDSHAKE), bEnable, VOP_HANDSHAKE_MODE);
3423*53ee8cc1Swenshuai.xi                 if(bEnable == FALSE)
3424*53ee8cc1Swenshuai.xi                 {
3425*53ee8cc1Swenshuai.xi                     HAL_MVOP_SetTimingFromXC(E_MVOP_DEV_1, FALSE);
3426*53ee8cc1Swenshuai.xi                 }
3427*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_CTRL0), bEnable, BIT4);
3428*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG_HI), bEnable, VOP_HK_MASK); //bk background
3429*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_CTRL0), 1, BIT0);
3430*53ee8cc1Swenshuai.xi                 HAL_MVOP_SubLoadReg();
3431*53ee8cc1Swenshuai.xi             }
3432*53ee8cc1Swenshuai.xi #endif
3433*53ee8cc1Swenshuai.xi             break;
3434*53ee8cc1Swenshuai.xi         }
3435*53ee8cc1Swenshuai.xi         default:
3436*53ee8cc1Swenshuai.xi             MVOP_PRINTF("[Warning] MVOP_DevID not support!\n");
3437*53ee8cc1Swenshuai.xi             break;
3438*53ee8cc1Swenshuai.xi     }
3439*53ee8cc1Swenshuai.xi }
3440*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetCropforXC(MVOP_DevID eID,MVOP_XCGetCrop * stXCCrop,MS_U16 u16Width,MS_U16 u16Height)3441*53ee8cc1Swenshuai.xi void HAL_MVOP_SetCropforXC(MVOP_DevID eID, MVOP_XCGetCrop* stXCCrop, MS_U16 u16Width, MS_U16 u16Height)
3442*53ee8cc1Swenshuai.xi {
3443*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF("%s [crop info] xst: 0x%x yst: 0x%x xsize: 0x%x ysize: 0x%x Width: 0x%x Height: 0x%x\n", __FUNCTION__,
3444*53ee8cc1Swenshuai.xi         stXCCrop->u16XStart, stXCCrop->u16XSize, stXCCrop->u16YStart, stXCCrop->u16YSize, u16Width, u16Height);)
3445*53ee8cc1Swenshuai.xi 
3446*53ee8cc1Swenshuai.xi     EN_MVOP_Output_3D_TYPE en3DType = E_MVOP_OUTPUT_3D_NONE;
3447*53ee8cc1Swenshuai.xi 
3448*53ee8cc1Swenshuai.xi     switch(eID)
3449*53ee8cc1Swenshuai.xi     {
3450*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
3451*53ee8cc1Swenshuai.xi         {
3452*53ee8cc1Swenshuai.xi             if((stXCCrop->u16XStart + stXCCrop->u16XSize) > u16Width)
3453*53ee8cc1Swenshuai.xi             {
3454*53ee8cc1Swenshuai.xi                 MVOP_PRINTF("[Warning] crop x size or start out of boundary.");
3455*53ee8cc1Swenshuai.xi                 return;
3456*53ee8cc1Swenshuai.xi             }
3457*53ee8cc1Swenshuai.xi 
3458*53ee8cc1Swenshuai.xi             if((stXCCrop->u16YStart + stXCCrop->u16YSize) > u16Height)
3459*53ee8cc1Swenshuai.xi             {
3460*53ee8cc1Swenshuai.xi                 MVOP_PRINTF("[Warning] crop y size or start out of boundary.");
3461*53ee8cc1Swenshuai.xi                 return;
3462*53ee8cc1Swenshuai.xi             }
3463*53ee8cc1Swenshuai.xi 
3464*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropXStart = stXCCrop->u16XStart;
3465*53ee8cc1Swenshuai.xi             en3DType = HAL_MVOP_GetOutput3DType();
3466*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("%s 3D FORMAT = %d\n", __FUNCTION__, en3DType);)
3467*53ee8cc1Swenshuai.xi             if(en3DType == E_MVOP_OUTPUT_3D_SBS)
3468*53ee8cc1Swenshuai.xi             {
3469*53ee8cc1Swenshuai.xi                 stXCCrop->u16XSize = stXCCrop->u16XSize >> 1;
3470*53ee8cc1Swenshuai.xi             }
3471*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropXSize = stXCCrop->u16XSize;
3472*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropYStart = stXCCrop->u16YStart;
3473*53ee8cc1Swenshuai.xi             if(stXCCrop->u16YStart == 0)
3474*53ee8cc1Swenshuai.xi                 stXCCrop->u16YStart |= 0x6000;
3475*53ee8cc1Swenshuai.xi             else
3476*53ee8cc1Swenshuai.xi                 stXCCrop->u16YStart |= 0x2000;
3477*53ee8cc1Swenshuai.xi 
3478*53ee8cc1Swenshuai.xi             if((en3DType == E_MVOP_OUTPUT_3D_TB) || (en3DType == E_MVOP_OUTPUT_3D_LA))
3479*53ee8cc1Swenshuai.xi             {
3480*53ee8cc1Swenshuai.xi                 stXCCrop->u16YSize = stXCCrop->u16YSize >> 1;
3481*53ee8cc1Swenshuai.xi             }
3482*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropYSize = stXCCrop->u16YSize;
3483*53ee8cc1Swenshuai.xi             break;
3484*53ee8cc1Swenshuai.xi         }
3485*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
3486*53ee8cc1Swenshuai.xi         {
3487*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3488*53ee8cc1Swenshuai.xi 
3489*53ee8cc1Swenshuai.xi             if((stXCCrop->u16XStart + stXCCrop->u16XSize) > u16Width)
3490*53ee8cc1Swenshuai.xi             {
3491*53ee8cc1Swenshuai.xi                 MVOP_PRINTF("[Warning] crop x size or start out of boundary.");
3492*53ee8cc1Swenshuai.xi                 return;
3493*53ee8cc1Swenshuai.xi             }
3494*53ee8cc1Swenshuai.xi 
3495*53ee8cc1Swenshuai.xi             if((stXCCrop->u16YStart + stXCCrop->u16YSize) > u16Height)
3496*53ee8cc1Swenshuai.xi             {
3497*53ee8cc1Swenshuai.xi                 MVOP_PRINTF("[Warning] crop y size or start out of boundary.");
3498*53ee8cc1Swenshuai.xi                 return;
3499*53ee8cc1Swenshuai.xi             }
3500*53ee8cc1Swenshuai.xi 
3501*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropXStart = stXCCrop->u16XStart;
3502*53ee8cc1Swenshuai.xi             en3DType = HAL_MVOP_SubGetOutput3DType();
3503*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("%s 3D FORMAT = %d\n", __FUNCTION__, en3DType);)
3504*53ee8cc1Swenshuai.xi             if(en3DType == E_MVOP_OUTPUT_3D_SBS)
3505*53ee8cc1Swenshuai.xi             {
3506*53ee8cc1Swenshuai.xi                 stXCCrop->u16XSize = stXCCrop->u16XSize >> 1;
3507*53ee8cc1Swenshuai.xi             }
3508*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropXSize = stXCCrop->u16XSize;
3509*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropYStart = stXCCrop->u16YStart;
3510*53ee8cc1Swenshuai.xi             if(stXCCrop->u16YStart == 0)
3511*53ee8cc1Swenshuai.xi                 stXCCrop->u16YStart |= 0x6000;
3512*53ee8cc1Swenshuai.xi             else
3513*53ee8cc1Swenshuai.xi                 stXCCrop->u16YStart |= 0x2000;
3514*53ee8cc1Swenshuai.xi 
3515*53ee8cc1Swenshuai.xi             if((en3DType == E_MVOP_OUTPUT_3D_TB) || (en3DType == E_MVOP_OUTPUT_3D_LA))
3516*53ee8cc1Swenshuai.xi             {
3517*53ee8cc1Swenshuai.xi                 stXCCrop->u16YSize = stXCCrop->u16YSize >> 1;
3518*53ee8cc1Swenshuai.xi             }
3519*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropYSize = stXCCrop->u16YSize;
3520*53ee8cc1Swenshuai.xi #endif
3521*53ee8cc1Swenshuai.xi             break;
3522*53ee8cc1Swenshuai.xi         }
3523*53ee8cc1Swenshuai.xi         default:
3524*53ee8cc1Swenshuai.xi             MVOP_PRINTF("[Warning] MVOP_DevID not support!\n");
3525*53ee8cc1Swenshuai.xi             break;
3526*53ee8cc1Swenshuai.xi     }
3527*53ee8cc1Swenshuai.xi     MVOP_PRINTF("[Debug][Crop to XC] xsize = %d, ysize = %d, xstart = %d, ystart=%d\n",stXCCrop->u16XSize,stXCCrop->u16YSize,stXCCrop->u16XStart,stXCCrop->u16YStart);
3528*53ee8cc1Swenshuai.xi     return;
3529*53ee8cc1Swenshuai.xi }
3530*53ee8cc1Swenshuai.xi 
3531*53ee8cc1Swenshuai.xi 
3532*53ee8cc1Swenshuai.xi 
HAL_MVOP_SupportFRCOutputFPS(MVOP_DevID eID)3533*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SupportFRCOutputFPS(MVOP_DevID eID)
3534*53ee8cc1Swenshuai.xi {
3535*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
3536*53ee8cc1Swenshuai.xi     switch(eID)
3537*53ee8cc1Swenshuai.xi     {
3538*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
3539*53ee8cc1Swenshuai.xi             bRet = TRUE;
3540*53ee8cc1Swenshuai.xi             break;
3541*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3542*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
3543*53ee8cc1Swenshuai.xi             bRet = TRUE;
3544*53ee8cc1Swenshuai.xi             break;
3545*53ee8cc1Swenshuai.xi #endif
3546*53ee8cc1Swenshuai.xi         default:
3547*53ee8cc1Swenshuai.xi             break;
3548*53ee8cc1Swenshuai.xi     }
3549*53ee8cc1Swenshuai.xi     return bRet;
3550*53ee8cc1Swenshuai.xi }
3551*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetIsCurrentHSK(MVOP_DevID eID)3552*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetIsCurrentHSK(MVOP_DevID eID)
3553*53ee8cc1Swenshuai.xi {
3554*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
3555*53ee8cc1Swenshuai.xi     switch(eID)
3556*53ee8cc1Swenshuai.xi     {
3557*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
3558*53ee8cc1Swenshuai.xi             bRet = g_pHalMVOPCtx->bIsHS;
3559*53ee8cc1Swenshuai.xi             break;
3560*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
3561*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3562*53ee8cc1Swenshuai.xi             bRet = g_pHalMVOPCtx->bSubIsHS;
3563*53ee8cc1Swenshuai.xi #endif
3564*53ee8cc1Swenshuai.xi             break;
3565*53ee8cc1Swenshuai.xi         default:
3566*53ee8cc1Swenshuai.xi             bRet = E_MVOP_HS_INVALID_PARAM;
3567*53ee8cc1Swenshuai.xi             break;
3568*53ee8cc1Swenshuai.xi     }
3569*53ee8cc1Swenshuai.xi     return bRet;
3570*53ee8cc1Swenshuai.xi }
3571*53ee8cc1Swenshuai.xi 
3572*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetIsCurrentXCGenTiming(MVOP_DevID eID)3573*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetIsCurrentXCGenTiming(MVOP_DevID eID)
3574*53ee8cc1Swenshuai.xi {
3575*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
3576*53ee8cc1Swenshuai.xi     switch(eID)
3577*53ee8cc1Swenshuai.xi     {
3578*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
3579*53ee8cc1Swenshuai.xi             bRet = g_pHalMVOPCtx->bIsXcTrig;
3580*53ee8cc1Swenshuai.xi             break;
3581*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
3582*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3583*53ee8cc1Swenshuai.xi             bRet = g_pHalMVOPCtx->bSubIsXcTrig;
3584*53ee8cc1Swenshuai.xi #endif
3585*53ee8cc1Swenshuai.xi             break;
3586*53ee8cc1Swenshuai.xi         default:
3587*53ee8cc1Swenshuai.xi             bRet = E_MVOP_HS_INVALID_PARAM;
3588*53ee8cc1Swenshuai.xi             break;
3589*53ee8cc1Swenshuai.xi     }
3590*53ee8cc1Swenshuai.xi     return bRet;
3591*53ee8cc1Swenshuai.xi }
3592*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetFixClk(MVOP_DevID eID,MS_U32 u32MVOPClk)3593*53ee8cc1Swenshuai.xi HALMVOPFREQUENCY HAL_MVOP_SetFixClk(MVOP_DevID eID, MS_U32 u32MVOPClk)
3594*53ee8cc1Swenshuai.xi {
3595*53ee8cc1Swenshuai.xi     HALMVOPFREQUENCY eRet = HALMVOP_160MHZ;
3596*53ee8cc1Swenshuai.xi 
3597*53ee8cc1Swenshuai.xi     if(u32MVOPClk > HALMVOP_320MHZ*2)
3598*53ee8cc1Swenshuai.xi     {
3599*53ee8cc1Swenshuai.xi         MVOP_PRINTF("[Warning] MVOP clock out of spec(640MHz), set freerun mode.\n");
3600*53ee8cc1Swenshuai.xi         eRet = HALMVOP_FREERUNMODE;
3601*53ee8cc1Swenshuai.xi     }
3602*53ee8cc1Swenshuai.xi     else if(u32MVOPClk <= HALMVOP_320MHZ*2 && u32MVOPClk > HALMVOP_320MHZ)
3603*53ee8cc1Swenshuai.xi     {
3604*53ee8cc1Swenshuai.xi         eRet = u32MVOPClk;
3605*53ee8cc1Swenshuai.xi     }
3606*53ee8cc1Swenshuai.xi     else if(u32MVOPClk <= HALMVOP_320MHZ && u32MVOPClk > HALMVOP_192MHZ)
3607*53ee8cc1Swenshuai.xi     {
3608*53ee8cc1Swenshuai.xi         eRet = u32MVOPClk;
3609*53ee8cc1Swenshuai.xi     }
3610*53ee8cc1Swenshuai.xi     else if(u32MVOPClk <= HALMVOP_192MHZ && u32MVOPClk > HALMVOP_160MHZ)
3611*53ee8cc1Swenshuai.xi     {
3612*53ee8cc1Swenshuai.xi         eRet = HALMVOP_192MHZ;
3613*53ee8cc1Swenshuai.xi     }
3614*53ee8cc1Swenshuai.xi     else if(u32MVOPClk <= HALMVOP_160MHZ && u32MVOPClk > HALMVOP_144MHZ)
3615*53ee8cc1Swenshuai.xi     {
3616*53ee8cc1Swenshuai.xi         eRet = HALMVOP_160MHZ;
3617*53ee8cc1Swenshuai.xi     }
3618*53ee8cc1Swenshuai.xi     else if(u32MVOPClk <= HALMVOP_144MHZ && u32MVOPClk > HALMVOP_123MHZ)
3619*53ee8cc1Swenshuai.xi     {
3620*53ee8cc1Swenshuai.xi         eRet = HALMVOP_144MHZ;
3621*53ee8cc1Swenshuai.xi     }
3622*53ee8cc1Swenshuai.xi     else if(u32MVOPClk <= HALMVOP_123MHZ && u32MVOPClk > HALMVOP_108MHZ)
3623*53ee8cc1Swenshuai.xi     {
3624*53ee8cc1Swenshuai.xi         eRet = HALMVOP_123MHZ;
3625*53ee8cc1Swenshuai.xi     }
3626*53ee8cc1Swenshuai.xi     else
3627*53ee8cc1Swenshuai.xi     {
3628*53ee8cc1Swenshuai.xi         eRet = HALMVOP_108MHZ;
3629*53ee8cc1Swenshuai.xi     }
3630*53ee8cc1Swenshuai.xi 
3631*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF("[MVOP] MVOP clock set as %ld\n",eRet););
3632*53ee8cc1Swenshuai.xi     if(eID == E_MVOP_DEV_0)
3633*53ee8cc1Swenshuai.xi     {
3634*53ee8cc1Swenshuai.xi         if(eRet > HALMVOP_192MHZ)
3635*53ee8cc1Swenshuai.xi         {
3636*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u32MVOPFixClk = HALMVOP_320MHZ;
3637*53ee8cc1Swenshuai.xi         }
3638*53ee8cc1Swenshuai.xi         else
3639*53ee8cc1Swenshuai.xi         {
3640*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u32MVOPFixClk = eRet;
3641*53ee8cc1Swenshuai.xi         }
3642*53ee8cc1Swenshuai.xi     }
3643*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3644*53ee8cc1Swenshuai.xi     else if(eID == E_MVOP_DEV_1)
3645*53ee8cc1Swenshuai.xi     {
3646*53ee8cc1Swenshuai.xi         if(eRet > HALMVOP_192MHZ)
3647*53ee8cc1Swenshuai.xi         {
3648*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u32SubMVOPFixClk = HALMVOP_320MHZ;
3649*53ee8cc1Swenshuai.xi         }
3650*53ee8cc1Swenshuai.xi         else
3651*53ee8cc1Swenshuai.xi         {
3652*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u32SubMVOPFixClk = eRet;
3653*53ee8cc1Swenshuai.xi         }
3654*53ee8cc1Swenshuai.xi     }
3655*53ee8cc1Swenshuai.xi #endif
3656*53ee8cc1Swenshuai.xi     return eRet;
3657*53ee8cc1Swenshuai.xi }
3658*53ee8cc1Swenshuai.xi 
3659*53ee8cc1Swenshuai.xi 
3660*53ee8cc1Swenshuai.xi #if 0
3661*53ee8cc1Swenshuai.xi void HAL_SetSCFEMIUIPSel(MVOP_SCIPSel *stIPSel)
3662*53ee8cc1Swenshuai.xi {
3663*53ee8cc1Swenshuai.xi     if(NULL == stIPSel)
3664*53ee8cc1Swenshuai.xi     {
3665*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_MIU_SEL_FROM_IP, 1, MVOP_MIU_IP_SEL);  //mvop
3666*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_MIU_SEL_FROM_IP, 1, MFDEC0_MIU_IP_SEL);  //mfdec0
3667*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_MIU_SEL_FROM_IP, 1, MFDEC1_MIU_IP_SEL);  //mfdec1
3668*53ee8cc1Swenshuai.xi     }
3669*53ee8cc1Swenshuai.xi     else
3670*53ee8cc1Swenshuai.xi     {
3671*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_MIU_SEL_FROM_IP, stIPSel->bMVOP0, MVOP_MIU_IP_SEL);  //mvop
3672*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_MIU_SEL_FROM_IP, stIPSel->bMFDEC0, MFDEC0_MIU_IP_SEL);  //mfdec0
3673*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_MIU_SEL_FROM_IP, stIPSel->bMFDEC1, MFDEC1_MIU_IP_SEL);  //mfdec1
3674*53ee8cc1Swenshuai.xi     }
3675*53ee8cc1Swenshuai.xi 
3676*53ee8cc1Swenshuai.xi }
3677*53ee8cc1Swenshuai.xi #endif
3678*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetInterlaceType(MVOP_DevID eDevID,MS_U16 u16ECONumber,MS_U8 u8Interlace)3679*53ee8cc1Swenshuai.xi void HAL_MVOP_SetInterlaceType(MVOP_DevID eDevID, MS_U16 u16ECONumber, MS_U8 u8Interlace)
3680*53ee8cc1Swenshuai.xi {
3681*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF("%s u8Interlace = %d\n", __FUNCTION__ ,u8Interlace);)
3682*53ee8cc1Swenshuai.xi     switch(u8Interlace)
3683*53ee8cc1Swenshuai.xi     {
3684*53ee8cc1Swenshuai.xi     case 0:
3685*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->eInterlaceType = E_MVOP_PRO;
3686*53ee8cc1Swenshuai.xi         break;
3687*53ee8cc1Swenshuai.xi     case 0x1:
3688*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->bIsH265)
3689*53ee8cc1Swenshuai.xi         {
3690*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->eInterlaceType = E_MVOP_INT_TB_SEP_FRAME;
3691*53ee8cc1Swenshuai.xi         }
3692*53ee8cc1Swenshuai.xi         else
3693*53ee8cc1Swenshuai.xi         {
3694*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->eInterlaceType = E_MVOP_INT_TB_ONE_FRAME;
3695*53ee8cc1Swenshuai.xi         }
3696*53ee8cc1Swenshuai.xi         break;
3697*53ee8cc1Swenshuai.xi     case 0x2:
3698*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->bIsH265)
3699*53ee8cc1Swenshuai.xi         {
3700*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->eInterlaceType = E_MVOP_INT_TB_ONE_FRAME;
3701*53ee8cc1Swenshuai.xi         }
3702*53ee8cc1Swenshuai.xi         else
3703*53ee8cc1Swenshuai.xi         {
3704*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->eInterlaceType = E_MVOP_INT_TB_SEP_FRAME;
3705*53ee8cc1Swenshuai.xi         }
3706*53ee8cc1Swenshuai.xi         break;
3707*53ee8cc1Swenshuai.xi     default:
3708*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->eInterlaceType = E_MVOP_PRO;
3709*53ee8cc1Swenshuai.xi         break;
3710*53ee8cc1Swenshuai.xi     }
3711*53ee8cc1Swenshuai.xi 
3712*53ee8cc1Swenshuai.xi     switch(eDevID)
3713*53ee8cc1Swenshuai.xi     {
3714*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_0:
3715*53ee8cc1Swenshuai.xi         if((g_pHalMVOPCtx->eInterlaceType == E_MVOP_INT_TB_SEP_FRAME) && (g_pHalMVOPCtx->bIsH265))
3716*53ee8cc1Swenshuai.xi         {
3717*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_INT_TYPE, 1, VOP_EVD_INT_SEP);
3718*53ee8cc1Swenshuai.xi         }
3719*53ee8cc1Swenshuai.xi         else if((g_pHalMVOPCtx->eInterlaceType == E_MVOP_INT_TB_ONE_FRAME) && (g_pHalMVOPCtx->bIsH265))
3720*53ee8cc1Swenshuai.xi         {
3721*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_INT_TYPE, 0, VOP_EVD_INT_SEP);
3722*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_MIRROR_CFG, 0, VOP_FIELD_FROM_ADDR);
3723*53ee8cc1Swenshuai.xi         }
3724*53ee8cc1Swenshuai.xi         HAL_MVOP_LoadReg();
3725*53ee8cc1Swenshuai.xi         break;
3726*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3727*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_1:
3728*53ee8cc1Swenshuai.xi         if((g_pHalMVOPCtx->eSubInterlaceType == E_MVOP_INT_TB_SEP_FRAME) && (g_pHalMVOPCtx->bSubIsH265))
3729*53ee8cc1Swenshuai.xi         {
3730*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(SUB_REG(VOP_INT_TYPE), 1, VOP_EVD_INT_SEP);
3731*53ee8cc1Swenshuai.xi         }
3732*53ee8cc1Swenshuai.xi         else if((g_pHalMVOPCtx->eSubInterlaceType == E_MVOP_INT_TB_ONE_FRAME) && (g_pHalMVOPCtx->bSubIsH265))
3733*53ee8cc1Swenshuai.xi         {
3734*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(SUB_REG(VOP_INT_TYPE), 0, VOP_EVD_INT_SEP);
3735*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), 0, VOP_FIELD_FROM_ADDR);
3736*53ee8cc1Swenshuai.xi         }
3737*53ee8cc1Swenshuai.xi         HAL_MVOP_SubLoadReg();
3738*53ee8cc1Swenshuai.xi         break;
3739*53ee8cc1Swenshuai.xi #endif
3740*53ee8cc1Swenshuai.xi     default:
3741*53ee8cc1Swenshuai.xi         MVOP_PRINTF("[Warning][%s] MVOP_DevID not support\n",__FUNCTION__);
3742*53ee8cc1Swenshuai.xi         break;
3743*53ee8cc1Swenshuai.xi     }
3744*53ee8cc1Swenshuai.xi }
3745*53ee8cc1Swenshuai.xi 
3746*53ee8cc1Swenshuai.xi #ifdef UFO_MVOP_GET_IS_MVOP_AUTO_GEN_BLACK
HAL_MVOP_GetIsMVOPSupportBLKBackground(MVOP_DevID eID)3747*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetIsMVOPSupportBLKBackground(MVOP_DevID eID)
3748*53ee8cc1Swenshuai.xi {
3749*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
3750*53ee8cc1Swenshuai.xi     switch(eID)
3751*53ee8cc1Swenshuai.xi     {
3752*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
3753*53ee8cc1Swenshuai.xi             bRet = FALSE;
3754*53ee8cc1Swenshuai.xi             break;
3755*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
3756*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3757*53ee8cc1Swenshuai.xi             bRet = FALSE;
3758*53ee8cc1Swenshuai.xi #endif
3759*53ee8cc1Swenshuai.xi             break;
3760*53ee8cc1Swenshuai.xi         default:
3761*53ee8cc1Swenshuai.xi             bRet = E_MVOP_HS_INVALID_PARAM;
3762*53ee8cc1Swenshuai.xi             break;
3763*53ee8cc1Swenshuai.xi     }
3764*53ee8cc1Swenshuai.xi     return bRet;
3765*53ee8cc1Swenshuai.xi }
3766*53ee8cc1Swenshuai.xi #endif
3767*53ee8cc1Swenshuai.xi 
HAL_MVOP_ReadBank(MVOP_DevID eID,MS_U16 u16Length)3768*53ee8cc1Swenshuai.xi MS_U16 HAL_MVOP_ReadBank(MVOP_DevID eID ,MS_U16 u16Length)
3769*53ee8cc1Swenshuai.xi {
3770*53ee8cc1Swenshuai.xi     MS_U16 u16Reg = 0;
3771*53ee8cc1Swenshuai.xi     if(eID == E_MVOP_DEV_0)
3772*53ee8cc1Swenshuai.xi     {
3773*53ee8cc1Swenshuai.xi         u16Reg = HAL_Read2Byte(MVOP_REG_BASE + (u16Length << 1));
3774*53ee8cc1Swenshuai.xi     }
3775*53ee8cc1Swenshuai.xi #ifdef MVOP_SUPPORT_SUB
3776*53ee8cc1Swenshuai.xi     else if(eID == E_MVOP_DEV_1)
3777*53ee8cc1Swenshuai.xi     {
3778*53ee8cc1Swenshuai.xi         u16Reg = HAL_Read2Byte(SUB_REG(MVOP_REG_BASE + (u16Length << 1)));
3779*53ee8cc1Swenshuai.xi     }
3780*53ee8cc1Swenshuai.xi #endif
3781*53ee8cc1Swenshuai.xi     return u16Reg;
3782*53ee8cc1Swenshuai.xi }
3783*53ee8cc1Swenshuai.xi 
HAL_MVOP_WriteBank(MVOP_DevID eID,MS_U16 u16Length,MS_U16 u16Data)3784*53ee8cc1Swenshuai.xi void HAL_MVOP_WriteBank(MVOP_DevID eID ,MS_U16 u16Length,MS_U16 u16Data)
3785*53ee8cc1Swenshuai.xi {
3786*53ee8cc1Swenshuai.xi     if(eID == E_MVOP_DEV_0)
3787*53ee8cc1Swenshuai.xi     {
3788*53ee8cc1Swenshuai.xi         HAL_Write2Byte(MVOP_REG_BASE + (u16Length << 1),u16Data);
3789*53ee8cc1Swenshuai.xi     }
3790*53ee8cc1Swenshuai.xi #ifdef MVOP_SUPPORT_SUB
3791*53ee8cc1Swenshuai.xi     else if(eID == E_MVOP_DEV_1)
3792*53ee8cc1Swenshuai.xi     {
3793*53ee8cc1Swenshuai.xi         HAL_Write2Byte(SUB_REG(MVOP_REG_BASE + (u16Length << 1)),u16Data);
3794*53ee8cc1Swenshuai.xi     }
3795*53ee8cc1Swenshuai.xi #endif
3796*53ee8cc1Swenshuai.xi }
3797*53ee8cc1Swenshuai.xi 
HAL_MVOP_ReadClkBank(MS_U16 u16Length)3798*53ee8cc1Swenshuai.xi MS_U16 HAL_MVOP_ReadClkBank(MS_U16 u16Length)
3799*53ee8cc1Swenshuai.xi {
3800*53ee8cc1Swenshuai.xi     MS_U16 u16Reg = 0;
3801*53ee8cc1Swenshuai.xi 
3802*53ee8cc1Swenshuai.xi     if(u16Length < 3) // stc cw
3803*53ee8cc1Swenshuai.xi     {
3804*53ee8cc1Swenshuai.xi         u16Reg = HAL_Read2Byte(REG_STC_CW_SLE_L + (u16Length << 1));
3805*53ee8cc1Swenshuai.xi 
3806*53ee8cc1Swenshuai.xi     }
3807*53ee8cc1Swenshuai.xi     else if(u16Length < 7) // dc clk
3808*53ee8cc1Swenshuai.xi     {
3809*53ee8cc1Swenshuai.xi         u16Length -= 3;
3810*53ee8cc1Swenshuai.xi         u16Reg = HAL_Read2Byte(REG_CKG_DC0 + (u16Length << 1)); // main/sub sram
3811*53ee8cc1Swenshuai.xi     }
3812*53ee8cc1Swenshuai.xi     else // freerun/sync clk
3813*53ee8cc1Swenshuai.xi     {
3814*53ee8cc1Swenshuai.xi         u16Length -= 7;
3815*53ee8cc1Swenshuai.xi         u16Reg = HAL_Read2Byte(REG_UPDATE_DC0_CW + (u16Length << 1));
3816*53ee8cc1Swenshuai.xi     }
3817*53ee8cc1Swenshuai.xi 
3818*53ee8cc1Swenshuai.xi     //printk("[read][%x] u16Reg = 0x%x\n",u16Length,u16Reg);
3819*53ee8cc1Swenshuai.xi     return u16Reg;
3820*53ee8cc1Swenshuai.xi }
3821*53ee8cc1Swenshuai.xi 
HAL_MVOP_WriteClkBank(MS_U16 u16Length,MS_U16 u16Data)3822*53ee8cc1Swenshuai.xi void HAL_MVOP_WriteClkBank(MS_U16 u16Length,MS_U16 u16Data)
3823*53ee8cc1Swenshuai.xi {
3824*53ee8cc1Swenshuai.xi 
3825*53ee8cc1Swenshuai.xi     //printk("[write][%x] u16Reg = 0x%x\n",u16Length,u16Data);
3826*53ee8cc1Swenshuai.xi 
3827*53ee8cc1Swenshuai.xi     if(u16Length < 3) // stc cw
3828*53ee8cc1Swenshuai.xi     {
3829*53ee8cc1Swenshuai.xi         HAL_Write2Byte(REG_STC_CW_SLE_L + (u16Length << 1), u16Data);
3830*53ee8cc1Swenshuai.xi     }
3831*53ee8cc1Swenshuai.xi     else if(u16Length < 7) // dc clk
3832*53ee8cc1Swenshuai.xi     {
3833*53ee8cc1Swenshuai.xi         u16Length -= 3;
3834*53ee8cc1Swenshuai.xi         HAL_Write2Byte(REG_CKG_DC0 + (u16Length << 1), u16Data);
3835*53ee8cc1Swenshuai.xi     }
3836*53ee8cc1Swenshuai.xi     else // freerun/sync clk
3837*53ee8cc1Swenshuai.xi     {
3838*53ee8cc1Swenshuai.xi         u16Length -= 7;
3839*53ee8cc1Swenshuai.xi         HAL_Write2Byte(REG_UPDATE_DC0_CW + (u16Length << 1), u16Data);
3840*53ee8cc1Swenshuai.xi     }
3841*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(REG_UPDATE_DC0_CW, TRUE, UPDATE_DC0_SYNC_CW);
3842*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(REG_UPDATE_DC0_CW, FALSE, UPDATE_DC0_SYNC_CW);
3843*53ee8cc1Swenshuai.xi 
3844*53ee8cc1Swenshuai.xi }
3845*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetSramPower(MVOP_DevID eID,MS_BOOL bEnable)3846*53ee8cc1Swenshuai.xi void HAL_MVOP_SetSramPower(MVOP_DevID eID ,MS_BOOL bEnable)
3847*53ee8cc1Swenshuai.xi {
3848*53ee8cc1Swenshuai.xi     switch(eID)
3849*53ee8cc1Swenshuai.xi     {
3850*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_0:
3851*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3852*53ee8cc1Swenshuai.xi         if((bEnable== FALSE) && (g_pHalMVOPCtx->bIsSubEnable == FALSE)) //check sub disable -> mfdec sram disable
3853*53ee8cc1Swenshuai.xi         {
3854*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_DC_STRIP_H, 1, MFDEC_SRAM_SD_MASK);
3855*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_DC_STRIP_H, 1, VOP_SRAM_SD_MASK);
3856*53ee8cc1Swenshuai.xi         }
3857*53ee8cc1Swenshuai.xi         else
3858*53ee8cc1Swenshuai.xi         {
3859*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_DC_STRIP_H, 0, MFDEC_SRAM_SD_MASK);
3860*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_DC_STRIP_H, 0, VOP_SRAM_SD_MASK);
3861*53ee8cc1Swenshuai.xi         }
3862*53ee8cc1Swenshuai.xi #else
3863*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_DC_STRIP_H, !bEnable, VOP_SRAM_SD_MASK);
3864*53ee8cc1Swenshuai.xi #endif
3865*53ee8cc1Swenshuai.xi         break;
3866*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3867*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_1:
3868*53ee8cc1Swenshuai.xi         if((bEnable== FALSE) && (g_pHalMVOPCtx->bIsEnable == FALSE))
3869*53ee8cc1Swenshuai.xi         {
3870*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_DC_STRIP_H, 1, MFDEC_SRAM_SD_MASK);
3871*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_DC_STRIP_H, 1, VOP_SRAM_SD_MASK);
3872*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(SUB_REG(VOP_DC_STRIP_H), 1, VOP_SRAM_SD_MASK);
3873*53ee8cc1Swenshuai.xi         }
3874*53ee8cc1Swenshuai.xi         else
3875*53ee8cc1Swenshuai.xi         {
3876*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_DC_STRIP_H, 0, MFDEC_SRAM_SD_MASK);
3877*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_DC_STRIP_H, 0, VOP_SRAM_SD_MASK); //main need to enable, if sub enable.
3878*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(SUB_REG(VOP_DC_STRIP_H), 0, VOP_SRAM_SD_MASK);
3879*53ee8cc1Swenshuai.xi         }
3880*53ee8cc1Swenshuai.xi         break;
3881*53ee8cc1Swenshuai.xi #endif
3882*53ee8cc1Swenshuai.xi     default:
3883*53ee8cc1Swenshuai.xi         break;
3884*53ee8cc1Swenshuai.xi     }
3885*53ee8cc1Swenshuai.xi     return;
3886*53ee8cc1Swenshuai.xi }
3887*53ee8cc1Swenshuai.xi 
HAL_MVOP_Exit(MVOP_DevID eID)3888*53ee8cc1Swenshuai.xi void HAL_MVOP_Exit(MVOP_DevID eID)
3889*53ee8cc1Swenshuai.xi {
3890*53ee8cc1Swenshuai.xi     switch(eID)
3891*53ee8cc1Swenshuai.xi     {
3892*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_0:
3893*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bIsInit = 0;
3894*53ee8cc1Swenshuai.xi         break;
3895*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3896*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_1:
3897*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubIsInit = 0;
3898*53ee8cc1Swenshuai.xi         break;
3899*53ee8cc1Swenshuai.xi #endif
3900*53ee8cc1Swenshuai.xi     default:
3901*53ee8cc1Swenshuai.xi         break;
3902*53ee8cc1Swenshuai.xi     }
3903*53ee8cc1Swenshuai.xi     return;
3904*53ee8cc1Swenshuai.xi }
3905*53ee8cc1Swenshuai.xi 
HAL_MVOP_UVSwapEnable(MVOP_DevID eID,MS_BOOL bEnable)3906*53ee8cc1Swenshuai.xi void HAL_MVOP_UVSwapEnable(MVOP_DevID eID, MS_BOOL bEnable)
3907*53ee8cc1Swenshuai.xi {
3908*53ee8cc1Swenshuai.xi     switch(eID)
3909*53ee8cc1Swenshuai.xi     {
3910*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_0:
3911*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_TST_IMG, bEnable, VOP_UV_SWAP);
3912*53ee8cc1Swenshuai.xi         break;
3913*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3914*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_1:
3915*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_TST_IMG), bEnable, VOP_UV_SWAP);
3916*53ee8cc1Swenshuai.xi         break;
3917*53ee8cc1Swenshuai.xi #endif
3918*53ee8cc1Swenshuai.xi     default:
3919*53ee8cc1Swenshuai.xi         break;
3920*53ee8cc1Swenshuai.xi     }
3921*53ee8cc1Swenshuai.xi     return;
3922*53ee8cc1Swenshuai.xi }
3923*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetECONumber(MS_U16 u16ECOVersion)3924*53ee8cc1Swenshuai.xi void HAL_MVOP_SetECONumber(MS_U16 u16ECOVersion)
3925*53ee8cc1Swenshuai.xi {
3926*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
3927*53ee8cc1Swenshuai.xi     {
3928*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
3929*53ee8cc1Swenshuai.xi         return;
3930*53ee8cc1Swenshuai.xi     }
3931*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16ECONum = u16ECOVersion;
3932*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF("[%s] version num = %d\n",__FUNCTION__);)
3933*53ee8cc1Swenshuai.xi }
3934*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetMFDECInfo(MVOP_DevID eID,HALMVOPMFDECINFO * pMFDECInfo)3935*53ee8cc1Swenshuai.xi void HAL_MVOP_SetMFDECInfo(MVOP_DevID eID, HALMVOPMFDECINFO *pMFDECInfo)
3936*53ee8cc1Swenshuai.xi {
3937*53ee8cc1Swenshuai.xi     MS_PHY u64tmp = 0;
3938*53ee8cc1Swenshuai.xi     MS_U16 u16Hszie, u16Vsize;
3939*53ee8cc1Swenshuai.xi 
3940*53ee8cc1Swenshuai.xi     switch(eID)
3941*53ee8cc1Swenshuai.xi     {
3942*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
3943*53ee8cc1Swenshuai.xi         {
3944*53ee8cc1Swenshuai.xi             #if 1
3945*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->bIsMCUMfdec = pMFDECInfo->bMFDEC_EN;
3946*53ee8cc1Swenshuai.xi             if(pMFDECInfo->bMFDEC_EN)
3947*53ee8cc1Swenshuai.xi             {
3948*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_REG_MFDEC_0_L, TRUE, VOP_MFDEC_EN); // enable mfdec
3949*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(REG_MF_BASIC_L, TRUE, MF_MFDEC_EN); // enable mfdec
3950*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(REG_MF_BASIC_H, 0x30, (MF_RIU_MODE|MF_RIU1_MODE));
3951*53ee8cc1Swenshuai.xi 
3952*53ee8cc1Swenshuai.xi                 u16Hszie = HAL_Read2Byte(VOP_JPG_HSIZE);
3953*53ee8cc1Swenshuai.xi                 u16Vsize = HAL_Read2Byte(VOP_JPG_VSIZE);
3954*53ee8cc1Swenshuai.xi                 if(pMFDECInfo->u8MFDEC_ID >= HAL_MFDEC_MODULE_CNT)
3955*53ee8cc1Swenshuai.xi                 {
3956*53ee8cc1Swenshuai.xi                     MVOP_PRINTF("[MVOP][ERR] not support mfdec id: %d\n",pMFDECInfo->u8MFDEC_ID);
3957*53ee8cc1Swenshuai.xi                 }
3958*53ee8cc1Swenshuai.xi                 else
3959*53ee8cc1Swenshuai.xi                 {
3960*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(VOP_REG_MFDEC_0_L, pMFDECInfo->u8MFDEC_ID, VOP_MFDEC_SEL); //select 0/1 mfdec
3961*53ee8cc1Swenshuai.xi                 }
3962*53ee8cc1Swenshuai.xi                 HAL_MVOP_LOAD_MFDEC_TABLE(pMFDECInfo->u8MFDEC_ID);//k6 mcu mode need to use 0x1122 bank
3963*53ee8cc1Swenshuai.xi                 u64tmp = pMFDECInfo->u32BITLEN_FB_ADDR >> 3;
3964*53ee8cc1Swenshuai.xi #if 0
3965*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(VOP_REG_MFDEC_2_L, (pMFDECInfo->u32UNCOMPRESS_MODE << 4), VOP_UNCOMP_MODE);
3966*53ee8cc1Swenshuai.xi                 HAL_Write2Byte(VOP_REG_BITLEN_ADD_L, u64tmp & 0xffff);
3967*53ee8cc1Swenshuai.xi                 HAL_Write2Byte(VOP_REG_BITLEN_ADD_H, (u64tmp >> 16) & 0x3ff);
3968*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(VOP_REG_MFDEC_2_L, (pMFDECInfo->u8BITLEN_FB_MIU << 2), VOP_BIT_MIU_SEL);
3969*53ee8cc1Swenshuai.xi                 HAL_WriteByte(VOP_REG_MFDEC_BIT_PITCH, pMFDECInfo->u32BITLEN_FB_PITCH);
3970*53ee8cc1Swenshuai.xi #endif
3971*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(REG_MF_BASIC_L, (pMFDECInfo->u32UNCOMPRESS_MODE << 5), MF_UNCOMP_MODE);
3972*53ee8cc1Swenshuai.xi                 HAL_Write2Byte(REG_MF_BT_ADDR_L, u64tmp & 0xffff);
3973*53ee8cc1Swenshuai.xi                 HAL_Write2Byte(REG_MF_BT_ADDR_H, (u64tmp >> 16) & 0x3ff);
3974*53ee8cc1Swenshuai.xi                 HAL_Write2Byte(REG_MF_FB_WIDTH, u16Hszie>>4);
3975*53ee8cc1Swenshuai.xi                 HAL_Write2Byte(REG_MF_FB_HEIGHT, u16Vsize);
3976*53ee8cc1Swenshuai.xi                 HAL_Write2Byte(REG_MF_FB_PITCH, u16Hszie>>3);
3977*53ee8cc1Swenshuai.xi 
3978*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(REG_MF_MIU, (pMFDECInfo->u8BITLEN_FB_MIU << 4), MF_BITLEN_MIU);
3979*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(REG_MF_MIU, g_pHalMVOPCtx->u8LumaMIU, MF_LUMA_MIU);
3980*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(REG_MF_MIU, g_pHalMVOPCtx->u8ChromaMIU<<2, MF_CHROMA_MIU);
3981*53ee8cc1Swenshuai.xi                 HAL_WriteByte(REG_MF_BT_PITCH, pMFDECInfo->u32BITLEN_FB_PITCH);
3982*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_REG_MFDEC_5E, pMFDECInfo->bBITLEN_SHT_8, VOP_BITLEN_SHT);
3983*53ee8cc1Swenshuai.xi             }
3984*53ee8cc1Swenshuai.xi             else
3985*53ee8cc1Swenshuai.xi             {
3986*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_REG_MFDEC_0_L, FALSE, VOP_MFDEC_EN); // disable mfdec
3987*53ee8cc1Swenshuai.xi             }
3988*53ee8cc1Swenshuai.xi             #endif
3989*53ee8cc1Swenshuai.xi             HAL_MVOP_LoadReg();
3990*53ee8cc1Swenshuai.xi         }
3991*53ee8cc1Swenshuai.xi         break;
3992*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3993*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
3994*53ee8cc1Swenshuai.xi         {
3995*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->bSubIsMCUMfdec = pMFDECInfo->bMFDEC_EN;
3996*53ee8cc1Swenshuai.xi             if(pMFDECInfo->bMFDEC_EN)
3997*53ee8cc1Swenshuai.xi             {
3998*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_REG_MFDEC_0_L), TRUE, VOP_MFDEC_EN); // enable mfdec
3999*53ee8cc1Swenshuai.xi                 if(pMFDECInfo->u8MFDEC_ID >= HAL_MFDEC_MODULE_CNT)
4000*53ee8cc1Swenshuai.xi                 {
4001*53ee8cc1Swenshuai.xi                     MVOP_PRINTF("[MVOP][ERR] not support mfdec id: %d\n",pMFDECInfo->u8MFDEC_ID);
4002*53ee8cc1Swenshuai.xi                 }
4003*53ee8cc1Swenshuai.xi                 else
4004*53ee8cc1Swenshuai.xi                 {
4005*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(SUB_REG(VOP_REG_MFDEC_0_L), pMFDECInfo->u8MFDEC_ID, VOP_MFDEC_SEL); //select 0/1 mfdec
4006*53ee8cc1Swenshuai.xi                 }
4007*53ee8cc1Swenshuai.xi                 u64tmp = pMFDECInfo->u32BITLEN_FB_ADDR >> 3;
4008*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(SUB_REG(VOP_REG_MFDEC_2_L), (pMFDECInfo->u32UNCOMPRESS_MODE << 4), VOP_UNCOMP_MODE);
4009*53ee8cc1Swenshuai.xi                 HAL_Write2Byte(SUB_REG(VOP_REG_BITLEN_ADD_L), u64tmp);
4010*53ee8cc1Swenshuai.xi                 HAL_Write2Byte(SUB_REG(VOP_REG_BITLEN_ADD_H), u64tmp >> 16);
4011*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(SUB_REG(VOP_REG_MFDEC_2_L), (pMFDECInfo->u8BITLEN_FB_MIU << 2), VOP_BIT_MIU_SEL);
4012*53ee8cc1Swenshuai.xi                 HAL_WriteByte(SUB_REG(VOP_REG_MFDEC_BIT_PITCH), pMFDECInfo->u32BITLEN_FB_PITCH);
4013*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_REG_MFDEC_5E), pMFDECInfo->bBITLEN_SHT_8, VOP_BITLEN_SHT);
4014*53ee8cc1Swenshuai.xi             }
4015*53ee8cc1Swenshuai.xi             else
4016*53ee8cc1Swenshuai.xi             {
4017*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_REG_MFDEC_0_L), FALSE, VOP_MFDEC_EN); // disable mfdec
4018*53ee8cc1Swenshuai.xi             }
4019*53ee8cc1Swenshuai.xi             HAL_MVOP_SubLoadReg();
4020*53ee8cc1Swenshuai.xi         }
4021*53ee8cc1Swenshuai.xi         break;
4022*53ee8cc1Swenshuai.xi #endif
4023*53ee8cc1Swenshuai.xi         default:
4024*53ee8cc1Swenshuai.xi             break;
4025*53ee8cc1Swenshuai.xi     }
4026*53ee8cc1Swenshuai.xi     return;
4027*53ee8cc1Swenshuai.xi }
4028*53ee8cc1Swenshuai.xi MS_U16 MFDec_HUFF_Table[MFEDC_TABLE_INDEX_NUM][4] =
4029*53ee8cc1Swenshuai.xi {
4030*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8080},
4031*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0101,0x8081},
4032*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8082},
4033*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8083},
4034*53ee8cc1Swenshuai.xi     {0x0002,0x0002,0x0101,0x8180},
4035*53ee8cc1Swenshuai.xi     {0x0002,0x0002,0x0000,0x8181},
4036*53ee8cc1Swenshuai.xi     {0x0000,0x0002,0x0200,0x8182},
4037*53ee8cc1Swenshuai.xi     {0x0000,0x0001,0x0100,0x8183},
4038*53ee8cc1Swenshuai.xi     {0x0006,0x0007,0x0302,0x8280},
4039*53ee8cc1Swenshuai.xi     {0x0006,0x0006,0x0202,0x8281},
4040*53ee8cc1Swenshuai.xi     {0x0006,0x0006,0x0303,0x8282},
4041*53ee8cc1Swenshuai.xi     {0x0004,0x0005,0x0302,0x8283},
4042*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8380},
4043*53ee8cc1Swenshuai.xi     {0x000E,0x000E,0x0303,0x8381},
4044*53ee8cc1Swenshuai.xi     {0x000E,0x000E,0x0404,0x8382},
4045*53ee8cc1Swenshuai.xi     {0x000C,0x000D,0x0504,0x8383},
4046*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8480},
4047*53ee8cc1Swenshuai.xi     {0x001E,0x001E,0x0404,0x8481},
4048*53ee8cc1Swenshuai.xi     {0x001E,0x001E,0x0505,0x8482},
4049*53ee8cc1Swenshuai.xi     {0x001C,0x001D,0x0706,0x8483},
4050*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8580},
4051*53ee8cc1Swenshuai.xi     {0x003E,0x003E,0x0505,0x8581},
4052*53ee8cc1Swenshuai.xi     {0x003E,0x003E,0x0606,0x8582},
4053*53ee8cc1Swenshuai.xi     {0x003C,0x003D,0x0908,0x8583},
4054*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8680},
4055*53ee8cc1Swenshuai.xi     {0x007E,0x007F,0x0706,0x8681},
4056*53ee8cc1Swenshuai.xi     {0x007E,0x007E,0x0707,0x8682},
4057*53ee8cc1Swenshuai.xi     {0x007C,0x007D,0x0B0A,0x8683},
4058*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8780},
4059*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8781},
4060*53ee8cc1Swenshuai.xi     {0x00FE,0x00FE,0x0808,0x8782},
4061*53ee8cc1Swenshuai.xi     {0x00FC,0x00FD,0x0D0C,0x8783},
4062*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8880},
4063*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8881},
4064*53ee8cc1Swenshuai.xi     {0x01FE,0x01FE,0x0909,0x8882},
4065*53ee8cc1Swenshuai.xi     {0x01FC,0x01FD,0x0F0E,0x8883},
4066*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8980},
4067*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8981},
4068*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0D00,0x8982},
4069*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8983},
4070*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8A80},
4071*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8A81},
4072*53ee8cc1Swenshuai.xi     {0x07FC,0x07FD,0x0B0A,0x8A82},
4073*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8A83},
4074*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8B80},
4075*53ee8cc1Swenshuai.xi     {0x0000,0x0000,0x0000,0x8B81},
4076*53ee8cc1Swenshuai.xi     {0x0FFC,0x0FFF,0x0F0C,0x8B82},
4077*53ee8cc1Swenshuai.xi     {0x0FF0,0x0FFF,0x1F10,0x8B83},
4078*53ee8cc1Swenshuai.xi };
HAL_MVOP_LOAD_MFDEC_TABLE(MS_U8 mfdec_id)4079*53ee8cc1Swenshuai.xi void HAL_MVOP_LOAD_MFDEC_TABLE(MS_U8 mfdec_id)
4080*53ee8cc1Swenshuai.xi {
4081*53ee8cc1Swenshuai.xi     MS_U8 u8index=0;
4082*53ee8cc1Swenshuai.xi 
4083*53ee8cc1Swenshuai.xi     //MVOP_PRINTF("[apple] HAL_MVOP_LOAD_MFDEC_TABLE\n");
4084*53ee8cc1Swenshuai.xi 
4085*53ee8cc1Swenshuai.xi     //HAL_Write2ByteMask(REG_MF_BASIC_H, 0x3000 , BMASK(15:0));
4086*53ee8cc1Swenshuai.xi     HAL_Write2ByteMask(REG_MF_CW_LEN2(mfdec_id), 0x0007 , BMASK(11:0));
4087*53ee8cc1Swenshuai.xi     HAL_Write2ByteMask(REG_MF_CW_LEN3(mfdec_id), 0x007F , BMASK(11:0));
4088*53ee8cc1Swenshuai.xi     HAL_Write2ByteMask(REG_MF_CW_LEN4(mfdec_id), 0x0DFE , BMASK(11:0));
4089*53ee8cc1Swenshuai.xi     HAL_Write2ByteMask(REG_MF_CW_LEN5(mfdec_id), 0x09FE , BMASK(11:0));
4090*53ee8cc1Swenshuai.xi 
4091*53ee8cc1Swenshuai.xi     for (u8index=0;u8index< MFEDC_TABLE_INDEX_NUM; u8index++)
4092*53ee8cc1Swenshuai.xi     {
4093*53ee8cc1Swenshuai.xi         HAL_Write2ByteMask(REG_MF_CW_BASE(mfdec_id), MFDec_HUFF_Table[u8index][0] , BMASK(15:0));
4094*53ee8cc1Swenshuai.xi         HAL_Write2ByteMask(REG_MF_CW_MAX(mfdec_id), MFDec_HUFF_Table[u8index][1] , BMASK(15:0));
4095*53ee8cc1Swenshuai.xi         HAL_Write2ByteMask(REG_MF_SYMB_BASE(mfdec_id), MFDec_HUFF_Table[u8index][2] , BMASK(15:0));
4096*53ee8cc1Swenshuai.xi         HAL_Write2ByteMask(REG_MF_HUF_TAB(mfdec_id), MFDec_HUFF_Table[u8index][3] , BMASK(15:0));
4097*53ee8cc1Swenshuai.xi     }
4098*53ee8cc1Swenshuai.xi     //HAL_Write2ByteMask(REG_MF_BASIC_H, 0x0000 , BMASK(15:0));
4099*53ee8cc1Swenshuai.xi }
4100*53ee8cc1Swenshuai.xi 
4101*53ee8cc1Swenshuai.xi ///////////////////////   Sub MVOP   ////////////////////////
4102*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
HAL_MVOP_SubRegSetBase(MS_VIRT u32Base)4103*53ee8cc1Swenshuai.xi void HAL_MVOP_SubRegSetBase(MS_VIRT u32Base)
4104*53ee8cc1Swenshuai.xi {
4105*53ee8cc1Swenshuai.xi     u32RiuBaseAdd = u32Base;
4106*53ee8cc1Swenshuai.xi }
4107*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubInitMirrorMode(MS_BOOL bMir)4108*53ee8cc1Swenshuai.xi void HAL_MVOP_SubInitMirrorMode(MS_BOOL bMir)
4109*53ee8cc1Swenshuai.xi {
4110*53ee8cc1Swenshuai.xi     //set bit[3:7] to support mirror mode
4111*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), bMir, VOP_MIRROR_CFG_ENABLE);
4112*53ee8cc1Swenshuai.xi }
4113*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubInit(void)4114*53ee8cc1Swenshuai.xi void HAL_MVOP_SubInit(void)
4115*53ee8cc1Swenshuai.xi {
4116*53ee8cc1Swenshuai.xi     MVOP_HalInitCtxResults eRet;
4117*53ee8cc1Swenshuai.xi     MS_BOOL pbFirstDrvInstant;
4118*53ee8cc1Swenshuai.xi 
4119*53ee8cc1Swenshuai.xi     eRet = _HAL_MVOP_InitContext(&pbFirstDrvInstant);
4120*53ee8cc1Swenshuai.xi     if(eRet == E_MVOP_INIT_FAIL)
4121*53ee8cc1Swenshuai.xi     {
4122*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("[%s] MVOP Context Init failed!\n",__FUNCTION__);)
4123*53ee8cc1Swenshuai.xi         return;
4124*53ee8cc1Swenshuai.xi     }
4125*53ee8cc1Swenshuai.xi     else if(eRet == E_MVOP_INIT_ALREADY_EXIST)
4126*53ee8cc1Swenshuai.xi     {
4127*53ee8cc1Swenshuai.xi          if(g_pHalMVOPCtx->bSubIsInit)
4128*53ee8cc1Swenshuai.xi         {
4129*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("[%s] Sub MVOP Context has Initialized!\n",__FUNCTION__);)
4130*53ee8cc1Swenshuai.xi             return;
4131*53ee8cc1Swenshuai.xi         }
4132*53ee8cc1Swenshuai.xi     }
4133*53ee8cc1Swenshuai.xi     HAL_MVOP_SubInitMirrorMode(TRUE);
4134*53ee8cc1Swenshuai.xi     //Enable dynamic clock gating
4135*53ee8cc1Swenshuai.xi     //Note: cannot enable VOP_GCLK_VCLK_ON, or hsync cannot be sent out.
4136*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_GCLK), VOP_GCLK_MIU_ON, VOP_GCLK_MIU_ON|VOP_GCLK_VCLK_ON);
4137*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsInit = 1;
4138*53ee8cc1Swenshuai.xi }
4139*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetVerticalMirrorMode(MS_BOOL bEnable)4140*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetVerticalMirrorMode(MS_BOOL bEnable)
4141*53ee8cc1Swenshuai.xi {
4142*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
4143*53ee8cc1Swenshuai.xi     {
4144*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
4145*53ee8cc1Swenshuai.xi         return;
4146*53ee8cc1Swenshuai.xi     }
4147*53ee8cc1Swenshuai.xi     if (VOP_MIRROR_CFG_ENABLE != HAL_ReadRegBit(SUB_REG(VOP_MIRROR_CFG), VOP_MIRROR_CFG_ENABLE))
4148*53ee8cc1Swenshuai.xi     {
4149*53ee8cc1Swenshuai.xi         //MVOP_PRINTF("Setup mirror mode\n");
4150*53ee8cc1Swenshuai.xi         HAL_MVOP_SubInitMirrorMode(TRUE);
4151*53ee8cc1Swenshuai.xi     }
4152*53ee8cc1Swenshuai.xi 
4153*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), bEnable, VOP_MIRROR_CFG_VEN);
4154*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubMirrorModeVer = bEnable;
4155*53ee8cc1Swenshuai.xi }
4156*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetHorizontallMirrorMode(MS_BOOL bEnable)4157*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetHorizontallMirrorMode(MS_BOOL bEnable)
4158*53ee8cc1Swenshuai.xi {
4159*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
4160*53ee8cc1Swenshuai.xi     {
4161*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
4162*53ee8cc1Swenshuai.xi         return;
4163*53ee8cc1Swenshuai.xi     }
4164*53ee8cc1Swenshuai.xi     if (VOP_MIRROR_CFG_ENABLE != HAL_ReadRegBit(SUB_REG(VOP_MIRROR_CFG), VOP_MIRROR_CFG_ENABLE))
4165*53ee8cc1Swenshuai.xi     {
4166*53ee8cc1Swenshuai.xi         //MVOP_PRINTF("Setup mirror mode\n");
4167*53ee8cc1Swenshuai.xi         HAL_MVOP_SubInitMirrorMode(TRUE);
4168*53ee8cc1Swenshuai.xi     }
4169*53ee8cc1Swenshuai.xi 
4170*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), bEnable, VOP_MIRROR_CFG_HEN);
4171*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubMirrorModeHor = bEnable;
4172*53ee8cc1Swenshuai.xi }
4173*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetFieldInverse(MS_BOOL b2MVD,MS_BOOL b2IP)4174*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetFieldInverse(MS_BOOL b2MVD, MS_BOOL b2IP)
4175*53ee8cc1Swenshuai.xi {
4176*53ee8cc1Swenshuai.xi     // Set fld inv & ofld_inv
4177*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_CTRL0+1), b2MVD, BIT3); //inverse the field to MVD
4178*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_CTRL0+1), b2IP, BIT4);  //inverse the field to IP
4179*53ee8cc1Swenshuai.xi }
4180*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetChromaWeighting(MS_BOOL bEnable)4181*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetChromaWeighting(MS_BOOL bEnable)
4182*53ee8cc1Swenshuai.xi {
4183*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WEIGHT_CTRL), bEnable, BIT1);
4184*53ee8cc1Swenshuai.xi }
4185*53ee8cc1Swenshuai.xi 
4186*53ee8cc1Swenshuai.xi //load new value into active registers 0x20-0x26
HAL_MVOP_SubLoadReg(void)4187*53ee8cc1Swenshuai.xi void HAL_MVOP_SubLoadReg(void)
4188*53ee8cc1Swenshuai.xi {
4189*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 1, BIT0);
4190*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 0, BIT0);
4191*53ee8cc1Swenshuai.xi 
4192*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 1, BIT4);
4193*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 0, BIT4);
4194*53ee8cc1Swenshuai.xi }
4195*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetMIUReqMask(MS_BOOL bEnable)4196*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetMIUReqMask(MS_BOOL bEnable)
4197*53ee8cc1Swenshuai.xi {
4198*53ee8cc1Swenshuai.xi #if 0
4199*53ee8cc1Swenshuai.xi     if (bEnable)
4200*53ee8cc1Swenshuai.xi     {   // mask MVOP2MI to protect MIU
4201*53ee8cc1Swenshuai.xi         HAL_MIU_SubSetReqMask(SUBMVOP_R, 1);
4202*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
4203*53ee8cc1Swenshuai.xi     }
4204*53ee8cc1Swenshuai.xi     else
4205*53ee8cc1Swenshuai.xi     {   // unmask MVOP2MI
4206*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
4207*53ee8cc1Swenshuai.xi         HAL_MIU_SubSetReqMask(SUBMVOP_R, 0);
4208*53ee8cc1Swenshuai.xi     }
4209*53ee8cc1Swenshuai.xi #endif
4210*53ee8cc1Swenshuai.xi     MS_U8 u8Miu;
4211*53ee8cc1Swenshuai.xi     if(HAL_MVOP_GetIsOnlyMiuIPControl() == TRUE)
4212*53ee8cc1Swenshuai.xi     {
4213*53ee8cc1Swenshuai.xi         // mask msb mvop
4214*53ee8cc1Swenshuai.xi         u8Miu = (HAL_ReadByte(SUB_REG(VOP_MIU_SEL)) & VOP_MSB_BUF0_MIU_SEL) >> 4;
4215*53ee8cc1Swenshuai.xi     }
4216*53ee8cc1Swenshuai.xi     else
4217*53ee8cc1Swenshuai.xi     {
4218*53ee8cc1Swenshuai.xi         u8Miu = SUBVOP_ON_MIU1;
4219*53ee8cc1Swenshuai.xi     }
4220*53ee8cc1Swenshuai.xi     eMIUClientID eClientID = MIU_CLIENT_MVOP1_R;
4221*53ee8cc1Swenshuai.xi     //MVOP_PRINTF("Enter %s bEnable=%x ReqMask=0x%x, 0x%x, u8Miu=%x\n", __FUNCTION__, bEnable,
4222*53ee8cc1Swenshuai.xi     //    HAL_ReadByte(0x1266), HAL_ReadByte(0x0666), u8Miu);
4223*53ee8cc1Swenshuai.xi 
4224*53ee8cc1Swenshuai.xi     if (bEnable)
4225*53ee8cc1Swenshuai.xi     {   // mask MVOP2MI to protect MIU
4226*53ee8cc1Swenshuai.xi         MDrv_MIU_MaskReq(u8Miu, eClientID);
4227*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
4228*53ee8cc1Swenshuai.xi     }
4229*53ee8cc1Swenshuai.xi     else
4230*53ee8cc1Swenshuai.xi     {   // unmask MVOP2MI
4231*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
4232*53ee8cc1Swenshuai.xi         MDrv_MIU_UnMaskReq(u8Miu, eClientID);
4233*53ee8cc1Swenshuai.xi     }
4234*53ee8cc1Swenshuai.xi 
4235*53ee8cc1Swenshuai.xi     //MVOP_PRINTF(">Exit %s bEnable=%x ReqMask=0x%x, 0x%x, u8Miu=%x\n", __FUNCTION__, bEnable,
4236*53ee8cc1Swenshuai.xi     //    HAL_ReadByte(0x1266), HAL_ReadByte(0x0666), u8Miu);
4237*53ee8cc1Swenshuai.xi }
4238*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubRst(void)4239*53ee8cc1Swenshuai.xi void HAL_MVOP_SubRst(void)
4240*53ee8cc1Swenshuai.xi {
4241*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_CTRL0), 0, BIT0);
4242*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_CTRL0), 1, BIT0);
4243*53ee8cc1Swenshuai.xi 
4244*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_CTRL0), 0, BIT4);
4245*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_CTRL0), 1, BIT4);
4246*53ee8cc1Swenshuai.xi 
4247*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsSubEnable = 1;
4248*53ee8cc1Swenshuai.xi }
4249*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubEnable(MS_BOOL bEnable,MS_U8 u8Framerate)4250*53ee8cc1Swenshuai.xi void HAL_MVOP_SubEnable(MS_BOOL bEnable, MS_U8 u8Framerate)
4251*53ee8cc1Swenshuai.xi {
4252*53ee8cc1Swenshuai.xi     MS_U8 regval;
4253*53ee8cc1Swenshuai.xi 
4254*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(SUB_REG(VOP_CTRL0));
4255*53ee8cc1Swenshuai.xi 
4256*53ee8cc1Swenshuai.xi     if ( bEnable )
4257*53ee8cc1Swenshuai.xi     {
4258*53ee8cc1Swenshuai.xi         regval |= 0x1;
4259*53ee8cc1Swenshuai.xi     }
4260*53ee8cc1Swenshuai.xi     else
4261*53ee8cc1Swenshuai.xi     {
4262*53ee8cc1Swenshuai.xi         regval &= ~0x1;
4263*53ee8cc1Swenshuai.xi     }
4264*53ee8cc1Swenshuai.xi 
4265*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsSubEnable = bEnable;
4266*53ee8cc1Swenshuai.xi 
4267*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_CTRL0), regval);
4268*53ee8cc1Swenshuai.xi }
4269*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubGetEnableState(void)4270*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubGetEnableState(void)
4271*53ee8cc1Swenshuai.xi {
4272*53ee8cc1Swenshuai.xi     return (HAL_ReadRegBit(SUB_REG(VOP_CTRL0), BIT0));
4273*53ee8cc1Swenshuai.xi }
4274*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubGetMaxFreerunClk()4275*53ee8cc1Swenshuai.xi HALMVOPFREQUENCY HAL_MVOP_SubGetMaxFreerunClk()
4276*53ee8cc1Swenshuai.xi {
4277*53ee8cc1Swenshuai.xi     return HALMVOP_160MHZ;
4278*53ee8cc1Swenshuai.xi }
4279*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubGet4k2kClk()4280*53ee8cc1Swenshuai.xi HALMVOPFREQUENCY HAL_MVOP_SubGet4k2kClk()
4281*53ee8cc1Swenshuai.xi {
4282*53ee8cc1Swenshuai.xi     return HALMVOP_320MHZ;
4283*53ee8cc1Swenshuai.xi }
4284*53ee8cc1Swenshuai.xi 
4285*53ee8cc1Swenshuai.xi //FIXME
HAL_MVOP_SubSetFrequency(HALMVOPFREQUENCY enFrequency)4286*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetFrequency(HALMVOPFREQUENCY enFrequency)
4287*53ee8cc1Swenshuai.xi {
4288*53ee8cc1Swenshuai.xi     // clear
4289*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(REG_CKG_SUB_DC0, 0, CKG_SUB_DC0_MASK);
4290*53ee8cc1Swenshuai.xi     switch(enFrequency)
4291*53ee8cc1Swenshuai.xi     {
4292*53ee8cc1Swenshuai.xi         case HALMVOP_SYNCMODE:
4293*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_SUB_DC0, CKG_SUB_DC0_SYNCHRONOUS, CKG_SUB_DC0_MASK);
4294*53ee8cc1Swenshuai.xi             break;
4295*53ee8cc1Swenshuai.xi         case HALMVOP_FREERUNMODE:
4296*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_SUB_DC0, CKG_SUB_DC0_FREERUN, CKG_SUB_DC0_MASK);
4297*53ee8cc1Swenshuai.xi             break;
4298*53ee8cc1Swenshuai.xi         case HALMVOP_320MHZ:
4299*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_SUB_DC0, CKG_SUB_DC0_320MHZ, CKG_SUB_DC0_MASK);
4300*53ee8cc1Swenshuai.xi             break;
4301*53ee8cc1Swenshuai.xi         case HALMVOP_108MHZ:
4302*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_SUB_DC0, CKG_SUB_DC0_108MHZ, CKG_SUB_DC0_MASK);
4303*53ee8cc1Swenshuai.xi             break;
4304*53ee8cc1Swenshuai.xi         case HALMVOP_123MHZ:
4305*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_SUB_DC0, CKG_SUB_DC0_123MHZ, CKG_SUB_DC0_MASK);
4306*53ee8cc1Swenshuai.xi             break;
4307*53ee8cc1Swenshuai.xi         case HALMVOP_144MHZ:
4308*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_SUB_DC0, CKG_SUB_DC0_144MHZ, CKG_SUB_DC0_MASK);
4309*53ee8cc1Swenshuai.xi             break;
4310*53ee8cc1Swenshuai.xi         case HALMVOP_160MHZ:
4311*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_SUB_DC0, CKG_SUB_DC0_160MHZ, CKG_SUB_DC0_MASK);
4312*53ee8cc1Swenshuai.xi             break;
4313*53ee8cc1Swenshuai.xi         case HALMVOP_192MHZ:
4314*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_SUB_DC0, CKG_SUB_DC0_192MHZ, CKG_SUB_DC0_MASK);
4315*53ee8cc1Swenshuai.xi             break;
4316*53ee8cc1Swenshuai.xi         default:
4317*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_SUB_DC0, CKG_SUB_DC0_160MHZ, CKG_SUB_DC0_MASK);
4318*53ee8cc1Swenshuai.xi             MVOP_PRINTF("Attention! In HAL_MVOP_SetFrequency default 160MHz!\n");
4319*53ee8cc1Swenshuai.xi             break;
4320*53ee8cc1Swenshuai.xi     }
4321*53ee8cc1Swenshuai.xi }
4322*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetOutputInterlace(MS_BOOL bEnable,MS_U16 u16ECOVersion)4323*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetOutputInterlace(MS_BOOL bEnable, MS_U16 u16ECOVersion)
4324*53ee8cc1Swenshuai.xi {
4325*53ee8cc1Swenshuai.xi     MS_U8 regval;
4326*53ee8cc1Swenshuai.xi 
4327*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(SUB_REG(VOP_CTRL0));
4328*53ee8cc1Swenshuai.xi 
4329*53ee8cc1Swenshuai.xi     if ( bEnable )
4330*53ee8cc1Swenshuai.xi     {
4331*53ee8cc1Swenshuai.xi         regval |= 0x80;
4332*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_BW_SAVE), 0, VOP_420_BW_SAVE_EX);
4333*53ee8cc1Swenshuai.xi         if(u16ECOVersion == 0)
4334*53ee8cc1Swenshuai.xi         {
4335*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC_SRAM, 0x40, CKG_DC1_SRAM);//Dc0 enable & dc0_mfdec_en =0  57[3:0]= 0x4, others  57[3:0]=0x0
4336*53ee8cc1Swenshuai.xi         }
4337*53ee8cc1Swenshuai.xi     }
4338*53ee8cc1Swenshuai.xi     else
4339*53ee8cc1Swenshuai.xi     {
4340*53ee8cc1Swenshuai.xi         regval &= ~0x80;
4341*53ee8cc1Swenshuai.xi     }
4342*53ee8cc1Swenshuai.xi 
4343*53ee8cc1Swenshuai.xi     //Kano patch for GOP
4344*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_TST_IMG), bEnable, VOP_SC_VS_INV);
4345*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_CTRL0), regval);
4346*53ee8cc1Swenshuai.xi }
4347*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetPattern(MVOP_Pattern enMVOPPattern)4348*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetPattern(MVOP_Pattern enMVOPPattern)
4349*53ee8cc1Swenshuai.xi {
4350*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_TST_IMG), enMVOPPattern, BIT2 | BIT1 | BIT0);
4351*53ee8cc1Swenshuai.xi }
4352*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetTileFormat(MVOP_TileFormat eTileFmt)4353*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubSetTileFormat(MVOP_TileFormat eTileFmt)
4354*53ee8cc1Swenshuai.xi {
4355*53ee8cc1Swenshuai.xi     if (eTileFmt == E_MVOP_TILE_8x32)
4356*53ee8cc1Swenshuai.xi     {
4357*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 0, BIT1);
4358*53ee8cc1Swenshuai.xi         return TRUE;
4359*53ee8cc1Swenshuai.xi     }
4360*53ee8cc1Swenshuai.xi     else if (eTileFmt == E_MVOP_TILE_16x32)
4361*53ee8cc1Swenshuai.xi     {
4362*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 1, BIT1);
4363*53ee8cc1Swenshuai.xi         return TRUE;
4364*53ee8cc1Swenshuai.xi     }
4365*53ee8cc1Swenshuai.xi     else if (eTileFmt == E_MVOP_TILE_32x16)
4366*53ee8cc1Swenshuai.xi     {
4367*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 0, BIT1);
4368*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 1, EVD_ENABLE);
4369*53ee8cc1Swenshuai.xi         return TRUE;
4370*53ee8cc1Swenshuai.xi     }
4371*53ee8cc1Swenshuai.xi     else if (eTileFmt == E_MVOP_TILE_32x32)
4372*53ee8cc1Swenshuai.xi     {
4373*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 0, BIT1);
4374*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 0, EVD_ENABLE);
4375*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 1, VOP_TILE_32x32);
4376*53ee8cc1Swenshuai.xi         return TRUE;
4377*53ee8cc1Swenshuai.xi     }
4378*53ee8cc1Swenshuai.xi     else
4379*53ee8cc1Swenshuai.xi     {
4380*53ee8cc1Swenshuai.xi         return FALSE;
4381*53ee8cc1Swenshuai.xi     }
4382*53ee8cc1Swenshuai.xi }
4383*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetRgbFormat(MVOP_RgbFormat eRgbFmt)4384*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubSetRgbFormat(MVOP_RgbFormat eRgbFmt)
4385*53ee8cc1Swenshuai.xi {
4386*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
4387*53ee8cc1Swenshuai.xi 
4388*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
4389*53ee8cc1Swenshuai.xi     {
4390*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
4391*53ee8cc1Swenshuai.xi         return FALSE;
4392*53ee8cc1Swenshuai.xi     }
4393*53ee8cc1Swenshuai.xi     if (eRgbFmt == E_MVOP_RGB_NONE)
4394*53ee8cc1Swenshuai.xi     {
4395*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_RGB_FMT), 0, VOP_RGB_FMT_SEL);
4396*53ee8cc1Swenshuai.xi         bRet = TRUE;
4397*53ee8cc1Swenshuai.xi     }
4398*53ee8cc1Swenshuai.xi     else if (eRgbFmt == E_MVOP_RGB_565)
4399*53ee8cc1Swenshuai.xi     {
4400*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_RGB_FMT), VOP_RGB_FMT_565, VOP_RGB_FMT_SEL);
4401*53ee8cc1Swenshuai.xi         bRet = TRUE;
4402*53ee8cc1Swenshuai.xi     }
4403*53ee8cc1Swenshuai.xi     else if (eRgbFmt == E_MVOP_RGB_888)
4404*53ee8cc1Swenshuai.xi     {
4405*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_RGB_FMT), VOP_RGB_FMT_888, VOP_RGB_FMT_SEL);
4406*53ee8cc1Swenshuai.xi         bRet = TRUE;
4407*53ee8cc1Swenshuai.xi     }
4408*53ee8cc1Swenshuai.xi 
4409*53ee8cc1Swenshuai.xi     if (bRet == TRUE)
4410*53ee8cc1Swenshuai.xi     {
4411*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->eSubRgbFmt = eRgbFmt;
4412*53ee8cc1Swenshuai.xi     }
4413*53ee8cc1Swenshuai.xi     return bRet;
4414*53ee8cc1Swenshuai.xi }
4415*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetBlackBG(void)4416*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetBlackBG(void)
4417*53ee8cc1Swenshuai.xi {
4418*53ee8cc1Swenshuai.xi     MS_U8 regval;
4419*53ee8cc1Swenshuai.xi 
4420*53ee8cc1Swenshuai.xi     //set MVOP test pattern to black
4421*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TST_IMG + 1), 0x10);
4422*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_U_PAT      ), 0x80);
4423*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_U_PAT   + 1), 0x80);
4424*53ee8cc1Swenshuai.xi 
4425*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(SUB_REG(VOP_TST_IMG));
4426*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_TST_IMG), 0x02, BIT2 | BIT1 | BIT0);
4427*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_TST_IMG), 0x00, BIT2 | BIT1 | BIT0);
4428*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_TST_IMG), regval, BIT2 | BIT1 | BIT0);
4429*53ee8cc1Swenshuai.xi }
4430*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetCropWindow(MVOP_InputCfg * pparam)4431*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetCropWindow(MVOP_InputCfg *pparam)
4432*53ee8cc1Swenshuai.xi {
4433*53ee8cc1Swenshuai.xi #if 1
4434*53ee8cc1Swenshuai.xi     UNUSED(pparam);
4435*53ee8cc1Swenshuai.xi #else // enable it when test code is ready
4436*53ee8cc1Swenshuai.xi     MS_U32 x, y;
4437*53ee8cc1Swenshuai.xi     MS_U32 u32offset;
4438*53ee8cc1Swenshuai.xi 
4439*53ee8cc1Swenshuai.xi     if(!pparam)
4440*53ee8cc1Swenshuai.xi     {
4441*53ee8cc1Swenshuai.xi         return;
4442*53ee8cc1Swenshuai.xi     }
4443*53ee8cc1Swenshuai.xi     //set MVOP test pattern to black
4444*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetBlackBG();
4445*53ee8cc1Swenshuai.xi #if 0
4446*53ee8cc1Swenshuai.xi     if((pparam->enVideoType == MVOP_H264) && (pparam->u16StripSize == 1920))
4447*53ee8cc1Swenshuai.xi     {
4448*53ee8cc1Swenshuai.xi         pparam->u16StripSize = 1952;
4449*53ee8cc1Swenshuai.xi     }
4450*53ee8cc1Swenshuai.xi #endif
4451*53ee8cc1Swenshuai.xi     if((pparam->enVideoType == MVOP_MPG) || (pparam->enVideoType == MVOP_MPEG4))
4452*53ee8cc1Swenshuai.xi     {
4453*53ee8cc1Swenshuai.xi         pparam->u16CropX = (pparam->u16CropX >> 3) << 3; // 8 bytes align
4454*53ee8cc1Swenshuai.xi         pparam->u16CropY = (pparam->u16CropY >> 6) << 6; // 64 bytes align
4455*53ee8cc1Swenshuai.xi     }
4456*53ee8cc1Swenshuai.xi     else if((pparam->enVideoType == MVOP_H264) || (pparam->enVideoType == MVOP_RM))
4457*53ee8cc1Swenshuai.xi     {
4458*53ee8cc1Swenshuai.xi         pparam->u16CropX = (pparam->u16CropX >> 4) << 4; // 16 bytes align
4459*53ee8cc1Swenshuai.xi         pparam->u16CropY = (pparam->u16CropY >> 6) << 6; // 64 bytes align
4460*53ee8cc1Swenshuai.xi     }
4461*53ee8cc1Swenshuai.xi     else
4462*53ee8cc1Swenshuai.xi     {
4463*53ee8cc1Swenshuai.xi         MS_ASSERT(0);
4464*53ee8cc1Swenshuai.xi     }
4465*53ee8cc1Swenshuai.xi 
4466*53ee8cc1Swenshuai.xi     x = (MS_U32)pparam->u16CropX;
4467*53ee8cc1Swenshuai.xi     y = (MS_U32)pparam->u16CropY;
4468*53ee8cc1Swenshuai.xi 
4469*53ee8cc1Swenshuai.xi     // y offset
4470*53ee8cc1Swenshuai.xi     u32offset = ((y * pparam->u16StripSize + (x << 5)) >> 3);
4471*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_L    ), (MS_U8)(u32offset));
4472*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_L + 1), (MS_U8)(u32offset >> 8));
4473*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_H    ), (MS_U8)(u32offset >> 16));
4474*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_H + 1), (MS_U8)((u32offset >> 24) & VOP_YUV_STR_HIBITS));
4475*53ee8cc1Swenshuai.xi 
4476*53ee8cc1Swenshuai.xi     // uv offset
4477*53ee8cc1Swenshuai.xi     u32offset = ((y >> 1) * pparam->u16StripSize + (x << 5)) >> 3;
4478*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_L    ), (MS_U8)(u32offset));
4479*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_L + 1), (MS_U8)(u32offset >> 8));
4480*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_H    ), (MS_U8)(u32offset >> 16));
4481*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_H + 1), (MS_U8)((u32offset >> 24) & VOP_YUV_STR_HIBITS));
4482*53ee8cc1Swenshuai.xi 
4483*53ee8cc1Swenshuai.xi     pparam->u16CropWidth= (pparam->u16CropWidth >> 3) << 3;
4484*53ee8cc1Swenshuai.xi     // HSize, VSize
4485*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_HSIZE    ), LOWBYTE(pparam->u16CropWidth ));
4486*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_HSIZE + 1), HIGHBYTE(pparam->u16CropWidth ));
4487*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_VSIZE    ), LOWBYTE(pparam->u16CropHeight));
4488*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_VSIZE + 1), HIGHBYTE(pparam->u16CropHeight ));
4489*53ee8cc1Swenshuai.xi 
4490*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_MPG_JPG_SWITCH), BIT0, BIT1|BIT0);
4491*53ee8cc1Swenshuai.xi 
4492*53ee8cc1Swenshuai.xi     // clear extend strip len bit by default
4493*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_STRIP_ALIGN), 0, BIT0);
4494*53ee8cc1Swenshuai.xi     if((pparam->enVideoType == MVOP_MPG) || (pparam->enVideoType == MVOP_MPEG4))
4495*53ee8cc1Swenshuai.xi     {
4496*53ee8cc1Swenshuai.xi         // Disable H264 or RM Input
4497*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH), 0, BIT2|BIT3);
4498*53ee8cc1Swenshuai.xi         //8*32 tile format
4499*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 0, BIT1);
4500*53ee8cc1Swenshuai.xi     }
4501*53ee8cc1Swenshuai.xi     else if((pparam->enVideoType == MVOP_H264) || (pparam->enVideoType == MVOP_RM))
4502*53ee8cc1Swenshuai.xi     {
4503*53ee8cc1Swenshuai.xi         //16*32 tile format
4504*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 1, BIT1);
4505*53ee8cc1Swenshuai.xi         // SVD mode enable
4506*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_INPUT_SWITCH), BIT3, BIT2|BIT3);
4507*53ee8cc1Swenshuai.xi         // set mvop to 128bit_i128 interface
4508*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_MIU_IF), VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
4509*53ee8cc1Swenshuai.xi     }
4510*53ee8cc1Swenshuai.xi     HAL_MVOP_SubLoadReg();
4511*53ee8cc1Swenshuai.xi #endif
4512*53ee8cc1Swenshuai.xi }
4513*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetRepeatField(MVOP_RptFldMode eMode)4514*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetRepeatField(MVOP_RptFldMode eMode)
4515*53ee8cc1Swenshuai.xi {
4516*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
4517*53ee8cc1Swenshuai.xi     {
4518*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
4519*53ee8cc1Swenshuai.xi         return;
4520*53ee8cc1Swenshuai.xi     }
4521*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->eSubRepeatField = eMode;
4522*53ee8cc1Swenshuai.xi }
4523*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetFDMaskFromMVD(MS_BOOL bEnable)4524*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetFDMaskFromMVD(MS_BOOL bEnable)
4525*53ee8cc1Swenshuai.xi {
4526*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_FD_MASK_SEL), bEnable, BIT5); //FD MASK from MVD
4527*53ee8cc1Swenshuai.xi }
4528*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetInputMode(VOPINPUTMODE mode,MVOP_InputCfg * pparam,MS_U16 u16ECOVersion)4529*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetInputMode( VOPINPUTMODE mode, MVOP_InputCfg *pparam, MS_U16 u16ECOVersion )
4530*53ee8cc1Swenshuai.xi {
4531*53ee8cc1Swenshuai.xi     MS_U8 regval;
4532*53ee8cc1Swenshuai.xi     MS_U16 u16strip, u16strip_lsb;
4533*53ee8cc1Swenshuai.xi 
4534*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
4535*53ee8cc1Swenshuai.xi     {
4536*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
4537*53ee8cc1Swenshuai.xi         return;
4538*53ee8cc1Swenshuai.xi     }
4539*53ee8cc1Swenshuai.xi 
4540*53ee8cc1Swenshuai.xi #if 0
4541*53ee8cc1Swenshuai.xi     /*****************************************************/
4542*53ee8cc1Swenshuai.xi     // Reset MVOP setting
4543*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TST_IMG), 0x40);
4544*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetRgbFormat(E_MVOP_RGB_NONE);
4545*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_CTRL1), 0, VOP_MVD_VS_MD); //default use original vsync
4546*53ee8cc1Swenshuai.xi     // Only for Monaco: Enable deciding bot by top address + 2
4547*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), 1, VOP_FIELD_FROM_ADDR);
4548*53ee8cc1Swenshuai.xi 
4549*53ee8cc1Swenshuai.xi     //set MVOP test pattern to black
4550*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetBlackBG();
4551*53ee8cc1Swenshuai.xi 
4552*53ee8cc1Swenshuai.xi     //regval = HAL_ReadByte(SUB_REG(VOP_MPG_JPG_SWITCH);
4553*53ee8cc1Swenshuai.xi     regval = 0;
4554*53ee8cc1Swenshuai.xi     regval |= ( mode & 0x3 );
4555*53ee8cc1Swenshuai.xi 
4556*53ee8cc1Swenshuai.xi     // clear extend strip len bit by default
4557*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_STRIP_ALIGN), 0, BIT0);
4558*53ee8cc1Swenshuai.xi 
4559*53ee8cc1Swenshuai.xi     // set mvop to 128bit_i128 interface
4560*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_MIU_IF), VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
4561*53ee8cc1Swenshuai.xi 
4562*53ee8cc1Swenshuai.xi     // Disable H264 or RM Input
4563*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH), 0, BIT2|BIT3);
4564*53ee8cc1Swenshuai.xi     //8*32 tile format
4565*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 0, BIT1);
4566*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG_HI), 0, VOP_REF_SELF_FLD);
4567*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetFieldInverse(ENABLE, ENABLE);
4568*53ee8cc1Swenshuai.xi #endif
4569*53ee8cc1Swenshuai.xi     regval = 0;
4570*53ee8cc1Swenshuai.xi     regval |= ( mode & 0x3 );
4571*53ee8cc1Swenshuai.xi 
4572*53ee8cc1Swenshuai.xi     if ( mode == VOPINPUT_HARDWIRE )
4573*53ee8cc1Swenshuai.xi     {
4574*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_MPG_JPG_SWITCH), regval);
4575*53ee8cc1Swenshuai.xi     }
4576*53ee8cc1Swenshuai.xi     else if ( mode == VOPINPUT_HARDWIRECLIP )
4577*53ee8cc1Swenshuai.xi     {
4578*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_MPG_JPG_SWITCH), regval);
4579*53ee8cc1Swenshuai.xi 
4580*53ee8cc1Swenshuai.xi         // HSize, VSize
4581*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_HSIZE    ), LOWBYTE( pparam->u16HSize ));
4582*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_HSIZE + 1), HIGHBYTE( pparam->u16HSize ));
4583*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_VSIZE    ), LOWBYTE( pparam->u16VSize ));
4584*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_VSIZE + 1), HIGHBYTE( pparam->u16VSize ));
4585*53ee8cc1Swenshuai.xi     }
4586*53ee8cc1Swenshuai.xi     else if (mode == VOPINPUT_MCUCTRL)
4587*53ee8cc1Swenshuai.xi     {
4588*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubMirrorMode = (g_pHalMVOPCtx->bSubMirrorModeVer||g_pHalMVOPCtx->bSubMirrorModeHor);
4589*53ee8cc1Swenshuai.xi         if ( pparam->bProgressive )
4590*53ee8cc1Swenshuai.xi             regval |= 0x4;
4591*53ee8cc1Swenshuai.xi         else
4592*53ee8cc1Swenshuai.xi         {
4593*53ee8cc1Swenshuai.xi             regval &= ~0x4;
4594*53ee8cc1Swenshuai.xi             regval |= 0x1;  //reg_dc_md=b'11 for interlace input
4595*53ee8cc1Swenshuai.xi             if (E_MVOP_RPTFLD_NONE == g_pHalMVOPCtx->eSubRepeatField)
4596*53ee8cc1Swenshuai.xi             {
4597*53ee8cc1Swenshuai.xi                 MVOP_DBG("%s normal NOT repeat field %x\n", __FUNCTION__, g_pHalMVOPCtx->eSubRepeatField);
4598*53ee8cc1Swenshuai.xi                 //To support mcu mode interlace, need to set h'3B[9]=1,
4599*53ee8cc1Swenshuai.xi                 //h'11[12]=0, and Y1/UV1 address equal to Y0/UV0 address.
4600*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG_HI), 1, VOP_REF_SELF_FLD);
4601*53ee8cc1Swenshuai.xi                 //HAL_MVOP_SubSetFieldInverse(ENABLE, DISABLE); //do not inverse in kano: mvop gen timing + hsk mode
4602*53ee8cc1Swenshuai.xi                 // mheg5, mcu mode for i mode, do not bypass, 0x11[6] = 0: mvop t/b toggle
4603*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_REG_DUMMY_3D_1), 0, VOP_RGB_FILED_BYPASS);
4604*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_CTRL0), 0, VOP_EXTFLD_EN);
4605*53ee8cc1Swenshuai.xi             }
4606*53ee8cc1Swenshuai.xi         }
4607*53ee8cc1Swenshuai.xi         // disable from wb
4608*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_MFDEC_2_L), 0, VOP_MF_FROM_WB);
4609*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 0, VOP_R2_WISHBONE);
4610*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_DUMMY), 0, VOP_32x32_WB);
4611*53ee8cc1Swenshuai.xi 
4612*53ee8cc1Swenshuai.xi         if ( pparam->bYUV422 )
4613*53ee8cc1Swenshuai.xi             regval |= 0x10;
4614*53ee8cc1Swenshuai.xi         else
4615*53ee8cc1Swenshuai.xi             regval &= ~0x10;
4616*53ee8cc1Swenshuai.xi 
4617*53ee8cc1Swenshuai.xi         if ( pparam->b422pack )
4618*53ee8cc1Swenshuai.xi             regval |= 0x80;
4619*53ee8cc1Swenshuai.xi 
4620*53ee8cc1Swenshuai.xi         if ( pparam->bDramRdContd == 1 )
4621*53ee8cc1Swenshuai.xi             regval |= 0x20;
4622*53ee8cc1Swenshuai.xi         else
4623*53ee8cc1Swenshuai.xi             regval &= ~0x20;
4624*53ee8cc1Swenshuai.xi 
4625*53ee8cc1Swenshuai.xi         // for backward compatable to saturn
4626*53ee8cc1Swenshuai.xi         // [3] UV-7bit mode don't care
4627*53ee8cc1Swenshuai.xi         // [5] dram_rd_md =0
4628*53ee8cc1Swenshuai.xi         // [6] Fld don't care
4629*53ee8cc1Swenshuai.xi         // [7] 422pack don'care
4630*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_MPG_JPG_SWITCH), regval);
4631*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubIs422 = pparam->bYUV422;
4632*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_DUMMY), !pparam->bYUV422, VOP_420_BW_SAVE);
4633*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_BW_SAVE), !pparam->bYUV422, VOP_420_BW_SAVE_EX);
4634*53ee8cc1Swenshuai.xi 
4635*53ee8cc1Swenshuai.xi         if (pparam->u16StripSize == 0)
4636*53ee8cc1Swenshuai.xi         {
4637*53ee8cc1Swenshuai.xi             if (pparam->bSD)
4638*53ee8cc1Swenshuai.xi             {
4639*53ee8cc1Swenshuai.xi                 u16strip = 720;
4640*53ee8cc1Swenshuai.xi                 u16strip_lsb = 720;
4641*53ee8cc1Swenshuai.xi             }
4642*53ee8cc1Swenshuai.xi             else
4643*53ee8cc1Swenshuai.xi             {
4644*53ee8cc1Swenshuai.xi                 u16strip = 1920;
4645*53ee8cc1Swenshuai.xi                 u16strip_lsb = 1920;
4646*53ee8cc1Swenshuai.xi             }
4647*53ee8cc1Swenshuai.xi         }
4648*53ee8cc1Swenshuai.xi         else
4649*53ee8cc1Swenshuai.xi         {
4650*53ee8cc1Swenshuai.xi             u16strip = pparam->u16StripSize;
4651*53ee8cc1Swenshuai.xi             u16strip_lsb = pparam->u16StripSize;
4652*53ee8cc1Swenshuai.xi         }
4653*53ee8cc1Swenshuai.xi 
4654*53ee8cc1Swenshuai.xi         // set dc_strip[7:0]
4655*53ee8cc1Swenshuai.xi         if (pparam->bDramRdContd == 0)
4656*53ee8cc1Swenshuai.xi         {
4657*53ee8cc1Swenshuai.xi             u16strip = (u16strip + 31) / 32 * 32; //need align for monaco
4658*53ee8cc1Swenshuai.xi             u16strip = u16strip/8;
4659*53ee8cc1Swenshuai.xi             u16strip_lsb = (u16strip_lsb+127)/128;
4660*53ee8cc1Swenshuai.xi             u16strip_lsb *= 4;
4661*53ee8cc1Swenshuai.xi 
4662*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("[MVOP]%s enVideoType = 0x%x\n", __FUNCTION__,pparam->enVideoType);)
4663*53ee8cc1Swenshuai.xi 
4664*53ee8cc1Swenshuai.xi             if(pparam->enVideoType == MVOP_H264)
4665*53ee8cc1Swenshuai.xi             {
4666*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 1, VOP_TILE_32x32);//mantis:1144345 mustang h264 default 32x32.
4667*53ee8cc1Swenshuai.xi             }
4668*53ee8cc1Swenshuai.xi             else
4669*53ee8cc1Swenshuai.xi             {
4670*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 0, VOP_TILE_32x32);//MVD can not 32x32.
4671*53ee8cc1Swenshuai.xi             }
4672*53ee8cc1Swenshuai.xi         }
4673*53ee8cc1Swenshuai.xi         else
4674*53ee8cc1Swenshuai.xi         {
4675*53ee8cc1Swenshuai.xi             if ( pparam->b422pack )
4676*53ee8cc1Swenshuai.xi             {
4677*53ee8cc1Swenshuai.xi                 if (E_MVOP_RGB_888 == g_pHalMVOPCtx->eSubRgbFmt)
4678*53ee8cc1Swenshuai.xi                 {
4679*53ee8cc1Swenshuai.xi                     u16strip *= 2;
4680*53ee8cc1Swenshuai.xi                 }
4681*53ee8cc1Swenshuai.xi 
4682*53ee8cc1Swenshuai.xi                 if ((u16strip < 1024) || g_pHalMVOPCtx->bSubMirrorMode)
4683*53ee8cc1Swenshuai.xi                 {
4684*53ee8cc1Swenshuai.xi                     u16strip = u16strip/4;
4685*53ee8cc1Swenshuai.xi                     // dont extend strip len
4686*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(SUB_REG(VOP_REG_STRIP_ALIGN), 0, BIT0);
4687*53ee8cc1Swenshuai.xi                 }
4688*53ee8cc1Swenshuai.xi                 else
4689*53ee8cc1Swenshuai.xi                 {
4690*53ee8cc1Swenshuai.xi                     u16strip = u16strip/8;
4691*53ee8cc1Swenshuai.xi                     // extend strip len to 2048
4692*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(SUB_REG(VOP_REG_STRIP_ALIGN), 1, BIT0);
4693*53ee8cc1Swenshuai.xi                 }
4694*53ee8cc1Swenshuai.xi             }
4695*53ee8cc1Swenshuai.xi             else
4696*53ee8cc1Swenshuai.xi             {
4697*53ee8cc1Swenshuai.xi                 u16strip = u16strip/8;
4698*53ee8cc1Swenshuai.xi             }
4699*53ee8cc1Swenshuai.xi         }
4700*53ee8cc1Swenshuai.xi 
4701*53ee8cc1Swenshuai.xi         if (u16strip >= 256 )
4702*53ee8cc1Swenshuai.xi         {
4703*53ee8cc1Swenshuai.xi             HAL_WriteByte(SUB_REG(VOP_DC_STRIP_H), (u16strip>>8));
4704*53ee8cc1Swenshuai.xi             //reg_dc_strip_h[2:0] = reg_dc_strip[10:8]
4705*53ee8cc1Swenshuai.xi         }
4706*53ee8cc1Swenshuai.xi         else
4707*53ee8cc1Swenshuai.xi         {
4708*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(SUB_REG(VOP_DC_STRIP_H), 0, BIT0 | BIT1 | BIT2);
4709*53ee8cc1Swenshuai.xi         }
4710*53ee8cc1Swenshuai.xi 
4711*53ee8cc1Swenshuai.xi         regval = u16strip;
4712*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_DC_STRIP), regval);
4713*53ee8cc1Swenshuai.xi         //LSB strip
4714*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_DC_STRIP_LSB), u16strip_lsb & 0x3ff);
4715*53ee8cc1Swenshuai.xi 
4716*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetYUVBaseAdd(pparam->u32YOffset, pparam->u32UVOffset,
4717*53ee8cc1Swenshuai.xi                                pparam->bProgressive, pparam->b422pack);
4718*53ee8cc1Swenshuai.xi 
4719*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_NONE != g_pHalMVOPCtx->eSubRepeatField)
4720*53ee8cc1Swenshuai.xi         {
4721*53ee8cc1Swenshuai.xi             MVOP_DBG("%s reset eRepeatField=%x ==>", __FUNCTION__, g_pHalMVOPCtx->eSubRepeatField);
4722*53ee8cc1Swenshuai.xi             //To output the same field for single field input,
4723*53ee8cc1Swenshuai.xi             //do NOT set h'3B[9]=1 and h'11[12]=0
4724*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->eSubRepeatField = E_MVOP_RPTFLD_NONE;    //reset the flag to repeat field
4725*53ee8cc1Swenshuai.xi             MVOP_DBG(" %x\n", g_pHalMVOPCtx->eSubRepeatField);
4726*53ee8cc1Swenshuai.xi         }
4727*53ee8cc1Swenshuai.xi 
4728*53ee8cc1Swenshuai.xi         // HSize
4729*53ee8cc1Swenshuai.xi         MS_U16 u16HSize = ALIGN_UPTO_16(pparam->u16HSize);
4730*53ee8cc1Swenshuai.xi         if (u16HSize != pparam->u16HSize)
4731*53ee8cc1Swenshuai.xi         {
4732*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("\n\n Change HSize %d to %d\n", pparam->u16HSize, u16HSize);)
4733*53ee8cc1Swenshuai.xi         }
4734*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_HSIZE    ), LOWBYTE( u16HSize ));
4735*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_HSIZE + 1), HIGHBYTE( u16HSize ));
4736*53ee8cc1Swenshuai.xi 
4737*53ee8cc1Swenshuai.xi         // VSize
4738*53ee8cc1Swenshuai.xi         MS_U16 u16VSize = pparam->u16VSize;
4739*53ee8cc1Swenshuai.xi         if (g_pHalMVOPCtx->bSubMirrorModeVer)
4740*53ee8cc1Swenshuai.xi         {
4741*53ee8cc1Swenshuai.xi             u16VSize = ALIGN_UPTO_4(pparam->u16VSize);
4742*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("\n\n Change VSize %d to %d\n", pparam->u16VSize, u16VSize);)
4743*53ee8cc1Swenshuai.xi         }
4744*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_VSIZE    ), LOWBYTE( u16VSize ));
4745*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_VSIZE + 1), HIGHBYTE( u16VSize ));
4746*53ee8cc1Swenshuai.xi     }
4747*53ee8cc1Swenshuai.xi 
4748*53ee8cc1Swenshuai.xi     HAL_MVOP_SubLoadReg();
4749*53ee8cc1Swenshuai.xi }
4750*53ee8cc1Swenshuai.xi 
4751*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubEnableUVShift(MS_BOOL bEnable)4752*53ee8cc1Swenshuai.xi void HAL_MVOP_SubEnableUVShift(MS_BOOL bEnable)
4753*53ee8cc1Swenshuai.xi {
4754*53ee8cc1Swenshuai.xi     MS_U8 regval;
4755*53ee8cc1Swenshuai.xi 
4756*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(SUB_REG(VOP_MPG_JPG_SWITCH));
4757*53ee8cc1Swenshuai.xi 
4758*53ee8cc1Swenshuai.xi     if (((regval & BIT4) == BIT4) && ((regval & 0x3)== 0x2))
4759*53ee8cc1Swenshuai.xi     {   // 422 with MCU control mode
4760*53ee8cc1Swenshuai.xi         if (bEnable)
4761*53ee8cc1Swenshuai.xi         {
4762*53ee8cc1Swenshuai.xi             MS_ASSERT(0);
4763*53ee8cc1Swenshuai.xi         }
4764*53ee8cc1Swenshuai.xi     }
4765*53ee8cc1Swenshuai.xi 
4766*53ee8cc1Swenshuai.xi     // output 420 and interlace
4767*53ee8cc1Swenshuai.xi     //[IP - Sheet] : Main Page --- 420CUP
4768*53ee8cc1Swenshuai.xi     //[Project] :  Titania2
4769*53ee8cc1Swenshuai.xi     //[Description]:   Chroma artifacts when 420to422 is applied duplicate method.
4770*53ee8cc1Swenshuai.xi     //[Root cause]: Apply 420to422 average algorithm to all DTV input cases.
4771*53ee8cc1Swenshuai.xi     //The average algorithm must cooperate with MVOP.
4772*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_UV_SHIFT), (bEnable)?1:0, 0x3);
4773*53ee8cc1Swenshuai.xi }
4774*53ee8cc1Swenshuai.xi 
4775*53ee8cc1Swenshuai.xi static MS_BOOL _bSubEnable60P = false;
HAL_MVOP_SubSetEnable60P(MS_BOOL bEnable)4776*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetEnable60P(MS_BOOL bEnable)
4777*53ee8cc1Swenshuai.xi {
4778*53ee8cc1Swenshuai.xi     _bSubEnable60P = bEnable;
4779*53ee8cc1Swenshuai.xi }
4780*53ee8cc1Swenshuai.xi 
4781*53ee8cc1Swenshuai.xi static MS_BOOL _bSubEnable4k2kClk = false;
HAL_MVOP_SubSetEnable4k2kClk(MS_BOOL bEnable)4782*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetEnable4k2kClk(MS_BOOL bEnable)
4783*53ee8cc1Swenshuai.xi {
4784*53ee8cc1Swenshuai.xi     _bSubEnable4k2kClk = bEnable;
4785*53ee8cc1Swenshuai.xi }
4786*53ee8cc1Swenshuai.xi 
4787*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetEnable4k2k2P(MS_BOOL bEnable)4788*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetEnable4k2k2P(MS_BOOL bEnable)
4789*53ee8cc1Swenshuai.xi {
4790*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIs2p = bEnable;
4791*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_4K2K_2P), bEnable, VOP_4K2K_2P);
4792*53ee8cc1Swenshuai.xi 
4793*53ee8cc1Swenshuai.xi }
4794*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubEnableFreerunMode(MS_BOOL bEnable)4795*53ee8cc1Swenshuai.xi void HAL_MVOP_SubEnableFreerunMode(MS_BOOL bEnable)
4796*53ee8cc1Swenshuai.xi {
4797*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
4798*53ee8cc1Swenshuai.xi     {
4799*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
4800*53ee8cc1Swenshuai.xi         return;
4801*53ee8cc1Swenshuai.xi     }
4802*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubEnableFreerunMode = bEnable;
4803*53ee8cc1Swenshuai.xi }
4804*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetOutputTiming(MVOP_Timing * ptiming)4805*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetOutputTiming( MVOP_Timing *ptiming )
4806*53ee8cc1Swenshuai.xi {
4807*53ee8cc1Swenshuai.xi     MS_U8 regval;
4808*53ee8cc1Swenshuai.xi 
4809*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_FRAME_VCOUNT    ), LOWBYTE( ptiming->u16V_TotalCount ));
4810*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_FRAME_VCOUNT + 1), HIGHBYTE( ptiming->u16V_TotalCount ));
4811*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_FRAME_HCOUNT    ), LOWBYTE( ptiming->u16H_TotalCount ));
4812*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_FRAME_HCOUNT + 1), HIGHBYTE( ptiming->u16H_TotalCount ));
4813*53ee8cc1Swenshuai.xi 
4814*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_VB0_STR     ), LOWBYTE( ptiming->u16VBlank0_Start ));
4815*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_VB0_STR  + 1), HIGHBYTE( ptiming->u16VBlank0_Start ));
4816*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_VB0_END     ), LOWBYTE( ptiming->u16VBlank0_End ));
4817*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_VB0_END  + 1), HIGHBYTE( ptiming->u16VBlank0_End ));
4818*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_VB1_STR     ), LOWBYTE( ptiming->u16VBlank1_Start ));
4819*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_VB1_STR  + 1), HIGHBYTE( ptiming->u16VBlank1_Start ));
4820*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_VB1_END     ), LOWBYTE( ptiming->u16VBlank1_End ));
4821*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_VB1_END  + 1), HIGHBYTE( ptiming->u16VBlank1_End ));
4822*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TF_STR      ), LOWBYTE( ptiming->u16TopField_Start ));
4823*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TF_STR   + 1), HIGHBYTE( ptiming->u16TopField_Start ));
4824*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_BF_STR      ), LOWBYTE( ptiming->u16BottomField_Start ));
4825*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_BF_STR   + 1), HIGHBYTE( ptiming->u16BottomField_Start ));
4826*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_HACT_STR    ), LOWBYTE( ptiming->u16HActive_Start ));
4827*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_HACT_STR + 1), HIGHBYTE( ptiming->u16HActive_Start ));
4828*53ee8cc1Swenshuai.xi 
4829*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TF_VS      ), LOWBYTE( ptiming->u16TopField_VS ));
4830*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TF_VS   + 1), HIGHBYTE( ptiming->u16TopField_VS ));
4831*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_BF_VS      ), LOWBYTE( ptiming->u16BottomField_VS ));
4832*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_BF_VS   + 1), HIGHBYTE( ptiming->u16BottomField_VS ));
4833*53ee8cc1Swenshuai.xi 
4834*53ee8cc1Swenshuai.xi     //if(((ptiming->u16V_TotalCount > 2160) || (ptiming->u16H_TotalCount > 3840)) && (ptiming->u8Framerate >= 30))
4835*53ee8cc1Swenshuai.xi     if((!g_pHalMVOPCtx->bSubIsXcTrig) && (g_pHalMVOPCtx->bSubIsHS))
4836*53ee8cc1Swenshuai.xi     {
4837*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubNewVSyncMode = TRUE;
4838*53ee8cc1Swenshuai.xi     }
4839*53ee8cc1Swenshuai.xi 
4840*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx->bSubNewVSyncMode)
4841*53ee8cc1Swenshuai.xi     {
4842*53ee8cc1Swenshuai.xi         #define SUB_NEW_VSYNC_MODE_ADVANCE_LINECNT 30
4843*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("MVOP use new vync mode, forwarding %d lines\n",SUB_NEW_VSYNC_MODE_ADVANCE_LINECNT);)
4844*53ee8cc1Swenshuai.xi 
4845*53ee8cc1Swenshuai.xi         MS_U16 u16BottomField_VS2MVD = ptiming->u16BottomField_VS - SUB_NEW_VSYNC_MODE_ADVANCE_LINECNT;
4846*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("BottomField VS ori=0x%x, new=0x%x\n", ptiming->u16BottomField_VS, u16BottomField_VS2MVD);)
4847*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_BF_VS_MVD), LOWBYTE( u16BottomField_VS2MVD ));
4848*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG((VOP_BF_VS_MVD + 1)), HIGHBYTE( u16BottomField_VS2MVD ));
4849*53ee8cc1Swenshuai.xi 
4850*53ee8cc1Swenshuai.xi         MS_U16 u16TopField_VS2MVD = ptiming->u16V_TotalCount - SUB_NEW_VSYNC_MODE_ADVANCE_LINECNT;
4851*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("TopField VS Vtt=0x%x, new=0x%x\n", ptiming->u16V_TotalCount, u16TopField_VS2MVD);)
4852*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_TF_VS_MVD), LOWBYTE( u16TopField_VS2MVD ));
4853*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG((VOP_TF_VS_MVD + 1)), HIGHBYTE( u16TopField_VS2MVD ));
4854*53ee8cc1Swenshuai.xi 
4855*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_GCLK), 0, VOP_GCLK_MIU_ON);
4856*53ee8cc1Swenshuai.xi 
4857*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_CTRL1), 1, VOP_MVD_VS_MD); //Use new vsync
4858*53ee8cc1Swenshuai.xi 
4859*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubNewVSyncMode = FALSE; //restore to original mode
4860*53ee8cc1Swenshuai.xi     }
4861*53ee8cc1Swenshuai.xi 
4862*53ee8cc1Swenshuai.xi 
4863*53ee8cc1Swenshuai.xi     // + S3, set default IMG_HSTR, IMG_VSTR0, IMG_VSTR1
4864*53ee8cc1Swenshuai.xi #ifdef _SUPPORT_IMG_OFFSET_
4865*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_HSTR    ), LOWBYTE( ptiming->u16HImg_Start));
4866*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_HSTR + 1), HIGHBYTE( ptiming->u16HImg_Start ));
4867*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_VSTR0   ), LOWBYTE( ptiming->u16VImg_Start0));
4868*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_VSTR0+ 1), HIGHBYTE( ptiming->u16VImg_Start0 ));
4869*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_VSTR1   ), LOWBYTE( ptiming->u16VImg_Start1 ));
4870*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_VSTR1+ 1), HIGHBYTE( ptiming->u16VImg_Start1 ));
4871*53ee8cc1Swenshuai.xi #else
4872*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_HSTR    ), LOWBYTE( ptiming->u16HActive_Start ));
4873*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_HSTR + 1), HIGHBYTE( ptiming->u16HActive_Start ));
4874*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_VSTR0   ), LOWBYTE( ptiming->u16VBlank0_End ));
4875*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_VSTR0+ 1), HIGHBYTE( ptiming->u16VBlank0_End ));
4876*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_VSTR1   ), LOWBYTE( ptiming->u16VBlank1_End ));
4877*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_VSTR1+ 1), HIGHBYTE( ptiming->u16VBlank1_End ));
4878*53ee8cc1Swenshuai.xi #endif
4879*53ee8cc1Swenshuai.xi     // select mvop output from frame color(black)
4880*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TST_IMG + 1), 0x10);
4881*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_U_PAT      ), 0x80);
4882*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_U_PAT   + 1), 0x80);
4883*53ee8cc1Swenshuai.xi     // set mvop src to test pattern
4884*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(SUB_REG(VOP_TST_IMG));
4885*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_TST_IMG), 0x02, BIT2 | BIT1 | BIT0);
4886*53ee8cc1Swenshuai.xi     // make changed registers take effect
4887*53ee8cc1Swenshuai.xi     HAL_MVOP_SubLoadReg();
4888*53ee8cc1Swenshuai.xi 
4889*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetMIUReqMask(TRUE);
4890*53ee8cc1Swenshuai.xi     // reset mvop to avoid timing change cause mvop hang-up
4891*53ee8cc1Swenshuai.xi     HAL_MVOP_SubRst();
4892*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetMIUReqMask(FALSE);
4893*53ee8cc1Swenshuai.xi 
4894*53ee8cc1Swenshuai.xi     // select mvop output from mvd
4895*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_TST_IMG), 0x00, BIT2 | BIT1 | BIT0);
4896*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_TST_IMG), regval, BIT2 | BIT1 | BIT0);
4897*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_CTRL0), ptiming->bHDuplicate, BIT2);// H pixel duplicate
4898*53ee8cc1Swenshuai.xi 
4899*53ee8cc1Swenshuai.xi #if 0
4900*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF("\nMVOP SetOutputTiming\n");)
4901*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" VTot=%u,\t",ptiming->u16V_TotalCount);)
4902*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" HTot=%u,\t",ptiming->u16H_TotalCount);)
4903*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" I/P=%u\n",ptiming->bInterlace);)
4904*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" W=%u,\t",ptiming->u16Width);)
4905*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" H=%u,\t",ptiming->u16Height);)
4906*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" FRate=%u,\t",ptiming->u8Framerate);)
4907*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" HFreq=%u\n",ptiming->u16H_Freq);)
4908*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" Num=0x%x,\t",ptiming->u16Num);)
4909*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" Den=0x%x,\t",ptiming->u16Den);)
4910*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" u16ExpFRate=%u #\n\n", ptiming->u16ExpFrameRate);)
4911*53ee8cc1Swenshuai.xi #endif
4912*53ee8cc1Swenshuai.xi }
4913*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetDCClk(MS_U8 clkNum,MS_BOOL bEnable)4914*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetDCClk(MS_U8 clkNum, MS_BOOL bEnable)
4915*53ee8cc1Swenshuai.xi {
4916*53ee8cc1Swenshuai.xi     MS_ASSERT( (clkNum==0) || (clkNum==1) );
4917*53ee8cc1Swenshuai.xi     if (clkNum==0)
4918*53ee8cc1Swenshuai.xi     {
4919*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_CKG_SUB_DC0, !bEnable, CKG_SUB_DC0_GATED);
4920*53ee8cc1Swenshuai.xi     }
4921*53ee8cc1Swenshuai.xi }
4922*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetDCSRAMClk(MS_U8 clkNum,MS_BOOL bEnable)4923*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetDCSRAMClk(MS_U8 clkNum, MS_BOOL bEnable)
4924*53ee8cc1Swenshuai.xi {
4925*53ee8cc1Swenshuai.xi     MS_ASSERT( (clkNum==0) || (clkNum==1) );
4926*53ee8cc1Swenshuai.xi     if (clkNum==0)
4927*53ee8cc1Swenshuai.xi     {
4928*53ee8cc1Swenshuai.xi         if(bEnable)
4929*53ee8cc1Swenshuai.xi         {
4930*53ee8cc1Swenshuai.xi             if(g_pHalMVOPCtx->u16ECONum == 0)
4931*53ee8cc1Swenshuai.xi             {
4932*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(REG_CKG_DC_SRAM, 0x4, CKG_DC1_SRAM);//Dc0 enable & dc0_mfdec_en =0  57[3:0]= 0x4, others  57[3:0]=0x0
4933*53ee8cc1Swenshuai.xi             }
4934*53ee8cc1Swenshuai.xi             else
4935*53ee8cc1Swenshuai.xi             {
4936*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(REG_CKG_DC_SRAM, 0x0, CKG_DC1_SRAM);
4937*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(SUB_REG(VOP_REG_DUMMY_5D), 0x0, VOP_SRAM_CLK_AUTO);
4938*53ee8cc1Swenshuai.xi                 HAL_MVOP_SubLoadReg();
4939*53ee8cc1Swenshuai.xi             }
4940*53ee8cc1Swenshuai.xi         }
4941*53ee8cc1Swenshuai.xi         else
4942*53ee8cc1Swenshuai.xi         {
4943*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC_SRAM, 0x0, CKG_DC1_SRAM);
4944*53ee8cc1Swenshuai.xi         }
4945*53ee8cc1Swenshuai.xi     }
4946*53ee8cc1Swenshuai.xi }
4947*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetSynClk(MVOP_Timing * ptiming)4948*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetSynClk(MVOP_Timing *ptiming)
4949*53ee8cc1Swenshuai.xi {
4950*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
4951*53ee8cc1Swenshuai.xi     {
4952*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
4953*53ee8cc1Swenshuai.xi         return;
4954*53ee8cc1Swenshuai.xi     }
4955*53ee8cc1Swenshuai.xi     if(g_pHalMVOPCtx->u32SubMVOPFixClk != 0)
4956*53ee8cc1Swenshuai.xi     {
4957*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetFrequency(g_pHalMVOPCtx->u32SubMVOPFixClk);
4958*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->bSub3DLRMode)//4k1k mvc
4959*53ee8cc1Swenshuai.xi         {
4960*53ee8cc1Swenshuai.xi             //burst and priority
4961*53ee8cc1Swenshuai.xi             HAL_WriteByte(SUB_REG(VOP_DMA1), 0x26);
4962*53ee8cc1Swenshuai.xi             HAL_WriteByte(SUB_REG(VOP_BURST_CTRL0), 0x05);
4963*53ee8cc1Swenshuai.xi             HAL_WriteByte(SUB_REG(VOP_BURST_CTRL1), 0x00);
4964*53ee8cc1Swenshuai.xi         }
4965*53ee8cc1Swenshuai.xi     }
4966*53ee8cc1Swenshuai.xi     else if(g_pHalMVOPCtx->bSubEnableFreerunMode)
4967*53ee8cc1Swenshuai.xi     {
4968*53ee8cc1Swenshuai.xi         MS_U64 u64mpll_clock = MPLL_CLOCK << 27 ;
4969*53ee8cc1Swenshuai.xi         do_div(u64mpll_clock, ((MS_U32)ptiming->u16H_TotalCount * (MS_U32)ptiming->u16V_TotalCount * (MS_U32)ptiming->u8Framerate));
4970*53ee8cc1Swenshuai.xi         MS_U32 u32FreerunClk = (MS_U32)u64mpll_clock;
4971*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetFrequency(HALMVOP_FREERUNMODE);
4972*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC1_FREERUN_CW_L  ), LOWBYTE((MS_U16)u32FreerunClk));
4973*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC1_FREERUN_CW_L+1), HIGHBYTE((MS_U16)u32FreerunClk));
4974*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC1_FREERUN_CW_H  ), LOWBYTE((MS_U16)(u32FreerunClk >> 16)));
4975*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC1_FREERUN_CW_H+1), HIGHBYTE((MS_U16)(u32FreerunClk >> 16)));
4976*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_UPDATE_DC1_CW, 1, UPDATE_DC1_FREERUN_CW);
4977*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_UPDATE_DC1_CW, 0, UPDATE_DC1_FREERUN_CW);
4978*53ee8cc1Swenshuai.xi     }
4979*53ee8cc1Swenshuai.xi     else if (_bSubEnable60P)
4980*53ee8cc1Swenshuai.xi     {
4981*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetFrequency(HAL_MVOP_SubGetMaxFreerunClk());
4982*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_FRAME_RST), 0, BIT15); // reg_frame_rst = 0
4983*53ee8cc1Swenshuai.xi 
4984*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_CTRL0), DISABLE, VOP_FSYNC_EN); // frame sync disable
4985*53ee8cc1Swenshuai.xi 
4986*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->bSub3DLRMode)//4k1k mvc
4987*53ee8cc1Swenshuai.xi         {
4988*53ee8cc1Swenshuai.xi             //burst and priority
4989*53ee8cc1Swenshuai.xi             HAL_WriteByte(SUB_REG(VOP_DMA1), 0x26);
4990*53ee8cc1Swenshuai.xi             HAL_WriteByte(SUB_REG(VOP_BURST_CTRL0), 0x05);
4991*53ee8cc1Swenshuai.xi             HAL_WriteByte(SUB_REG(VOP_BURST_CTRL1), 0x00);
4992*53ee8cc1Swenshuai.xi         }
4993*53ee8cc1Swenshuai.xi     }
4994*53ee8cc1Swenshuai.xi     else if (_bSubEnable4k2kClk)
4995*53ee8cc1Swenshuai.xi     {
4996*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetFrequency(HAL_MVOP_SubGet4k2kClk());
4997*53ee8cc1Swenshuai.xi 
4998*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_FRAME_RST), 0, BIT15); // reg_frame_rst = 0
4999*53ee8cc1Swenshuai.xi 
5000*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_CTRL0), DISABLE, VOP_FSYNC_EN); // frame sync disable
5001*53ee8cc1Swenshuai.xi     }
5002*53ee8cc1Swenshuai.xi     else
5003*53ee8cc1Swenshuai.xi     {
5004*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetFrequency(HALMVOP_SYNCMODE);
5005*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC1_NUM  ), LOWBYTE( ptiming->u16Num));
5006*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC1_NUM+1), HIGHBYTE(ptiming->u16Num));
5007*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC1_DEN  ), LOWBYTE( ptiming->u16Den));
5008*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC1_DEN+1), HIGHBYTE(ptiming->u16Den));
5009*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_UPDATE_DC1_CW, 1, UPDATE_DC1_SYNC_CW);
5010*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_UPDATE_DC1_CW, 0, UPDATE_DC1_SYNC_CW);
5011*53ee8cc1Swenshuai.xi     }
5012*53ee8cc1Swenshuai.xi }
5013*53ee8cc1Swenshuai.xi 
5014*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetMonoMode(MS_BOOL bEnable)5015*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetMonoMode(MS_BOOL bEnable)
5016*53ee8cc1Swenshuai.xi {
5017*53ee8cc1Swenshuai.xi     if(bEnable)
5018*53ee8cc1Swenshuai.xi     {
5019*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_U_PAT  ), 0x80);
5020*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_U_PAT+1), 0x80);
5021*53ee8cc1Swenshuai.xi 
5022*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH1), 1, BIT1);    // Mono mode enable
5023*53ee8cc1Swenshuai.xi     }
5024*53ee8cc1Swenshuai.xi     else
5025*53ee8cc1Swenshuai.xi     {
5026*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH1), 0, BIT1);    //Mono mode disable
5027*53ee8cc1Swenshuai.xi     }
5028*53ee8cc1Swenshuai.xi }
5029*53ee8cc1Swenshuai.xi 
5030*53ee8cc1Swenshuai.xi /******************************************************************************/
5031*53ee8cc1Swenshuai.xi /// Set MVOP for H264  Hardwire Mode
5032*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SubSetH264HardwireMode(MS_U16 u16ECOVersion)5033*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetH264HardwireMode(MS_U16 u16ECOVersion)
5034*53ee8cc1Swenshuai.xi {
5035*53ee8cc1Swenshuai.xi     // Hardwire mode
5036*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_MPG_JPG_SWITCH), 0x00);
5037*53ee8cc1Swenshuai.xi 
5038*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_STRIP_ALIGN), 0, BIT0);
5039*53ee8cc1Swenshuai.xi 
5040*53ee8cc1Swenshuai.xi     //16*32 tile format
5041*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 1, BIT1);
5042*53ee8cc1Swenshuai.xi 
5043*53ee8cc1Swenshuai.xi     // SVD mode enable
5044*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_INPUT_SWITCH1), BIT3, BIT2|BIT3);
5045*53ee8cc1Swenshuai.xi 
5046*53ee8cc1Swenshuai.xi 
5047*53ee8cc1Swenshuai.xi     // set mvop to 64bit interface
5048*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_MIU_IF), VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
5049*53ee8cc1Swenshuai.xi     // Only for Monaco: Disable deciding bot by top address + 2
5050*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), 0, VOP_FIELD_FROM_ADDR);
5051*53ee8cc1Swenshuai.xi 
5052*53ee8cc1Swenshuai.xi     // Enable mfdec setting from wb from Manhattan
5053*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_DUMMY), 1, VOP_32x32_WB); //32x32 from wb
5054*53ee8cc1Swenshuai.xi 
5055*53ee8cc1Swenshuai.xi     if(u16ECOVersion == 0)
5056*53ee8cc1Swenshuai.xi     {
5057*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(REG_CKG_DC_SRAM, 0x0, CKG_DC1_SRAM);//Dc0 enable & dc0_mfdec_en =0  57[3:0]= 0x4, others  57[3:0]=0x0
5058*53ee8cc1Swenshuai.xi     }
5059*53ee8cc1Swenshuai.xi 
5060*53ee8cc1Swenshuai.xi     // Write trigger
5061*53ee8cc1Swenshuai.xi     HAL_MVOP_SubLoadReg();
5062*53ee8cc1Swenshuai.xi }
5063*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubEnableMVDInterface(MS_BOOL bEnable)5064*53ee8cc1Swenshuai.xi void HAL_MVOP_SubEnableMVDInterface(MS_BOOL bEnable)
5065*53ee8cc1Swenshuai.xi {
5066*53ee8cc1Swenshuai.xi     MS_BOOL bMVOPMain2MVD = TRUE;
5067*53ee8cc1Swenshuai.xi     bMVOPMain2MVD = (bEnable) ? FALSE : TRUE;
5068*53ee8cc1Swenshuai.xi 
5069*53ee8cc1Swenshuai.xi     //This bit is only valid in main mvop bank.
5070*53ee8cc1Swenshuai.xi     //Select which mvop interrupt that mvd f/w recieve: 1 for main; 0 for sub.
5071*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_INPUT_SWITCH1, bMVOPMain2MVD, VOP_MVD_EN);
5072*53ee8cc1Swenshuai.xi 
5073*53ee8cc1Swenshuai.xi     //No need to "Write trigger" since HAL_MVOP_SubSetInputMode() will do it later.
5074*53ee8cc1Swenshuai.xi     //HAL_MVOP_SubLoadReg();
5075*53ee8cc1Swenshuai.xi }
5076*53ee8cc1Swenshuai.xi 
5077*53ee8cc1Swenshuai.xi /******************************************************************************/
5078*53ee8cc1Swenshuai.xi /// Set MVOP for RM  Hardwire Mode
5079*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SubSetRMHardwireMode(MS_U16 u16ECOVersion)5080*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetRMHardwireMode(MS_U16 u16ECOVersion)
5081*53ee8cc1Swenshuai.xi {
5082*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetH264HardwireMode(u16ECOVersion);
5083*53ee8cc1Swenshuai.xi     if(u16ECOVersion == 0)
5084*53ee8cc1Swenshuai.xi     {
5085*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(REG_CKG_DC_SRAM, 0x40, CKG_DC1_SRAM);//Dc0 enable & dc0_mfdec_en =0  57[3:0]= 0x4, others  57[3:0]=0x0
5086*53ee8cc1Swenshuai.xi     }
5087*53ee8cc1Swenshuai.xi }
5088*53ee8cc1Swenshuai.xi 
5089*53ee8cc1Swenshuai.xi /******************************************************************************/
5090*53ee8cc1Swenshuai.xi /// Set MVOP for JPEG Hardwire Mode
5091*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SubSetJpegHardwireMode(MS_U16 u16ECOVersion)5092*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetJpegHardwireMode(MS_U16 u16ECOVersion)
5093*53ee8cc1Swenshuai.xi {
5094*53ee8cc1Swenshuai.xi     MS_U8 regval = 0x00;
5095*53ee8cc1Swenshuai.xi 
5096*53ee8cc1Swenshuai.xi     //Hardwire mode//
5097*53ee8cc1Swenshuai.xi     //Use HVD interface//
5098*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetH264HardwireMode(u16ECOVersion);
5099*53ee8cc1Swenshuai.xi 
5100*53ee8cc1Swenshuai.xi     regval |= 0x80; // packmode
5101*53ee8cc1Swenshuai.xi     regval |= 0x20; // Dram Rd Contd
5102*53ee8cc1Swenshuai.xi     regval |= 0x10; // reg_img422
5103*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_MPG_JPG_SWITCH), regval);
5104*53ee8cc1Swenshuai.xi     /* There is no hardwire:mvd2dc_img422/hvd2dc_img422 0x20[4] in sub mvop*/
5105*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_INFO_FROM_CODEC_L), 0, VOP_INFO_FROM_CODEC_422_FMT);
5106*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIs422 = 1;
5107*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_DUMMY), 0, VOP_420_BW_SAVE);
5108*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_BW_SAVE), 0, VOP_420_BW_SAVE_EX);
5109*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_INFO_FROM_CODEC_H), 0x00, VOP_INFO_FROM_CODEC_MIU_BUF0_SEL|VOP_INFO_FROM_CODEC_MIU_BUF1_SEL);
5110*53ee8cc1Swenshuai.xi 
5111*53ee8cc1Swenshuai.xi     // Write trigger
5112*53ee8cc1Swenshuai.xi     HAL_MVOP_SubLoadReg();
5113*53ee8cc1Swenshuai.xi }
5114*53ee8cc1Swenshuai.xi /******************************************************************************/
5115*53ee8cc1Swenshuai.xi /// Set MVOP for EVD Hardwire Mode
5116*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SubSetEVDHardwireMode(MS_U16 u16ECOVersion)5117*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetEVDHardwireMode(MS_U16 u16ECOVersion)
5118*53ee8cc1Swenshuai.xi {
5119*53ee8cc1Swenshuai.xi     // Hardwire mode
5120*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_MPG_JPG_SWITCH), 0x00);
5121*53ee8cc1Swenshuai.xi 
5122*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_STRIP_ALIGN), 0, BIT0);
5123*53ee8cc1Swenshuai.xi 
5124*53ee8cc1Swenshuai.xi     //16*32 tile format
5125*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 1, BIT1);
5126*53ee8cc1Swenshuai.xi 
5127*53ee8cc1Swenshuai.xi     // EVD use HVD interface
5128*53ee8cc1Swenshuai.xi     //HAL_WriteByteMask(SUB_REG(VOP_INPUT_SWITCH1), BIT3, BIT2|BIT3);
5129*53ee8cc1Swenshuai.xi 
5130*53ee8cc1Swenshuai.xi     // EVD mode enable
5131*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 1, EVD_ENABLE);
5132*53ee8cc1Swenshuai.xi 
5133*53ee8cc1Swenshuai.xi     // set mvop to 128bit_i128 interface
5134*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_MIU_IF), VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
5135*53ee8cc1Swenshuai.xi 
5136*53ee8cc1Swenshuai.xi     // set evd flag for interlace mode setting
5137*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsH265 = 1;
5138*53ee8cc1Swenshuai.xi 
5139*53ee8cc1Swenshuai.xi     // 10 bits from wb
5140*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_INFO_FROM_CODEC_H), 1, VOP_INFO_FROM_CODEC_10BIT);
5141*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_REG_MASK), 0, VOP_LSB_REQ_MASK);
5142*53ee8cc1Swenshuai.xi 
5143*53ee8cc1Swenshuai.xi     if(u16ECOVersion == 0)
5144*53ee8cc1Swenshuai.xi     {
5145*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(REG_CKG_DC_SRAM, 0x0, CKG_DC1_SRAM);//Dc0 enable & dc0_mfdec_en =0  57[3:0]= 0x4, others  57[3:0]=0x0
5146*53ee8cc1Swenshuai.xi     }
5147*53ee8cc1Swenshuai.xi 
5148*53ee8cc1Swenshuai.xi     // Write trigger
5149*53ee8cc1Swenshuai.xi     HAL_MVOP_SubLoadReg();
5150*53ee8cc1Swenshuai.xi }
5151*53ee8cc1Swenshuai.xi 
5152*53ee8cc1Swenshuai.xi /******************************************************************************/
5153*53ee8cc1Swenshuai.xi /// Set MVOP for VP9 Hardwire Mode
5154*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SubSetVP9HardwireMode(MS_U16 u16ECOVersion)5155*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetVP9HardwireMode(MS_U16 u16ECOVersion)
5156*53ee8cc1Swenshuai.xi {
5157*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetEVDHardwireMode(u16ECOVersion);
5158*53ee8cc1Swenshuai.xi }
5159*53ee8cc1Swenshuai.xi 
5160*53ee8cc1Swenshuai.xi 
5161*53ee8cc1Swenshuai.xi ///Enable 3D L/R dual buffer mode
HAL_MVOP_SubEnable3DLR(MS_BOOL bEnable)5162*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubEnable3DLR(MS_BOOL bEnable)
5163*53ee8cc1Swenshuai.xi {
5164*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
5165*53ee8cc1Swenshuai.xi     {
5166*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
5167*53ee8cc1Swenshuai.xi         return FALSE;
5168*53ee8cc1Swenshuai.xi     }
5169*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MULTI_WIN_CFG0), bEnable, VOP_LR_BUF_MODE);
5170*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSub3DLRMode = bEnable;
5171*53ee8cc1Swenshuai.xi     if(bEnable)
5172*53ee8cc1Swenshuai.xi     {
5173*53ee8cc1Swenshuai.xi         //only for monaco: do not wait for data ready.
5174*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_NOT_WAIT_READ_DATA), 2, VOP_NOT_WAIT_RDLAT);
5175*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_BW_SAVE), 0, VOP_420_BW_SAVE_EX);
5176*53ee8cc1Swenshuai.xi     }
5177*53ee8cc1Swenshuai.xi     else
5178*53ee8cc1Swenshuai.xi     {
5179*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_NOT_WAIT_READ_DATA), 0, VOP_NOT_WAIT_RDLAT);
5180*53ee8cc1Swenshuai.xi     }
5181*53ee8cc1Swenshuai.xi     return TRUE;
5182*53ee8cc1Swenshuai.xi }
5183*53ee8cc1Swenshuai.xi 
5184*53ee8cc1Swenshuai.xi ///Get if 3D L/R mode is enabled
HAL_MVOP_SubGet3DLRMode(void)5185*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubGet3DLRMode(void)
5186*53ee8cc1Swenshuai.xi {
5187*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
5188*53ee8cc1Swenshuai.xi     {
5189*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
5190*53ee8cc1Swenshuai.xi         return FALSE;
5191*53ee8cc1Swenshuai.xi     }
5192*53ee8cc1Swenshuai.xi     return g_pHalMVOPCtx->bSub3DLRMode;
5193*53ee8cc1Swenshuai.xi }
5194*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubGetTimingInfoFromRegisters(MVOP_TimingInfo_FromRegisters * pMvopTimingInfo)5195*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubGetTimingInfoFromRegisters(MVOP_TimingInfo_FromRegisters *pMvopTimingInfo)
5196*53ee8cc1Swenshuai.xi {
5197*53ee8cc1Swenshuai.xi     if(NULL == pMvopTimingInfo)
5198*53ee8cc1Swenshuai.xi     {
5199*53ee8cc1Swenshuai.xi         MVOP_PRINTF("HAL_MVOP_SubGetTimingInfoFromRegisters():pMvopTimingInfo is NULL\n");
5200*53ee8cc1Swenshuai.xi         return FALSE;
5201*53ee8cc1Swenshuai.xi     }
5202*53ee8cc1Swenshuai.xi     if(HAL_MVOP_SubGetEnableState() == FALSE)
5203*53ee8cc1Swenshuai.xi     {
5204*53ee8cc1Swenshuai.xi         MVOP_PRINTF("MVOP is not enabled!\n");
5205*53ee8cc1Swenshuai.xi         pMvopTimingInfo->bEnabled = FALSE;
5206*53ee8cc1Swenshuai.xi         return FALSE;
5207*53ee8cc1Swenshuai.xi     }
5208*53ee8cc1Swenshuai.xi     pMvopTimingInfo->bEnabled = TRUE;
5209*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16H_TotalCount = (HAL_ReadByte(SUB_REG(VOP_FRAME_HCOUNT + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_FRAME_HCOUNT)));
5210*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16V_TotalCount = (HAL_ReadByte(SUB_REG(VOP_FRAME_VCOUNT + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_FRAME_VCOUNT)));
5211*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16VBlank0_Start = (HAL_ReadByte(SUB_REG(VOP_VB0_STR + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_VB0_STR)));
5212*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16VBlank0_End = (HAL_ReadByte(SUB_REG(VOP_VB0_END + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_VB0_END)));
5213*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16VBlank1_Start = (HAL_ReadByte(SUB_REG(VOP_VB1_STR + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_VB1_STR)));
5214*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16VBlank1_End = (HAL_ReadByte(SUB_REG(VOP_VB1_END + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_VB1_END)));
5215*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16TopField_Start = (HAL_ReadByte(SUB_REG(VOP_TF_STR + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_TF_STR)));
5216*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16BottomField_Start = (HAL_ReadByte(SUB_REG(VOP_BF_STR + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_BF_STR)));
5217*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16HActive_Start = (HAL_ReadByte(SUB_REG(VOP_HACT_STR + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_HACT_STR)));
5218*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16TopField_VS = (HAL_ReadByte(SUB_REG(VOP_TF_VS + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_TF_VS)));
5219*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16BottomField_VS = (HAL_ReadByte(SUB_REG(VOP_BF_VS + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_BF_VS)));
5220*53ee8cc1Swenshuai.xi     pMvopTimingInfo->bInterlace = (HAL_ReadRegBit(SUB_REG(VOP_CTRL0), BIT7) == BIT7);
5221*53ee8cc1Swenshuai.xi     return TRUE;
5222*53ee8cc1Swenshuai.xi }
5223*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetYUVBaseAdd(MS_PHY u32YOffset,MS_PHY u32UVOffset,MS_BOOL bProgressive,MS_BOOL b422pack)5224*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetYUVBaseAdd(MS_PHY u32YOffset, MS_PHY u32UVOffset, MS_BOOL bProgressive, MS_BOOL b422pack)
5225*53ee8cc1Swenshuai.xi {
5226*53ee8cc1Swenshuai.xi     MS_PHY u64tmp = 0;
5227*53ee8cc1Swenshuai.xi 
5228*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
5229*53ee8cc1Swenshuai.xi     {
5230*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
5231*53ee8cc1Swenshuai.xi         return;
5232*53ee8cc1Swenshuai.xi     }
5233*53ee8cc1Swenshuai.xi     // Y offset
5234*53ee8cc1Swenshuai.xi     u64tmp = u32YOffset >> 3;
5235*53ee8cc1Swenshuai.xi     if ( !bProgressive )
5236*53ee8cc1Swenshuai.xi     {   //Refine Y offset for interlace repeat bottom field
5237*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eSubRepeatField)
5238*53ee8cc1Swenshuai.xi         {
5239*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eSubRepeatField);
5240*53ee8cc1Swenshuai.xi             u64tmp += 2;
5241*53ee8cc1Swenshuai.xi         }
5242*53ee8cc1Swenshuai.xi         else
5243*53ee8cc1Swenshuai.xi         {
5244*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is TOP or NONE.\n", __LINE__, g_pHalMVOPCtx->eSubRepeatField);
5245*53ee8cc1Swenshuai.xi         }
5246*53ee8cc1Swenshuai.xi     }
5247*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_L), u64tmp & 0xff);
5248*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_L+1), (u64tmp >> 8) & 0xff);
5249*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_L+2), (u64tmp >> 16) & 0xff);
5250*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_L+3), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
5251*53ee8cc1Swenshuai.xi 
5252*53ee8cc1Swenshuai.xi     if (!bProgressive )
5253*53ee8cc1Swenshuai.xi     {  //Y offset of bottom field if interlace
5254*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_YSTR1_L), u64tmp & 0xff);
5255*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_YSTR1_L+1), (u64tmp >> 8) & 0xff);
5256*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_YSTR1_L+2), (u64tmp >> 16) & 0xff);
5257*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_YSTR1_L+3), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
5258*53ee8cc1Swenshuai.xi     }
5259*53ee8cc1Swenshuai.xi 
5260*53ee8cc1Swenshuai.xi     if (b422pack)
5261*53ee8cc1Swenshuai.xi     {
5262*53ee8cc1Swenshuai.xi         if (HAL_ReadRegBit(SUB_REG(VOP_MIU_IF), VOP_MIU_128B_I64) != VOP_MIU_128B_I64) //128-bit
5263*53ee8cc1Swenshuai.xi         {
5264*53ee8cc1Swenshuai.xi             u32UVOffset = u32YOffset + 16; //add 16 for 128bit; add 8 for 64bit
5265*53ee8cc1Swenshuai.xi         }
5266*53ee8cc1Swenshuai.xi         else    //64-bit
5267*53ee8cc1Swenshuai.xi         {
5268*53ee8cc1Swenshuai.xi             u32UVOffset = u32YOffset + 8; //add 16 for 128bit; add 8 for 64bit
5269*53ee8cc1Swenshuai.xi         }
5270*53ee8cc1Swenshuai.xi     }
5271*53ee8cc1Swenshuai.xi         // UV offset
5272*53ee8cc1Swenshuai.xi     u64tmp = u32UVOffset >> 3;
5273*53ee8cc1Swenshuai.xi     if( !bProgressive )
5274*53ee8cc1Swenshuai.xi     {  //Refine UV offset for interlace repeat bottom field
5275*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eSubRepeatField)
5276*53ee8cc1Swenshuai.xi         {
5277*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eSubRepeatField);
5278*53ee8cc1Swenshuai.xi             u64tmp += 2;
5279*53ee8cc1Swenshuai.xi         }
5280*53ee8cc1Swenshuai.xi         else
5281*53ee8cc1Swenshuai.xi         {
5282*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is TOP/NONE.\n", __LINE__, g_pHalMVOPCtx->eSubRepeatField);
5283*53ee8cc1Swenshuai.xi         }
5284*53ee8cc1Swenshuai.xi     }
5285*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_L), u64tmp & 0xff);
5286*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_L+1), (u64tmp >> 8) & 0xff);
5287*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_L+2), (u64tmp >> 16) & 0xff);
5288*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_L+3), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
5289*53ee8cc1Swenshuai.xi 
5290*53ee8cc1Swenshuai.xi     if( !bProgressive )
5291*53ee8cc1Swenshuai.xi     {  //UV offset of bottom field if interlace
5292*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR1_L), u64tmp & 0xff);
5293*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR1_L+1), (u64tmp >> 8) & 0xff);
5294*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR1_L+2), (u64tmp >> 16) & 0xff);
5295*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR1_L+3), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
5296*53ee8cc1Swenshuai.xi     }
5297*53ee8cc1Swenshuai.xi 
5298*53ee8cc1Swenshuai.xi     return;
5299*53ee8cc1Swenshuai.xi }
5300*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubGetYBaseAdd(void)5301*53ee8cc1Swenshuai.xi MS_PHY HAL_MVOP_SubGetYBaseAdd(void)
5302*53ee8cc1Swenshuai.xi {
5303*53ee8cc1Swenshuai.xi     MS_PHY u64YOffset;
5304*53ee8cc1Swenshuai.xi     u64YOffset = HAL_ReadByte(SUB_REG(VOP_JPG_YSTR0_L))&0xff;
5305*53ee8cc1Swenshuai.xi     u64YOffset |=((HAL_ReadByte(SUB_REG(VOP_JPG_YSTR0_L+1))<<8)&0xff00);
5306*53ee8cc1Swenshuai.xi     u64YOffset |=((HAL_ReadByte(SUB_REG(VOP_JPG_YSTR0_L+2))<<16)&0xff0000);
5307*53ee8cc1Swenshuai.xi     u64YOffset |= ((HAL_ReadByte(SUB_REG(VOP_JPG_YSTR0_L+3)) & VOP_YUV_STR_HIBITS) <<24);
5308*53ee8cc1Swenshuai.xi     return u64YOffset;
5309*53ee8cc1Swenshuai.xi }
5310*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubGetUVBaseAdd(void)5311*53ee8cc1Swenshuai.xi MS_PHY HAL_MVOP_SubGetUVBaseAdd(void)
5312*53ee8cc1Swenshuai.xi {
5313*53ee8cc1Swenshuai.xi     MS_PHY u64UVOffset;
5314*53ee8cc1Swenshuai.xi     u64UVOffset = HAL_ReadByte(SUB_REG(VOP_JPG_UVSTR0_L))&0xff;
5315*53ee8cc1Swenshuai.xi     u64UVOffset |=((HAL_ReadByte(SUB_REG(VOP_JPG_UVSTR0_L+1))<<8)&0xff00);
5316*53ee8cc1Swenshuai.xi     u64UVOffset |=((HAL_ReadByte(SUB_REG(VOP_JPG_UVSTR0_L+2))<<16)&0xff0000);
5317*53ee8cc1Swenshuai.xi     u64UVOffset |= ((HAL_ReadByte(SUB_REG(VOP_JPG_UVSTR0_L+3)) & VOP_YUV_STR_HIBITS) <<24);
5318*53ee8cc1Swenshuai.xi     return u64UVOffset;
5319*53ee8cc1Swenshuai.xi }
5320*53ee8cc1Swenshuai.xi 
5321*53ee8cc1Swenshuai.xi /******************************************************************************/
5322*53ee8cc1Swenshuai.xi /// Set MVOP Saving BW Mode
5323*53ee8cc1Swenshuai.xi /// @ Napoli this command should be set after MDrv_MVOP_SubSetOutputCfg
5324*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SubSet420BWSaveMode(MS_BOOL bEnable,MS_U16 u16ECOVersion)5325*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubSet420BWSaveMode(MS_BOOL bEnable, MS_U16 u16ECOVersion)
5326*53ee8cc1Swenshuai.xi {
5327*53ee8cc1Swenshuai.xi     UNUSED(u16ECOVersion);
5328*53ee8cc1Swenshuai.xi     MS_BOOL bValue = FALSE;
5329*53ee8cc1Swenshuai.xi 
5330*53ee8cc1Swenshuai.xi     //hw limtation: 3DLA/3DSBS/422/p mode in, i mode out/i mode in, p mode out(only need to check in MCU mode)
5331*53ee8cc1Swenshuai.xi     bValue = (g_pHalMVOPCtx->bSub3DLRAltSBSOutput || g_pHalMVOPCtx->bSub3DLRAltOutput/* || g_pHalMVOPCtx->bSub3DLRMode */|| g_pHalMVOPCtx->bSubIs422 );
5332*53ee8cc1Swenshuai.xi 
5333*53ee8cc1Swenshuai.xi     if(bValue)
5334*53ee8cc1Swenshuai.xi     {
5335*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s Hit the limitation of saving bw, disable BW Saving mode\n", __FUNCTION__);)
5336*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_DUMMY), 0, VOP_420_BW_SAVE);
5337*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_BW_SAVE), 0, VOP_420_BW_SAVE_EX);
5338*53ee8cc1Swenshuai.xi         HAL_MVOP_SubLoadReg();
5339*53ee8cc1Swenshuai.xi         return FALSE;
5340*53ee8cc1Swenshuai.xi     }
5341*53ee8cc1Swenshuai.xi     else
5342*53ee8cc1Swenshuai.xi     {
5343*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_DUMMY), bEnable, VOP_420_BW_SAVE);
5344*53ee8cc1Swenshuai.xi         if( g_pHalMVOPCtx->bSub3DLRMode == FALSE)
5345*53ee8cc1Swenshuai.xi         {
5346*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(SUB_REG(VOP_REG_BW_SAVE), bEnable, VOP_420_BW_SAVE_EX);
5347*53ee8cc1Swenshuai.xi         }
5348*53ee8cc1Swenshuai.xi         HAL_MVOP_SubLoadReg();
5349*53ee8cc1Swenshuai.xi         return TRUE;
5350*53ee8cc1Swenshuai.xi     }
5351*53ee8cc1Swenshuai.xi }
5352*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetEVDYUVBaseAdd(MVOP_EVDBaseAddInput * stEVDBaseAddInfo)5353*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubSetEVDYUVBaseAdd(MVOP_EVDBaseAddInput *stEVDBaseAddInfo)
5354*53ee8cc1Swenshuai.xi {
5355*53ee8cc1Swenshuai.xi     //----------------------------------------------------
5356*53ee8cc1Swenshuai.xi     // Set MSB YUV Address
5357*53ee8cc1Swenshuai.xi     //----------------------------------------------------
5358*53ee8cc1Swenshuai.xi 
5359*53ee8cc1Swenshuai.xi     MS_PHY u64tmp = 0;
5360*53ee8cc1Swenshuai.xi 
5361*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
5362*53ee8cc1Swenshuai.xi     {
5363*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
5364*53ee8cc1Swenshuai.xi         return FALSE;
5365*53ee8cc1Swenshuai.xi     }
5366*53ee8cc1Swenshuai.xi     // Y offset
5367*53ee8cc1Swenshuai.xi     u64tmp = stEVDBaseAddInfo->u32MSBYOffset >> 3;
5368*53ee8cc1Swenshuai.xi     if ( !stEVDBaseAddInfo->bProgressive)
5369*53ee8cc1Swenshuai.xi     {   //Refine Y offset for interlace repeat bottom field
5370*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
5371*53ee8cc1Swenshuai.xi         {
5372*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
5373*53ee8cc1Swenshuai.xi             u64tmp += 2;
5374*53ee8cc1Swenshuai.xi         }
5375*53ee8cc1Swenshuai.xi         else
5376*53ee8cc1Swenshuai.xi         {
5377*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is TOP or NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
5378*53ee8cc1Swenshuai.xi         }
5379*53ee8cc1Swenshuai.xi     }
5380*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_L), u64tmp & 0xff);
5381*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_L+1), (u64tmp >> 8) & 0xff);
5382*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_H), (u64tmp >> 16) & 0xff);
5383*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
5384*53ee8cc1Swenshuai.xi 
5385*53ee8cc1Swenshuai.xi     if (!stEVDBaseAddInfo->bProgressive )
5386*53ee8cc1Swenshuai.xi     {   //Y offset of bottom field if interlace
5387*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_YSTR1_L), u64tmp & 0xff);
5388*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_YSTR1_L+1), (u64tmp >> 8) & 0xff);
5389*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_YSTR1_H), (u64tmp >> 16) & 0xff);
5390*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_YSTR1_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
5391*53ee8cc1Swenshuai.xi     }
5392*53ee8cc1Swenshuai.xi 
5393*53ee8cc1Swenshuai.xi     if (stEVDBaseAddInfo->b422Pack)
5394*53ee8cc1Swenshuai.xi     {
5395*53ee8cc1Swenshuai.xi         stEVDBaseAddInfo->u32MSBUVOffset = stEVDBaseAddInfo->u32MSBYOffset + 16; //add 16 for 128bit; add 8 for 64bit
5396*53ee8cc1Swenshuai.xi     }
5397*53ee8cc1Swenshuai.xi     // UV offset
5398*53ee8cc1Swenshuai.xi     u64tmp = stEVDBaseAddInfo->u32MSBUVOffset >> 3;
5399*53ee8cc1Swenshuai.xi     if( !stEVDBaseAddInfo->bProgressive )
5400*53ee8cc1Swenshuai.xi     {  //Refine UV offset for interlace repeat bottom field
5401*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
5402*53ee8cc1Swenshuai.xi         {
5403*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
5404*53ee8cc1Swenshuai.xi             u64tmp += 2;
5405*53ee8cc1Swenshuai.xi         }
5406*53ee8cc1Swenshuai.xi         else
5407*53ee8cc1Swenshuai.xi         {
5408*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is TOP/NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
5409*53ee8cc1Swenshuai.xi         }
5410*53ee8cc1Swenshuai.xi     }
5411*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_L), u64tmp & 0xff);
5412*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_L+1), (u64tmp >> 8) & 0xff);
5413*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_H), (u64tmp >> 16) & 0xff);
5414*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
5415*53ee8cc1Swenshuai.xi 
5416*53ee8cc1Swenshuai.xi     if( !stEVDBaseAddInfo->bProgressive )
5417*53ee8cc1Swenshuai.xi     {  //UV offset of bottom field if interlace
5418*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR1_L), u64tmp & 0xff);
5419*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR1_L+1), (u64tmp >> 8) & 0xff);
5420*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR1_H), (u64tmp >> 16) & 0xff);
5421*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR1_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
5422*53ee8cc1Swenshuai.xi     }
5423*53ee8cc1Swenshuai.xi 
5424*53ee8cc1Swenshuai.xi     //----------------------------------------------------
5425*53ee8cc1Swenshuai.xi     // Set MSB YUV Address
5426*53ee8cc1Swenshuai.xi     //----------------------------------------------------
5427*53ee8cc1Swenshuai.xi     if(stEVDBaseAddInfo->bEnLSB)
5428*53ee8cc1Swenshuai.xi     {
5429*53ee8cc1Swenshuai.xi         //Enable LSB
5430*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_EVD_10B_EN), 1, VOP_EVD_10B_Y_EN);
5431*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_EVD_10B_EN), 1, VOP_EVD_10B_UV_EN);
5432*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_MASK), 0, VOP_LSB_REQ_MASK);
5433*53ee8cc1Swenshuai.xi 
5434*53ee8cc1Swenshuai.xi         // Y offset
5435*53ee8cc1Swenshuai.xi         u64tmp = stEVDBaseAddInfo->u32LSBYOffset >> 3;
5436*53ee8cc1Swenshuai.xi         if ( !stEVDBaseAddInfo->bProgressive)
5437*53ee8cc1Swenshuai.xi         {   //Refine Y offset for interlace repeat bottom field
5438*53ee8cc1Swenshuai.xi             if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
5439*53ee8cc1Swenshuai.xi             {
5440*53ee8cc1Swenshuai.xi                 MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
5441*53ee8cc1Swenshuai.xi                 u64tmp += 2;
5442*53ee8cc1Swenshuai.xi             }
5443*53ee8cc1Swenshuai.xi             else
5444*53ee8cc1Swenshuai.xi             {
5445*53ee8cc1Swenshuai.xi                 MVOP_DBG("%d eRepeatField(%x) is TOP or NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
5446*53ee8cc1Swenshuai.xi             }
5447*53ee8cc1Swenshuai.xi         }
5448*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_YSTR0_L), u64tmp & 0xff);
5449*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_YSTR0_L+1), (u64tmp >> 8) & 0xff);
5450*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_YSTR0_L), (u64tmp >> 16) & 0xff);
5451*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_YSTR0_L+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
5452*53ee8cc1Swenshuai.xi 
5453*53ee8cc1Swenshuai.xi         if (!stEVDBaseAddInfo->bProgressive )
5454*53ee8cc1Swenshuai.xi         {   //Y offset of bottom field if interlace
5455*53ee8cc1Swenshuai.xi             HAL_WriteByte(SUB_REG(VOP_LSB_YSTR1_L), u64tmp & 0xff);
5456*53ee8cc1Swenshuai.xi             HAL_WriteByte(SUB_REG(VOP_LSB_YSTR1_L+1), (u64tmp >> 8) & 0xff);
5457*53ee8cc1Swenshuai.xi             HAL_WriteByte(SUB_REG(VOP_LSB_YSTR1_H), (u64tmp >> 16) & 0xff);
5458*53ee8cc1Swenshuai.xi             HAL_WriteByte(SUB_REG(VOP_LSB_YSTR1_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
5459*53ee8cc1Swenshuai.xi         }
5460*53ee8cc1Swenshuai.xi 
5461*53ee8cc1Swenshuai.xi         if (stEVDBaseAddInfo->b422Pack)
5462*53ee8cc1Swenshuai.xi         {
5463*53ee8cc1Swenshuai.xi             stEVDBaseAddInfo->u32LSBUVOffset = stEVDBaseAddInfo->u32LSBYOffset + 16; //add 16 for 128bit; add 8 for 64bit
5464*53ee8cc1Swenshuai.xi         }
5465*53ee8cc1Swenshuai.xi         // UV offset
5466*53ee8cc1Swenshuai.xi         u64tmp = stEVDBaseAddInfo->u32LSBUVOffset >> 3;
5467*53ee8cc1Swenshuai.xi         if( !stEVDBaseAddInfo->bProgressive )
5468*53ee8cc1Swenshuai.xi         {  //Refine UV offset for interlace repeat bottom field
5469*53ee8cc1Swenshuai.xi             if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
5470*53ee8cc1Swenshuai.xi             {
5471*53ee8cc1Swenshuai.xi                 MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
5472*53ee8cc1Swenshuai.xi                 u64tmp += 2;
5473*53ee8cc1Swenshuai.xi             }
5474*53ee8cc1Swenshuai.xi             else
5475*53ee8cc1Swenshuai.xi             {
5476*53ee8cc1Swenshuai.xi                 MVOP_DBG("%d eRepeatField(%x) is TOP/NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
5477*53ee8cc1Swenshuai.xi             }
5478*53ee8cc1Swenshuai.xi         }
5479*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_UVSTR0_L), u64tmp & 0xff);
5480*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_UVSTR0_L+1), (u64tmp >> 8) & 0xff);
5481*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_UVSTR0_H), (u64tmp >> 16) & 0xff);
5482*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_UVSTR0_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
5483*53ee8cc1Swenshuai.xi 
5484*53ee8cc1Swenshuai.xi         if( !stEVDBaseAddInfo->bProgressive )
5485*53ee8cc1Swenshuai.xi         {  //UV offset of bottom field if interlace
5486*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_UVSTR1_L), u64tmp & 0xff);
5487*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_UVSTR1_L+1), (u64tmp >> 8) & 0xff);
5488*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_UVSTR1_H), (u64tmp >> 16) & 0xff);
5489*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_UVSTR1_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
5490*53ee8cc1Swenshuai.xi         }
5491*53ee8cc1Swenshuai.xi     }
5492*53ee8cc1Swenshuai.xi 
5493*53ee8cc1Swenshuai.xi     return TRUE;
5494*53ee8cc1Swenshuai.xi }
5495*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubCheckSTCCW(void)5496*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubCheckSTCCW(void)
5497*53ee8cc1Swenshuai.xi {
5498*53ee8cc1Swenshuai.xi     MS_U16 u16STC_CW_L = 0;
5499*53ee8cc1Swenshuai.xi     MS_U16 u16STC_CW_H = 0;
5500*53ee8cc1Swenshuai.xi 
5501*53ee8cc1Swenshuai.xi     MS_BOOL u16STC_CW_SEL = 0;
5502*53ee8cc1Swenshuai.xi     MS_BOOL u16TSP_CLK_EN = 0;
5503*53ee8cc1Swenshuai.xi 
5504*53ee8cc1Swenshuai.xi     u16STC_CW_L = HAL_Read2Byte(REG_STC1_CW_L)&0xffff;
5505*53ee8cc1Swenshuai.xi     u16STC_CW_H = HAL_Read2Byte(REG_STC1_CW_H)&0xffff;
5506*53ee8cc1Swenshuai.xi 
5507*53ee8cc1Swenshuai.xi     u16STC_CW_SEL = (HAL_ReadRegBit(REG_STC_CW_SLE_H, BIT1) == BIT1);
5508*53ee8cc1Swenshuai.xi     u16TSP_CLK_EN = !(HAL_ReadRegBit(REG_TSP_CLK, BIT0) == BIT0);
5509*53ee8cc1Swenshuai.xi 
5510*53ee8cc1Swenshuai.xi     if((((u16STC_CW_L || u16STC_CW_H) == 0) && (u16STC_CW_SEL == 0)) || ((u16STC_CW_SEL == 1) && (u16TSP_CLK_EN == 0)))
5511*53ee8cc1Swenshuai.xi         return FALSE;
5512*53ee8cc1Swenshuai.xi     else
5513*53ee8cc1Swenshuai.xi         return TRUE;
5514*53ee8cc1Swenshuai.xi 
5515*53ee8cc1Swenshuai.xi }
5516*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetVSyncMode(MS_U8 u8Mode)5517*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetVSyncMode(MS_U8 u8Mode)
5518*53ee8cc1Swenshuai.xi {
5519*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
5520*53ee8cc1Swenshuai.xi     {
5521*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
5522*53ee8cc1Swenshuai.xi         return;
5523*53ee8cc1Swenshuai.xi     }
5524*53ee8cc1Swenshuai.xi     if (1==u8Mode)
5525*53ee8cc1Swenshuai.xi     {
5526*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubNewVSyncMode = TRUE;
5527*53ee8cc1Swenshuai.xi     }
5528*53ee8cc1Swenshuai.xi     else
5529*53ee8cc1Swenshuai.xi     {
5530*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubNewVSyncMode = FALSE;
5531*53ee8cc1Swenshuai.xi     }
5532*53ee8cc1Swenshuai.xi }
5533*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSet3DLRAltOutput_VHalfScaling(MS_BOOL bEnable)5534*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubSet3DLRAltOutput_VHalfScaling(MS_BOOL bEnable)
5535*53ee8cc1Swenshuai.xi {
5536*53ee8cc1Swenshuai.xi     MS_BOOL bEnDualBuff = bEnable ? ENABLE : DISABLE;     //enable dual buffer
5537*53ee8cc1Swenshuai.xi     MS_BOOL bEnSWDualBuff = bEnable ? DISABLE : ENABLE;   //buffer controlled by HK instead of FW
5538*53ee8cc1Swenshuai.xi     MS_BOOL bEnMirrMaskBase = bEnable ? DISABLE : ENABLE; //do not mask LSB
5539*53ee8cc1Swenshuai.xi     MS_BOOL bEnHwFldBase = bEnable ? DISABLE : ENABLE;    //hardware calculate field jump base address
5540*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
5541*53ee8cc1Swenshuai.xi     {
5542*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
5543*53ee8cc1Swenshuai.xi         return FALSE;
5544*53ee8cc1Swenshuai.xi     }
5545*53ee8cc1Swenshuai.xi     //Set 0x27[2] = 1 (enable SW dual buffer mode)
5546*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), bEnDualBuff, VOP_BUF_DUAL);
5547*53ee8cc1Swenshuai.xi 
5548*53ee8cc1Swenshuai.xi     //Set 0x38[8] = 0 (use SW dual buffer mode)
5549*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_INFO_FROM_CODEC_H), bEnSWDualBuff, VOP_INFO_FROM_CODEC_DUAL_BUFF);
5550*53ee8cc1Swenshuai.xi 
5551*53ee8cc1Swenshuai.xi     //Set 0x3b[7] = 0 (use MVD/HVD firmware send base)
5552*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), bEnMirrMaskBase, VOP_MASK_BASE_LSB);
5553*53ee8cc1Swenshuai.xi 
5554*53ee8cc1Swenshuai.xi     //Set 0x3b[5] = 0 (hardware calculate field jump base address)
5555*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), bEnHwFldBase, VOP_HW_FLD_BASE);
5556*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSub3DLRAltOutput = bEnable;
5557*53ee8cc1Swenshuai.xi     return TRUE;
5558*53ee8cc1Swenshuai.xi }
5559*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSet3DLRAltOutput(MS_BOOL bEnable)5560*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubSet3DLRAltOutput(MS_BOOL bEnable)
5561*53ee8cc1Swenshuai.xi {
5562*53ee8cc1Swenshuai.xi     //Set 0x3C[2] = 1 (enable 3D L/R dual buffer line alternative output)
5563*53ee8cc1Swenshuai.xi     //it works when 0x3C[0] = 1
5564*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MULTI_WIN_CFG0), bEnable, VOP_LR_LA_OUT);
5565*53ee8cc1Swenshuai.xi     // bw saving not support: LA/SBS
5566*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_DUMMY), 0, VOP_420_BW_SAVE);
5567*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_BW_SAVE), 0, VOP_420_BW_SAVE_EX);
5568*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
5569*53ee8cc1Swenshuai.xi 
5570*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSub3DLRAltOutput = bEnable;
5571*53ee8cc1Swenshuai.xi     return TRUE;
5572*53ee8cc1Swenshuai.xi }
5573*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSet3DLRAltSBSOutput(MS_BOOL bEnable)5574*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubSet3DLRAltSBSOutput(MS_BOOL bEnable)
5575*53ee8cc1Swenshuai.xi {
5576*53ee8cc1Swenshuai.xi     //it works when 0x3C[0] = 1 and 0x3C[2] = 1
5577*53ee8cc1Swenshuai.xi     //Set 0x3C[3] = 1 (3D L/R line alternative read, side-by-side output)
5578*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MULTI_WIN_CFG0), bEnable, VOP_LR_LA2SBS_OUT);
5579*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSub3DLRAltSBSOutput = bEnable;
5580*53ee8cc1Swenshuai.xi     return TRUE;
5581*53ee8cc1Swenshuai.xi }
5582*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubGet3DLRAltOutput(void)5583*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubGet3DLRAltOutput(void)
5584*53ee8cc1Swenshuai.xi {
5585*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
5586*53ee8cc1Swenshuai.xi     {
5587*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
5588*53ee8cc1Swenshuai.xi         return FALSE;
5589*53ee8cc1Swenshuai.xi     }
5590*53ee8cc1Swenshuai.xi     return g_pHalMVOPCtx->bSub3DLRAltOutput;
5591*53ee8cc1Swenshuai.xi }
5592*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubGet3DLRAltSBSOutput(void)5593*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubGet3DLRAltSBSOutput(void)
5594*53ee8cc1Swenshuai.xi {
5595*53ee8cc1Swenshuai.xi     return g_pHalMVOPCtx->bSub3DLRAltSBSOutput;
5596*53ee8cc1Swenshuai.xi }
5597*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubGetOutput3DType(void)5598*53ee8cc1Swenshuai.xi EN_MVOP_Output_3D_TYPE HAL_MVOP_SubGetOutput3DType(void)
5599*53ee8cc1Swenshuai.xi {
5600*53ee8cc1Swenshuai.xi     EN_MVOP_Output_3D_TYPE en3DType = E_MVOP_OUTPUT_3D_NONE;
5601*53ee8cc1Swenshuai.xi     if(g_pHalMVOPCtx->bSub3DLRMode)
5602*53ee8cc1Swenshuai.xi     {
5603*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->bSub3DLRAltSBSOutput)
5604*53ee8cc1Swenshuai.xi         {
5605*53ee8cc1Swenshuai.xi             en3DType = E_MVOP_OUTPUT_3D_SBS;
5606*53ee8cc1Swenshuai.xi         }
5607*53ee8cc1Swenshuai.xi         else
5608*53ee8cc1Swenshuai.xi         {
5609*53ee8cc1Swenshuai.xi             en3DType = E_MVOP_OUTPUT_3D_TB;
5610*53ee8cc1Swenshuai.xi         }
5611*53ee8cc1Swenshuai.xi     }
5612*53ee8cc1Swenshuai.xi     else if(g_pHalMVOPCtx->bSub3DLRAltOutput)
5613*53ee8cc1Swenshuai.xi     {
5614*53ee8cc1Swenshuai.xi         en3DType = E_MVOP_OUTPUT_3D_LA;
5615*53ee8cc1Swenshuai.xi     }
5616*53ee8cc1Swenshuai.xi     return en3DType;
5617*53ee8cc1Swenshuai.xi }
5618*53ee8cc1Swenshuai.xi 
5619*53ee8cc1Swenshuai.xi 
5620*53ee8cc1Swenshuai.xi #endif
5621*53ee8cc1Swenshuai.xi 
5622*53ee8cc1Swenshuai.xi 
5623*53ee8cc1Swenshuai.xi #define MVOP_INT_UF BIT0
5624*53ee8cc1Swenshuai.xi #define MVOP_INT_OF BIT1
5625*53ee8cc1Swenshuai.xi #define MVOP_INT_VSYNC BIT2
5626*53ee8cc1Swenshuai.xi #define MVOP_INT_HSYNC BIT3
5627*53ee8cc1Swenshuai.xi #define MVOP_INT_RDY   BIT4
5628*53ee8cc1Swenshuai.xi #define MVOP_INT_FLD   BIT5
5629*53ee8cc1Swenshuai.xi #define MVOP_INT_ALL (BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0)
5630*53ee8cc1Swenshuai.xi 
5631*53ee8cc1Swenshuai.xi const MS_U16 u16MvopRegBase[2] = { MVOP_REG_BASE, MVOP_SUB_REG_BASE};
5632*53ee8cc1Swenshuai.xi #define MAP_REG(_id, _reg)        ((_reg) - MVOP_REG_BASE + u16MvopRegBase[(_id)])
5633*53ee8cc1Swenshuai.xi 
HAL_MVOP_IntEnableMask(MVOP_DevID eID,MS_U8 eIntType)5634*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_IntEnableMask(MVOP_DevID eID, MS_U8 eIntType)
5635*53ee8cc1Swenshuai.xi {
5636*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
5637*53ee8cc1Swenshuai.xi     MS_U16 u16Reg = MAP_REG( eID, VOP_INT_MASK);
5638*53ee8cc1Swenshuai.xi     MS_U8 u8Mask = 0;
5639*53ee8cc1Swenshuai.xi 
5640*53ee8cc1Swenshuai.xi     u8Mask = HAL_ReadByte(u16Reg);
5641*53ee8cc1Swenshuai.xi 
5642*53ee8cc1Swenshuai.xi     if (E_MVOP_INT_NONE != eIntType)
5643*53ee8cc1Swenshuai.xi     {
5644*53ee8cc1Swenshuai.xi         u8Mask = (E_MVOP_INT_VSYNC == (eIntType&E_MVOP_INT_VSYNC)) ?
5645*53ee8cc1Swenshuai.xi                  (u8Mask & ~MVOP_INT_VSYNC) : (u8Mask);
5646*53ee8cc1Swenshuai.xi         u8Mask = (E_MVOP_INT_HSYNC == (eIntType&E_MVOP_INT_HSYNC)) ?
5647*53ee8cc1Swenshuai.xi                  (u8Mask & ~MVOP_INT_HSYNC) : (u8Mask);
5648*53ee8cc1Swenshuai.xi         u8Mask = (E_MVOP_INT_FDCHNG == (eIntType&E_MVOP_INT_FDCHNG)) ?
5649*53ee8cc1Swenshuai.xi                  (u8Mask & ~MVOP_INT_FLD) : (u8Mask);
5650*53ee8cc1Swenshuai.xi         u8Mask = (E_MVOP_INT_RDY == (eIntType&E_MVOP_INT_RDY)) ?
5651*53ee8cc1Swenshuai.xi                  (u8Mask & ~MVOP_INT_RDY) : (u8Mask);
5652*53ee8cc1Swenshuai.xi         u8Mask = (E_MVOP_INT_BUFF_UF == (eIntType&E_MVOP_INT_BUFF_UF)) ?
5653*53ee8cc1Swenshuai.xi                  (u8Mask & ~MVOP_INT_UF) : (u8Mask);
5654*53ee8cc1Swenshuai.xi         u8Mask = (E_MVOP_INT_BUFF_OF == (eIntType&E_MVOP_INT_BUFF_OF)) ?
5655*53ee8cc1Swenshuai.xi                  (u8Mask & ~MVOP_INT_OF) : (u8Mask);
5656*53ee8cc1Swenshuai.xi     }
5657*53ee8cc1Swenshuai.xi     else    //mask all
5658*53ee8cc1Swenshuai.xi     {
5659*53ee8cc1Swenshuai.xi         u8Mask |= MVOP_INT_ALL;
5660*53ee8cc1Swenshuai.xi     }
5661*53ee8cc1Swenshuai.xi 
5662*53ee8cc1Swenshuai.xi     //MVOP_PRINTF("u8Mask %x ", u8Mask);
5663*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(u16Reg, u8Mask, MVOP_INT_ALL);
5664*53ee8cc1Swenshuai.xi     //u8Mask = HAL_ReadByte(u16Reg);
5665*53ee8cc1Swenshuai.xi     //MVOP_PRINTF("==> %x \n", u8Mask);
5666*53ee8cc1Swenshuai.xi     return bRet;
5667*53ee8cc1Swenshuai.xi }
5668*53ee8cc1Swenshuai.xi 
HAL_MVOP_IntGetStatus(MVOP_DevID eID)5669*53ee8cc1Swenshuai.xi MS_U8 HAL_MVOP_IntGetStatus(MVOP_DevID eID)
5670*53ee8cc1Swenshuai.xi {
5671*53ee8cc1Swenshuai.xi     MS_U8 u8IntVal = 0;
5672*53ee8cc1Swenshuai.xi     MS_U8 u8IntType = E_MVOP_INT_NONE;
5673*53ee8cc1Swenshuai.xi     MS_U16 u16Reg = MAP_REG(eID, (VOP_INT_MASK+1));
5674*53ee8cc1Swenshuai.xi 
5675*53ee8cc1Swenshuai.xi     u8IntVal = HAL_ReadByte(u16Reg) & MVOP_INT_ALL;
5676*53ee8cc1Swenshuai.xi     //MVOP_PRINTF("u8IntVal %x\n", u8IntVal);
5677*53ee8cc1Swenshuai.xi     if ((u8IntVal & MVOP_INT_VSYNC) == MVOP_INT_VSYNC)
5678*53ee8cc1Swenshuai.xi     {
5679*53ee8cc1Swenshuai.xi         u8IntType |= E_MVOP_INT_VSYNC;
5680*53ee8cc1Swenshuai.xi     }
5681*53ee8cc1Swenshuai.xi     if ((u8IntVal & MVOP_INT_HSYNC) == MVOP_INT_HSYNC)
5682*53ee8cc1Swenshuai.xi     {
5683*53ee8cc1Swenshuai.xi         u8IntType |= E_MVOP_INT_HSYNC;
5684*53ee8cc1Swenshuai.xi     }
5685*53ee8cc1Swenshuai.xi     if ((u8IntVal & MVOP_INT_FLD) == MVOP_INT_FLD)
5686*53ee8cc1Swenshuai.xi     {
5687*53ee8cc1Swenshuai.xi         u8IntType |= E_MVOP_INT_FDCHNG;
5688*53ee8cc1Swenshuai.xi     }
5689*53ee8cc1Swenshuai.xi     if ((u8IntVal & MVOP_INT_RDY) == MVOP_INT_RDY)
5690*53ee8cc1Swenshuai.xi     {
5691*53ee8cc1Swenshuai.xi         u8IntType |= E_MVOP_INT_RDY;
5692*53ee8cc1Swenshuai.xi     }
5693*53ee8cc1Swenshuai.xi     if ((u8IntVal & MVOP_INT_UF) == MVOP_INT_UF)
5694*53ee8cc1Swenshuai.xi     {
5695*53ee8cc1Swenshuai.xi         u8IntType |= E_MVOP_INT_BUFF_UF;
5696*53ee8cc1Swenshuai.xi     }
5697*53ee8cc1Swenshuai.xi     if ((u8IntVal & MVOP_INT_OF) == MVOP_INT_OF)
5698*53ee8cc1Swenshuai.xi     {
5699*53ee8cc1Swenshuai.xi         u8IntType |= E_MVOP_INT_BUFF_OF;
5700*53ee8cc1Swenshuai.xi     }
5701*53ee8cc1Swenshuai.xi     return u8IntType;
5702*53ee8cc1Swenshuai.xi }
5703*53ee8cc1Swenshuai.xi 
5704*53ee8cc1Swenshuai.xi #if 0
5705*53ee8cc1Swenshuai.xi void HAL_MVOP_SetStartX(MS_U16 u16Length)
5706*53ee8cc1Swenshuai.xi {
5707*53ee8cc1Swenshuai.xi     if(g_pHalMVOPCtx == NULL)
5708*53ee8cc1Swenshuai.xi     {
5709*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
5710*53ee8cc1Swenshuai.xi         return;
5711*53ee8cc1Swenshuai.xi     }
5712*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->g_u16SetStartX = u16Length;
5713*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_REG_CROP_HSTART, u16Length & 0xff);
5714*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_REG_CROP_HSTART + 1),((u16Length) >> (8)) & (0x1f));
5715*53ee8cc1Swenshuai.xi     // Write trigger
5716*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
5717*53ee8cc1Swenshuai.xi }
5718*53ee8cc1Swenshuai.xi 
5719*53ee8cc1Swenshuai.xi 
5720*53ee8cc1Swenshuai.xi void HAL_MVOP_SetStartY(MS_U16 u16Length, MS_BOOL bIs4Align)
5721*53ee8cc1Swenshuai.xi {
5722*53ee8cc1Swenshuai.xi     if(g_pHalMVOPCtx == NULL)
5723*53ee8cc1Swenshuai.xi     {
5724*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
5725*53ee8cc1Swenshuai.xi         return;
5726*53ee8cc1Swenshuai.xi     }
5727*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->g_u16SetStartY = u16Length;
5728*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->g_bIsY4Align = bIs4Align;
5729*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_REG_CROP_VSTART, u16Length & 0xff);
5730*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_REG_CROP_VSTART + 1), ((u16Length) >> (8)) & (0x1f));
5731*53ee8cc1Swenshuai.xi     // Write trigger
5732*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
5733*53ee8cc1Swenshuai.xi }
5734*53ee8cc1Swenshuai.xi 
5735*53ee8cc1Swenshuai.xi 
5736*53ee8cc1Swenshuai.xi void HAL_MVOP_SetPicWidthMinus(MS_U16 u16Sizes)
5737*53ee8cc1Swenshuai.xi {
5738*53ee8cc1Swenshuai.xi     if(g_pHalMVOPCtx == NULL)
5739*53ee8cc1Swenshuai.xi     {
5740*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
5741*53ee8cc1Swenshuai.xi         return;
5742*53ee8cc1Swenshuai.xi     }
5743*53ee8cc1Swenshuai.xi     if(u16Sizes == 0)
5744*53ee8cc1Swenshuai.xi     {
5745*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_REG_CROP_HSIZE, u16Sizes);
5746*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_REG_CROP_HSIZE + 1), u16Sizes);
5747*53ee8cc1Swenshuai.xi     }
5748*53ee8cc1Swenshuai.xi     else
5749*53ee8cc1Swenshuai.xi     {
5750*53ee8cc1Swenshuai.xi         u16Sizes = u16Sizes + 1 - g_pHalMVOPCtx->g_u16SetStartX ;
5751*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_REG_CROP_HSIZE, u16Sizes & 0xff);
5752*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_REG_CROP_HSIZE + 1), ((u16Sizes) >> (8)) & (0x1f));
5753*53ee8cc1Swenshuai.xi     }
5754*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->g_u16SetXSize= u16Sizes;
5755*53ee8cc1Swenshuai.xi     // Write trigger
5756*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
5757*53ee8cc1Swenshuai.xi }
5758*53ee8cc1Swenshuai.xi 
5759*53ee8cc1Swenshuai.xi void HAL_MVOP_SetPicHeightMinus(MS_U16 u16Sizes)
5760*53ee8cc1Swenshuai.xi {
5761*53ee8cc1Swenshuai.xi     MS_U32 u32YOffset=0;
5762*53ee8cc1Swenshuai.xi     MS_U32 u32UVOffset=0;
5763*53ee8cc1Swenshuai.xi     MS_BOOL bIsInterlace = 0;
5764*53ee8cc1Swenshuai.xi 
5765*53ee8cc1Swenshuai.xi     if(g_pHalMVOPCtx == NULL)
5766*53ee8cc1Swenshuai.xi     {
5767*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
5768*53ee8cc1Swenshuai.xi         return;
5769*53ee8cc1Swenshuai.xi     }
5770*53ee8cc1Swenshuai.xi 
5771*53ee8cc1Swenshuai.xi     if(u16Sizes == 0)
5772*53ee8cc1Swenshuai.xi     {
5773*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_REG_CROP_VSIZE, u16Sizes);
5774*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_REG_CROP_VSIZE + 1), u16Sizes);
5775*53ee8cc1Swenshuai.xi     }
5776*53ee8cc1Swenshuai.xi     else
5777*53ee8cc1Swenshuai.xi     {
5778*53ee8cc1Swenshuai.xi         u16Sizes = u16Sizes + 1 - g_pHalMVOPCtx->g_u16SetStartY ;
5779*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->g_bIsY4Align)
5780*53ee8cc1Swenshuai.xi             u16Sizes -= 2;
5781*53ee8cc1Swenshuai.xi 
5782*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_REG_CROP_VSIZE, (u16Sizes) & 0xff);
5783*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_REG_CROP_VSIZE + 1), ((u16Sizes) >> (8)) & (0x1f));
5784*53ee8cc1Swenshuai.xi     }
5785*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->g_u16SetYSize= u16Sizes;
5786*53ee8cc1Swenshuai.xi     //***********************************************************************************//
5787*53ee8cc1Swenshuai.xi     //@clippers crop sw patch
5788*53ee8cc1Swenshuai.xi     // Synchronization: video broken, looks like pitch incorrect.
5789*53ee8cc1Swenshuai.xi     // Hit condition: (g_pHalMVOPCtx->g_u16SetStartX%16)+(g_pHalMVOPCtx->g_u16SetXSize%16) > 16
5790*53ee8cc1Swenshuai.xi     // Fix: after monet
5791*53ee8cc1Swenshuai.xi     // Limitation: have to set MDrv_MVOP_SetImageWidthHight after:
5792*53ee8cc1Swenshuai.xi     // MDrv_MVOP_SetInputCfg / MDrv_MVOP_SetOutputCfg / MDrv_MVOP_SetBaseAdd / MDrv_MVOP_SetStartPos
5793*53ee8cc1Swenshuai.xi     //***********************************************************************************//
5794*53ee8cc1Swenshuai.xi     if((g_pHalMVOPCtx->g_u16SetXSize == 0) && (g_pHalMVOPCtx->g_u16SetYSize == 0))
5795*53ee8cc1Swenshuai.xi     {
5796*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_SINGLE_3D_L, 0, VOP_FORCE_SKIP);
5797*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_REG_SINGLE_3D_L, 0, VOP_SKIP_SIZE_LVIEW);
5798*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_REG_SINGLE_3D_H, 0, VOP_SKIP_SIZE_RVIEW);
5799*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_ENABLE_SKIP, 0, VOP_SKIP_LVIEW);
5800*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_ENABLE_SKIP, 0, VOP_SKIP_RVIEW);
5801*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->g_bIsSetCrop == TRUE)
5802*53ee8cc1Swenshuai.xi         {
5803*53ee8cc1Swenshuai.xi             u32YOffset = HAL_MVOP_GetYBaseAdd() +4;
5804*53ee8cc1Swenshuai.xi             u32UVOffset = HAL_MVOP_GetUVBaseAdd() +4;
5805*53ee8cc1Swenshuai.xi             bIsInterlace = HAL_ReadRegBit(VOP_CTRL0, BIT7);
5806*53ee8cc1Swenshuai.xi             HAL_MVOP_SetYUVBaseAdd(u32YOffset<<3, u32UVOffset<<3, !bIsInterlace,g_pHalMVOPCtx->bIs422);
5807*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->g_bIsSetCrop = FALSE;
5808*53ee8cc1Swenshuai.xi         }
5809*53ee8cc1Swenshuai.xi         HAL_MVOP_LoadReg();
5810*53ee8cc1Swenshuai.xi         return;
5811*53ee8cc1Swenshuai.xi     }
5812*53ee8cc1Swenshuai.xi     MVOP_DBG("[Warning] clippers crop may hit hw bug: g_u16SetStartX = %d, g_u16SetXSize = %d\n",g_pHalMVOPCtx->g_u16SetStartX,g_pHalMVOPCtx->g_u16SetXSize);
5813*53ee8cc1Swenshuai.xi     if(((g_pHalMVOPCtx->g_u16SetStartX%16)+(g_pHalMVOPCtx->g_u16SetXSize%16) > 16) && (g_pHalMVOPCtx->bIs422))
5814*53ee8cc1Swenshuai.xi     {
5815*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_SINGLE_3D_L, 1, VOP_FORCE_SKIP);
5816*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_REG_SINGLE_3D_L, (g_pHalMVOPCtx->g_u16SetStartX%16), VOP_SKIP_SIZE_LVIEW);
5817*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_REG_SINGLE_3D_H, (g_pHalMVOPCtx->g_u16SetStartX%16), VOP_SKIP_SIZE_RVIEW);
5818*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_ENABLE_SKIP, 1, VOP_SKIP_LVIEW);
5819*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_ENABLE_SKIP, 1, VOP_SKIP_RVIEW);
5820*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->g_bIsSetCrop == FALSE)
5821*53ee8cc1Swenshuai.xi         {
5822*53ee8cc1Swenshuai.xi             u32YOffset = HAL_MVOP_GetYBaseAdd();
5823*53ee8cc1Swenshuai.xi             u32UVOffset = HAL_MVOP_GetUVBaseAdd();
5824*53ee8cc1Swenshuai.xi             if((u32YOffset < 4) || (u32UVOffset < 4))
5825*53ee8cc1Swenshuai.xi                 return;
5826*53ee8cc1Swenshuai.xi 
5827*53ee8cc1Swenshuai.xi             u32YOffset -= 4;
5828*53ee8cc1Swenshuai.xi             u32UVOffset -= 4;
5829*53ee8cc1Swenshuai.xi             bIsInterlace = HAL_ReadRegBit(VOP_CTRL0, BIT7);
5830*53ee8cc1Swenshuai.xi             HAL_MVOP_SetYUVBaseAdd(u32YOffset<<3, u32UVOffset<<3, !bIsInterlace,g_pHalMVOPCtx->bIs422);
5831*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->g_bIsSetCrop = TRUE;
5832*53ee8cc1Swenshuai.xi         }
5833*53ee8cc1Swenshuai.xi     }
5834*53ee8cc1Swenshuai.xi     // Write trigger
5835*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
5836*53ee8cc1Swenshuai.xi }
5837*53ee8cc1Swenshuai.xi #endif
HAL_MVOP_MaskDBRegCtrl(MVOP_DevID eID,MS_BOOL bEnable,MVOPMSAKDBREGCTRL eModeCtrl)5838*53ee8cc1Swenshuai.xi void HAL_MVOP_MaskDBRegCtrl(MVOP_DevID eID, MS_BOOL bEnable ,MVOPMSAKDBREGCTRL eModeCtrl)
5839*53ee8cc1Swenshuai.xi {
5840*53ee8cc1Swenshuai.xi     MS_U8 regval;
5841*53ee8cc1Swenshuai.xi     MS_U8 u8Arg;
5842*53ee8cc1Swenshuai.xi 
5843*53ee8cc1Swenshuai.xi     if (eModeCtrl> E_MVOP_INV_OP_VS)
5844*53ee8cc1Swenshuai.xi     {
5845*53ee8cc1Swenshuai.xi         return;
5846*53ee8cc1Swenshuai.xi     }
5847*53ee8cc1Swenshuai.xi     #if 0
5848*53ee8cc1Swenshuai.xi     else if (eModeCtrl >= E_MVOP_CHKSUM_422_SWAP)
5849*53ee8cc1Swenshuai.xi     {
5850*53ee8cc1Swenshuai.xi         regval = HAL_ReadByte(MVOP_MASK_DB_REG1);
5851*53ee8cc1Swenshuai.xi     }
5852*53ee8cc1Swenshuai.xi     else
5853*53ee8cc1Swenshuai.xi     {
5854*53ee8cc1Swenshuai.xi         regval = HAL_ReadByte(MVOP_MASK_DB_REG0);
5855*53ee8cc1Swenshuai.xi     }
5856*53ee8cc1Swenshuai.xi     #endif
5857*53ee8cc1Swenshuai.xi 
5858*53ee8cc1Swenshuai.xi     switch(eID)
5859*53ee8cc1Swenshuai.xi     {
5860*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
5861*53ee8cc1Swenshuai.xi         {
5862*53ee8cc1Swenshuai.xi             switch(eModeCtrl)
5863*53ee8cc1Swenshuai.xi             {
5864*53ee8cc1Swenshuai.xi                 case E_MVOP_MASK_DB_REG:
5865*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_MASK_DB_REG;
5866*53ee8cc1Swenshuai.xi                     break;
5867*53ee8cc1Swenshuai.xi                 case E_MVOP_EN_DB_REG:
5868*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_EN_DB_REG;
5869*53ee8cc1Swenshuai.xi                     break;
5870*53ee8cc1Swenshuai.xi                 case E_MVOP_DEBUG_SEL:
5871*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_DEBUG_SEL;
5872*53ee8cc1Swenshuai.xi                     break;
5873*53ee8cc1Swenshuai.xi                 case E_MVOP_UPDATE_SEL:
5874*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_UPDATE_SEL;
5875*53ee8cc1Swenshuai.xi                     break;
5876*53ee8cc1Swenshuai.xi                 case E_MVOP_RST_START_SEL:
5877*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_RST_START_SEL;
5878*53ee8cc1Swenshuai.xi                     break;
5879*53ee8cc1Swenshuai.xi                 case E_MVOP_SC_VSYNC_SEL:
5880*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_SC_VSYNC_SEL;
5881*53ee8cc1Swenshuai.xi                     break;
5882*53ee8cc1Swenshuai.xi                 case E_MVOP_READ_IP_BASE_SEL:
5883*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_READ_IP_BASE_SEL;
5884*53ee8cc1Swenshuai.xi                     break;
5885*53ee8cc1Swenshuai.xi                 case E_MVOP_CHKSUM_422_SWAP:
5886*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_CHKSUM_422_SWAP;
5887*53ee8cc1Swenshuai.xi                     break;
5888*53ee8cc1Swenshuai.xi                 case E_MVOP_CHKSUM_FULL_C:
5889*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_CHKSUM_FULL_C;
5890*53ee8cc1Swenshuai.xi                     break;
5891*53ee8cc1Swenshuai.xi                 case E_MVOP_OFF_LATCH_CRC:
5892*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_OFF_LATCH_CRC;
5893*53ee8cc1Swenshuai.xi                     break;
5894*53ee8cc1Swenshuai.xi                 case E_MVOP_SEL_OP_FIELD:
5895*53ee8cc1Swenshuai.xi                 {
5896*53ee8cc1Swenshuai.xi                     u8Arg = VOP_MVD_VS_MD;
5897*53ee8cc1Swenshuai.xi                     regval = HAL_ReadByte(VOP_CTRL0);
5898*53ee8cc1Swenshuai.xi                     if ( bEnable )
5899*53ee8cc1Swenshuai.xi                     {
5900*53ee8cc1Swenshuai.xi                         regval &= ~u8Arg;
5901*53ee8cc1Swenshuai.xi                     }
5902*53ee8cc1Swenshuai.xi                     else
5903*53ee8cc1Swenshuai.xi                     {
5904*53ee8cc1Swenshuai.xi                         regval |= u8Arg;
5905*53ee8cc1Swenshuai.xi                     }
5906*53ee8cc1Swenshuai.xi                     HAL_WriteByte(VOP_CTRL0, regval);
5907*53ee8cc1Swenshuai.xi 
5908*53ee8cc1Swenshuai.xi                     u8Arg = VOP_RGB_FILED_BYPASS;
5909*53ee8cc1Swenshuai.xi                     regval = HAL_ReadByte(VOP_REG_DUMMY_3D_1);
5910*53ee8cc1Swenshuai.xi                     if ( bEnable )
5911*53ee8cc1Swenshuai.xi                     {
5912*53ee8cc1Swenshuai.xi                         regval &= ~u8Arg;
5913*53ee8cc1Swenshuai.xi                     }
5914*53ee8cc1Swenshuai.xi                     else
5915*53ee8cc1Swenshuai.xi                     {
5916*53ee8cc1Swenshuai.xi                         regval |= u8Arg;
5917*53ee8cc1Swenshuai.xi                     }
5918*53ee8cc1Swenshuai.xi                     HAL_WriteByte(VOP_REG_DUMMY_3D_1, regval);
5919*53ee8cc1Swenshuai.xi                     //xc use bob mode(only use one field de-interlace)
5920*53ee8cc1Swenshuai.xi                     // xc receive top/bot toggle signal, but only one field
5921*53ee8cc1Swenshuai.xi                     #if 0
5922*53ee8cc1Swenshuai.xi                     // xc receive top/bot toggle signal, but only one field
5923*53ee8cc1Swenshuai.xi                     u8Arg = VOP_REF_SELF_FLD;
5924*53ee8cc1Swenshuai.xi                     regval = HAL_ReadByte(VOP_MIRROR_CFG_HI);
5925*53ee8cc1Swenshuai.xi                     if ( bEnable )
5926*53ee8cc1Swenshuai.xi                     {
5927*53ee8cc1Swenshuai.xi                         regval |= u8Arg;
5928*53ee8cc1Swenshuai.xi                     }
5929*53ee8cc1Swenshuai.xi                     else
5930*53ee8cc1Swenshuai.xi                     {
5931*53ee8cc1Swenshuai.xi                         regval &= ~u8Arg;
5932*53ee8cc1Swenshuai.xi                     }
5933*53ee8cc1Swenshuai.xi                     HAL_WriteByte(VOP_MIRROR_CFG_HI, regval);
5934*53ee8cc1Swenshuai.xi                     //if hardwired mode
5935*53ee8cc1Swenshuai.xi                     if(BIT2 != HAL_ReadRegBit(VOP_MPG_JPG_SWITCH, BIT2))
5936*53ee8cc1Swenshuai.xi                     {
5937*53ee8cc1Swenshuai.xi                         if ( bEnable )
5938*53ee8cc1Swenshuai.xi                         {
5939*53ee8cc1Swenshuai.xi                             HAL_WriteRegBit(VOP_INFO_FROM_CODEC_L, 0, VOP_INFO_FROM_CODEC_FIELD);
5940*53ee8cc1Swenshuai.xi                         }
5941*53ee8cc1Swenshuai.xi                         else
5942*53ee8cc1Swenshuai.xi                         {
5943*53ee8cc1Swenshuai.xi                             HAL_WriteRegBit(VOP_INFO_FROM_CODEC_L, 1, VOP_INFO_FROM_CODEC_FIELD);
5944*53ee8cc1Swenshuai.xi                         }
5945*53ee8cc1Swenshuai.xi                     }
5946*53ee8cc1Swenshuai.xi                     #endif
5947*53ee8cc1Swenshuai.xi                     HAL_MVOP_LoadReg();
5948*53ee8cc1Swenshuai.xi                     break;
5949*53ee8cc1Swenshuai.xi                 }
5950*53ee8cc1Swenshuai.xi                 case E_MVOP_INV_OP_FIELD:
5951*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_INV_OP_FIELD;
5952*53ee8cc1Swenshuai.xi                     break;
5953*53ee8cc1Swenshuai.xi                 case E_MVOP_INV_OP_VS:
5954*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_INV_OP_VS;
5955*53ee8cc1Swenshuai.xi                     break;
5956*53ee8cc1Swenshuai.xi                 default:
5957*53ee8cc1Swenshuai.xi                     //u8Arg = 0x0;
5958*53ee8cc1Swenshuai.xi                     break;
5959*53ee8cc1Swenshuai.xi 
5960*53ee8cc1Swenshuai.xi             }
5961*53ee8cc1Swenshuai.xi             break;
5962*53ee8cc1Swenshuai.xi         }
5963*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
5964*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
5965*53ee8cc1Swenshuai.xi         {
5966*53ee8cc1Swenshuai.xi             switch(eModeCtrl)
5967*53ee8cc1Swenshuai.xi             {
5968*53ee8cc1Swenshuai.xi                 case E_MVOP_MASK_DB_REG:
5969*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_MASK_DB_REG;
5970*53ee8cc1Swenshuai.xi                     break;
5971*53ee8cc1Swenshuai.xi                 case E_MVOP_EN_DB_REG:
5972*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_EN_DB_REG;
5973*53ee8cc1Swenshuai.xi                     break;
5974*53ee8cc1Swenshuai.xi                 case E_MVOP_DEBUG_SEL:
5975*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_DEBUG_SEL;
5976*53ee8cc1Swenshuai.xi                     break;
5977*53ee8cc1Swenshuai.xi                 case E_MVOP_UPDATE_SEL:
5978*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_UPDATE_SEL;
5979*53ee8cc1Swenshuai.xi                     break;
5980*53ee8cc1Swenshuai.xi                 case E_MVOP_RST_START_SEL:
5981*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_RST_START_SEL;
5982*53ee8cc1Swenshuai.xi                     break;
5983*53ee8cc1Swenshuai.xi                 case E_MVOP_SC_VSYNC_SEL:
5984*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_SC_VSYNC_SEL;
5985*53ee8cc1Swenshuai.xi                     break;
5986*53ee8cc1Swenshuai.xi                 case E_MVOP_READ_IP_BASE_SEL:
5987*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_READ_IP_BASE_SEL;
5988*53ee8cc1Swenshuai.xi                     break;
5989*53ee8cc1Swenshuai.xi                 case E_MVOP_CHKSUM_422_SWAP:
5990*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_CHKSUM_422_SWAP;
5991*53ee8cc1Swenshuai.xi                     break;
5992*53ee8cc1Swenshuai.xi                 case E_MVOP_CHKSUM_FULL_C:
5993*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_CHKSUM_FULL_C;
5994*53ee8cc1Swenshuai.xi                     break;
5995*53ee8cc1Swenshuai.xi                 case E_MVOP_OFF_LATCH_CRC:
5996*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_OFF_LATCH_CRC;
5997*53ee8cc1Swenshuai.xi                     break;
5998*53ee8cc1Swenshuai.xi                 case E_MVOP_SEL_OP_FIELD:
5999*53ee8cc1Swenshuai.xi                 {
6000*53ee8cc1Swenshuai.xi                     u8Arg = VOP_MVD_VS_MD;
6001*53ee8cc1Swenshuai.xi                     regval = HAL_ReadByte(SUB_REG(VOP_CTRL0));
6002*53ee8cc1Swenshuai.xi                     if ( bEnable )
6003*53ee8cc1Swenshuai.xi                     {
6004*53ee8cc1Swenshuai.xi                         regval &= ~u8Arg;
6005*53ee8cc1Swenshuai.xi                     }
6006*53ee8cc1Swenshuai.xi                     else
6007*53ee8cc1Swenshuai.xi                     {
6008*53ee8cc1Swenshuai.xi                         regval |= u8Arg;
6009*53ee8cc1Swenshuai.xi                     }
6010*53ee8cc1Swenshuai.xi                     HAL_WriteByte(SUB_REG(VOP_CTRL0), regval);
6011*53ee8cc1Swenshuai.xi 
6012*53ee8cc1Swenshuai.xi                     u8Arg = VOP_RGB_FILED_BYPASS;
6013*53ee8cc1Swenshuai.xi                     regval = HAL_ReadByte(SUB_REG(VOP_REG_DUMMY_3D_1));
6014*53ee8cc1Swenshuai.xi                     if ( bEnable )
6015*53ee8cc1Swenshuai.xi                     {
6016*53ee8cc1Swenshuai.xi                         regval &= ~u8Arg;
6017*53ee8cc1Swenshuai.xi                     }
6018*53ee8cc1Swenshuai.xi                     else
6019*53ee8cc1Swenshuai.xi                     {
6020*53ee8cc1Swenshuai.xi                         regval |= u8Arg;
6021*53ee8cc1Swenshuai.xi                     }
6022*53ee8cc1Swenshuai.xi                     HAL_WriteByte(SUB_REG(VOP_REG_DUMMY_3D_1), regval);
6023*53ee8cc1Swenshuai.xi                     //xc use bob mode(only use one field de-interlace)
6024*53ee8cc1Swenshuai.xi                     // xc receive top/bot toggle signal, but only one field
6025*53ee8cc1Swenshuai.xi                     #if 0
6026*53ee8cc1Swenshuai.xi                     // xc receive top/bot toggle signal, but only one field
6027*53ee8cc1Swenshuai.xi                     u8Arg = VOP_REF_SELF_FLD;
6028*53ee8cc1Swenshuai.xi                     regval = HAL_ReadByte(VOP_MIRROR_CFG_HI);
6029*53ee8cc1Swenshuai.xi                     if ( bEnable )
6030*53ee8cc1Swenshuai.xi                     {
6031*53ee8cc1Swenshuai.xi                         regval |= u8Arg;
6032*53ee8cc1Swenshuai.xi                     }
6033*53ee8cc1Swenshuai.xi                     else
6034*53ee8cc1Swenshuai.xi                     {
6035*53ee8cc1Swenshuai.xi                         regval &= ~u8Arg;
6036*53ee8cc1Swenshuai.xi                     }
6037*53ee8cc1Swenshuai.xi                     HAL_WriteByte(VOP_MIRROR_CFG_HI, regval);
6038*53ee8cc1Swenshuai.xi                     //if hardwired mode
6039*53ee8cc1Swenshuai.xi                     if(BIT2 != HAL_ReadRegBit(VOP_MPG_JPG_SWITCH, BIT2))
6040*53ee8cc1Swenshuai.xi                     {
6041*53ee8cc1Swenshuai.xi                         if ( bEnable )
6042*53ee8cc1Swenshuai.xi                         {
6043*53ee8cc1Swenshuai.xi                             HAL_WriteRegBit(VOP_INFO_FROM_CODEC_L, 0, VOP_INFO_FROM_CODEC_FIELD);
6044*53ee8cc1Swenshuai.xi                         }
6045*53ee8cc1Swenshuai.xi                         else
6046*53ee8cc1Swenshuai.xi                         {
6047*53ee8cc1Swenshuai.xi                             HAL_WriteRegBit(VOP_INFO_FROM_CODEC_L, 1, VOP_INFO_FROM_CODEC_FIELD);
6048*53ee8cc1Swenshuai.xi                         }
6049*53ee8cc1Swenshuai.xi                     }
6050*53ee8cc1Swenshuai.xi                     #endif
6051*53ee8cc1Swenshuai.xi                     HAL_MVOP_SubLoadReg();
6052*53ee8cc1Swenshuai.xi                     break;
6053*53ee8cc1Swenshuai.xi                 }
6054*53ee8cc1Swenshuai.xi                 case E_MVOP_INV_OP_FIELD:
6055*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_INV_OP_FIELD;
6056*53ee8cc1Swenshuai.xi                     break;
6057*53ee8cc1Swenshuai.xi                 case E_MVOP_INV_OP_VS:
6058*53ee8cc1Swenshuai.xi                     //u8Arg = MVOP_INV_OP_VS;
6059*53ee8cc1Swenshuai.xi                     break;
6060*53ee8cc1Swenshuai.xi                 default:
6061*53ee8cc1Swenshuai.xi                     //u8Arg = 0x0;
6062*53ee8cc1Swenshuai.xi                     break;
6063*53ee8cc1Swenshuai.xi 
6064*53ee8cc1Swenshuai.xi             }
6065*53ee8cc1Swenshuai.xi             break;
6066*53ee8cc1Swenshuai.xi         }
6067*53ee8cc1Swenshuai.xi #endif
6068*53ee8cc1Swenshuai.xi         default:
6069*53ee8cc1Swenshuai.xi             break;
6070*53ee8cc1Swenshuai.xi     }
6071*53ee8cc1Swenshuai.xi     #if 0
6072*53ee8cc1Swenshuai.xi     if ( bEnable )
6073*53ee8cc1Swenshuai.xi     {
6074*53ee8cc1Swenshuai.xi         regval |= u8Arg;
6075*53ee8cc1Swenshuai.xi     }
6076*53ee8cc1Swenshuai.xi     else
6077*53ee8cc1Swenshuai.xi     {
6078*53ee8cc1Swenshuai.xi         regval &= ~u8Arg;
6079*53ee8cc1Swenshuai.xi     }
6080*53ee8cc1Swenshuai.xi     if (eModeCtrl >= E_MVOP_CHKSUM_422_SWAP)
6081*53ee8cc1Swenshuai.xi     {
6082*53ee8cc1Swenshuai.xi         HAL_WriteByte(MVOP_MASK_DB_REG1, regval);
6083*53ee8cc1Swenshuai.xi     }
6084*53ee8cc1Swenshuai.xi     else
6085*53ee8cc1Swenshuai.xi     {
6086*53ee8cc1Swenshuai.xi         HAL_WriteByte(MVOP_MASK_DB_REG0, regval);
6087*53ee8cc1Swenshuai.xi     }
6088*53ee8cc1Swenshuai.xi     #endif
6089*53ee8cc1Swenshuai.xi 
6090*53ee8cc1Swenshuai.xi 
6091*53ee8cc1Swenshuai.xi }
6092*53ee8cc1Swenshuai.xi 
6093*53ee8cc1Swenshuai.xi 
6094*53ee8cc1Swenshuai.xi  //patch for Kappa
HAL_MVOP_SetDeb2MVDFrameModeCtrl(MVOP_DevID eID,MS_BOOL bEnable,MVOPDEB2MVDFRAMECTRL eModeCtrl)6095*53ee8cc1Swenshuai.xi void HAL_MVOP_SetDeb2MVDFrameModeCtrl(MVOP_DevID eID, MS_BOOL bEnable, MVOPDEB2MVDFRAMECTRL eModeCtrl)
6096*53ee8cc1Swenshuai.xi {
6097*53ee8cc1Swenshuai.xi     MS_U8 regval;
6098*53ee8cc1Swenshuai.xi     MS_U8 u8Arg;
6099*53ee8cc1Swenshuai.xi 
6100*53ee8cc1Swenshuai.xi     switch(eID)
6101*53ee8cc1Swenshuai.xi     {
6102*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
6103*53ee8cc1Swenshuai.xi         {
6104*53ee8cc1Swenshuai.xi             regval = HAL_ReadByte(VOP_INFO_FROM_CODEC_L);
6105*53ee8cc1Swenshuai.xi             switch (eModeCtrl)
6106*53ee8cc1Swenshuai.xi             {
6107*53ee8cc1Swenshuai.xi                 case E_MVOP_DEB2MVD_FRAME_MODE:
6108*53ee8cc1Swenshuai.xi                     u8Arg = 0x0;
6109*53ee8cc1Swenshuai.xi                     break;
6110*53ee8cc1Swenshuai.xi                 case E_MVOP_DEB2MVD_FIELD_INV:
6111*53ee8cc1Swenshuai.xi                     u8Arg = 0x0;
6112*53ee8cc1Swenshuai.xi                     break;
6113*53ee8cc1Swenshuai.xi                 case E_MVOP_SIZE_FROM_MVD:
6114*53ee8cc1Swenshuai.xi                     u8Arg = VOP_INFO_FROM_CODEC_SIZE;
6115*53ee8cc1Swenshuai.xi                     if (bEnable)
6116*53ee8cc1Swenshuai.xi                     {
6117*53ee8cc1Swenshuai.xi                         //crop = 0, then size could be from vdec.
6118*53ee8cc1Swenshuai.xi                         HAL_MVOP_SetPicWidthMinus(E_MVOP_DEV_0, 0, 0);
6119*53ee8cc1Swenshuai.xi                         HAL_MVOP_SetPicHeightMinus(E_MVOP_DEV_0, 0, 0);
6120*53ee8cc1Swenshuai.xi                     }
6121*53ee8cc1Swenshuai.xi                     break;
6122*53ee8cc1Swenshuai.xi                 case E_MVOP_SEQ_FROM_MVD:
6123*53ee8cc1Swenshuai.xi                     u8Arg = 0x0;
6124*53ee8cc1Swenshuai.xi                     break;
6125*53ee8cc1Swenshuai.xi                 default:
6126*53ee8cc1Swenshuai.xi                     u8Arg = 0x0;
6127*53ee8cc1Swenshuai.xi                     break;
6128*53ee8cc1Swenshuai.xi             }
6129*53ee8cc1Swenshuai.xi 
6130*53ee8cc1Swenshuai.xi             if (bEnable)
6131*53ee8cc1Swenshuai.xi             {
6132*53ee8cc1Swenshuai.xi                 regval |= u8Arg;
6133*53ee8cc1Swenshuai.xi             }
6134*53ee8cc1Swenshuai.xi             else
6135*53ee8cc1Swenshuai.xi             {
6136*53ee8cc1Swenshuai.xi                 regval &= ~u8Arg;
6137*53ee8cc1Swenshuai.xi             }
6138*53ee8cc1Swenshuai.xi 
6139*53ee8cc1Swenshuai.xi             HAL_WriteByte(VOP_INFO_FROM_CODEC_L, regval);
6140*53ee8cc1Swenshuai.xi 
6141*53ee8cc1Swenshuai.xi             // Write trigger
6142*53ee8cc1Swenshuai.xi             HAL_MVOP_LoadReg();
6143*53ee8cc1Swenshuai.xi         }
6144*53ee8cc1Swenshuai.xi         break;
6145*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
6146*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
6147*53ee8cc1Swenshuai.xi         {
6148*53ee8cc1Swenshuai.xi             regval = HAL_ReadByte(SUB_REG(VOP_INFO_FROM_CODEC_L));
6149*53ee8cc1Swenshuai.xi             switch (eModeCtrl)
6150*53ee8cc1Swenshuai.xi             {
6151*53ee8cc1Swenshuai.xi                 case E_MVOP_DEB2MVD_FRAME_MODE:
6152*53ee8cc1Swenshuai.xi                     u8Arg = 0x0;
6153*53ee8cc1Swenshuai.xi                     break;
6154*53ee8cc1Swenshuai.xi                 case E_MVOP_DEB2MVD_FIELD_INV:
6155*53ee8cc1Swenshuai.xi                     u8Arg = 0x0;
6156*53ee8cc1Swenshuai.xi                     break;
6157*53ee8cc1Swenshuai.xi                 case E_MVOP_SIZE_FROM_MVD:
6158*53ee8cc1Swenshuai.xi                     u8Arg = VOP_INFO_FROM_CODEC_SIZE;
6159*53ee8cc1Swenshuai.xi                     if (bEnable)
6160*53ee8cc1Swenshuai.xi                     {
6161*53ee8cc1Swenshuai.xi                         //crop = 0, then size could be from vdec.
6162*53ee8cc1Swenshuai.xi                         HAL_MVOP_SetPicWidthMinus(SUB_REG(E_MVOP_DEV_0), 0, 0);
6163*53ee8cc1Swenshuai.xi                         HAL_MVOP_SetPicHeightMinus(SUB_REG(E_MVOP_DEV_0), 0, 0);
6164*53ee8cc1Swenshuai.xi                     }
6165*53ee8cc1Swenshuai.xi                     break;
6166*53ee8cc1Swenshuai.xi                 case E_MVOP_SEQ_FROM_MVD:
6167*53ee8cc1Swenshuai.xi                     u8Arg = 0x0;
6168*53ee8cc1Swenshuai.xi                     break;
6169*53ee8cc1Swenshuai.xi                 default:
6170*53ee8cc1Swenshuai.xi                     u8Arg = 0x0;
6171*53ee8cc1Swenshuai.xi                     break;
6172*53ee8cc1Swenshuai.xi             }
6173*53ee8cc1Swenshuai.xi 
6174*53ee8cc1Swenshuai.xi             if (bEnable)
6175*53ee8cc1Swenshuai.xi             {
6176*53ee8cc1Swenshuai.xi                 regval |= u8Arg;
6177*53ee8cc1Swenshuai.xi             }
6178*53ee8cc1Swenshuai.xi             else
6179*53ee8cc1Swenshuai.xi             {
6180*53ee8cc1Swenshuai.xi                 regval &= ~u8Arg;
6181*53ee8cc1Swenshuai.xi             }
6182*53ee8cc1Swenshuai.xi 
6183*53ee8cc1Swenshuai.xi             HAL_WriteByte(SUB_REG(VOP_INFO_FROM_CODEC_L), regval);
6184*53ee8cc1Swenshuai.xi 
6185*53ee8cc1Swenshuai.xi             // Write trigger
6186*53ee8cc1Swenshuai.xi             HAL_MVOP_SubLoadReg();
6187*53ee8cc1Swenshuai.xi         }
6188*53ee8cc1Swenshuai.xi         break;
6189*53ee8cc1Swenshuai.xi #endif
6190*53ee8cc1Swenshuai.xi         default:
6191*53ee8cc1Swenshuai.xi             break;
6192*53ee8cc1Swenshuai.xi     }
6193*53ee8cc1Swenshuai.xi 
6194*53ee8cc1Swenshuai.xi }
6195*53ee8cc1Swenshuai.xi 
6196*53ee8cc1Swenshuai.xi // for kappa
HAL_MVOP_BaseFromIPCtrl(MVOP_DevID eID,MS_BOOL bEnable,MVOPBASEFROMIPCTRL eModeCtrl)6197*53ee8cc1Swenshuai.xi void HAL_MVOP_BaseFromIPCtrl(MVOP_DevID eID, MS_BOOL bEnable ,MVOPBASEFROMIPCTRL eModeCtrl )
6198*53ee8cc1Swenshuai.xi {
6199*53ee8cc1Swenshuai.xi     MS_U8 regval;
6200*53ee8cc1Swenshuai.xi     MS_U8 u8Arg;
6201*53ee8cc1Swenshuai.xi 
6202*53ee8cc1Swenshuai.xi     if ( eModeCtrl>
6203*53ee8cc1Swenshuai.xi #if NO_MVOP_PATCH
6204*53ee8cc1Swenshuai.xi         E_MVOP_FD_MASK_INV)
6205*53ee8cc1Swenshuai.xi #else
6206*53ee8cc1Swenshuai.xi         E_MVOP_SIZE_FROM_MVD_PATCH)
6207*53ee8cc1Swenshuai.xi #endif
6208*53ee8cc1Swenshuai.xi     {
6209*53ee8cc1Swenshuai.xi         return;
6210*53ee8cc1Swenshuai.xi     }
6211*53ee8cc1Swenshuai.xi     else if (eModeCtrl >= E_MVOP_FMT_FROM_MVD)
6212*53ee8cc1Swenshuai.xi     {
6213*53ee8cc1Swenshuai.xi         regval = HAL_ReadByte(VOP_FD_MASK); // ox30
6214*53ee8cc1Swenshuai.xi     }
6215*53ee8cc1Swenshuai.xi     else
6216*53ee8cc1Swenshuai.xi     {
6217*53ee8cc1Swenshuai.xi         regval = HAL_ReadByte(VOP_INFO_FROM_CODEC_L); //0x38
6218*53ee8cc1Swenshuai.xi     }
6219*53ee8cc1Swenshuai.xi 
6220*53ee8cc1Swenshuai.xi     switch(eModeCtrl)
6221*53ee8cc1Swenshuai.xi     {
6222*53ee8cc1Swenshuai.xi         case E_MVOP_BASE_FROM_IP:
6223*53ee8cc1Swenshuai.xi             u8Arg = 0x0;
6224*53ee8cc1Swenshuai.xi             break;
6225*53ee8cc1Swenshuai.xi         case E_MVOP_SRC_FROM_MVD:
6226*53ee8cc1Swenshuai.xi             u8Arg = 0x0;
6227*53ee8cc1Swenshuai.xi             break;
6228*53ee8cc1Swenshuai.xi         case E_MVOP_FIELD_FROM_MVD:
6229*53ee8cc1Swenshuai.xi             u8Arg = 0x0;
6230*53ee8cc1Swenshuai.xi             break;
6231*53ee8cc1Swenshuai.xi         case E_MVOP_FIELD_FROM_MVD_INV:
6232*53ee8cc1Swenshuai.xi             u8Arg = 0x0;
6233*53ee8cc1Swenshuai.xi             break;
6234*53ee8cc1Swenshuai.xi         case E_MVOP_PITCH_FROM_IP:
6235*53ee8cc1Swenshuai.xi             u8Arg = 0x0;
6236*53ee8cc1Swenshuai.xi             break;
6237*53ee8cc1Swenshuai.xi         case E_MVOP_FMT_FROM_MVD:
6238*53ee8cc1Swenshuai.xi             u8Arg = 0x0;
6239*53ee8cc1Swenshuai.xi             break;
6240*53ee8cc1Swenshuai.xi         case E_MVOP_FD_MASK_CLR:
6241*53ee8cc1Swenshuai.xi             u8Arg = VOP_FD_MASK_CLR;
6242*53ee8cc1Swenshuai.xi             break;
6243*53ee8cc1Swenshuai.xi         case E_MVOP_FD_MASK_INV:
6244*53ee8cc1Swenshuai.xi             u8Arg = VOP_FD_MASK_INV;
6245*53ee8cc1Swenshuai.xi             break;
6246*53ee8cc1Swenshuai.xi #if (NO_MVOP_PATCH == 0)
6247*53ee8cc1Swenshuai.xi         case E_MVOP_SIZE_FROM_MVD_PATCH:
6248*53ee8cc1Swenshuai.xi             u8Arg = 0x0;
6249*53ee8cc1Swenshuai.xi             break;
6250*53ee8cc1Swenshuai.xi         case E_MVOP_SEQ_FROM_MVD_PATCH:
6251*53ee8cc1Swenshuai.xi             u8Arg = 0x0;
6252*53ee8cc1Swenshuai.xi             break;
6253*53ee8cc1Swenshuai.xi #endif
6254*53ee8cc1Swenshuai.xi         default:
6255*53ee8cc1Swenshuai.xi             u8Arg = 0x0;
6256*53ee8cc1Swenshuai.xi             break;
6257*53ee8cc1Swenshuai.xi 
6258*53ee8cc1Swenshuai.xi     }
6259*53ee8cc1Swenshuai.xi     if ( bEnable )
6260*53ee8cc1Swenshuai.xi     {
6261*53ee8cc1Swenshuai.xi         regval |= u8Arg;
6262*53ee8cc1Swenshuai.xi     }
6263*53ee8cc1Swenshuai.xi     else
6264*53ee8cc1Swenshuai.xi     {
6265*53ee8cc1Swenshuai.xi         regval &= ~u8Arg;
6266*53ee8cc1Swenshuai.xi     }
6267*53ee8cc1Swenshuai.xi     if (eModeCtrl >= E_MVOP_FMT_FROM_MVD)
6268*53ee8cc1Swenshuai.xi     {
6269*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_FD_MASK, regval);
6270*53ee8cc1Swenshuai.xi     }
6271*53ee8cc1Swenshuai.xi     else
6272*53ee8cc1Swenshuai.xi     {
6273*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_INFO_FROM_CODEC_L, regval);
6274*53ee8cc1Swenshuai.xi     }
6275*53ee8cc1Swenshuai.xi 
6276*53ee8cc1Swenshuai.xi 
6277*53ee8cc1Swenshuai.xi }
6278