xref: /utopia/UTPA2-700.0.x/modules/mvop/hal/mooney/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_216           (216000000ULL)
140*53ee8cc1Swenshuai.xi #define MPLL_CLOCK_432           (432000000ULL)
141*53ee8cc1Swenshuai.xi 
142*53ee8cc1Swenshuai.xi #define BIT0    BIT(0)
143*53ee8cc1Swenshuai.xi #define BIT1    BIT(1)
144*53ee8cc1Swenshuai.xi #define BIT2    BIT(2)
145*53ee8cc1Swenshuai.xi #define BIT3    BIT(3)
146*53ee8cc1Swenshuai.xi #define BIT4    BIT(4)
147*53ee8cc1Swenshuai.xi #define BIT5    BIT(5)
148*53ee8cc1Swenshuai.xi #define BIT6    BIT(6)
149*53ee8cc1Swenshuai.xi #define BIT7    BIT(7)
150*53ee8cc1Swenshuai.xi #define BIT15   BIT(15)
151*53ee8cc1Swenshuai.xi 
152*53ee8cc1Swenshuai.xi #define ALIGN_UPTO_16(x)  ((((x) + 15) >> 4) << 4)
153*53ee8cc1Swenshuai.xi #define ALIGN_UPTO_4(x)   ((((x) + 3) >> 2) << 2)
154*53ee8cc1Swenshuai.xi #define ALIGN_UPTO_2(x)   ((((x) + 1) >> 1) << 1)
155*53ee8cc1Swenshuai.xi 
156*53ee8cc1Swenshuai.xi #define MVOP_VBlank               45
157*53ee8cc1Swenshuai.xi #define MVOP_HBlank_SD            200
158*53ee8cc1Swenshuai.xi #define MVOP_HBlank_HD            300
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     MS_BOOL bMirrorModeVer;
182*53ee8cc1Swenshuai.xi     MS_BOOL bMirrorModeHor;
183*53ee8cc1Swenshuai.xi     MS_BOOL bMirrorMode;
184*53ee8cc1Swenshuai.xi     MS_BOOL bEnableFreerunMode;
185*53ee8cc1Swenshuai.xi 
186*53ee8cc1Swenshuai.xi     MS_BOOL b3DLRMode;    /// 3D L/R dual buffer mode
187*53ee8cc1Swenshuai.xi 
188*53ee8cc1Swenshuai.xi     MS_BOOL b3DLRAltOutput;    /// 3D L/R line alternative output
189*53ee8cc1Swenshuai.xi     MS_BOOL b3DLRAltSBSOutput; /// 3D L/R side by side output
190*53ee8cc1Swenshuai.xi     MS_BOOL bNewVSyncMode;
191*53ee8cc1Swenshuai.xi     MVOP_RptFldMode eRepeatField;      /// mvop output repeating fields for single field input.
192*53ee8cc1Swenshuai.xi     MVOP_RgbFormat eMainRgbFmt;
193*53ee8cc1Swenshuai.xi     MS_BOOL bIsInit;
194*53ee8cc1Swenshuai.xi     MS_BOOL bRptPreVsync;
195*53ee8cc1Swenshuai.xi     MS_BOOL bIs422;
196*53ee8cc1Swenshuai.xi     MS_BOOL bIsH265;
197*53ee8cc1Swenshuai.xi     MS_BOOL bIsHS;
198*53ee8cc1Swenshuai.xi     MS_U16  u16CropXStart;
199*53ee8cc1Swenshuai.xi     MS_U16  u16CropYStart;
200*53ee8cc1Swenshuai.xi     MS_U16  u16CropXSize;
201*53ee8cc1Swenshuai.xi     MS_U16  u16CropYSize;
202*53ee8cc1Swenshuai.xi     MS_BOOL bIs2p;
203*53ee8cc1Swenshuai.xi     MS_BOOL bIsEnable;
204*53ee8cc1Swenshuai.xi     MS_U16  u16VsyncLines;
205*53ee8cc1Swenshuai.xi     MVOP_OutputImodeType eInterlaceType;
206*53ee8cc1Swenshuai.xi     MS_BOOL bIsXcTrig;
207*53ee8cc1Swenshuai.xi     MS_BOOL bIs265DV;
208*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
209*53ee8cc1Swenshuai.xi     MS_BOOL bSubMirrorModeVer;
210*53ee8cc1Swenshuai.xi     MS_BOOL bSubMirrorModeHor;
211*53ee8cc1Swenshuai.xi     MS_BOOL bSubMirrorMode;
212*53ee8cc1Swenshuai.xi     MS_BOOL bSubEnableFreerunMode;
213*53ee8cc1Swenshuai.xi     MS_BOOL bSub3DLRMode;
214*53ee8cc1Swenshuai.xi     MS_BOOL bSubNewVSyncMode;
215*53ee8cc1Swenshuai.xi     MVOP_RptFldMode eSubRepeatField;   /// mvop output repeating fields for single field input.
216*53ee8cc1Swenshuai.xi     MVOP_RgbFormat eSubRgbFmt;
217*53ee8cc1Swenshuai.xi     MS_BOOL bSubIsInit;
218*53ee8cc1Swenshuai.xi     MS_BOOL bSubRptPreVsync;
219*53ee8cc1Swenshuai.xi     MS_BOOL bSubIs422;
220*53ee8cc1Swenshuai.xi     MS_BOOL bSubIsH265;
221*53ee8cc1Swenshuai.xi     MS_BOOL bSub3DLRAltOutput;    /// 3D L/R line alternative output
222*53ee8cc1Swenshuai.xi     MS_BOOL bSub3DLRAltSBSOutput;
223*53ee8cc1Swenshuai.xi     MS_BOOL bSubIsHS;
224*53ee8cc1Swenshuai.xi     MS_U16  u16SubCropXStart;
225*53ee8cc1Swenshuai.xi     MS_U16  u16SubCropYStart;
226*53ee8cc1Swenshuai.xi     MS_U16  u16SubCropXSize;
227*53ee8cc1Swenshuai.xi     MS_U16  u16SubCropYSize;
228*53ee8cc1Swenshuai.xi     MS_BOOL bSubIs2p;
229*53ee8cc1Swenshuai.xi     MS_BOOL bSubIsEnable;
230*53ee8cc1Swenshuai.xi     MS_U16  u16SubVsyncLines;
231*53ee8cc1Swenshuai.xi     MVOP_OutputImodeType eSubInterlaceType;
232*53ee8cc1Swenshuai.xi     MS_BOOL bSubIsXcTrig;
233*53ee8cc1Swenshuai.xi #endif
234*53ee8cc1Swenshuai.xi }MVOP_CTX_HAL;
235*53ee8cc1Swenshuai.xi 
236*53ee8cc1Swenshuai.xi static MVOP_CTX_HAL *g_pHalMVOPCtx = NULL;
237*53ee8cc1Swenshuai.xi static MS_VIRT u32RiuBaseAdd=0;
238*53ee8cc1Swenshuai.xi 
239*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX
240*53ee8cc1Swenshuai.xi     MVOP_CTX_HAL g_stmvopHalCtx;
241*53ee8cc1Swenshuai.xi #endif
242*53ee8cc1Swenshuai.xi #if defined(SUPPORT_X_MODEL_FEATURE)
243*53ee8cc1Swenshuai.xi     MVOP_CTX_HAL g_stmvopHalCtx;
244*53ee8cc1Swenshuai.xi #endif
245*53ee8cc1Swenshuai.xi #define RIU_MAP u32RiuBaseAdd  //obtained in init
246*53ee8cc1Swenshuai.xi 
247*53ee8cc1Swenshuai.xi #define RIU8    ((unsigned char  volatile *) RIU_MAP)
248*53ee8cc1Swenshuai.xi #define RIU16    ((MS_U16  volatile *) RIU_MAP)
249*53ee8cc1Swenshuai.xi #define MST_MACRO_START     do {
250*53ee8cc1Swenshuai.xi #define MST_MACRO_END       } while (0)
251*53ee8cc1Swenshuai.xi 
252*53ee8cc1Swenshuai.xi #define HAL_WriteByte( u32Reg, u8Val )                                                 \
253*53ee8cc1Swenshuai.xi     MST_MACRO_START                                                                     \
254*53ee8cc1Swenshuai.xi     if ( __builtin_constant_p( u32Reg ) )                                               \
255*53ee8cc1Swenshuai.xi     {                                                                                   \
256*53ee8cc1Swenshuai.xi         RIU8[((u32Reg) * 2) - ((u32Reg) & 1)] = u8Val;                                  \
257*53ee8cc1Swenshuai.xi     }                                                                                   \
258*53ee8cc1Swenshuai.xi     else                                                                                \
259*53ee8cc1Swenshuai.xi     {                                                                                   \
260*53ee8cc1Swenshuai.xi         RIU8[(u32Reg << 1) - (u32Reg & 1)] = u8Val;                                     \
261*53ee8cc1Swenshuai.xi     }                                                                                   \
262*53ee8cc1Swenshuai.xi     MST_MACRO_END
263*53ee8cc1Swenshuai.xi 
264*53ee8cc1Swenshuai.xi #define HAL_ReadByte( u32Reg )                                                         \
265*53ee8cc1Swenshuai.xi     (__builtin_constant_p( u32Reg ) ?                                                   \
266*53ee8cc1Swenshuai.xi         (((u32Reg) & 0x01) ? RIU8[(u32Reg) * 2 - 1] : RIU8[(u32Reg) * 2]) :             \
267*53ee8cc1Swenshuai.xi         (RIU8[(u32Reg << 1) - (u32Reg & 1)]))
268*53ee8cc1Swenshuai.xi 
269*53ee8cc1Swenshuai.xi #define HAL_Read2Byte( u32Reg )                                                         \
270*53ee8cc1Swenshuai.xi 			(RIU16[u32Reg])
271*53ee8cc1Swenshuai.xi 
272*53ee8cc1Swenshuai.xi #define HAL_ReadRegBit( u32Reg, u8Mask )                                               \
273*53ee8cc1Swenshuai.xi         (RIU8[(u32Reg) * 2 - ((u32Reg) & 1)] & (u8Mask))
274*53ee8cc1Swenshuai.xi 
275*53ee8cc1Swenshuai.xi #define HAL_WriteRegBit( u32Reg, bEnable, u8Mask )                                     \
276*53ee8cc1Swenshuai.xi     MST_MACRO_START                                                                     \
277*53ee8cc1Swenshuai.xi     MS_U32 u32Reg8 = ((u32Reg) * 2) - ((u32Reg) & 1);                                   \
278*53ee8cc1Swenshuai.xi     RIU8[u32Reg8] = (bEnable) ? (RIU8[u32Reg8] |  (u8Mask)) :                           \
279*53ee8cc1Swenshuai.xi                                 (RIU8[u32Reg8] & ~(u8Mask));                            \
280*53ee8cc1Swenshuai.xi     MST_MACRO_END
281*53ee8cc1Swenshuai.xi 
282*53ee8cc1Swenshuai.xi #define HAL_WriteByteMask( u32Reg, u8Val, u8Msk )                                      \
283*53ee8cc1Swenshuai.xi     MST_MACRO_START                                                                     \
284*53ee8cc1Swenshuai.xi     MS_U32 u32Reg8 = ((u32Reg) * 2) - ((u32Reg) & 1);                                   \
285*53ee8cc1Swenshuai.xi     RIU8[u32Reg8] = (RIU8[u32Reg8] & ~(u8Msk)) | ((u8Val) & (u8Msk));                   \
286*53ee8cc1Swenshuai.xi     MST_MACRO_END
287*53ee8cc1Swenshuai.xi 
288*53ee8cc1Swenshuai.xi #define HAL_Write2Byte(u32Reg, u16Val)                                                       \
289*53ee8cc1Swenshuai.xi 			RIU16[u32Reg] = u16Val;
290*53ee8cc1Swenshuai.xi 
291*53ee8cc1Swenshuai.xi #define SUB_REG(x)         (x-MVOP_REG_BASE+MVOP_SUB_REG_BASE)
292*53ee8cc1Swenshuai.xi 
293*53ee8cc1Swenshuai.xi #define _FUNC_NOT_USED()        do {} while ( 0 )
294*53ee8cc1Swenshuai.xi #ifndef UNUSED
295*53ee8cc1Swenshuai.xi #define UNUSED(x) (void)(x)
296*53ee8cc1Swenshuai.xi #endif
297*53ee8cc1Swenshuai.xi 
298*53ee8cc1Swenshuai.xi #define LOWBYTE(u16)            ((MS_U8)(u16))
299*53ee8cc1Swenshuai.xi #define HIGHBYTE(u16)           ((MS_U8)((u16) >> 8))
300*53ee8cc1Swenshuai.xi 
301*53ee8cc1Swenshuai.xi 
302*53ee8cc1Swenshuai.xi #define VOP_ON_MIU1                     ((HAL_ReadByte(0x12F9) & BIT2) == BIT2)
303*53ee8cc1Swenshuai.xi #define _MaskMiuReq_MVOP_R( m )         HAL_WriteRegBit(0x12C7, m, BIT2)
304*53ee8cc1Swenshuai.xi #define _MaskMiu1Req_MVOP_R( m )        HAL_WriteRegBit(0x06C7, m, BIT2)
305*53ee8cc1Swenshuai.xi 
306*53ee8cc1Swenshuai.xi #define HAL_MIU_SetReqMask( miu_clients, mask ) \
307*53ee8cc1Swenshuai.xi    do { \
308*53ee8cc1Swenshuai.xi        if (VOP_ON_MIU1 == 0) \
309*53ee8cc1Swenshuai.xi            _MaskMiuReq_##miu_clients( mask ); \
310*53ee8cc1Swenshuai.xi        else \
311*53ee8cc1Swenshuai.xi            _MaskMiu1Req_##miu_clients( mask ); \
312*53ee8cc1Swenshuai.xi    }while(0)
313*53ee8cc1Swenshuai.xi 
314*53ee8cc1Swenshuai.xi #define SUBVOP_ON_MIU1                  ((HAL_ReadByte(0x12F9) & BIT2) == BIT2)
315*53ee8cc1Swenshuai.xi #define _MaskMiuReq_SUBMVOP_R( m )         HAL_WriteRegBit(0x12C7, m, BIT2)
316*53ee8cc1Swenshuai.xi #define _MaskMiu1Req_SUBMVOP_R( m )        HAL_WriteRegBit(0x06C7, m, BIT2)
317*53ee8cc1Swenshuai.xi 
318*53ee8cc1Swenshuai.xi #define HAL_MIU_SubSetReqMask( miu_clients, mask ) \
319*53ee8cc1Swenshuai.xi    do { \
320*53ee8cc1Swenshuai.xi        if (SUBVOP_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 MVOP_DBG_ENABLE 0
327*53ee8cc1Swenshuai.xi #if MVOP_DBG_ENABLE
328*53ee8cc1Swenshuai.xi #define MVOP_DBG(fmt, args...)       MVOP_PRINTF(fmt, ##args)
329*53ee8cc1Swenshuai.xi #else
330*53ee8cc1Swenshuai.xi #define MVOP_DBG(fmt, args...)       {}
331*53ee8cc1Swenshuai.xi #endif
332*53ee8cc1Swenshuai.xi 
333*53ee8cc1Swenshuai.xi typedef enum
334*53ee8cc1Swenshuai.xi {
335*53ee8cc1Swenshuai.xi     E_MVOP_INIT_OK            = 0,
336*53ee8cc1Swenshuai.xi     E_MVOP_INIT_FAIL          = 1,
337*53ee8cc1Swenshuai.xi     E_MVOP_INIT_ALREADY_EXIST = 2
338*53ee8cc1Swenshuai.xi } MVOP_HalInitCtxResults;
339*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
340*53ee8cc1Swenshuai.xi //  Local Structures
341*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
342*53ee8cc1Swenshuai.xi 
343*53ee8cc1Swenshuai.xi 
344*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
345*53ee8cc1Swenshuai.xi //  Global Variables
346*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
347*53ee8cc1Swenshuai.xi 
348*53ee8cc1Swenshuai.xi #define Y_INFO 0
349*53ee8cc1Swenshuai.xi #define UV_INFO 1
350*53ee8cc1Swenshuai.xi 
351*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
352*53ee8cc1Swenshuai.xi //  Local Variables
353*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
354*53ee8cc1Swenshuai.xi 
355*53ee8cc1Swenshuai.xi 
356*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
357*53ee8cc1Swenshuai.xi //  Debug Functions
358*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
359*53ee8cc1Swenshuai.xi 
360*53ee8cc1Swenshuai.xi 
361*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
362*53ee8cc1Swenshuai.xi //  Local Functions
363*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
364*53ee8cc1Swenshuai.xi 
365*53ee8cc1Swenshuai.xi 
366*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
367*53ee8cc1Swenshuai.xi //  Global Functions
368*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
369*53ee8cc1Swenshuai.xi 
_HAL_MVOP_InitVarCtx(void)370*53ee8cc1Swenshuai.xi void _HAL_MVOP_InitVarCtx(void)
371*53ee8cc1Swenshuai.xi {
372*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bMirrorModeVer = 0;
373*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bMirrorModeHor = 0;
374*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bMirrorMode=0;
375*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bEnableFreerunMode = FALSE;
376*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->b3DLRMode=0;    /// 3D L/R dual buffer mode
377*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->b3DLRAltOutput = FALSE;    /// 3D L/R line alternative output
378*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->b3DLRAltSBSOutput = FALSE;
379*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bNewVSyncMode = FALSE;
380*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->eRepeatField = E_MVOP_RPTFLD_NONE;      /// mvop output repeating fields for single field input.
381*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->eMainRgbFmt = E_MVOP_RGB_NONE;
382*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsInit = 0;
383*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bRptPreVsync = 0;
384*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIs422 = 0;
385*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsH265 = 0;
386*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsHS = FALSE;
387*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16CropXStart = 0;
388*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16CropYStart = 0;
389*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16CropXSize = 0;
390*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16CropYSize = 0;
391*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIs2p = FALSE;
392*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsEnable = 0;
393*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16VsyncLines = 0;
394*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->eInterlaceType = E_MVOP_PRO;
395*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsXcTrig = FALSE;
396*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIs265DV = 0;
397*53ee8cc1Swenshuai.xi }
398*53ee8cc1Swenshuai.xi 
_HAL_MVOP_SubInitVarCtx(void)399*53ee8cc1Swenshuai.xi void _HAL_MVOP_SubInitVarCtx(void)
400*53ee8cc1Swenshuai.xi {
401*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
402*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubMirrorModeVer = 0;
403*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubMirrorModeHor = 0;
404*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubMirrorMode=0;
405*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubEnableFreerunMode = FALSE;
406*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSub3DLRMode=0;
407*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubNewVSyncMode = FALSE;
408*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->eSubRepeatField = E_MVOP_RPTFLD_NONE;   /// mvop output repeating fields for single field input.
409*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->eSubRgbFmt = E_MVOP_RGB_NONE;
410*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsInit = 0;
411*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubRptPreVsync = 0;
412*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIs422 = 0;
413*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsH265 = 0;
414*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSub3DLRAltOutput = FALSE;    /// 3D L/R line alternative output
415*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSub3DLRAltSBSOutput = FALSE;
416*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsHS = FALSE;
417*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16SubCropXStart = 0;
418*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16SubCropYStart = 0;
419*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16SubCropXSize = 0;
420*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16SubCropYSize = 0;
421*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIs2p = FALSE;
422*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsEnable = 0;
423*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->u16SubVsyncLines = 0;
424*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->eSubInterlaceType = E_MVOP_PRO;
425*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsXcTrig = FALSE;
426*53ee8cc1Swenshuai.xi #endif
427*53ee8cc1Swenshuai.xi }
428*53ee8cc1Swenshuai.xi 
_HAL_MVOP_InitContext(MS_BOOL * pbFirstDrvInstant)429*53ee8cc1Swenshuai.xi MVOP_HalInitCtxResults _HAL_MVOP_InitContext(MS_BOOL *pbFirstDrvInstant)
430*53ee8cc1Swenshuai.xi {
431*53ee8cc1Swenshuai.xi     MS_BOOL bNeedInitShared = FALSE;
432*53ee8cc1Swenshuai.xi 
433*53ee8cc1Swenshuai.xi //check first init by MsOS_SHM_GetId / MSOS_SHM_QUERY
434*53ee8cc1Swenshuai.xi #if 0
435*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx)
436*53ee8cc1Swenshuai.xi     {
437*53ee8cc1Swenshuai.xi         // The context instance has been created already
438*53ee8cc1Swenshuai.xi         // before somewhere sometime in the same process.
439*53ee8cc1Swenshuai.xi         *pbFirstDrvInstant = bNeedInitShared;
440*53ee8cc1Swenshuai.xi         //return E_MVOP_INIT_FAIL;
441*53ee8cc1Swenshuai.xi         return E_MVOP_INIT_OK;
442*53ee8cc1Swenshuai.xi     }
443*53ee8cc1Swenshuai.xi #endif
444*53ee8cc1Swenshuai.xi 
445*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
446*53ee8cc1Swenshuai.xi #if !defined(SUPPORT_X_MODEL_FEATURE)
447*53ee8cc1Swenshuai.xi     MS_U32 u32ShmId;
448*53ee8cc1Swenshuai.xi     MS_VIRT u32Addr;
449*53ee8cc1Swenshuai.xi     MS_U32 u32BufSize;
450*53ee8cc1Swenshuai.xi 
451*53ee8cc1Swenshuai.xi     //MsOS_SHM_Init(); init in msos_init
452*53ee8cc1Swenshuai.xi     if (FALSE == MsOS_SHM_GetId((MS_U8*)"Linux MVOP HAL driver", sizeof(MVOP_CTX_HAL), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_QUERY))
453*53ee8cc1Swenshuai.xi     {
454*53ee8cc1Swenshuai.xi         if (FALSE == MsOS_SHM_GetId((MS_U8*)"Linux MVOP HAL driver", sizeof(MVOP_CTX_HAL), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_CREATE))
455*53ee8cc1Swenshuai.xi         {
456*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("MVOP: SHM allocation failed!\n");)
457*53ee8cc1Swenshuai.xi             return E_MVOP_INIT_FAIL;
458*53ee8cc1Swenshuai.xi         }
459*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("MVOP: [%s][%d] This is first initial 0x%08lx\n", __FUNCTION__, __LINE__, u32Addr);)
460*53ee8cc1Swenshuai.xi         memset( (MS_U8*)u32Addr, 0, sizeof(MVOP_CTX_HAL));
461*53ee8cc1Swenshuai.xi         bNeedInitShared = TRUE;
462*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx = (MVOP_CTX_HAL*)u32Addr;
463*53ee8cc1Swenshuai.xi         _HAL_MVOP_InitVarCtx();
464*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
465*53ee8cc1Swenshuai.xi         _HAL_MVOP_SubInitVarCtx();
466*53ee8cc1Swenshuai.xi #endif
467*53ee8cc1Swenshuai.xi     }
468*53ee8cc1Swenshuai.xi     else
469*53ee8cc1Swenshuai.xi     {
470*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx = (MVOP_CTX_HAL*)u32Addr;
471*53ee8cc1Swenshuai.xi         bNeedInitShared = FALSE;
472*53ee8cc1Swenshuai.xi         *pbFirstDrvInstant = bNeedInitShared;
473*53ee8cc1Swenshuai.xi 
474*53ee8cc1Swenshuai.xi         return E_MVOP_INIT_ALREADY_EXIST;
475*53ee8cc1Swenshuai.xi     }
476*53ee8cc1Swenshuai.xi #else
477*53ee8cc1Swenshuai.xi       g_pHalMVOPCtx =  &g_stmvopHalCtx;
478*53ee8cc1Swenshuai.xi       bNeedInitShared = TRUE;
479*53ee8cc1Swenshuai.xi #endif
480*53ee8cc1Swenshuai.xi #else
481*53ee8cc1Swenshuai.xi       g_pHalMVOPCtx =  &g_stmvopHalCtx;
482*53ee8cc1Swenshuai.xi       bNeedInitShared = TRUE;
483*53ee8cc1Swenshuai.xi #endif
484*53ee8cc1Swenshuai.xi       *pbFirstDrvInstant = bNeedInitShared;
485*53ee8cc1Swenshuai.xi 
486*53ee8cc1Swenshuai.xi     if (bNeedInitShared)
487*53ee8cc1Swenshuai.xi     {
488*53ee8cc1Swenshuai.xi         memset(g_pHalMVOPCtx, 0, sizeof(*g_pHalMVOPCtx));
489*53ee8cc1Swenshuai.xi     }
490*53ee8cc1Swenshuai.xi 
491*53ee8cc1Swenshuai.xi       return E_MVOP_INIT_OK;
492*53ee8cc1Swenshuai.xi }
493*53ee8cc1Swenshuai.xi 
_HAL_MVOP_IsSupport4k2k2P(void)494*53ee8cc1Swenshuai.xi MS_BOOL _HAL_MVOP_IsSupport4k2k2P(void)
495*53ee8cc1Swenshuai.xi {
496*53ee8cc1Swenshuai.xi     return TRUE;
497*53ee8cc1Swenshuai.xi }
498*53ee8cc1Swenshuai.xi 
HAL_MVOP_RegSetBase(MS_VIRT u32Base)499*53ee8cc1Swenshuai.xi void HAL_MVOP_RegSetBase(MS_VIRT u32Base)
500*53ee8cc1Swenshuai.xi {
501*53ee8cc1Swenshuai.xi     u32RiuBaseAdd = u32Base;
502*53ee8cc1Swenshuai.xi }
503*53ee8cc1Swenshuai.xi 
HAL_MVOP_InitMirrorMode(MS_BOOL bMir)504*53ee8cc1Swenshuai.xi void HAL_MVOP_InitMirrorMode(MS_BOOL bMir)
505*53ee8cc1Swenshuai.xi {
506*53ee8cc1Swenshuai.xi     //set bit[3:7] to support mirror mode
507*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG, bMir, VOP_MIRROR_CFG_ENABLE);
508*53ee8cc1Swenshuai.xi }
509*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetVerticalMirrorMode(MS_BOOL bEnable)510*53ee8cc1Swenshuai.xi void HAL_MVOP_SetVerticalMirrorMode(MS_BOOL bEnable)
511*53ee8cc1Swenshuai.xi {
512*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
513*53ee8cc1Swenshuai.xi     {
514*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
515*53ee8cc1Swenshuai.xi         return;
516*53ee8cc1Swenshuai.xi     }
517*53ee8cc1Swenshuai.xi 
518*53ee8cc1Swenshuai.xi     if (VOP_MIRROR_CFG_ENABLE != HAL_ReadRegBit(VOP_MIRROR_CFG, VOP_MIRROR_CFG_ENABLE))
519*53ee8cc1Swenshuai.xi     {
520*53ee8cc1Swenshuai.xi         //MVOP_PRINTF("Setup mirror mode\n");
521*53ee8cc1Swenshuai.xi         HAL_MVOP_InitMirrorMode(TRUE);
522*53ee8cc1Swenshuai.xi     }
523*53ee8cc1Swenshuai.xi 
524*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG, bEnable, VOP_MIRROR_CFG_VEN);
525*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bMirrorModeVer = bEnable;
526*53ee8cc1Swenshuai.xi }
527*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetHorizontallMirrorMode(MS_BOOL bEnable)528*53ee8cc1Swenshuai.xi void HAL_MVOP_SetHorizontallMirrorMode(MS_BOOL bEnable)
529*53ee8cc1Swenshuai.xi {
530*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
531*53ee8cc1Swenshuai.xi     {
532*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
533*53ee8cc1Swenshuai.xi         return;
534*53ee8cc1Swenshuai.xi     }
535*53ee8cc1Swenshuai.xi 
536*53ee8cc1Swenshuai.xi     if (VOP_MIRROR_CFG_ENABLE != HAL_ReadRegBit(VOP_MIRROR_CFG, VOP_MIRROR_CFG_ENABLE))
537*53ee8cc1Swenshuai.xi     {
538*53ee8cc1Swenshuai.xi         //MVOP_PRINTF("Setup mirror mode\n");
539*53ee8cc1Swenshuai.xi         HAL_MVOP_InitMirrorMode(TRUE);
540*53ee8cc1Swenshuai.xi     }
541*53ee8cc1Swenshuai.xi 
542*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG, bEnable, VOP_MIRROR_CFG_HEN);
543*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bMirrorModeHor = bEnable;
544*53ee8cc1Swenshuai.xi }
545*53ee8cc1Swenshuai.xi 
HAL_MVOP_Init(void)546*53ee8cc1Swenshuai.xi void HAL_MVOP_Init(void)
547*53ee8cc1Swenshuai.xi {
548*53ee8cc1Swenshuai.xi     MVOP_HalInitCtxResults eRet;
549*53ee8cc1Swenshuai.xi     MS_BOOL pbFirstDrvInstant;
550*53ee8cc1Swenshuai.xi 
551*53ee8cc1Swenshuai.xi     eRet = _HAL_MVOP_InitContext(&pbFirstDrvInstant);
552*53ee8cc1Swenshuai.xi     if(eRet == E_MVOP_INIT_FAIL)
553*53ee8cc1Swenshuai.xi     {
554*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("[%s] MVOP Context Init failed!\n",__FUNCTION__);)
555*53ee8cc1Swenshuai.xi         return;
556*53ee8cc1Swenshuai.xi     }
557*53ee8cc1Swenshuai.xi     else if(eRet == E_MVOP_INIT_ALREADY_EXIST)
558*53ee8cc1Swenshuai.xi     {
559*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->bIsInit)
560*53ee8cc1Swenshuai.xi         {
561*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("[%s] Main MVOP Context has Initialized!\n",__FUNCTION__);)
562*53ee8cc1Swenshuai.xi             return;
563*53ee8cc1Swenshuai.xi         }
564*53ee8cc1Swenshuai.xi     }
565*53ee8cc1Swenshuai.xi 
566*53ee8cc1Swenshuai.xi     HAL_MVOP_InitMirrorMode(TRUE);
567*53ee8cc1Swenshuai.xi     //Enable dynamic clock gating
568*53ee8cc1Swenshuai.xi     //Note: cannot enable VOP_GCLK_VCLK_ON, or hsync cannot be sent out.
569*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_GCLK, VOP_GCLK_MIU_ON, VOP_GCLK_MIU_ON|VOP_GCLK_VCLK_ON);
570*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsInit = 1;
571*53ee8cc1Swenshuai.xi }
572*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetFieldInverse(MS_BOOL b2MVD,MS_BOOL b2IP)573*53ee8cc1Swenshuai.xi void HAL_MVOP_SetFieldInverse(MS_BOOL b2MVD, MS_BOOL b2IP)
574*53ee8cc1Swenshuai.xi {
575*53ee8cc1Swenshuai.xi     // Set fld inv & ofld_inv
576*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL0+1, b2MVD, BIT3); //inverse the field to MVD
577*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL0+1, b2IP, BIT4);  //inverse the field to IP
578*53ee8cc1Swenshuai.xi }
579*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetChromaWeighting(MS_BOOL bEnable)580*53ee8cc1Swenshuai.xi void HAL_MVOP_SetChromaWeighting(MS_BOOL bEnable)
581*53ee8cc1Swenshuai.xi {
582*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WEIGHT_CTRL, bEnable, BIT1);
583*53ee8cc1Swenshuai.xi }
584*53ee8cc1Swenshuai.xi 
585*53ee8cc1Swenshuai.xi //load new value into active registers 0x20-0x26
HAL_MVOP_LoadReg(void)586*53ee8cc1Swenshuai.xi void HAL_MVOP_LoadReg(void)
587*53ee8cc1Swenshuai.xi {
588*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, 1, BIT0);
589*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, 0, BIT0);
590*53ee8cc1Swenshuai.xi 
591*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, 1, BIT4);
592*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, 0, BIT4);
593*53ee8cc1Swenshuai.xi }
594*53ee8cc1Swenshuai.xi 
595*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetMIUReqMask(MS_BOOL bEnable)596*53ee8cc1Swenshuai.xi void HAL_MVOP_SetMIUReqMask(MS_BOOL bEnable)
597*53ee8cc1Swenshuai.xi {
598*53ee8cc1Swenshuai.xi #if 0   //[FIXME]
599*53ee8cc1Swenshuai.xi     if (bEnable)
600*53ee8cc1Swenshuai.xi     {   // mask MVOP2MI to protect MIU
601*53ee8cc1Swenshuai.xi         HAL_MIU_SetReqMask(MVOP_R, 1);
602*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
603*53ee8cc1Swenshuai.xi     }
604*53ee8cc1Swenshuai.xi     else
605*53ee8cc1Swenshuai.xi     {   // unmask MVOP2MI
606*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
607*53ee8cc1Swenshuai.xi         HAL_MIU_SetReqMask(MVOP_R, 0);
608*53ee8cc1Swenshuai.xi     }
609*53ee8cc1Swenshuai.xi #endif
610*53ee8cc1Swenshuai.xi     MS_U8 u8Miu;
611*53ee8cc1Swenshuai.xi 
612*53ee8cc1Swenshuai.xi 	if(HAL_MVOP_GetIsOnlyMiuIPControl() == TRUE)
613*53ee8cc1Swenshuai.xi 	{
614*53ee8cc1Swenshuai.xi 		// mask msb mvop
615*53ee8cc1Swenshuai.xi 		u8Miu = (HAL_ReadByte(VOP_MIU_SEL) & VOP_MSB_BUF0_MIU_SEL) >> 4;
616*53ee8cc1Swenshuai.xi 	}
617*53ee8cc1Swenshuai.xi 	else
618*53ee8cc1Swenshuai.xi 	{
619*53ee8cc1Swenshuai.xi     	u8Miu = VOP_ON_MIU1;
620*53ee8cc1Swenshuai.xi 	}
621*53ee8cc1Swenshuai.xi     eMIUClientID eClientID = MIU_CLIENT_MVOP_128BIT_R;
622*53ee8cc1Swenshuai.xi     //MVOP_PRINTF("Enter %s bEnable=%x ReqMask=0x%x, 0x%x\n", __FUNCTION__, bEnable,
623*53ee8cc1Swenshuai.xi     //    HAL_ReadByte(0x1266), HAL_ReadByte(0x0666));
624*53ee8cc1Swenshuai.xi     if (bEnable)
625*53ee8cc1Swenshuai.xi     {   // mask MVOP2MI to protect MIU
626*53ee8cc1Swenshuai.xi         MDrv_MIU_MaskReq(u8Miu,eClientID);
627*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
628*53ee8cc1Swenshuai.xi     }
629*53ee8cc1Swenshuai.xi     else
630*53ee8cc1Swenshuai.xi     {   // unmask MVOP2MI
631*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
632*53ee8cc1Swenshuai.xi         MDrv_MIU_UnMaskReq(u8Miu,eClientID);
633*53ee8cc1Swenshuai.xi     }
634*53ee8cc1Swenshuai.xi 
635*53ee8cc1Swenshuai.xi     //MVOP_PRINTF(">Exit %s bEnable=%x ReqMask=0x%x, 0x%x\n", __FUNCTION__, bEnable,
636*53ee8cc1Swenshuai.xi     //    HAL_ReadByte(0x1266), HAL_ReadByte(0x0666));
637*53ee8cc1Swenshuai.xi }
638*53ee8cc1Swenshuai.xi 
HAL_MVOP_Rst(void)639*53ee8cc1Swenshuai.xi void HAL_MVOP_Rst(void)
640*53ee8cc1Swenshuai.xi {
641*53ee8cc1Swenshuai.xi #if 0
642*53ee8cc1Swenshuai.xi     MS_BOOL bMCU = FALSE;
643*53ee8cc1Swenshuai.xi 
644*53ee8cc1Swenshuai.xi     bMCU = HAL_ReadRegBit(VOP_MPG_JPG_SWITCH, BIT1);
645*53ee8cc1Swenshuai.xi #endif
646*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL0, 0, BIT0);
647*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL0, 1, BIT0);
648*53ee8cc1Swenshuai.xi 
649*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsEnable = 1;
650*53ee8cc1Swenshuai.xi #if 0
651*53ee8cc1Swenshuai.xi     // sw patch: for mvop hsk mode, switching mvop enable/disable may cause video was stuck.
652*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF("[MVOP][DBG] HAL_MVOP_Enable patch \n");)
653*53ee8cc1Swenshuai.xi     HAL_MVOP_SetBlackBG();
654*53ee8cc1Swenshuai.xi     HAL_MVOP_SetPattern(MVOP_PATTERN_FRAMECOLOR);
655*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, 1, BIT4);
656*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MPG_JPG_SWITCH, 1, BIT1);
657*53ee8cc1Swenshuai.xi     MsOS_DelayTask(40);
658*53ee8cc1Swenshuai.xi     if(bMCU == FALSE)
659*53ee8cc1Swenshuai.xi     {
660*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_MPG_JPG_SWITCH, 0, BIT1);
661*53ee8cc1Swenshuai.xi     }
662*53ee8cc1Swenshuai.xi     HAL_MVOP_SetPattern(MVOP_PATTERN_NORMAL);
663*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, 0, BIT4);
664*53ee8cc1Swenshuai.xi #endif
665*53ee8cc1Swenshuai.xi }
666*53ee8cc1Swenshuai.xi 
HAL_MVOP_Enable(MS_BOOL bEnable,MS_U8 u8Framerate)667*53ee8cc1Swenshuai.xi void HAL_MVOP_Enable(MS_BOOL bEnable, MS_U8 u8Framerate)
668*53ee8cc1Swenshuai.xi {
669*53ee8cc1Swenshuai.xi     MS_U8 regval;
670*53ee8cc1Swenshuai.xi #if 0 //remove patch
671*53ee8cc1Swenshuai.xi     MS_U8 u8FrmDur = 40;
672*53ee8cc1Swenshuai.xi     MS_BOOL bMCU = FALSE;
673*53ee8cc1Swenshuai.xi 
674*53ee8cc1Swenshuai.xi     bMCU = HAL_ReadRegBit(VOP_MPG_JPG_SWITCH, BIT1);
675*53ee8cc1Swenshuai.xi 
676*53ee8cc1Swenshuai.xi     if(u8Framerate != 0)
677*53ee8cc1Swenshuai.xi     {
678*53ee8cc1Swenshuai.xi         u8FrmDur = 1000/u8Framerate; //time of one frame(ms).
679*53ee8cc1Swenshuai.xi     }
680*53ee8cc1Swenshuai.xi #endif
681*53ee8cc1Swenshuai.xi 
682*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(VOP_CTRL0);
683*53ee8cc1Swenshuai.xi 
684*53ee8cc1Swenshuai.xi     if ( bEnable )
685*53ee8cc1Swenshuai.xi     {
686*53ee8cc1Swenshuai.xi         regval |= 0x1;
687*53ee8cc1Swenshuai.xi     }
688*53ee8cc1Swenshuai.xi     else
689*53ee8cc1Swenshuai.xi     {
690*53ee8cc1Swenshuai.xi         regval &= ~0x1;
691*53ee8cc1Swenshuai.xi         HAL_Write2Byte(VOP_BF_VS_MVD, 0x200);
692*53ee8cc1Swenshuai.xi         HAL_Write2Byte(VOP_TF_VS_MVD, 0x200);
693*53ee8cc1Swenshuai.xi     }
694*53ee8cc1Swenshuai.xi #if 0
695*53ee8cc1Swenshuai.xi     // sw patch: for mvop hsk mode, switching mvop enable/disable may cause video was stuck.
696*53ee8cc1Swenshuai.xi     if( bEnable && (g_pHalMVOPCtx->bIsEnable == FALSE)) // need patch only from off to on
697*53ee8cc1Swenshuai.xi     {
698*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("[MVOP][DBG] HAL_MVOP_Enable patch \n");)
699*53ee8cc1Swenshuai.xi         HAL_MVOP_SetBlackBG();
700*53ee8cc1Swenshuai.xi         HAL_MVOP_SetPattern(MVOP_PATTERN_FRAMECOLOR);
701*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_WR, 1, BIT4);
702*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_MPG_JPG_SWITCH, 1, BIT1);
703*53ee8cc1Swenshuai.xi         MsOS_DelayTask(u8FrmDur);
704*53ee8cc1Swenshuai.xi         if(bMCU == FALSE)
705*53ee8cc1Swenshuai.xi         {
706*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_MPG_JPG_SWITCH, 0, BIT1);
707*53ee8cc1Swenshuai.xi         }
708*53ee8cc1Swenshuai.xi         HAL_MVOP_SetPattern(MVOP_PATTERN_NORMAL);
709*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_WR, 0, BIT4);
710*53ee8cc1Swenshuai.xi     }
711*53ee8cc1Swenshuai.xi #endif
712*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsEnable = bEnable;
713*53ee8cc1Swenshuai.xi 
714*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_CTRL0, regval);
715*53ee8cc1Swenshuai.xi }
716*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetEnableState(void)717*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetEnableState(void)
718*53ee8cc1Swenshuai.xi {
719*53ee8cc1Swenshuai.xi     return (HAL_ReadRegBit(VOP_CTRL0, BIT0));
720*53ee8cc1Swenshuai.xi }
721*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetMaxFreerunClk(void)722*53ee8cc1Swenshuai.xi HALMVOPFREQUENCY HAL_MVOP_GetMaxFreerunClk(void)
723*53ee8cc1Swenshuai.xi {
724*53ee8cc1Swenshuai.xi     return HALMVOP_160MHZ;
725*53ee8cc1Swenshuai.xi }
726*53ee8cc1Swenshuai.xi 
HAL_MVOP_Get4k2kClk(void)727*53ee8cc1Swenshuai.xi HALMVOPFREQUENCY HAL_MVOP_Get4k2kClk(void)
728*53ee8cc1Swenshuai.xi {
729*53ee8cc1Swenshuai.xi     return HALMVOP_320MHZ;
730*53ee8cc1Swenshuai.xi }
731*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetFrequency(HALMVOPFREQUENCY enFrequency)732*53ee8cc1Swenshuai.xi void HAL_MVOP_SetFrequency(HALMVOPFREQUENCY enFrequency)
733*53ee8cc1Swenshuai.xi {
734*53ee8cc1Swenshuai.xi     // clear
735*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(REG_CKG_DC0, 0, CKG_DC0_MASK);
736*53ee8cc1Swenshuai.xi     switch(enFrequency)
737*53ee8cc1Swenshuai.xi     {
738*53ee8cc1Swenshuai.xi         case HALMVOP_SYNCMODE:
739*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_SYNCHRONOUS, CKG_DC0_MASK);
740*53ee8cc1Swenshuai.xi             break;
741*53ee8cc1Swenshuai.xi         case HALMVOP_FREERUNMODE:
742*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_FREERUN, CKG_DC0_MASK);
743*53ee8cc1Swenshuai.xi             break;
744*53ee8cc1Swenshuai.xi         case HALMVOP_160MHZ:
745*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_160MHZ, CKG_DC0_MASK);
746*53ee8cc1Swenshuai.xi             break;
747*53ee8cc1Swenshuai.xi         case HALMVOP_144MHZ:
748*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_144MHZ, CKG_DC0_MASK);
749*53ee8cc1Swenshuai.xi             break;
750*53ee8cc1Swenshuai.xi         case HALMVOP_320MHZ:
751*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_320MHZ, CKG_DC0_MASK);
752*53ee8cc1Swenshuai.xi             break;
753*53ee8cc1Swenshuai.xi         default:
754*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_SYNCHRONOUS, CKG_DC0_MASK);
755*53ee8cc1Swenshuai.xi             MVOP_PRINTF("Attention! In HAL_MVOP_SetFrequency default path!\n");
756*53ee8cc1Swenshuai.xi             break;
757*53ee8cc1Swenshuai.xi     }
758*53ee8cc1Swenshuai.xi }
759*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetMaximumClk(void)760*53ee8cc1Swenshuai.xi HALMVOPFREQUENCY HAL_MVOP_GetMaximumClk(void)
761*53ee8cc1Swenshuai.xi {
762*53ee8cc1Swenshuai.xi     return HALMVOP_320MHZ;
763*53ee8cc1Swenshuai.xi }
764*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetCurrentClk(void)765*53ee8cc1Swenshuai.xi HALMVOPFREQUENCY HAL_MVOP_GetCurrentClk(void)
766*53ee8cc1Swenshuai.xi {
767*53ee8cc1Swenshuai.xi     (MVOP_DBG("%s err: HAL_MVOP_GetCurrentClk=NULL\n", __FUNCTION__));
768*53ee8cc1Swenshuai.xi     return 0;
769*53ee8cc1Swenshuai.xi }
770*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetOutputInterlace(MS_BOOL bEnable)771*53ee8cc1Swenshuai.xi void HAL_MVOP_SetOutputInterlace(MS_BOOL bEnable)
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     }
782*53ee8cc1Swenshuai.xi     else
783*53ee8cc1Swenshuai.xi     {
784*53ee8cc1Swenshuai.xi         regval &= ~0x80;
785*53ee8cc1Swenshuai.xi     }
786*53ee8cc1Swenshuai.xi 
787*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_CTRL0, regval);
788*53ee8cc1Swenshuai.xi }
789*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetPattern(MVOP_Pattern enMVOPPattern)790*53ee8cc1Swenshuai.xi void HAL_MVOP_SetPattern(MVOP_Pattern enMVOPPattern)
791*53ee8cc1Swenshuai.xi {
792*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_TST_IMG, enMVOPPattern, BIT2 | BIT1 | BIT0);
793*53ee8cc1Swenshuai.xi }
794*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetTileFormat(MVOP_TileFormat eTileFmt)795*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SetTileFormat(MVOP_TileFormat eTileFmt)
796*53ee8cc1Swenshuai.xi {
797*53ee8cc1Swenshuai.xi     if (eTileFmt == E_MVOP_TILE_8x32)
798*53ee8cc1Swenshuai.xi     {
799*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_WR, 0, BIT1);
800*53ee8cc1Swenshuai.xi         return TRUE;
801*53ee8cc1Swenshuai.xi     }
802*53ee8cc1Swenshuai.xi     else if (eTileFmt == E_MVOP_TILE_16x32)
803*53ee8cc1Swenshuai.xi     {
804*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_WR, 1, BIT1);
805*53ee8cc1Swenshuai.xi         return TRUE;
806*53ee8cc1Swenshuai.xi     }
807*53ee8cc1Swenshuai.xi     else
808*53ee8cc1Swenshuai.xi     {
809*53ee8cc1Swenshuai.xi         return FALSE;
810*53ee8cc1Swenshuai.xi     }
811*53ee8cc1Swenshuai.xi }
812*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetSupportRgbFormat(MVOP_RgbFormat eRgbFmt)813*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetSupportRgbFormat(MVOP_RgbFormat eRgbFmt)
814*53ee8cc1Swenshuai.xi {
815*53ee8cc1Swenshuai.xi     if ((eRgbFmt == E_MVOP_RGB_565) || (eRgbFmt == E_MVOP_RGB_888))
816*53ee8cc1Swenshuai.xi     {
817*53ee8cc1Swenshuai.xi         return TRUE;
818*53ee8cc1Swenshuai.xi     }
819*53ee8cc1Swenshuai.xi     return FALSE;
820*53ee8cc1Swenshuai.xi }
821*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetRgbFormat(MVOP_RgbFormat eRgbFmt)822*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SetRgbFormat(MVOP_RgbFormat eRgbFmt)
823*53ee8cc1Swenshuai.xi {
824*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
825*53ee8cc1Swenshuai.xi 
826*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
827*53ee8cc1Swenshuai.xi     {
828*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
829*53ee8cc1Swenshuai.xi         return FALSE;
830*53ee8cc1Swenshuai.xi     }
831*53ee8cc1Swenshuai.xi 
832*53ee8cc1Swenshuai.xi     if (eRgbFmt == E_MVOP_RGB_NONE)
833*53ee8cc1Swenshuai.xi     {
834*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_RGB_FMT, 0, VOP_RGB_FMT_SEL);
835*53ee8cc1Swenshuai.xi         bRet = TRUE;
836*53ee8cc1Swenshuai.xi     }
837*53ee8cc1Swenshuai.xi     else if (eRgbFmt == E_MVOP_RGB_565)
838*53ee8cc1Swenshuai.xi     {
839*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_RGB_FMT, VOP_RGB_FMT_565, VOP_RGB_FMT_SEL);
840*53ee8cc1Swenshuai.xi         bRet = TRUE;
841*53ee8cc1Swenshuai.xi     }
842*53ee8cc1Swenshuai.xi     else if (eRgbFmt == E_MVOP_RGB_888)
843*53ee8cc1Swenshuai.xi     {
844*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_RGB_FMT, VOP_RGB_FMT_888, VOP_RGB_FMT_SEL);
845*53ee8cc1Swenshuai.xi         bRet = TRUE;
846*53ee8cc1Swenshuai.xi     }
847*53ee8cc1Swenshuai.xi 
848*53ee8cc1Swenshuai.xi     if (bRet == TRUE)
849*53ee8cc1Swenshuai.xi     {
850*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->eMainRgbFmt = eRgbFmt;
851*53ee8cc1Swenshuai.xi     }
852*53ee8cc1Swenshuai.xi     return bRet;
853*53ee8cc1Swenshuai.xi }
854*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetBlackBG(void)855*53ee8cc1Swenshuai.xi void HAL_MVOP_SetBlackBG(void)
856*53ee8cc1Swenshuai.xi {
857*53ee8cc1Swenshuai.xi     MS_U8 regval;
858*53ee8cc1Swenshuai.xi 
859*53ee8cc1Swenshuai.xi     //set MVOP test pattern to black
860*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_TST_IMG + 1), 0x10);
861*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_U_PAT      , 0x80);
862*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_U_PAT   + 1), 0x80);
863*53ee8cc1Swenshuai.xi 
864*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(VOP_TST_IMG);
865*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_TST_IMG, 0x02);
866*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_TST_IMG, 0x00);
867*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_TST_IMG, regval);
868*53ee8cc1Swenshuai.xi }
869*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetCropWindow(MVOP_InputCfg * pparam)870*53ee8cc1Swenshuai.xi void HAL_MVOP_SetCropWindow(MVOP_InputCfg *pparam)
871*53ee8cc1Swenshuai.xi {
872*53ee8cc1Swenshuai.xi #if 1
873*53ee8cc1Swenshuai.xi     UNUSED(pparam);
874*53ee8cc1Swenshuai.xi #else // enable it when test code is ready
875*53ee8cc1Swenshuai.xi     MS_U32 x, y;
876*53ee8cc1Swenshuai.xi     MS_U32 u32offset;
877*53ee8cc1Swenshuai.xi 
878*53ee8cc1Swenshuai.xi     if(!pparam)
879*53ee8cc1Swenshuai.xi     {
880*53ee8cc1Swenshuai.xi         return;
881*53ee8cc1Swenshuai.xi     }
882*53ee8cc1Swenshuai.xi     //set MVOP test pattern to black
883*53ee8cc1Swenshuai.xi     HAL_MVOP_SetBlackBG();
884*53ee8cc1Swenshuai.xi #if 0
885*53ee8cc1Swenshuai.xi     if((pparam->enVideoType == MVOP_H264) && (pparam->u16StripSize == 1920))
886*53ee8cc1Swenshuai.xi     {
887*53ee8cc1Swenshuai.xi         pparam->u16StripSize = 1952;
888*53ee8cc1Swenshuai.xi     }
889*53ee8cc1Swenshuai.xi #endif
890*53ee8cc1Swenshuai.xi     if((pparam->enVideoType == MVOP_MPG) || (pparam->enVideoType == MVOP_MPEG4))
891*53ee8cc1Swenshuai.xi     {
892*53ee8cc1Swenshuai.xi         pparam->u16CropX = (pparam->u16CropX >> 3) << 3; // 8 bytes align
893*53ee8cc1Swenshuai.xi         pparam->u16CropY = (pparam->u16CropY >> 6) << 6; // 64 bytes align
894*53ee8cc1Swenshuai.xi     }
895*53ee8cc1Swenshuai.xi     else if((pparam->enVideoType == MVOP_H264) || (pparam->enVideoType == MVOP_RM))
896*53ee8cc1Swenshuai.xi     {
897*53ee8cc1Swenshuai.xi         pparam->u16CropX = (pparam->u16CropX >> 4) << 4; // 16 bytes align
898*53ee8cc1Swenshuai.xi         pparam->u16CropY = (pparam->u16CropY >> 6) << 6; // 64 bytes align
899*53ee8cc1Swenshuai.xi     }
900*53ee8cc1Swenshuai.xi     else
901*53ee8cc1Swenshuai.xi     {
902*53ee8cc1Swenshuai.xi         MS_ASSERT(0);
903*53ee8cc1Swenshuai.xi     }
904*53ee8cc1Swenshuai.xi 
905*53ee8cc1Swenshuai.xi     x = (MS_U32)pparam->u16CropX;
906*53ee8cc1Swenshuai.xi     y = (MS_U32)pparam->u16CropY;
907*53ee8cc1Swenshuai.xi 
908*53ee8cc1Swenshuai.xi     // y offset
909*53ee8cc1Swenshuai.xi     u32offset = ((y * pparam->u16StripSize + (x << 5)) >> 3);
910*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_L    ), (MS_U8)(u32offset));
911*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_L + 1), (MS_U8)(u32offset >> 8));
912*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_H    ), (MS_U8)(u32offset >> 16));
913*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_H + 1), (MS_U8)((u32offset >> 24) & VOP_YUV_STR_HIBITS));
914*53ee8cc1Swenshuai.xi 
915*53ee8cc1Swenshuai.xi     // uv offset
916*53ee8cc1Swenshuai.xi     u32offset = ((y >> 1) * pparam->u16StripSize + (x << 5)) >> 3;
917*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_UVSTR0_L    ), (MS_U8)(u32offset));
918*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_UVSTR0_L + 1), (MS_U8)(u32offset >> 8));
919*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_UVSTR0_H    ), (MS_U8)(u32offset >> 16));
920*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_UVSTR0_H + 1), (MS_U8)((u32offset >> 24) & VOP_YUV_STR_HIBITS));
921*53ee8cc1Swenshuai.xi 
922*53ee8cc1Swenshuai.xi     pparam->u16CropWidth= (pparam->u16CropWidth >> 3) << 3;
923*53ee8cc1Swenshuai.xi     // HSize, VSize
924*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_HSIZE    ), LOWBYTE(pparam->u16CropWidth ));
925*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_HSIZE + 1), HIGHBYTE(pparam->u16CropWidth ));
926*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_VSIZE    ), LOWBYTE(pparam->u16CropHeight));
927*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_VSIZE + 1), HIGHBYTE(pparam->u16CropHeight ));
928*53ee8cc1Swenshuai.xi 
929*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_MPG_JPG_SWITCH, BIT0, BIT1|BIT0);
930*53ee8cc1Swenshuai.xi 
931*53ee8cc1Swenshuai.xi     // clear extend strip len bit by default
932*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
933*53ee8cc1Swenshuai.xi     if((pparam->enVideoType == MVOP_MPG) || (pparam->enVideoType == MVOP_MPEG4))
934*53ee8cc1Swenshuai.xi     {
935*53ee8cc1Swenshuai.xi         // Disable H264 or RM Input
936*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_INPUT_SWITCH1, 0, BIT2|BIT3);
937*53ee8cc1Swenshuai.xi         //8*32 tile format
938*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_WR, 0, BIT1);
939*53ee8cc1Swenshuai.xi     }
940*53ee8cc1Swenshuai.xi     else if((pparam->enVideoType == MVOP_H264) || (pparam->enVideoType == MVOP_RM))
941*53ee8cc1Swenshuai.xi     {
942*53ee8cc1Swenshuai.xi         //16*32 tile format
943*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_WR, 1, BIT1);
944*53ee8cc1Swenshuai.xi         // SVD mode enable
945*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_INPUT_SWITCH1, BIT3, BIT2|BIT3);
946*53ee8cc1Swenshuai.xi         // set mvop to 64bit interface
947*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_MIU_IF, VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
948*53ee8cc1Swenshuai.xi     }
949*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
950*53ee8cc1Swenshuai.xi #endif
951*53ee8cc1Swenshuai.xi }
952*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetRepeatField(MVOP_RptFldMode eMode)953*53ee8cc1Swenshuai.xi void HAL_MVOP_SetRepeatField(MVOP_RptFldMode eMode)
954*53ee8cc1Swenshuai.xi {
955*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
956*53ee8cc1Swenshuai.xi     {
957*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
958*53ee8cc1Swenshuai.xi         return;
959*53ee8cc1Swenshuai.xi     }
960*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->eRepeatField = eMode;
961*53ee8cc1Swenshuai.xi }
962*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetInputMode(VOPINPUTMODE mode,MVOP_InputCfg * pparam,MS_U16 u16ECOVersion)963*53ee8cc1Swenshuai.xi void HAL_MVOP_SetInputMode( VOPINPUTMODE mode, MVOP_InputCfg *pparam, MS_U16 u16ECOVersion )
964*53ee8cc1Swenshuai.xi {
965*53ee8cc1Swenshuai.xi     MS_U8 regval;
966*53ee8cc1Swenshuai.xi     MS_U16 u16strip, u16strip_lsb;
967*53ee8cc1Swenshuai.xi 
968*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
969*53ee8cc1Swenshuai.xi     {
970*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
971*53ee8cc1Swenshuai.xi         return;
972*53ee8cc1Swenshuai.xi     }
973*53ee8cc1Swenshuai.xi #if 0
974*53ee8cc1Swenshuai.xi     /*****************************************************/
975*53ee8cc1Swenshuai.xi     // Reset MVOP setting
976*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_TST_IMG, 0x40); //reset test pattern or BG
977*53ee8cc1Swenshuai.xi     HAL_MVOP_Set3DLRAltOutput_VHalfScaling(DISABLE); //reset to default: disable 3D L/R alternative output.
978*53ee8cc1Swenshuai.xi     HAL_MVOP_Set3DLR2ndCfg(DISABLE);    //reset to default: disable 3D L/R 2nd pitch.
979*53ee8cc1Swenshuai.xi     HAL_MVOP_SetRgbFormat(E_MVOP_RGB_NONE); //reset rgb format
980*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL1, 0, VOP_MVD_VS_MD); //default use original vsync
981*53ee8cc1Swenshuai.xi     // Only for Monaco: Enable deciding bot by top address + 2
982*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG, 1, VOP_FIELD_FROM_ADDR);
983*53ee8cc1Swenshuai.xi 
984*53ee8cc1Swenshuai.xi     //set MVOP test pattern to black
985*53ee8cc1Swenshuai.xi     HAL_MVOP_SetBlackBG();
986*53ee8cc1Swenshuai.xi 
987*53ee8cc1Swenshuai.xi     // clear extend strip len bit by default
988*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
989*53ee8cc1Swenshuai.xi 
990*53ee8cc1Swenshuai.xi     // set mvop to 128bit_i128 interface
991*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_MIU_IF, VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
992*53ee8cc1Swenshuai.xi 
993*53ee8cc1Swenshuai.xi     // Disable H264 or RM Input
994*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INPUT_SWITCH1, 0, BIT2|BIT3);
995*53ee8cc1Swenshuai.xi     // Clear 422 Flag
996*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIs422 = 0;
997*53ee8cc1Swenshuai.xi     // Clear evd Flag for interlace mode setting
998*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsH265 = 0;
999*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INFO_FROM_CODEC_L, 1, BIT3);
1000*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG, 1, BIT5);
1001*53ee8cc1Swenshuai.xi     //8*32 tile format
1002*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, 0, BIT1);
1003*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG_HI, 0, VOP_REF_SELF_FLD);
1004*53ee8cc1Swenshuai.xi     HAL_MVOP_SetFieldInverse(ENABLE, ENABLE);
1005*53ee8cc1Swenshuai.xi     // EVD mode disable
1006*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INPUT_SWITCH0, 0, EVD_ENABLE);
1007*53ee8cc1Swenshuai.xi     // EVD 10 bits disable
1008*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_REG_MASK, BIT1, VOP_LSB_REQ_MASK);
1009*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_EVD_10B_EN, 0, VOP_EVD_10B_Y_EN);
1010*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_EVD_10B_EN, 0, VOP_EVD_10B_UV_EN);
1011*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_UV_SHIFT, 1, VOP_GCLK_MIU_ON);
1012*53ee8cc1Swenshuai.xi     // Disable 420 BW Saving mode
1013*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_DUMMY, 0, VOP_420_BW_SAVE);
1014*53ee8cc1Swenshuai.xi     // Disable New Vsync Mode
1015*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bNewVSyncMode = FALSE;
1016*53ee8cc1Swenshuai.xi     // VP9 MODE disable
1017*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INPUT_SWITCH0, 0, VOP_R2_WISHBONE);
1018*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MPG_JPG_SWITCH, 0, VOP_DRAM_RD_MODE);
1019*53ee8cc1Swenshuai.xi     // Disable 2p mode
1020*53ee8cc1Swenshuai.xi     HAL_MVOP_SetEnable4k2k2P(FALSE);
1021*53ee8cc1Swenshuai.xi     /*****************************************************/
1022*53ee8cc1Swenshuai.xi #endif
1023*53ee8cc1Swenshuai.xi     regval = 0;
1024*53ee8cc1Swenshuai.xi     regval |= ( mode & 0x3 );
1025*53ee8cc1Swenshuai.xi 
1026*53ee8cc1Swenshuai.xi     if ( mode == VOPINPUT_HARDWIRE )
1027*53ee8cc1Swenshuai.xi     {
1028*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_MPG_JPG_SWITCH, regval);
1029*53ee8cc1Swenshuai.xi     }
1030*53ee8cc1Swenshuai.xi     else if ( mode == VOPINPUT_HARDWIRECLIP )
1031*53ee8cc1Swenshuai.xi     {
1032*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_MPG_JPG_SWITCH, regval);
1033*53ee8cc1Swenshuai.xi 
1034*53ee8cc1Swenshuai.xi         // HSize, VSize
1035*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_HSIZE    , LOWBYTE( pparam->u16HSize ));
1036*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_HSIZE + 1), HIGHBYTE( pparam->u16HSize ));
1037*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_VSIZE    , LOWBYTE( pparam->u16VSize ));
1038*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_VSIZE + 1), HIGHBYTE( pparam->u16VSize ));
1039*53ee8cc1Swenshuai.xi     }
1040*53ee8cc1Swenshuai.xi     else if (mode == VOPINPUT_MCUCTRL)
1041*53ee8cc1Swenshuai.xi     {
1042*53ee8cc1Swenshuai.xi         // disable from wb
1043*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_MFDEC_2_L, 0, VOP_MF_FROM_WB);
1044*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_INPUT_SWITCH0, 0, VOP_R2_WISHBONE);
1045*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bMirrorMode = (g_pHalMVOPCtx->bMirrorModeVer||g_pHalMVOPCtx->bMirrorModeHor);
1046*53ee8cc1Swenshuai.xi         if ( pparam->bProgressive )
1047*53ee8cc1Swenshuai.xi             regval |= 0x4;
1048*53ee8cc1Swenshuai.xi         else
1049*53ee8cc1Swenshuai.xi         {
1050*53ee8cc1Swenshuai.xi             regval &= ~0x4;
1051*53ee8cc1Swenshuai.xi             regval |= 0x1;  //reg_dc_md=b'11 for interlace input
1052*53ee8cc1Swenshuai.xi             if (E_MVOP_RPTFLD_NONE == g_pHalMVOPCtx->eRepeatField)
1053*53ee8cc1Swenshuai.xi             {
1054*53ee8cc1Swenshuai.xi                 MVOP_DBG("%s normal NOT repeat field %x\n", __FUNCTION__, g_pHalMVOPCtx->eRepeatField);
1055*53ee8cc1Swenshuai.xi                 //To support mcu mode interlace, need to set h'3B[9]=1,
1056*53ee8cc1Swenshuai.xi                 //h'11[12]=0, and Y1/UV1 address equal to Y0/UV0 address.
1057*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_MIRROR_CFG_HI, 1, VOP_REF_SELF_FLD);
1058*53ee8cc1Swenshuai.xi                 HAL_MVOP_SetFieldInverse(ENABLE, DISABLE);
1059*53ee8cc1Swenshuai.xi             }
1060*53ee8cc1Swenshuai.xi         }
1061*53ee8cc1Swenshuai.xi 
1062*53ee8cc1Swenshuai.xi         if ( pparam->bYUV422 )
1063*53ee8cc1Swenshuai.xi             regval |= 0x10;
1064*53ee8cc1Swenshuai.xi         else
1065*53ee8cc1Swenshuai.xi             regval &= ~0x10;
1066*53ee8cc1Swenshuai.xi 
1067*53ee8cc1Swenshuai.xi         if ( pparam->b422pack )
1068*53ee8cc1Swenshuai.xi             regval |= 0x80;
1069*53ee8cc1Swenshuai.xi 
1070*53ee8cc1Swenshuai.xi         if ( pparam->bDramRdContd == 1 )
1071*53ee8cc1Swenshuai.xi             regval |= 0x20;
1072*53ee8cc1Swenshuai.xi         else
1073*53ee8cc1Swenshuai.xi             regval &= ~0x20;
1074*53ee8cc1Swenshuai.xi 
1075*53ee8cc1Swenshuai.xi         // for backward compatable to saturn
1076*53ee8cc1Swenshuai.xi         // [3] UV-7bit mode don't care
1077*53ee8cc1Swenshuai.xi         // [5] dram_rd_md =0
1078*53ee8cc1Swenshuai.xi         // [6] Fld don't care
1079*53ee8cc1Swenshuai.xi         // [7] 422pack don'care
1080*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_MPG_JPG_SWITCH, regval);
1081*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bIs422 = pparam->bYUV422;
1082*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_DUMMY, !(pparam->bYUV422), VOP_420_BW_SAVE);
1083*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_BW_SAVE, !(pparam->bYUV422), VOP_420_BW_SAVE_EX);
1084*53ee8cc1Swenshuai.xi 
1085*53ee8cc1Swenshuai.xi         if (pparam->u16StripSize == 0)
1086*53ee8cc1Swenshuai.xi         {
1087*53ee8cc1Swenshuai.xi             if (pparam->bSD)
1088*53ee8cc1Swenshuai.xi             {
1089*53ee8cc1Swenshuai.xi                 u16strip = 720;
1090*53ee8cc1Swenshuai.xi                 u16strip_lsb = 720;
1091*53ee8cc1Swenshuai.xi             }
1092*53ee8cc1Swenshuai.xi             else
1093*53ee8cc1Swenshuai.xi             {
1094*53ee8cc1Swenshuai.xi                 u16strip = 1920;
1095*53ee8cc1Swenshuai.xi                 u16strip_lsb = 1920;
1096*53ee8cc1Swenshuai.xi             }
1097*53ee8cc1Swenshuai.xi         }
1098*53ee8cc1Swenshuai.xi         else
1099*53ee8cc1Swenshuai.xi         {
1100*53ee8cc1Swenshuai.xi             u16strip = pparam->u16StripSize;
1101*53ee8cc1Swenshuai.xi             u16strip_lsb = pparam->u16StripSize;
1102*53ee8cc1Swenshuai.xi         }
1103*53ee8cc1Swenshuai.xi 
1104*53ee8cc1Swenshuai.xi         // set dc_strip[7:0]
1105*53ee8cc1Swenshuai.xi         if ( pparam->bDramRdContd == 0 )
1106*53ee8cc1Swenshuai.xi         {
1107*53ee8cc1Swenshuai.xi             u16strip = (u16strip + 31) / 32 * 32; //need align for monaco
1108*53ee8cc1Swenshuai.xi             u16strip = u16strip/8;
1109*53ee8cc1Swenshuai.xi             u16strip_lsb = (u16strip_lsb+127)/128;
1110*53ee8cc1Swenshuai.xi             u16strip_lsb *= 4;
1111*53ee8cc1Swenshuai.xi         }
1112*53ee8cc1Swenshuai.xi         else
1113*53ee8cc1Swenshuai.xi         {
1114*53ee8cc1Swenshuai.xi             if ( pparam->b422pack )
1115*53ee8cc1Swenshuai.xi             {
1116*53ee8cc1Swenshuai.xi                 if (E_MVOP_RGB_888 == g_pHalMVOPCtx->eMainRgbFmt)
1117*53ee8cc1Swenshuai.xi                 {
1118*53ee8cc1Swenshuai.xi                     u16strip *= 2; //4bytes/pixel (yuv422:2bytes/pixel)
1119*53ee8cc1Swenshuai.xi                 }
1120*53ee8cc1Swenshuai.xi                 //VOP_REG_STRIP_ALIGN and Mirror mode are mutually exclusive, after M10(support mirror), VOP_DC_STRIP_H
1121*53ee8cc1Swenshuai.xi                 //replace VOP_REG_STRIP_ALIGN, which supported maximun Hsize is 8188
1122*53ee8cc1Swenshuai.xi #if 0
1123*53ee8cc1Swenshuai.xi                 // [071016 Andy] support YUV422 pack mode
1124*53ee8cc1Swenshuai.xi                 if ((u16strip < 1024) || g_pHalMVOPCtx->bMirrorMode)
1125*53ee8cc1Swenshuai.xi                 {
1126*53ee8cc1Swenshuai.xi                     u16strip = u16strip/4;
1127*53ee8cc1Swenshuai.xi                     // dont extend strip len
1128*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
1129*53ee8cc1Swenshuai.xi                 }
1130*53ee8cc1Swenshuai.xi                 else
1131*53ee8cc1Swenshuai.xi                 {
1132*53ee8cc1Swenshuai.xi                     u16strip = u16strip/8;
1133*53ee8cc1Swenshuai.xi                     // extend strip len to 2048
1134*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 1, BIT0);
1135*53ee8cc1Swenshuai.xi                 }
1136*53ee8cc1Swenshuai.xi #endif
1137*53ee8cc1Swenshuai.xi                 u16strip = u16strip/4;
1138*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
1139*53ee8cc1Swenshuai.xi             }
1140*53ee8cc1Swenshuai.xi             else
1141*53ee8cc1Swenshuai.xi             {
1142*53ee8cc1Swenshuai.xi                 u16strip = u16strip/8;
1143*53ee8cc1Swenshuai.xi             }
1144*53ee8cc1Swenshuai.xi         }
1145*53ee8cc1Swenshuai.xi 
1146*53ee8cc1Swenshuai.xi         if (u16strip >= 256 )
1147*53ee8cc1Swenshuai.xi         {
1148*53ee8cc1Swenshuai.xi             HAL_WriteByte(VOP_DC_STRIP_H, (u16strip>>8));
1149*53ee8cc1Swenshuai.xi             //reg_dc_strip_h[2:0] = reg_dc_strip[10:8]
1150*53ee8cc1Swenshuai.xi         }
1151*53ee8cc1Swenshuai.xi         else
1152*53ee8cc1Swenshuai.xi         {
1153*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(VOP_DC_STRIP_H, 0, BIT0 | BIT1 | BIT2);
1154*53ee8cc1Swenshuai.xi         }
1155*53ee8cc1Swenshuai.xi 
1156*53ee8cc1Swenshuai.xi         regval = u16strip;
1157*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_DC_STRIP, regval);
1158*53ee8cc1Swenshuai.xi         //LSB strip
1159*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_DC_STRIP_LSB, u16strip_lsb & 0x3ff);
1160*53ee8cc1Swenshuai.xi 
1161*53ee8cc1Swenshuai.xi 
1162*53ee8cc1Swenshuai.xi         HAL_MVOP_SetYUVBaseAdd(pparam->u32YOffset, pparam->u32UVOffset,
1163*53ee8cc1Swenshuai.xi                                pparam->bProgressive, pparam->b422pack);
1164*53ee8cc1Swenshuai.xi 
1165*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_NONE != g_pHalMVOPCtx->eRepeatField)
1166*53ee8cc1Swenshuai.xi         {
1167*53ee8cc1Swenshuai.xi             MVOP_DBG("%s reset eRepeatField=%x ==>", __FUNCTION__, g_pHalMVOPCtx->eRepeatField);
1168*53ee8cc1Swenshuai.xi             //To output the same field for single field input,
1169*53ee8cc1Swenshuai.xi             //do NOT set h'3B[9]=1 and h'11[12]=0
1170*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->eRepeatField = E_MVOP_RPTFLD_NONE;    //reset the flag to repeat field
1171*53ee8cc1Swenshuai.xi             MVOP_DBG(" %x\n", g_pHalMVOPCtx->eRepeatField);
1172*53ee8cc1Swenshuai.xi         }
1173*53ee8cc1Swenshuai.xi 
1174*53ee8cc1Swenshuai.xi         // HSize
1175*53ee8cc1Swenshuai.xi         MS_U16 u16HSize = ALIGN_UPTO_16(pparam->u16HSize);
1176*53ee8cc1Swenshuai.xi         if (u16HSize != pparam->u16HSize)
1177*53ee8cc1Swenshuai.xi         {
1178*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("\n\n Change HSize %d to %d\n", pparam->u16HSize, u16HSize);)
1179*53ee8cc1Swenshuai.xi         }
1180*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_HSIZE    , LOWBYTE( u16HSize ));
1181*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_HSIZE + 1), HIGHBYTE( u16HSize ));
1182*53ee8cc1Swenshuai.xi 
1183*53ee8cc1Swenshuai.xi         // VSize
1184*53ee8cc1Swenshuai.xi         MS_U16 u16VSize = pparam->u16VSize;
1185*53ee8cc1Swenshuai.xi         if (g_pHalMVOPCtx->bMirrorModeVer)
1186*53ee8cc1Swenshuai.xi         {
1187*53ee8cc1Swenshuai.xi             u16VSize = ALIGN_UPTO_4(pparam->u16VSize);
1188*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("\n\n Change VSize %d to %d\n", pparam->u16VSize, u16VSize);)
1189*53ee8cc1Swenshuai.xi         }
1190*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_VSIZE    , LOWBYTE( u16VSize ));
1191*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_VSIZE + 1), HIGHBYTE( u16VSize ));
1192*53ee8cc1Swenshuai.xi     }
1193*53ee8cc1Swenshuai.xi 
1194*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
1195*53ee8cc1Swenshuai.xi }
1196*53ee8cc1Swenshuai.xi 
1197*53ee8cc1Swenshuai.xi 
HAL_MVOP_EnableUVShift(MS_BOOL bEnable)1198*53ee8cc1Swenshuai.xi void HAL_MVOP_EnableUVShift(MS_BOOL bEnable)
1199*53ee8cc1Swenshuai.xi {
1200*53ee8cc1Swenshuai.xi     MS_U8 regval;
1201*53ee8cc1Swenshuai.xi 
1202*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(VOP_MPG_JPG_SWITCH);
1203*53ee8cc1Swenshuai.xi 
1204*53ee8cc1Swenshuai.xi     if (((regval & BIT4) == BIT4) && ((regval & 0x3)== 0x2))
1205*53ee8cc1Swenshuai.xi     {   // 422 with MCU control mode
1206*53ee8cc1Swenshuai.xi         if (bEnable)
1207*53ee8cc1Swenshuai.xi         {
1208*53ee8cc1Swenshuai.xi             MS_ASSERT(0);
1209*53ee8cc1Swenshuai.xi         }
1210*53ee8cc1Swenshuai.xi     }
1211*53ee8cc1Swenshuai.xi 
1212*53ee8cc1Swenshuai.xi     // output 420 and interlace
1213*53ee8cc1Swenshuai.xi     //[IP - Sheet] : Main Page --- 420CUP
1214*53ee8cc1Swenshuai.xi     //[Project] :  Titania2
1215*53ee8cc1Swenshuai.xi     //[Description]:   Chroma artifacts when 420to422 is applied duplicate method.
1216*53ee8cc1Swenshuai.xi     //[Root cause]: Apply 420to422 average algorithm to all DTV input cases.
1217*53ee8cc1Swenshuai.xi     //The average algorithm must cooperate with MVOP.
1218*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_UV_SHIFT, (bEnable)?1:0, 0x3);
1219*53ee8cc1Swenshuai.xi }
1220*53ee8cc1Swenshuai.xi 
1221*53ee8cc1Swenshuai.xi static MS_BOOL _bEnable60P = false;
HAL_MVOP_SetEnable60P(MS_BOOL bEnable)1222*53ee8cc1Swenshuai.xi void HAL_MVOP_SetEnable60P(MS_BOOL bEnable)
1223*53ee8cc1Swenshuai.xi {
1224*53ee8cc1Swenshuai.xi     _bEnable60P = bEnable;
1225*53ee8cc1Swenshuai.xi }
1226*53ee8cc1Swenshuai.xi 
1227*53ee8cc1Swenshuai.xi static MS_BOOL _bEnable4k2kClk = false;
HAL_MVOP_SetEnable4k2kClk(MS_BOOL bEnable)1228*53ee8cc1Swenshuai.xi void HAL_MVOP_SetEnable4k2kClk(MS_BOOL bEnable)
1229*53ee8cc1Swenshuai.xi {
1230*53ee8cc1Swenshuai.xi     _bEnable4k2kClk = bEnable;
1231*53ee8cc1Swenshuai.xi }
1232*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetEnable4k2k2P(MS_BOOL bEnable)1233*53ee8cc1Swenshuai.xi void HAL_MVOP_SetEnable4k2k2P(MS_BOOL bEnable)
1234*53ee8cc1Swenshuai.xi {
1235*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIs2p = bEnable;
1236*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_4K2K_2P, bEnable, VOP_4K2K_2P);
1237*53ee8cc1Swenshuai.xi 
1238*53ee8cc1Swenshuai.xi }
1239*53ee8cc1Swenshuai.xi 
HAL_MVOP_EnableFreerunMode(MS_BOOL bEnable)1240*53ee8cc1Swenshuai.xi void HAL_MVOP_EnableFreerunMode(MS_BOOL bEnable)
1241*53ee8cc1Swenshuai.xi {
1242*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
1243*53ee8cc1Swenshuai.xi     {
1244*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1245*53ee8cc1Swenshuai.xi         return;
1246*53ee8cc1Swenshuai.xi     }
1247*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bEnableFreerunMode = bEnable;
1248*53ee8cc1Swenshuai.xi }
1249*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetVSyncMode(MS_U8 u8Mode)1250*53ee8cc1Swenshuai.xi void HAL_MVOP_SetVSyncMode(MS_U8 u8Mode)
1251*53ee8cc1Swenshuai.xi {
1252*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
1253*53ee8cc1Swenshuai.xi     {
1254*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1255*53ee8cc1Swenshuai.xi         return;
1256*53ee8cc1Swenshuai.xi     }
1257*53ee8cc1Swenshuai.xi     if (1==u8Mode)
1258*53ee8cc1Swenshuai.xi     {
1259*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bNewVSyncMode = TRUE;
1260*53ee8cc1Swenshuai.xi     }
1261*53ee8cc1Swenshuai.xi     else
1262*53ee8cc1Swenshuai.xi     {
1263*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bNewVSyncMode = FALSE;
1264*53ee8cc1Swenshuai.xi     }
1265*53ee8cc1Swenshuai.xi }
1266*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetOutputTiming(MVOP_Timing * ptiming)1267*53ee8cc1Swenshuai.xi void HAL_MVOP_SetOutputTiming( MVOP_Timing *ptiming )
1268*53ee8cc1Swenshuai.xi {
1269*53ee8cc1Swenshuai.xi     MS_U8 regval;
1270*53ee8cc1Swenshuai.xi 
1271*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
1272*53ee8cc1Swenshuai.xi     {
1273*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1274*53ee8cc1Swenshuai.xi         return;
1275*53ee8cc1Swenshuai.xi     }
1276*53ee8cc1Swenshuai.xi 
1277*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_FRAME_VCOUNT    , LOWBYTE( ptiming->u16V_TotalCount ));
1278*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_FRAME_VCOUNT + 1), HIGHBYTE( ptiming->u16V_TotalCount ));
1279*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_FRAME_HCOUNT    , LOWBYTE( ptiming->u16H_TotalCount ));
1280*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_FRAME_HCOUNT + 1), HIGHBYTE( ptiming->u16H_TotalCount ));
1281*53ee8cc1Swenshuai.xi 
1282*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_VB0_STR     ), LOWBYTE( ptiming->u16VBlank0_Start ));
1283*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_VB0_STR  + 1), HIGHBYTE( ptiming->u16VBlank0_Start ));
1284*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_VB0_END     ), LOWBYTE( ptiming->u16VBlank0_End ));
1285*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_VB0_END  + 1), HIGHBYTE( ptiming->u16VBlank0_End ));
1286*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_VB1_STR     ), LOWBYTE( ptiming->u16VBlank1_Start ));
1287*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_VB1_STR  + 1), HIGHBYTE( ptiming->u16VBlank1_Start ));
1288*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_VB1_END     ), LOWBYTE( ptiming->u16VBlank1_End ));
1289*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_VB1_END  + 1), HIGHBYTE( ptiming->u16VBlank1_End ));
1290*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_TF_STR      ), LOWBYTE( ptiming->u16TopField_Start ));
1291*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_TF_STR   + 1), HIGHBYTE( ptiming->u16TopField_Start ));
1292*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_BF_STR      ), LOWBYTE( ptiming->u16BottomField_Start ));
1293*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_BF_STR   + 1), HIGHBYTE( ptiming->u16BottomField_Start ));
1294*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_HACT_STR    ), LOWBYTE( ptiming->u16HActive_Start ));
1295*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_HACT_STR + 1), HIGHBYTE( ptiming->u16HActive_Start ));
1296*53ee8cc1Swenshuai.xi 
1297*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_TF_VS      ), LOWBYTE( ptiming->u16TopField_VS ));
1298*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_TF_VS   + 1), HIGHBYTE( ptiming->u16TopField_VS ));
1299*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_BF_VS      ), LOWBYTE( ptiming->u16BottomField_VS ));
1300*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_BF_VS   + 1), HIGHBYTE( ptiming->u16BottomField_VS ));
1301*53ee8cc1Swenshuai.xi 
1302*53ee8cc1Swenshuai.xi 	if((ptiming->u16Height >= 2160 || ptiming->u16Width >= 3840) && (ptiming->bInterlace == FALSE))
1303*53ee8cc1Swenshuai.xi     {
1304*53ee8cc1Swenshuai.xi         //Monet/Mooney 4k2k pmode default 30 lines forwarding.
1305*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bNewVSyncMode = TRUE;
1306*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->u16VsyncLines = 0;
1307*53ee8cc1Swenshuai.xi     }
1308*53ee8cc1Swenshuai.xi 
1309*53ee8cc1Swenshuai.xi     if(g_pHalMVOPCtx->bNewVSyncMode)
1310*53ee8cc1Swenshuai.xi     {
1311*53ee8cc1Swenshuai.xi         #define NEW_VSYNC_MODE_ADVANCE_LINECNT 30
1312*53ee8cc1Swenshuai.xi         MS_U16 u16BottomField_VS2MVD;
1313*53ee8cc1Swenshuai.xi         MS_U16 u16TopField_VS2MVD;
1314*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("MVOP use new vync mode, forwarding %d lines\n",NEW_VSYNC_MODE_ADVANCE_LINECNT);)
1315*53ee8cc1Swenshuai.xi 
1316*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->u16VsyncLines == 0)
1317*53ee8cc1Swenshuai.xi             u16BottomField_VS2MVD = ptiming->u16BottomField_VS - NEW_VSYNC_MODE_ADVANCE_LINECNT;
1318*53ee8cc1Swenshuai.xi         else
1319*53ee8cc1Swenshuai.xi             u16BottomField_VS2MVD = ptiming->u16BottomField_VS - g_pHalMVOPCtx->u16VsyncLines;
1320*53ee8cc1Swenshuai.xi 
1321*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("BottomField VS ori=0x%x, new=0x%x\n", ptiming->u16BottomField_VS, u16BottomField_VS2MVD);)
1322*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_BF_VS_MVD    ), LOWBYTE( u16BottomField_VS2MVD ));
1323*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_BF_VS_MVD + 1), HIGHBYTE( u16BottomField_VS2MVD ));
1324*53ee8cc1Swenshuai.xi 
1325*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->u16VsyncLines == 0)
1326*53ee8cc1Swenshuai.xi             u16TopField_VS2MVD = ptiming->u16V_TotalCount - NEW_VSYNC_MODE_ADVANCE_LINECNT;
1327*53ee8cc1Swenshuai.xi         else
1328*53ee8cc1Swenshuai.xi             u16TopField_VS2MVD = ptiming->u16V_TotalCount - g_pHalMVOPCtx->u16VsyncLines;
1329*53ee8cc1Swenshuai.xi 
1330*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("TopField VS Vtt=0x%x, new=0x%x\n", ptiming->u16V_TotalCount, u16TopField_VS2MVD);)
1331*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_TF_VS_MVD    ), LOWBYTE( u16TopField_VS2MVD ));
1332*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_TF_VS_MVD + 1), HIGHBYTE( u16TopField_VS2MVD ));
1333*53ee8cc1Swenshuai.xi 
1334*53ee8cc1Swenshuai.xi #if SUPPORT_FILED_DB // t/b signal 30 lines forwarding
1335*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_MIRROR_CFG_HI, 0, VOP_DC2MVD_FLD_SEL);
1336*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_BW_THD_H, 1, REG_MVD_FLD_SEL);
1337*53ee8cc1Swenshuai.xi 
1338*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_TF_STR_MVD    ), LOWBYTE( u16TopField_VS2MVD ));
1339*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_TF_STR_MVD + 1), HIGHBYTE( u16TopField_VS2MVD ));
1340*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_BF_STR_MVD    ), LOWBYTE( u16BottomField_VS2MVD ));
1341*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_BF_STR_MVD + 1), HIGHBYTE( u16BottomField_VS2MVD ));
1342*53ee8cc1Swenshuai.xi #endif
1343*53ee8cc1Swenshuai.xi 
1344*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_GCLK, 0, VOP_GCLK_MIU_ON);
1345*53ee8cc1Swenshuai.xi 
1346*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_CTRL1, 1, VOP_MVD_VS_MD); //Use new vsync
1347*53ee8cc1Swenshuai.xi 
1348*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bNewVSyncMode = FALSE; //restore to original mode
1349*53ee8cc1Swenshuai.xi     }
1350*53ee8cc1Swenshuai.xi     else
1351*53ee8cc1Swenshuai.xi     {
1352*53ee8cc1Swenshuai.xi         MS_U16 u16BottomField_VS2MVD = 0x200;
1353*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_BF_VS_MVD    ), LOWBYTE( u16BottomField_VS2MVD ));
1354*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_BF_VS_MVD + 1), HIGHBYTE( u16BottomField_VS2MVD ));
1355*53ee8cc1Swenshuai.xi 
1356*53ee8cc1Swenshuai.xi         MS_U16 u16TopField_VS2MVD = 0x200;
1357*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_TF_VS_MVD    ), LOWBYTE( u16TopField_VS2MVD ));
1358*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_TF_VS_MVD + 1), HIGHBYTE( u16TopField_VS2MVD ));
1359*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_CTRL1, 0, VOP_MVD_VS_MD);
1360*53ee8cc1Swenshuai.xi     }
1361*53ee8cc1Swenshuai.xi 
1362*53ee8cc1Swenshuai.xi     // + S3, set default IMG_HSTR, IMG_VSTR0, IMG_VSTR1
1363*53ee8cc1Swenshuai.xi #ifdef _SUPPORT_IMG_OFFSET_
1364*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_HSTR    ), LOWBYTE( ptiming->u16HImg_Start));
1365*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_HSTR + 1), HIGHBYTE( ptiming->u16HImg_Start ));
1366*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_VSTR0   ), LOWBYTE( ptiming->u16VImg_Start0));
1367*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_VSTR0+ 1), HIGHBYTE( ptiming->u16VImg_Start0 ));
1368*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_VSTR1   ), LOWBYTE( ptiming->u16VImg_Start1 ));
1369*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_VSTR1+ 1), HIGHBYTE( ptiming->u16VImg_Start1 ));
1370*53ee8cc1Swenshuai.xi #else
1371*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_HSTR    ), LOWBYTE( ptiming->u16HActive_Start ));
1372*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_HSTR + 1), HIGHBYTE( ptiming->u16HActive_Start ));
1373*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_VSTR0   ), LOWBYTE( ptiming->u16VBlank0_End ));
1374*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_VSTR0+ 1), HIGHBYTE( ptiming->u16VBlank0_End ));
1375*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_VSTR1   ), LOWBYTE( ptiming->u16VBlank1_End ));
1376*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_IMG_VSTR1+ 1), HIGHBYTE( ptiming->u16VBlank1_End ));
1377*53ee8cc1Swenshuai.xi #endif
1378*53ee8cc1Swenshuai.xi     // select mvop output from frame color(black)
1379*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_TST_IMG + 1), 0x10);
1380*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_U_PAT      ), 0x80);
1381*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_U_PAT   + 1), 0x80);
1382*53ee8cc1Swenshuai.xi     // set mvop src to test pattern
1383*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(VOP_TST_IMG);
1384*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_TST_IMG, 0x02);
1385*53ee8cc1Swenshuai.xi     // make changed registers take effect
1386*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
1387*53ee8cc1Swenshuai.xi 
1388*53ee8cc1Swenshuai.xi     HAL_MVOP_SetMIUReqMask(TRUE);
1389*53ee8cc1Swenshuai.xi     // reset mvop to avoid timing change cause mvop hang-up
1390*53ee8cc1Swenshuai.xi     HAL_MVOP_Rst();
1391*53ee8cc1Swenshuai.xi     HAL_MVOP_SetMIUReqMask(FALSE);
1392*53ee8cc1Swenshuai.xi 
1393*53ee8cc1Swenshuai.xi     // select mvop output from mvd
1394*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_TST_IMG, 0x00);
1395*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_TST_IMG, regval);
1396*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL0, ptiming->bHDuplicate, BIT2);// H pixel duplicate
1397*53ee8cc1Swenshuai.xi 
1398*53ee8cc1Swenshuai.xi #if 0
1399*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF("\nMVOP SetOutputTiming\n");)
1400*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" VTot=%u,\t",ptiming->u16V_TotalCount);)
1401*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" HTot=%u,\t",ptiming->u16H_TotalCount);)
1402*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" I/P=%u\n",ptiming->bInterlace);)
1403*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" W=%u,\t",ptiming->u16Width);)
1404*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" H=%u,\t",ptiming->u16Height);)
1405*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" FRate=%u,\t",ptiming->u8Framerate);)
1406*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" HFreq=%u\n",ptiming->u16H_Freq);)
1407*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" Num=0x%x,\t",ptiming->u16Num);)
1408*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" Den=0x%x,\t",ptiming->u16Den);)
1409*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" u16ExpFRate=%u #\n\n", ptiming->u16ExpFrameRate);)
1410*53ee8cc1Swenshuai.xi #endif
1411*53ee8cc1Swenshuai.xi }
1412*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetDCClk(MS_U8 clkNum,MS_BOOL bEnable)1413*53ee8cc1Swenshuai.xi void HAL_MVOP_SetDCClk(MS_U8 clkNum, MS_BOOL bEnable)
1414*53ee8cc1Swenshuai.xi {
1415*53ee8cc1Swenshuai.xi     MS_ASSERT( (clkNum==0) || (clkNum==1) );
1416*53ee8cc1Swenshuai.xi     if (clkNum==0)
1417*53ee8cc1Swenshuai.xi     {
1418*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_CKG_DC0, !bEnable, CKG_DC0_GATED);
1419*53ee8cc1Swenshuai.xi     }
1420*53ee8cc1Swenshuai.xi }
1421*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetDCSRAMClk(MS_U8 clkNum,MS_BOOL bEnable)1422*53ee8cc1Swenshuai.xi void HAL_MVOP_SetDCSRAMClk(MS_U8 clkNum, MS_BOOL bEnable)
1423*53ee8cc1Swenshuai.xi {
1424*53ee8cc1Swenshuai.xi     MS_ASSERT( (clkNum==0) || (clkNum==1) );
1425*53ee8cc1Swenshuai.xi     if (clkNum==0)
1426*53ee8cc1Swenshuai.xi     {
1427*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_CKG_DC_SRAM, !bEnable, CKG_DC0_SRAM);
1428*53ee8cc1Swenshuai.xi     }
1429*53ee8cc1Swenshuai.xi }
1430*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetSynClk(MVOP_Timing * ptiming)1431*53ee8cc1Swenshuai.xi void HAL_MVOP_SetSynClk(MVOP_Timing *ptiming)
1432*53ee8cc1Swenshuai.xi {
1433*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
1434*53ee8cc1Swenshuai.xi     {
1435*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1436*53ee8cc1Swenshuai.xi         return;
1437*53ee8cc1Swenshuai.xi     }
1438*53ee8cc1Swenshuai.xi     if(g_pHalMVOPCtx->bEnableFreerunMode)
1439*53ee8cc1Swenshuai.xi     {
1440*53ee8cc1Swenshuai.xi         MS_U64 u64mpll_clock = MPLL_CLOCK_216 << 27 ; //mvop hw bug, tsp default use 216MHz mpll clock @ maserati
1441*53ee8cc1Swenshuai.xi         if(HAL_ReadRegBit(REG_CLK_SYN_STC, BIT0) == BIT0) //check stc1 clock use 432 or 216
1442*53ee8cc1Swenshuai.xi         {
1443*53ee8cc1Swenshuai.xi             u64mpll_clock = MPLL_CLOCK_432 << 27 ;
1444*53ee8cc1Swenshuai.xi         }
1445*53ee8cc1Swenshuai.xi         MS_U64 u64exp_clock = (((MS_U64)ptiming->u16H_TotalCount * (MS_U64)ptiming->u16V_TotalCount * (MS_U64)ptiming->u16ExpFrameRate)/1000);
1446*53ee8cc1Swenshuai.xi         do_div(u64mpll_clock, u64exp_clock);
1447*53ee8cc1Swenshuai.xi         MS_U32 u32FreerunClk = (MS_U32)u64mpll_clock;
1448*53ee8cc1Swenshuai.xi         HAL_MVOP_SetFrequency(HALMVOP_FREERUNMODE);
1449*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC0_FREERUN_CW_L  ), LOWBYTE((MS_U16)u32FreerunClk));
1450*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC0_FREERUN_CW_L+1), HIGHBYTE((MS_U16)u32FreerunClk));
1451*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC0_FREERUN_CW_H  ), LOWBYTE((MS_U16)(u32FreerunClk >> 16)));
1452*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC0_FREERUN_CW_H+1), HIGHBYTE((MS_U16)(u32FreerunClk >> 16)));
1453*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_UPDATE_DC0_CW, 1, UPDATE_DC0_FREERUN_CW);
1454*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_UPDATE_DC0_CW, 0, UPDATE_DC0_FREERUN_CW);
1455*53ee8cc1Swenshuai.xi     }
1456*53ee8cc1Swenshuai.xi     else if (_bEnable60P)
1457*53ee8cc1Swenshuai.xi     {
1458*53ee8cc1Swenshuai.xi         //Set DC1 Timing
1459*53ee8cc1Swenshuai.xi         MS_U32 u32FrameRate = (MS_U32)ptiming->u16ExpFrameRate;
1460*53ee8cc1Swenshuai.xi         MS_U32 u32VSize = 1024;
1461*53ee8cc1Swenshuai.xi         MS_U32 u32HSize = ((86400000 / u32FrameRate) * 1000) / u32VSize;
1462*53ee8cc1Swenshuai.xi 
1463*53ee8cc1Swenshuai.xi         if(u32HSize > 4096)
1464*53ee8cc1Swenshuai.xi             MVOP_PRINTF("[Warning] xc support u32HSize > 4096 after CL 712830\n");
1465*53ee8cc1Swenshuai.xi 
1466*53ee8cc1Swenshuai.xi         HAL_MVOP_SetFrequency(HAL_MVOP_GetMaxFreerunClk());
1467*53ee8cc1Swenshuai.xi 
1468*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_YC422_EN_H, 0, VOP_FRAME_RST); // reg_frame_rst = 0
1469*53ee8cc1Swenshuai.xi 
1470*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_CTRL0, DISABLE, VOP_FSYNC_EN); // frame sync disable
1471*53ee8cc1Swenshuai.xi     }
1472*53ee8cc1Swenshuai.xi     else if (_bEnable4k2kClk)
1473*53ee8cc1Swenshuai.xi     {
1474*53ee8cc1Swenshuai.xi         HAL_MVOP_SetFrequency(HAL_MVOP_Get4k2kClk());
1475*53ee8cc1Swenshuai.xi 
1476*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_YC422_EN_H, 0, VOP_FRAME_RST); // reg_frame_rst = 0
1477*53ee8cc1Swenshuai.xi 
1478*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_CTRL0, DISABLE, VOP_FSYNC_EN); // frame sync disable
1479*53ee8cc1Swenshuai.xi     }
1480*53ee8cc1Swenshuai.xi     else
1481*53ee8cc1Swenshuai.xi     {
1482*53ee8cc1Swenshuai.xi         HAL_MVOP_SetFrequency(HALMVOP_SYNCMODE);
1483*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC0_NUM  ), LOWBYTE( ptiming->u16Num));
1484*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC0_NUM+1), HIGHBYTE(ptiming->u16Num));
1485*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC0_DEN  ), LOWBYTE( ptiming->u16Den));
1486*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC0_DEN+1), HIGHBYTE(ptiming->u16Den));
1487*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_UPDATE_DC0_CW, 1, UPDATE_DC0_SYNC_CW);
1488*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_UPDATE_DC0_CW, 0, UPDATE_DC0_SYNC_CW);
1489*53ee8cc1Swenshuai.xi     }
1490*53ee8cc1Swenshuai.xi }
1491*53ee8cc1Swenshuai.xi 
1492*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetMonoMode(MS_BOOL bEnable)1493*53ee8cc1Swenshuai.xi void HAL_MVOP_SetMonoMode(MS_BOOL bEnable)
1494*53ee8cc1Swenshuai.xi {
1495*53ee8cc1Swenshuai.xi     if(bEnable)
1496*53ee8cc1Swenshuai.xi     {
1497*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_U_PAT  , 0x80);
1498*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_U_PAT+1), 0x80);
1499*53ee8cc1Swenshuai.xi 
1500*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_INPUT_SWITCH1, 1, BIT1);    // Mono mode enable
1501*53ee8cc1Swenshuai.xi     }
1502*53ee8cc1Swenshuai.xi     else
1503*53ee8cc1Swenshuai.xi     {
1504*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_INPUT_SWITCH1, 0, BIT1);    //Mono mode disable
1505*53ee8cc1Swenshuai.xi     }
1506*53ee8cc1Swenshuai.xi }
1507*53ee8cc1Swenshuai.xi 
1508*53ee8cc1Swenshuai.xi /******************************************************************************/
1509*53ee8cc1Swenshuai.xi /// Set MVOP for H264  Hardwire Mode
1510*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SetH264HardwireMode(void)1511*53ee8cc1Swenshuai.xi void HAL_MVOP_SetH264HardwireMode(void)
1512*53ee8cc1Swenshuai.xi {
1513*53ee8cc1Swenshuai.xi     // Hardwire mode
1514*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_MPG_JPG_SWITCH, 0x00);
1515*53ee8cc1Swenshuai.xi 
1516*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
1517*53ee8cc1Swenshuai.xi 
1518*53ee8cc1Swenshuai.xi     //16*32 tile format
1519*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, 1, BIT1);
1520*53ee8cc1Swenshuai.xi 
1521*53ee8cc1Swenshuai.xi     // SVD mode enable
1522*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_INPUT_SWITCH1, BIT3, BIT2|BIT3);
1523*53ee8cc1Swenshuai.xi 
1524*53ee8cc1Swenshuai.xi     // set mvop to 128bit_i128 interface
1525*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_MIU_IF, VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
1526*53ee8cc1Swenshuai.xi 
1527*53ee8cc1Swenshuai.xi     // Only for Monaco: Disable deciding bot by top address + 2
1528*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG, 0, VOP_FIELD_FROM_ADDR);
1529*53ee8cc1Swenshuai.xi 
1530*53ee8cc1Swenshuai.xi     // Enable mfdec setting from wb from Manhattan
1531*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_MFDEC_2_L, 1, VOP_MF_FROM_WB);
1532*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_DUMMY, 1, VOP_32x32_WB); //32x32 from wb
1533*53ee8cc1Swenshuai.xi 
1534*53ee8cc1Swenshuai.xi     // H264 use WISHBONE(R2) interface
1535*53ee8cc1Swenshuai.xi     //HAL_WriteRegBit(VOP_INPUT_SWITCH0, 1, VOP_R2_WISHBONE);
1536*53ee8cc1Swenshuai.xi 
1537*53ee8cc1Swenshuai.xi     // Write trigger
1538*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
1539*53ee8cc1Swenshuai.xi }
1540*53ee8cc1Swenshuai.xi 
1541*53ee8cc1Swenshuai.xi /******************************************************************************/
1542*53ee8cc1Swenshuai.xi /// Set MVOP for RM  Hardwire Mode
1543*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SetRMHardwireMode(void)1544*53ee8cc1Swenshuai.xi void HAL_MVOP_SetRMHardwireMode(void)
1545*53ee8cc1Swenshuai.xi {
1546*53ee8cc1Swenshuai.xi     HAL_MVOP_SetH264HardwireMode();
1547*53ee8cc1Swenshuai.xi }
1548*53ee8cc1Swenshuai.xi 
1549*53ee8cc1Swenshuai.xi /******************************************************************************/
1550*53ee8cc1Swenshuai.xi /// Set MVOP for JPEG Hardwire Mode
1551*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SetJpegHardwireMode(void)1552*53ee8cc1Swenshuai.xi void HAL_MVOP_SetJpegHardwireMode(void)
1553*53ee8cc1Swenshuai.xi {
1554*53ee8cc1Swenshuai.xi     MS_U8 regval = 0x00;
1555*53ee8cc1Swenshuai.xi 
1556*53ee8cc1Swenshuai.xi     regval |= 0x80; // packmode
1557*53ee8cc1Swenshuai.xi     regval |= 0x20; // Dram Rd Contd
1558*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_MPG_JPG_SWITCH, regval);
1559*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIs422 = 1;
1560*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_DUMMY, 0, VOP_420_BW_SAVE);
1561*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_BW_SAVE, 0, VOP_420_BW_SAVE_EX);
1562*53ee8cc1Swenshuai.xi 
1563*53ee8cc1Swenshuai.xi     // Write trigger
1564*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
1565*53ee8cc1Swenshuai.xi }
1566*53ee8cc1Swenshuai.xi 
1567*53ee8cc1Swenshuai.xi /******************************************************************************/
1568*53ee8cc1Swenshuai.xi /// Set MVOP for EVD Hardwire Mode
1569*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SetEVDHardwireMode(MS_U16 u16ECOVersion)1570*53ee8cc1Swenshuai.xi void HAL_MVOP_SetEVDHardwireMode(MS_U16 u16ECOVersion)
1571*53ee8cc1Swenshuai.xi {
1572*53ee8cc1Swenshuai.xi     UNUSED(u16ECOVersion);
1573*53ee8cc1Swenshuai.xi 
1574*53ee8cc1Swenshuai.xi     // Hardwire mode
1575*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_MPG_JPG_SWITCH, 0x00);
1576*53ee8cc1Swenshuai.xi 
1577*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
1578*53ee8cc1Swenshuai.xi 
1579*53ee8cc1Swenshuai.xi     //16*32 tile format
1580*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, 1, BIT1);
1581*53ee8cc1Swenshuai.xi 
1582*53ee8cc1Swenshuai.xi     // EVD use HVD interface
1583*53ee8cc1Swenshuai.xi     //HAL_WriteByteMask(VOP_INPUT_SWITCH1, BIT3, BIT2|BIT3);
1584*53ee8cc1Swenshuai.xi 
1585*53ee8cc1Swenshuai.xi     // EVD mode enable
1586*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INPUT_SWITCH0, 1, EVD_ENABLE);
1587*53ee8cc1Swenshuai.xi 
1588*53ee8cc1Swenshuai.xi     // set mvop to 128bit_i128 interface
1589*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_MIU_IF, VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
1590*53ee8cc1Swenshuai.xi 
1591*53ee8cc1Swenshuai.xi     // set evd flag for interlace mode setting
1592*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsH265 = 1;
1593*53ee8cc1Swenshuai.xi 
1594*53ee8cc1Swenshuai.xi     // Enable mfdec setting from wb
1595*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_MFDEC_2_L, 1, VOP_MF_FROM_WB);
1596*53ee8cc1Swenshuai.xi 
1597*53ee8cc1Swenshuai.xi 	// 10 bits from wb
1598*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INFO_FROM_CODEC_H, 1, VOP_INFO_FROM_CODEC_10BIT);
1599*53ee8cc1Swenshuai.xi 
1600*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_REG_MASK, 0, VOP_LSB_REQ_MASK);//10 bits bw control by vdec fw
1601*53ee8cc1Swenshuai.xi 
1602*53ee8cc1Swenshuai.xi     // Write trigger
1603*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
1604*53ee8cc1Swenshuai.xi }
1605*53ee8cc1Swenshuai.xi 
1606*53ee8cc1Swenshuai.xi /******************************************************************************/
1607*53ee8cc1Swenshuai.xi /// Set MVOP for VP9 Hardwire Mode
1608*53ee8cc1Swenshuai.xi /// vp9 hw change in Manhathan: tile mode 16x32
1609*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SetVP9HardwireMode(void)1610*53ee8cc1Swenshuai.xi void HAL_MVOP_SetVP9HardwireMode(void)
1611*53ee8cc1Swenshuai.xi {
1612*53ee8cc1Swenshuai.xi     // Hardwire mode
1613*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_MPG_JPG_SWITCH, 0x00);
1614*53ee8cc1Swenshuai.xi 
1615*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
1616*53ee8cc1Swenshuai.xi 
1617*53ee8cc1Swenshuai.xi     //16*32 tile format
1618*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, 1, BIT1);
1619*53ee8cc1Swenshuai.xi 
1620*53ee8cc1Swenshuai.xi     // VP9 use WISHBONE(R2) interface
1621*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INPUT_SWITCH0, 1, VOP_R2_WISHBONE);
1622*53ee8cc1Swenshuai.xi 
1623*53ee8cc1Swenshuai.xi     // Enable VP9 dram continue mode
1624*53ee8cc1Swenshuai.xi     //HAL_WriteRegBit(VOP_MPG_JPG_SWITCH, 1, VOP_DRAM_RD_MODE);
1625*53ee8cc1Swenshuai.xi 
1626*53ee8cc1Swenshuai.xi     // set mvop to 128bit_i128 interface
1627*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_MIU_IF, VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
1628*53ee8cc1Swenshuai.xi 
1629*53ee8cc1Swenshuai.xi     // Enable mfdec setting from wb
1630*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_MFDEC_2_L, 1, VOP_MF_FROM_WB);
1631*53ee8cc1Swenshuai.xi 
1632*53ee8cc1Swenshuai.xi     // EVD mode enable
1633*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INPUT_SWITCH0, 1, EVD_ENABLE);
1634*53ee8cc1Swenshuai.xi     // 10 bits from wb
1635*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INFO_FROM_CODEC_H, 1, VOP_INFO_FROM_CODEC_10BIT);
1636*53ee8cc1Swenshuai.xi 
1637*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_REG_MASK, 0, VOP_LSB_REQ_MASK);//10 bits bw control by vdec fw
1638*53ee8cc1Swenshuai.xi 
1639*53ee8cc1Swenshuai.xi     // Write trigger
1640*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
1641*53ee8cc1Swenshuai.xi }
1642*53ee8cc1Swenshuai.xi 
1643*53ee8cc1Swenshuai.xi /******************************************************************************/
1644*53ee8cc1Swenshuai.xi /// Set MVOP for EVD MCU Mode
1645*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SetEVDFeature(MVOP_DevID eID,MVOP_EVDFeature * stEVDInput)1646*53ee8cc1Swenshuai.xi void HAL_MVOP_SetEVDFeature(MVOP_DevID eID, MVOP_EVDFeature* stEVDInput)
1647*53ee8cc1Swenshuai.xi {
1648*53ee8cc1Swenshuai.xi     switch(eID)
1649*53ee8cc1Swenshuai.xi     {
1650*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
1651*53ee8cc1Swenshuai.xi 
1652*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_INPUT_SWITCH0, stEVDInput->bEnableEVD, EVD_ENABLE);// 32x32 enable
1653*53ee8cc1Swenshuai.xi 
1654*53ee8cc1Swenshuai.xi             switch(stEVDInput->eEVDBit[Y_INFO])
1655*53ee8cc1Swenshuai.xi             {
1656*53ee8cc1Swenshuai.xi                 case E_MVOP_EVD_8BIT:
1657*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(VOP_EVD_10B_EN, 0, VOP_EVD_10B_Y_EN);
1658*53ee8cc1Swenshuai.xi                     break;
1659*53ee8cc1Swenshuai.xi                 case E_MVOP_EVD_10BIT:
1660*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(VOP_EVD_10B_EN, 1, VOP_EVD_10B_Y_EN);
1661*53ee8cc1Swenshuai.xi                     break;
1662*53ee8cc1Swenshuai.xi                 default:
1663*53ee8cc1Swenshuai.xi                     break;
1664*53ee8cc1Swenshuai.xi             }
1665*53ee8cc1Swenshuai.xi 
1666*53ee8cc1Swenshuai.xi             switch(stEVDInput->eEVDBit[UV_INFO])
1667*53ee8cc1Swenshuai.xi             {
1668*53ee8cc1Swenshuai.xi                 case E_MVOP_EVD_8BIT:
1669*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(VOP_EVD_10B_EN, 0, VOP_EVD_10B_UV_EN);
1670*53ee8cc1Swenshuai.xi                     break;
1671*53ee8cc1Swenshuai.xi                 case E_MVOP_EVD_10BIT:
1672*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(VOP_EVD_10B_EN, 1, VOP_EVD_10B_UV_EN);
1673*53ee8cc1Swenshuai.xi                     break;
1674*53ee8cc1Swenshuai.xi                 default:
1675*53ee8cc1Swenshuai.xi                     break;
1676*53ee8cc1Swenshuai.xi             }
1677*53ee8cc1Swenshuai.xi 
1678*53ee8cc1Swenshuai.xi             //LSB BW Discard MASK
1679*53ee8cc1Swenshuai.xi             if(stEVDInput->eEVDBit[Y_INFO] || stEVDInput->eEVDBit[UV_INFO])
1680*53ee8cc1Swenshuai.xi             {
1681*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(VOP_REG_MASK, 0, VOP_LSB_REQ_MASK);
1682*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_UV_SHIFT, 0, VOP_GCLK_MIU_ON);
1683*53ee8cc1Swenshuai.xi                 MVOP_DBG(MVOP_PRINTF("[Debug] 10 bits display\n"););
1684*53ee8cc1Swenshuai.xi             }
1685*53ee8cc1Swenshuai.xi             else
1686*53ee8cc1Swenshuai.xi             {
1687*53ee8cc1Swenshuai.xi                 //HAL_WriteByteMask(VOP_REG_MASK, BIT1, VOP_LSB_REQ_MASK);
1688*53ee8cc1Swenshuai.xi                 MVOP_DBG(MVOP_PRINTF("[Debug] 10 bits bw riu control default enable\n"););
1689*53ee8cc1Swenshuai.xi             }
1690*53ee8cc1Swenshuai.xi 
1691*53ee8cc1Swenshuai.xi             // Write trigger
1692*53ee8cc1Swenshuai.xi             HAL_MVOP_LoadReg();
1693*53ee8cc1Swenshuai.xi             break;
1694*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
1695*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
1696*53ee8cc1Swenshuai.xi 
1697*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), stEVDInput->bEnableEVD, EVD_ENABLE);// 32x32 enable
1698*53ee8cc1Swenshuai.xi 
1699*53ee8cc1Swenshuai.xi             switch(stEVDInput->eEVDBit[Y_INFO])
1700*53ee8cc1Swenshuai.xi             {
1701*53ee8cc1Swenshuai.xi                 case E_MVOP_EVD_8BIT:
1702*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(SUB_REG(VOP_EVD_10B_EN), 0, VOP_EVD_10B_Y_EN);
1703*53ee8cc1Swenshuai.xi                     break;
1704*53ee8cc1Swenshuai.xi                 case E_MVOP_EVD_10BIT:
1705*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(SUB_REG(VOP_EVD_10B_EN), 1, VOP_EVD_10B_Y_EN);
1706*53ee8cc1Swenshuai.xi                     break;
1707*53ee8cc1Swenshuai.xi                 default:
1708*53ee8cc1Swenshuai.xi                     break;
1709*53ee8cc1Swenshuai.xi             }
1710*53ee8cc1Swenshuai.xi 
1711*53ee8cc1Swenshuai.xi             switch(stEVDInput->eEVDBit[UV_INFO])
1712*53ee8cc1Swenshuai.xi             {
1713*53ee8cc1Swenshuai.xi                 case E_MVOP_EVD_8BIT:
1714*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(SUB_REG(VOP_EVD_10B_EN), 0, VOP_EVD_10B_UV_EN);
1715*53ee8cc1Swenshuai.xi                     break;
1716*53ee8cc1Swenshuai.xi                 case E_MVOP_EVD_10BIT:
1717*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(SUB_REG(VOP_EVD_10B_EN), 1, VOP_EVD_10B_UV_EN);
1718*53ee8cc1Swenshuai.xi                     break;
1719*53ee8cc1Swenshuai.xi                 default:
1720*53ee8cc1Swenshuai.xi                     break;
1721*53ee8cc1Swenshuai.xi             }
1722*53ee8cc1Swenshuai.xi 
1723*53ee8cc1Swenshuai.xi             //LSB BW Discard MASK
1724*53ee8cc1Swenshuai.xi             if(stEVDInput->eEVDBit[Y_INFO] || stEVDInput->eEVDBit[UV_INFO])
1725*53ee8cc1Swenshuai.xi             {
1726*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(SUB_REG(VOP_REG_MASK), 0, VOP_LSB_REQ_MASK);
1727*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_UV_SHIFT), 0, VOP_GCLK_MIU_ON);
1728*53ee8cc1Swenshuai.xi                 MVOP_DBG(MVOP_PRINTF("[Debug] 10 bits display\n"););
1729*53ee8cc1Swenshuai.xi             }
1730*53ee8cc1Swenshuai.xi             else
1731*53ee8cc1Swenshuai.xi             {
1732*53ee8cc1Swenshuai.xi                 //HAL_WriteByteMask(SUB_REG(VOP_REG_MASK), BIT1, VOP_LSB_REQ_MASK);
1733*53ee8cc1Swenshuai.xi                 MVOP_DBG(MVOP_PRINTF("[Debug] 10 bits bw riu control default enable\n"););
1734*53ee8cc1Swenshuai.xi             }
1735*53ee8cc1Swenshuai.xi             // Write trigger
1736*53ee8cc1Swenshuai.xi             HAL_MVOP_SubLoadReg();
1737*53ee8cc1Swenshuai.xi #endif
1738*53ee8cc1Swenshuai.xi             break;
1739*53ee8cc1Swenshuai.xi             default:
1740*53ee8cc1Swenshuai.xi                 break;
1741*53ee8cc1Swenshuai.xi     }
1742*53ee8cc1Swenshuai.xi 
1743*53ee8cc1Swenshuai.xi }
1744*53ee8cc1Swenshuai.xi 
1745*53ee8cc1Swenshuai.xi 
1746*53ee8cc1Swenshuai.xi ///Enable 3D L/R dual buffer mode
HAL_MVOP_Enable3DLR(MS_BOOL bEnable)1747*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Enable3DLR(MS_BOOL bEnable)
1748*53ee8cc1Swenshuai.xi {
1749*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
1750*53ee8cc1Swenshuai.xi     {
1751*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1752*53ee8cc1Swenshuai.xi         return FALSE;
1753*53ee8cc1Swenshuai.xi     }
1754*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MULTI_WIN_CFG0, bEnable, VOP_LR_BUF_MODE);
1755*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->b3DLRMode = bEnable;
1756*53ee8cc1Swenshuai.xi     if(bEnable)
1757*53ee8cc1Swenshuai.xi     {
1758*53ee8cc1Swenshuai.xi         //only for monaco: do not wait for data ready.
1759*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_NOT_WAIT_READ_DATA, 2, VOP_NOT_WAIT_RDLAT);
1760*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_BW_SAVE, 0, VOP_420_BW_SAVE_EX);
1761*53ee8cc1Swenshuai.xi     }
1762*53ee8cc1Swenshuai.xi     else
1763*53ee8cc1Swenshuai.xi     {
1764*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_NOT_WAIT_READ_DATA, 0, VOP_NOT_WAIT_RDLAT);
1765*53ee8cc1Swenshuai.xi     }
1766*53ee8cc1Swenshuai.xi     return TRUE;
1767*53ee8cc1Swenshuai.xi }
1768*53ee8cc1Swenshuai.xi 
1769*53ee8cc1Swenshuai.xi ///Get if 3D L/R mode is enabled
HAL_MVOP_Get3DLRMode(void)1770*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Get3DLRMode(void)
1771*53ee8cc1Swenshuai.xi {
1772*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
1773*53ee8cc1Swenshuai.xi     {
1774*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1775*53ee8cc1Swenshuai.xi         return FALSE;
1776*53ee8cc1Swenshuai.xi     }
1777*53ee8cc1Swenshuai.xi     return g_pHalMVOPCtx->b3DLRMode;
1778*53ee8cc1Swenshuai.xi }
1779*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetTimingInfoFromRegisters(MVOP_TimingInfo_FromRegisters * pMvopTimingInfo)1780*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetTimingInfoFromRegisters(MVOP_TimingInfo_FromRegisters *pMvopTimingInfo)
1781*53ee8cc1Swenshuai.xi {
1782*53ee8cc1Swenshuai.xi     if(NULL == pMvopTimingInfo)
1783*53ee8cc1Swenshuai.xi     {
1784*53ee8cc1Swenshuai.xi         MVOP_PRINTF("HAL_MVOP_GetTimingInfoFromRegisters():pMvopTimingInfo is NULL\n");
1785*53ee8cc1Swenshuai.xi         return FALSE;
1786*53ee8cc1Swenshuai.xi     }
1787*53ee8cc1Swenshuai.xi     if(HAL_MVOP_GetEnableState() == FALSE)
1788*53ee8cc1Swenshuai.xi     {
1789*53ee8cc1Swenshuai.xi         MVOP_PRINTF("MVOP is not enabled!\n");
1790*53ee8cc1Swenshuai.xi         pMvopTimingInfo->bEnabled = FALSE;
1791*53ee8cc1Swenshuai.xi         return FALSE;
1792*53ee8cc1Swenshuai.xi     }
1793*53ee8cc1Swenshuai.xi     pMvopTimingInfo->bEnabled = TRUE;
1794*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16H_TotalCount = (HAL_ReadByte((VOP_FRAME_HCOUNT + 1))<< 8) | (HAL_ReadByte((VOP_FRAME_HCOUNT)));
1795*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16V_TotalCount = (HAL_ReadByte((VOP_FRAME_VCOUNT + 1))<< 8) | (HAL_ReadByte((VOP_FRAME_VCOUNT)));
1796*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16VBlank0_Start = (HAL_ReadByte((VOP_VB0_STR + 1))<< 8) | (HAL_ReadByte((VOP_VB0_STR)));
1797*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16VBlank0_End = (HAL_ReadByte((VOP_VB0_END + 1))<< 8) | (HAL_ReadByte((VOP_VB0_END)));
1798*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16VBlank1_Start = (HAL_ReadByte((VOP_VB1_STR + 1))<< 8) | (HAL_ReadByte((VOP_VB1_STR)));
1799*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16VBlank1_End = (HAL_ReadByte((VOP_VB1_END + 1))<< 8) | (HAL_ReadByte((VOP_VB1_END)));
1800*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16TopField_Start = (HAL_ReadByte((VOP_TF_STR + 1))<< 8) | (HAL_ReadByte((VOP_TF_STR)));
1801*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16BottomField_Start = (HAL_ReadByte((VOP_BF_STR + 1))<< 8) | (HAL_ReadByte((VOP_BF_STR)));
1802*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16HActive_Start = (HAL_ReadByte((VOP_HACT_STR + 1))<< 8) | (HAL_ReadByte((VOP_HACT_STR)));
1803*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16TopField_VS = (HAL_ReadByte((VOP_TF_VS + 1))<< 8) | (HAL_ReadByte((VOP_TF_VS)));
1804*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16BottomField_VS = (HAL_ReadByte((VOP_BF_VS + 1))<< 8) | (HAL_ReadByte((VOP_BF_VS)));
1805*53ee8cc1Swenshuai.xi     pMvopTimingInfo->bInterlace = (HAL_ReadRegBit(VOP_CTRL0, BIT7) == BIT7);
1806*53ee8cc1Swenshuai.xi     return TRUE;
1807*53ee8cc1Swenshuai.xi }
1808*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetYUVBaseAdd(MS_PHY u32YOffset,MS_PHY u32UVOffset,MS_BOOL bProgressive,MS_BOOL b422pack)1809*53ee8cc1Swenshuai.xi void HAL_MVOP_SetYUVBaseAdd(MS_PHY u32YOffset, MS_PHY u32UVOffset, MS_BOOL bProgressive, MS_BOOL b422pack)
1810*53ee8cc1Swenshuai.xi {
1811*53ee8cc1Swenshuai.xi     MS_PHY u64tmp = 0;
1812*53ee8cc1Swenshuai.xi 
1813*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
1814*53ee8cc1Swenshuai.xi     {
1815*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1816*53ee8cc1Swenshuai.xi         return;
1817*53ee8cc1Swenshuai.xi     }
1818*53ee8cc1Swenshuai.xi     // Y offset
1819*53ee8cc1Swenshuai.xi     u64tmp = u32YOffset >> 3;
1820*53ee8cc1Swenshuai.xi     if ( !bProgressive )
1821*53ee8cc1Swenshuai.xi     {   //Refine Y offset for interlace repeat bottom field
1822*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
1823*53ee8cc1Swenshuai.xi         {
1824*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
1825*53ee8cc1Swenshuai.xi             u64tmp += 2;
1826*53ee8cc1Swenshuai.xi         }
1827*53ee8cc1Swenshuai.xi         else
1828*53ee8cc1Swenshuai.xi         {
1829*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is TOP or NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
1830*53ee8cc1Swenshuai.xi         }
1831*53ee8cc1Swenshuai.xi     }
1832*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_JPG_YSTR0_L, u64tmp & 0xff);
1833*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_L+1), (u64tmp >> 8) & 0xff);
1834*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_L+2), (u64tmp >> 16) & 0xff);
1835*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_L+3), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
1836*53ee8cc1Swenshuai.xi 
1837*53ee8cc1Swenshuai.xi     if (!bProgressive )
1838*53ee8cc1Swenshuai.xi     {   //Y offset of bottom field if interlace
1839*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_YSTR1_L, u64tmp & 0xff);
1840*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR1_L+1), (u64tmp >> 8) & 0xff);
1841*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR1_L+2), (u64tmp >> 16) & 0xff);
1842*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR1_L+3), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
1843*53ee8cc1Swenshuai.xi     }
1844*53ee8cc1Swenshuai.xi 
1845*53ee8cc1Swenshuai.xi     if (b422pack)
1846*53ee8cc1Swenshuai.xi     {
1847*53ee8cc1Swenshuai.xi         u32UVOffset = u32YOffset + 16; //add 16 for 128bit; add 8 for 64bit
1848*53ee8cc1Swenshuai.xi     }
1849*53ee8cc1Swenshuai.xi     // UV offset
1850*53ee8cc1Swenshuai.xi     u64tmp = u32UVOffset >> 3;
1851*53ee8cc1Swenshuai.xi     if( !bProgressive )
1852*53ee8cc1Swenshuai.xi     {  //Refine UV offset for interlace repeat bottom field
1853*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
1854*53ee8cc1Swenshuai.xi         {
1855*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
1856*53ee8cc1Swenshuai.xi             u64tmp += 2;
1857*53ee8cc1Swenshuai.xi         }
1858*53ee8cc1Swenshuai.xi         else
1859*53ee8cc1Swenshuai.xi         {
1860*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is TOP/NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
1861*53ee8cc1Swenshuai.xi         }
1862*53ee8cc1Swenshuai.xi     }
1863*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_JPG_UVSTR0_L, u64tmp & 0xff);
1864*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_UVSTR0_L+1), (u64tmp >> 8) & 0xff);
1865*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_UVSTR0_L+2), (u64tmp >> 16) & 0xff);
1866*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_UVSTR0_L+3), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
1867*53ee8cc1Swenshuai.xi 
1868*53ee8cc1Swenshuai.xi     if( !bProgressive )
1869*53ee8cc1Swenshuai.xi     {  //UV offset of bottom field if interlace
1870*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_UVSTR1_L, u64tmp & 0xff);
1871*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR1_L+1), (u64tmp >> 8) & 0xff);
1872*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR1_L+2), (u64tmp >> 16) & 0xff);
1873*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR1_L+3), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
1874*53ee8cc1Swenshuai.xi     }
1875*53ee8cc1Swenshuai.xi 
1876*53ee8cc1Swenshuai.xi     return;
1877*53ee8cc1Swenshuai.xi }
1878*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetYUVBaseAddMultiView(MVOP_BaseAddInput * stBaseAddInfo)1879*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SetYUVBaseAddMultiView(MVOP_BaseAddInput *stBaseAddInfo)
1880*53ee8cc1Swenshuai.xi {
1881*53ee8cc1Swenshuai.xi     MS_PHY u64tmpY = 0;
1882*53ee8cc1Swenshuai.xi     MS_PHY u64tmpUV = 0;
1883*53ee8cc1Swenshuai.xi 
1884*53ee8cc1Swenshuai.xi     if (stBaseAddInfo == NULL)
1885*53ee8cc1Swenshuai.xi     {
1886*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s stBaseAddInfo is NULL pointer\n", __FUNCTION__);)
1887*53ee8cc1Swenshuai.xi         return FALSE;
1888*53ee8cc1Swenshuai.xi     }
1889*53ee8cc1Swenshuai.xi     // Y offset
1890*53ee8cc1Swenshuai.xi     u64tmpY = (stBaseAddInfo->u32YOffset) >> 3;
1891*53ee8cc1Swenshuai.xi     // UV offset
1892*53ee8cc1Swenshuai.xi     u64tmpUV = (stBaseAddInfo->u32UVOffset) >> 3;
1893*53ee8cc1Swenshuai.xi 
1894*53ee8cc1Swenshuai.xi     switch(stBaseAddInfo->eView)
1895*53ee8cc1Swenshuai.xi     {
1896*53ee8cc1Swenshuai.xi     case E_MVOP_MAIN_VIEW:
1897*53ee8cc1Swenshuai.xi         // Y offset
1898*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_YSTR0_L, u64tmpY & 0xff);
1899*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR0_L+1), (u64tmpY >> 8) & 0xff);
1900*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR0_L+2), (u64tmpY >> 16) & 0xff);
1901*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR0_L+3), (u64tmpY >> 24) & VOP_YUV_STR_HIBITS);
1902*53ee8cc1Swenshuai.xi 
1903*53ee8cc1Swenshuai.xi         // UV offset
1904*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_UVSTR0_L, u64tmpUV & 0xff);
1905*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR0_L+1), (u64tmpUV >> 8) & 0xff);
1906*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR0_L+2), (u64tmpUV >> 16) & 0xff);
1907*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR0_L+3), (u64tmpUV >> 24) & VOP_YUV_STR_HIBITS);
1908*53ee8cc1Swenshuai.xi         break;
1909*53ee8cc1Swenshuai.xi     case E_MVOP_2ND_VIEW:
1910*53ee8cc1Swenshuai.xi         // Y offset
1911*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_YSTR1_L, u64tmpY & 0xff);
1912*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR1_L+1), (u64tmpY >> 8) & 0xff);
1913*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR1_L+2), (u64tmpY >> 16) & 0xff);
1914*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR1_L+3), (u64tmpY >> 24) & VOP_YUV_STR_HIBITS);
1915*53ee8cc1Swenshuai.xi 
1916*53ee8cc1Swenshuai.xi         //UV offset
1917*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_UVSTR1_L, u64tmpUV & 0xff);
1918*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR1_L+1), (u64tmpUV >> 8) & 0xff);
1919*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR1_L+2), (u64tmpUV >> 16) & 0xff);
1920*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR1_L+3), (u64tmpUV >> 24) & VOP_YUV_STR_HIBITS);
1921*53ee8cc1Swenshuai.xi         break;
1922*53ee8cc1Swenshuai.xi     default:
1923*53ee8cc1Swenshuai.xi         break;
1924*53ee8cc1Swenshuai.xi     }
1925*53ee8cc1Swenshuai.xi     return TRUE;
1926*53ee8cc1Swenshuai.xi }
1927*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetYBaseAdd(void)1928*53ee8cc1Swenshuai.xi MS_PHY HAL_MVOP_GetYBaseAdd(void)
1929*53ee8cc1Swenshuai.xi {
1930*53ee8cc1Swenshuai.xi     MS_PHY u64YOffset = 0;
1931*53ee8cc1Swenshuai.xi     u64YOffset = HAL_ReadByte(VOP_JPG_YSTR0_L)&0xff;
1932*53ee8cc1Swenshuai.xi     u64YOffset |=((HAL_ReadByte((VOP_JPG_YSTR0_L+1))<<8)&0xff00);
1933*53ee8cc1Swenshuai.xi     u64YOffset |=((HAL_ReadByte((VOP_JPG_YSTR0_L+2))<<16)&0xff0000);
1934*53ee8cc1Swenshuai.xi     u64YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR0_L+3)) & VOP_YUV_STR_HIBITS) <<24);
1935*53ee8cc1Swenshuai.xi     return u64YOffset;
1936*53ee8cc1Swenshuai.xi }
1937*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetUVBaseAdd(void)1938*53ee8cc1Swenshuai.xi MS_PHY HAL_MVOP_GetUVBaseAdd(void)
1939*53ee8cc1Swenshuai.xi {
1940*53ee8cc1Swenshuai.xi     MS_PHY u64UVOffset = 0;
1941*53ee8cc1Swenshuai.xi     u64UVOffset = HAL_ReadByte(VOP_JPG_UVSTR0_L)&0xff;
1942*53ee8cc1Swenshuai.xi     u64UVOffset |=((HAL_ReadByte((VOP_JPG_UVSTR0_L+1))<<8)&0xff00);
1943*53ee8cc1Swenshuai.xi     u64UVOffset |=((HAL_ReadByte((VOP_JPG_UVSTR0_L+2))<<16)&0xff0000);
1944*53ee8cc1Swenshuai.xi     u64UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR0_L+3)) & VOP_YUV_STR_HIBITS) <<24);
1945*53ee8cc1Swenshuai.xi     return u64UVOffset;
1946*53ee8cc1Swenshuai.xi }
1947*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetYBaseAddMultiView(MVOP_3DView eView)1948*53ee8cc1Swenshuai.xi MS_PHY HAL_MVOP_GetYBaseAddMultiView(MVOP_3DView eView)
1949*53ee8cc1Swenshuai.xi {
1950*53ee8cc1Swenshuai.xi     MS_PHY u64YOffset = 0;
1951*53ee8cc1Swenshuai.xi     switch(eView)
1952*53ee8cc1Swenshuai.xi     {
1953*53ee8cc1Swenshuai.xi         case E_MVOP_MAIN_VIEW:
1954*53ee8cc1Swenshuai.xi             u64YOffset = HAL_ReadByte(VOP_JPG_YSTR0_L)&0xff;
1955*53ee8cc1Swenshuai.xi             u64YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR0_L+1))<<8)&0xff00);
1956*53ee8cc1Swenshuai.xi             u64YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR0_L+2))<<16)&0xff0000);
1957*53ee8cc1Swenshuai.xi             u64YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR0_L+3)) & VOP_YUV_STR_HIBITS) <<24);
1958*53ee8cc1Swenshuai.xi             break;
1959*53ee8cc1Swenshuai.xi         case E_MVOP_2ND_VIEW:
1960*53ee8cc1Swenshuai.xi             u64YOffset = HAL_ReadByte(VOP_JPG_YSTR1_L)&0xff;
1961*53ee8cc1Swenshuai.xi             u64YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR1_L+1))<<8)&0xff00);
1962*53ee8cc1Swenshuai.xi             u64YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR1_L+2))<<16)&0xff0000);
1963*53ee8cc1Swenshuai.xi             u64YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR1_L+3))<<24)&0x7000000);
1964*53ee8cc1Swenshuai.xi             break;
1965*53ee8cc1Swenshuai.xi         default:
1966*53ee8cc1Swenshuai.xi             u64YOffset = 0;
1967*53ee8cc1Swenshuai.xi             break;
1968*53ee8cc1Swenshuai.xi     }
1969*53ee8cc1Swenshuai.xi     return u64YOffset;
1970*53ee8cc1Swenshuai.xi }
1971*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetUVBaseAddMultiView(MVOP_3DView eView)1972*53ee8cc1Swenshuai.xi MS_PHY HAL_MVOP_GetUVBaseAddMultiView(MVOP_3DView eView)
1973*53ee8cc1Swenshuai.xi {
1974*53ee8cc1Swenshuai.xi     MS_PHY u64UVOffset = 0;
1975*53ee8cc1Swenshuai.xi     switch(eView)
1976*53ee8cc1Swenshuai.xi     {
1977*53ee8cc1Swenshuai.xi         case E_MVOP_MAIN_VIEW:
1978*53ee8cc1Swenshuai.xi             u64UVOffset = HAL_ReadByte(VOP_JPG_UVSTR0_L)&0xff;
1979*53ee8cc1Swenshuai.xi             u64UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR0_L+1))<<8)&0xff00);
1980*53ee8cc1Swenshuai.xi             u64UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR0_L+2))<<16)&0xff0000);
1981*53ee8cc1Swenshuai.xi             u64UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR0_L+3)) & VOP_YUV_STR_HIBITS) <<24);
1982*53ee8cc1Swenshuai.xi             break;
1983*53ee8cc1Swenshuai.xi         case E_MVOP_2ND_VIEW:
1984*53ee8cc1Swenshuai.xi             u64UVOffset = HAL_ReadByte(VOP_JPG_UVSTR1_L)&0xff;
1985*53ee8cc1Swenshuai.xi             u64UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR1_L+1))<<8)&0xff00);
1986*53ee8cc1Swenshuai.xi             u64UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR1_L+2))<<16)&0xff0000);
1987*53ee8cc1Swenshuai.xi             u64UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR1_L+3))<<24)&0x7000000);
1988*53ee8cc1Swenshuai.xi             break;
1989*53ee8cc1Swenshuai.xi         default:
1990*53ee8cc1Swenshuai.xi             u64UVOffset = 0;
1991*53ee8cc1Swenshuai.xi             break;
1992*53ee8cc1Swenshuai.xi     }
1993*53ee8cc1Swenshuai.xi     return u64UVOffset;
1994*53ee8cc1Swenshuai.xi }
1995*53ee8cc1Swenshuai.xi 
HAL_MVOP_Set3DLRAltOutput_VHalfScaling(MS_BOOL bEnable)1996*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Set3DLRAltOutput_VHalfScaling(MS_BOOL bEnable)
1997*53ee8cc1Swenshuai.xi {
1998*53ee8cc1Swenshuai.xi     MS_BOOL bEnDualBuff = bEnable ? ENABLE : DISABLE;     //enable dual buffer
1999*53ee8cc1Swenshuai.xi     MS_BOOL bEnSWDualBuff = bEnable ? DISABLE : ENABLE;   //buffer controlled by HK instead of FW
2000*53ee8cc1Swenshuai.xi     MS_BOOL bEnMirrMaskBase = bEnable ? DISABLE : ENABLE; //do not mask LSB
2001*53ee8cc1Swenshuai.xi     MS_BOOL bEnHwFldBase = bEnable ? DISABLE : ENABLE;    //hardware calculate field jump base address
2002*53ee8cc1Swenshuai.xi 
2003*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
2004*53ee8cc1Swenshuai.xi     {
2005*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
2006*53ee8cc1Swenshuai.xi         return FALSE;
2007*53ee8cc1Swenshuai.xi     }
2008*53ee8cc1Swenshuai.xi     //Set 0x27[2] = 1 (enable SW dual buffer mode)
2009*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_WR, bEnDualBuff, VOP_BUF_DUAL);
2010*53ee8cc1Swenshuai.xi 
2011*53ee8cc1Swenshuai.xi     //Set 0x38[8] = 0 (use SW dual buffer mode)
2012*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_INFO_FROM_CODEC_H, bEnSWDualBuff, VOP_INFO_FROM_CODEC_DUAL_BUFF);
2013*53ee8cc1Swenshuai.xi 
2014*53ee8cc1Swenshuai.xi     //Set 0x3b[7] = 0 (use MVD/HVD firmware send base)
2015*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG, bEnMirrMaskBase, VOP_MASK_BASE_LSB);
2016*53ee8cc1Swenshuai.xi 
2017*53ee8cc1Swenshuai.xi     //Set 0x3b[5] = 0 (hardware calculate field jump base address)
2018*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MIRROR_CFG, bEnHwFldBase, VOP_HW_FLD_BASE);
2019*53ee8cc1Swenshuai.xi 
2020*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->b3DLRAltOutput = bEnable;
2021*53ee8cc1Swenshuai.xi     return TRUE;
2022*53ee8cc1Swenshuai.xi }
2023*53ee8cc1Swenshuai.xi 
HAL_MVOP_Set3DLRAltOutput(MS_BOOL bEnable)2024*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Set3DLRAltOutput(MS_BOOL bEnable)
2025*53ee8cc1Swenshuai.xi {
2026*53ee8cc1Swenshuai.xi     //Set 0x3C[2] = 1 (enable 3D L/R dual buffer line alternative output)
2027*53ee8cc1Swenshuai.xi     //it works when 0x3C[0] = 1
2028*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MULTI_WIN_CFG0, bEnable, VOP_LR_LA_OUT);
2029*53ee8cc1Swenshuai.xi     // bw saving not support: LA/SBS
2030*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_DUMMY, 0, VOP_420_BW_SAVE);
2031*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_REG_BW_SAVE, 0, VOP_420_BW_SAVE_EX);
2032*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
2033*53ee8cc1Swenshuai.xi 
2034*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->b3DLRAltOutput = bEnable;
2035*53ee8cc1Swenshuai.xi     return TRUE;
2036*53ee8cc1Swenshuai.xi }
2037*53ee8cc1Swenshuai.xi 
HAL_MVOP_Set3DLRAltSBSOutput(MS_BOOL bEnable)2038*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Set3DLRAltSBSOutput(MS_BOOL bEnable)
2039*53ee8cc1Swenshuai.xi {
2040*53ee8cc1Swenshuai.xi     //it works when 0x3C[0] = 1 and 0x3C[2] = 1
2041*53ee8cc1Swenshuai.xi     //Set 0x3C[3] = 1 (3D L/R line alternative read, side-by-side output)
2042*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MULTI_WIN_CFG0, bEnable, VOP_LR_LA2SBS_OUT);
2043*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->b3DLRAltSBSOutput = bEnable;
2044*53ee8cc1Swenshuai.xi     return TRUE;
2045*53ee8cc1Swenshuai.xi }
2046*53ee8cc1Swenshuai.xi 
HAL_MVOP_Get3DLRAltOutput(void)2047*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Get3DLRAltOutput(void)
2048*53ee8cc1Swenshuai.xi {
2049*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
2050*53ee8cc1Swenshuai.xi     {
2051*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
2052*53ee8cc1Swenshuai.xi         return FALSE;
2053*53ee8cc1Swenshuai.xi     }
2054*53ee8cc1Swenshuai.xi     return g_pHalMVOPCtx->b3DLRAltOutput;
2055*53ee8cc1Swenshuai.xi }
2056*53ee8cc1Swenshuai.xi 
HAL_MVOP_Get3DLRAltSBSOutput(void)2057*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Get3DLRAltSBSOutput(void)
2058*53ee8cc1Swenshuai.xi {
2059*53ee8cc1Swenshuai.xi     return g_pHalMVOPCtx->b3DLRAltSBSOutput;
2060*53ee8cc1Swenshuai.xi }
2061*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetOutput3DType(void)2062*53ee8cc1Swenshuai.xi EN_MVOP_Output_3D_TYPE HAL_MVOP_GetOutput3DType(void)
2063*53ee8cc1Swenshuai.xi {
2064*53ee8cc1Swenshuai.xi     EN_MVOP_Output_3D_TYPE en3DType = E_MVOP_OUTPUT_3D_NONE;
2065*53ee8cc1Swenshuai.xi     if(g_pHalMVOPCtx->b3DLRMode)
2066*53ee8cc1Swenshuai.xi     {
2067*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->b3DLRAltSBSOutput)
2068*53ee8cc1Swenshuai.xi         {
2069*53ee8cc1Swenshuai.xi             en3DType = E_MVOP_OUTPUT_3D_SBS;
2070*53ee8cc1Swenshuai.xi         }
2071*53ee8cc1Swenshuai.xi         else
2072*53ee8cc1Swenshuai.xi         {
2073*53ee8cc1Swenshuai.xi             en3DType = E_MVOP_OUTPUT_3D_TB;
2074*53ee8cc1Swenshuai.xi         }
2075*53ee8cc1Swenshuai.xi     }
2076*53ee8cc1Swenshuai.xi     else if(g_pHalMVOPCtx->b3DLRAltOutput)
2077*53ee8cc1Swenshuai.xi     {
2078*53ee8cc1Swenshuai.xi         en3DType = E_MVOP_OUTPUT_3D_LA;
2079*53ee8cc1Swenshuai.xi     }
2080*53ee8cc1Swenshuai.xi     return en3DType;
2081*53ee8cc1Swenshuai.xi }
2082*53ee8cc1Swenshuai.xi 
HAL_MVOP_Set3DLR2ndCfg(MS_BOOL bEnable)2083*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Set3DLR2ndCfg(MS_BOOL bEnable)
2084*53ee8cc1Swenshuai.xi {
2085*53ee8cc1Swenshuai.xi     //Set 0x3c[7] as 1 to enable
2086*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_MULTI_WIN_CFG0, bEnable, VOP_LR_DIFF_SIZE);
2087*53ee8cc1Swenshuai.xi     return TRUE;
2088*53ee8cc1Swenshuai.xi }
2089*53ee8cc1Swenshuai.xi 
HAL_MVOP_Get3DLR2ndCfg(void)2090*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Get3DLR2ndCfg(void)
2091*53ee8cc1Swenshuai.xi {
2092*53ee8cc1Swenshuai.xi     MS_BOOL bEnable = FALSE;
2093*53ee8cc1Swenshuai.xi     if (VOP_LR_DIFF_SIZE == (VOP_LR_DIFF_SIZE & HAL_ReadRegBit(VOP_MULTI_WIN_CFG0, VOP_LR_DIFF_SIZE)))
2094*53ee8cc1Swenshuai.xi     {
2095*53ee8cc1Swenshuai.xi         bEnable = TRUE;
2096*53ee8cc1Swenshuai.xi     }
2097*53ee8cc1Swenshuai.xi     return bEnable;
2098*53ee8cc1Swenshuai.xi }
2099*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetMirrorMode(MVOP_DevID eID)2100*53ee8cc1Swenshuai.xi MVOP_DrvMirror HAL_MVOP_GetMirrorMode(MVOP_DevID eID)
2101*53ee8cc1Swenshuai.xi {
2102*53ee8cc1Swenshuai.xi     MVOP_DrvMirror enMirror = E_VOPMIRROR_NONE;
2103*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
2104*53ee8cc1Swenshuai.xi     {
2105*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
2106*53ee8cc1Swenshuai.xi         return FALSE;
2107*53ee8cc1Swenshuai.xi     }
2108*53ee8cc1Swenshuai.xi     switch(eID)
2109*53ee8cc1Swenshuai.xi     {
2110*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
2111*53ee8cc1Swenshuai.xi             if(g_pHalMVOPCtx->bMirrorModeVer && g_pHalMVOPCtx->bMirrorModeHor)
2112*53ee8cc1Swenshuai.xi             {
2113*53ee8cc1Swenshuai.xi                 enMirror = E_VOPMIRROR_HVBOTH;
2114*53ee8cc1Swenshuai.xi             }
2115*53ee8cc1Swenshuai.xi             else if(g_pHalMVOPCtx->bMirrorModeHor)
2116*53ee8cc1Swenshuai.xi             {
2117*53ee8cc1Swenshuai.xi                 enMirror = E_VOPMIRROR_HORIZONTALL;
2118*53ee8cc1Swenshuai.xi             }
2119*53ee8cc1Swenshuai.xi             else if(g_pHalMVOPCtx->bMirrorModeVer)
2120*53ee8cc1Swenshuai.xi             {
2121*53ee8cc1Swenshuai.xi                 enMirror = E_VOPMIRROR_VERTICAL;
2122*53ee8cc1Swenshuai.xi             }
2123*53ee8cc1Swenshuai.xi             break;
2124*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
2125*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2126*53ee8cc1Swenshuai.xi             if(g_pHalMVOPCtx->bSubMirrorModeVer &&g_pHalMVOPCtx-> bSubMirrorModeHor)
2127*53ee8cc1Swenshuai.xi             {
2128*53ee8cc1Swenshuai.xi                 enMirror = E_VOPMIRROR_HVBOTH;
2129*53ee8cc1Swenshuai.xi             }
2130*53ee8cc1Swenshuai.xi             else if(g_pHalMVOPCtx->bSubMirrorModeHor)
2131*53ee8cc1Swenshuai.xi             {
2132*53ee8cc1Swenshuai.xi                 enMirror = E_VOPMIRROR_HORIZONTALL;
2133*53ee8cc1Swenshuai.xi             }
2134*53ee8cc1Swenshuai.xi             else if(g_pHalMVOPCtx->bSubMirrorModeVer)
2135*53ee8cc1Swenshuai.xi             {
2136*53ee8cc1Swenshuai.xi                 enMirror = E_VOPMIRROR_VERTICAL;
2137*53ee8cc1Swenshuai.xi             }
2138*53ee8cc1Swenshuai.xi #endif
2139*53ee8cc1Swenshuai.xi             break;
2140*53ee8cc1Swenshuai.xi         default:
2141*53ee8cc1Swenshuai.xi             break;
2142*53ee8cc1Swenshuai.xi     }
2143*53ee8cc1Swenshuai.xi     return enMirror;
2144*53ee8cc1Swenshuai.xi }
2145*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetVerDup(MS_BOOL bEnable)2146*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SetVerDup(MS_BOOL bEnable)
2147*53ee8cc1Swenshuai.xi {
2148*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL0, bEnable, BIT3);// V line duplicate
2149*53ee8cc1Swenshuai.xi     return TRUE;
2150*53ee8cc1Swenshuai.xi }
2151*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetVerDup(void)2152*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetVerDup(void)
2153*53ee8cc1Swenshuai.xi {
2154*53ee8cc1Swenshuai.xi     return (HAL_ReadRegBit(VOP_CTRL0, BIT3) == BIT3);
2155*53ee8cc1Swenshuai.xi }
2156*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetVerx4Dup(MS_BOOL bEnable)2157*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SetVerx4Dup(MS_BOOL bEnable)
2158*53ee8cc1Swenshuai.xi {
2159*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL0, bEnable, BIT3);// x4 duplicate should raise V line duplicate first
2160*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_RGB_FMT, bEnable, BIT3);// V line x4 duplicate
2161*53ee8cc1Swenshuai.xi     return TRUE;
2162*53ee8cc1Swenshuai.xi }
2163*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetHorx4Dup(MS_BOOL bEnable)2164*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SetHorx4Dup(MS_BOOL bEnable)
2165*53ee8cc1Swenshuai.xi {
2166*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_CTRL0, bEnable, BIT2);// x4 duplicate should raise H pixel duplicate first
2167*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(VOP_RGB_FMT, bEnable, BIT2);// H line x4 duplicate
2168*53ee8cc1Swenshuai.xi     return TRUE;
2169*53ee8cc1Swenshuai.xi }
2170*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetVerx4Dup(void)2171*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetVerx4Dup(void)
2172*53ee8cc1Swenshuai.xi {
2173*53ee8cc1Swenshuai.xi     return ((HAL_ReadRegBit(VOP_RGB_FMT, BIT3) & HAL_ReadRegBit(VOP_CTRL0, BIT3)) == BIT3);
2174*53ee8cc1Swenshuai.xi }
2175*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetHorx4Dup(void)2176*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetHorx4Dup(void)
2177*53ee8cc1Swenshuai.xi {
2178*53ee8cc1Swenshuai.xi     return ((HAL_ReadRegBit(VOP_RGB_FMT, BIT2) & HAL_ReadRegBit(VOP_CTRL0, BIT2)) == BIT2);
2179*53ee8cc1Swenshuai.xi }
2180*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetTopVStart(MVOP_DevID eID)2181*53ee8cc1Swenshuai.xi MS_U16 HAL_MVOP_GetTopVStart(MVOP_DevID eID)
2182*53ee8cc1Swenshuai.xi {
2183*53ee8cc1Swenshuai.xi     MS_U16 u16TopVStart = 0;
2184*53ee8cc1Swenshuai.xi     switch(eID)
2185*53ee8cc1Swenshuai.xi     {
2186*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
2187*53ee8cc1Swenshuai.xi             u16TopVStart = HAL_Read2Byte(VOP_IMG_VSTR0)&0x1fff;
2188*53ee8cc1Swenshuai.xi             break;
2189*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
2190*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2191*53ee8cc1Swenshuai.xi             u16TopVStart = HAL_Read2Byte(SUB_REG(VOP_IMG_VSTR0))&0x1fff;
2192*53ee8cc1Swenshuai.xi #endif
2193*53ee8cc1Swenshuai.xi             break;
2194*53ee8cc1Swenshuai.xi         default:
2195*53ee8cc1Swenshuai.xi             break;
2196*53ee8cc1Swenshuai.xi     }
2197*53ee8cc1Swenshuai.xi     return u16TopVStart;
2198*53ee8cc1Swenshuai.xi }
2199*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetBottomVStart(MVOP_DevID eID)2200*53ee8cc1Swenshuai.xi MS_U16 HAL_MVOP_GetBottomVStart(MVOP_DevID eID)
2201*53ee8cc1Swenshuai.xi {
2202*53ee8cc1Swenshuai.xi     MS_U16 u16BotVStart = 0;
2203*53ee8cc1Swenshuai.xi     switch(eID)
2204*53ee8cc1Swenshuai.xi     {
2205*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
2206*53ee8cc1Swenshuai.xi             u16BotVStart = HAL_Read2Byte(VOP_IMG_VSTR1)&0x1fff;
2207*53ee8cc1Swenshuai.xi             break;
2208*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
2209*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2210*53ee8cc1Swenshuai.xi             u16BotVStart = HAL_Read2Byte(SUB_REG(VOP_IMG_VSTR1))&0x1fff;
2211*53ee8cc1Swenshuai.xi #endif
2212*53ee8cc1Swenshuai.xi             break;
2213*53ee8cc1Swenshuai.xi         default:
2214*53ee8cc1Swenshuai.xi             break;
2215*53ee8cc1Swenshuai.xi     }
2216*53ee8cc1Swenshuai.xi     return u16BotVStart;
2217*53ee8cc1Swenshuai.xi }
2218*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetVCount(MVOP_DevID eID)2219*53ee8cc1Swenshuai.xi MS_U16 HAL_MVOP_GetVCount(MVOP_DevID eID)
2220*53ee8cc1Swenshuai.xi {
2221*53ee8cc1Swenshuai.xi     MS_U16 u16VCount = 0;
2222*53ee8cc1Swenshuai.xi     switch(eID)
2223*53ee8cc1Swenshuai.xi     {
2224*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
2225*53ee8cc1Swenshuai.xi             u16VCount = HAL_Read2Byte(VOP_DEBUG_2A)&0x1fff;
2226*53ee8cc1Swenshuai.xi             break;
2227*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
2228*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2229*53ee8cc1Swenshuai.xi             u16VCount = HAL_Read2Byte(SUB_REG(VOP_DEBUG_2A))&0x1fff;
2230*53ee8cc1Swenshuai.xi #endif
2231*53ee8cc1Swenshuai.xi             break;
2232*53ee8cc1Swenshuai.xi         default:
2233*53ee8cc1Swenshuai.xi             break;
2234*53ee8cc1Swenshuai.xi     }
2235*53ee8cc1Swenshuai.xi     return u16VCount;
2236*53ee8cc1Swenshuai.xi }
2237*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetVC1RangeMap(MVOP_DevID eID,MVOP_VC1RangeMapInfo * stVC1RangeMapInfo)2238*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SetVC1RangeMap(MVOP_DevID eID, MVOP_VC1RangeMapInfo *stVC1RangeMapInfo)
2239*53ee8cc1Swenshuai.xi {
2240*53ee8cc1Swenshuai.xi     MS_U32 u8Luma = 0;
2241*53ee8cc1Swenshuai.xi     MS_U32 u8Chroma = 0;
2242*53ee8cc1Swenshuai.xi 
2243*53ee8cc1Swenshuai.xi     if (stVC1RangeMapInfo == NULL)
2244*53ee8cc1Swenshuai.xi     {
2245*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s stBaseAddInfo is NULL pointer\n", __FUNCTION__);)
2246*53ee8cc1Swenshuai.xi         return FALSE;
2247*53ee8cc1Swenshuai.xi     }
2248*53ee8cc1Swenshuai.xi 
2249*53ee8cc1Swenshuai.xi     // Luma value
2250*53ee8cc1Swenshuai.xi     u8Luma = stVC1RangeMapInfo->u8LumaValue;
2251*53ee8cc1Swenshuai.xi     // Chroma value
2252*53ee8cc1Swenshuai.xi     u8Chroma = stVC1RangeMapInfo->u8ChromaValue;
2253*53ee8cc1Swenshuai.xi 
2254*53ee8cc1Swenshuai.xi     switch(eID)
2255*53ee8cc1Swenshuai.xi     {
2256*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
2257*53ee8cc1Swenshuai.xi             //set VC1 Luma value
2258*53ee8cc1Swenshuai.xi             if(stVC1RangeMapInfo->bIsEnableLuma)
2259*53ee8cc1Swenshuai.xi             {
2260*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_RAMAP_LUMA, 1, BIT7);
2261*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(VOP_RAMAP_LUMA, u8Luma, VOP_RAMAP_LUMA_VAL);
2262*53ee8cc1Swenshuai.xi             }
2263*53ee8cc1Swenshuai.xi             else //disable
2264*53ee8cc1Swenshuai.xi             {
2265*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_RAMAP_LUMA, 0, BIT7);
2266*53ee8cc1Swenshuai.xi             }
2267*53ee8cc1Swenshuai.xi 
2268*53ee8cc1Swenshuai.xi             //set VC1 Chroma value
2269*53ee8cc1Swenshuai.xi             if(stVC1RangeMapInfo->bIsEnableChroma)
2270*53ee8cc1Swenshuai.xi             {
2271*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_RAMAP_CHROMA, 1, BIT7);
2272*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(VOP_RAMAP_CHROMA, u8Chroma, VOP_RAMAP_CHROMA_VAL);
2273*53ee8cc1Swenshuai.xi             }
2274*53ee8cc1Swenshuai.xi             else
2275*53ee8cc1Swenshuai.xi             {
2276*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_RAMAP_CHROMA, 0, BIT7);
2277*53ee8cc1Swenshuai.xi             }
2278*53ee8cc1Swenshuai.xi             break;
2279*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
2280*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2281*53ee8cc1Swenshuai.xi             //set VC1 Luma value
2282*53ee8cc1Swenshuai.xi             if(stVC1RangeMapInfo->bIsEnableLuma)
2283*53ee8cc1Swenshuai.xi             {
2284*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_RAMAP_LUMA), 1, BIT7);
2285*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(SUB_REG(VOP_RAMAP_LUMA), u8Luma, VOP_RAMAP_LUMA_VAL);
2286*53ee8cc1Swenshuai.xi             }
2287*53ee8cc1Swenshuai.xi             else //disable
2288*53ee8cc1Swenshuai.xi             {
2289*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_RAMAP_LUMA), 0, BIT7);
2290*53ee8cc1Swenshuai.xi             }
2291*53ee8cc1Swenshuai.xi 
2292*53ee8cc1Swenshuai.xi             //set VC1 Chroma value
2293*53ee8cc1Swenshuai.xi             if(stVC1RangeMapInfo->bIsEnableChroma)
2294*53ee8cc1Swenshuai.xi             {
2295*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_RAMAP_CHROMA), 1, BIT7);
2296*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(SUB_REG(VOP_RAMAP_CHROMA), u8Chroma, VOP_RAMAP_CHROMA_VAL);
2297*53ee8cc1Swenshuai.xi             }
2298*53ee8cc1Swenshuai.xi             else
2299*53ee8cc1Swenshuai.xi             {
2300*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_RAMAP_CHROMA), 0, BIT7);
2301*53ee8cc1Swenshuai.xi             }
2302*53ee8cc1Swenshuai.xi #endif
2303*53ee8cc1Swenshuai.xi             break;
2304*53ee8cc1Swenshuai.xi         default:
2305*53ee8cc1Swenshuai.xi                 break;
2306*53ee8cc1Swenshuai.xi     }
2307*53ee8cc1Swenshuai.xi     return TRUE;
2308*53ee8cc1Swenshuai.xi }
2309*53ee8cc1Swenshuai.xi 
2310*53ee8cc1Swenshuai.xi MS_U16 g_u16SetStartX = 0;
2311*53ee8cc1Swenshuai.xi MS_U16 g_u16SetStartY = 0;
2312*53ee8cc1Swenshuai.xi MS_BOOL g_bIsY4Align = 0;
2313*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetStartX(MVOP_DevID eID,MS_U16 u16XPos)2314*53ee8cc1Swenshuai.xi void HAL_MVOP_SetStartX(MVOP_DevID eID, MS_U16 u16XPos)
2315*53ee8cc1Swenshuai.xi {
2316*53ee8cc1Swenshuai.xi     switch(eID)
2317*53ee8cc1Swenshuai.xi     {
2318*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_0:
2319*53ee8cc1Swenshuai.xi         u16XPos = ALIGN_UPTO_2(u16XPos);
2320*53ee8cc1Swenshuai.xi     	HAL_WriteByte(VOP_REG_CROP_HSTART, u16XPos & 0xff);
2321*53ee8cc1Swenshuai.xi     	HAL_WriteByte((VOP_REG_CROP_HSTART + 1),((u16XPos) >> (8)) & (0x1f));
2322*53ee8cc1Swenshuai.xi         if(0 == u16XPos)
2323*53ee8cc1Swenshuai.xi         {
2324*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropXStart = 0;
2325*53ee8cc1Swenshuai.xi         }
2326*53ee8cc1Swenshuai.xi         else
2327*53ee8cc1Swenshuai.xi         {
2328*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropXStart += u16XPos;
2329*53ee8cc1Swenshuai.xi         }
2330*53ee8cc1Swenshuai.xi     	// Write trigger
2331*53ee8cc1Swenshuai.xi     	HAL_MVOP_LoadReg();
2332*53ee8cc1Swenshuai.xi         break;
2333*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_1:
2334*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2335*53ee8cc1Swenshuai.xi         u16XPos = ALIGN_UPTO_2(u16XPos);
2336*53ee8cc1Swenshuai.xi     	HAL_WriteByte(SUB_REG(VOP_REG_CROP_HSTART), u16XPos & 0xff);
2337*53ee8cc1Swenshuai.xi     	HAL_WriteByte(SUB_REG((VOP_REG_CROP_HSTART + 1)),((u16XPos) >> (8)) & (0x1f));
2338*53ee8cc1Swenshuai.xi         if(0 == u16XPos)
2339*53ee8cc1Swenshuai.xi         {
2340*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropXStart = 0;
2341*53ee8cc1Swenshuai.xi         }
2342*53ee8cc1Swenshuai.xi         else
2343*53ee8cc1Swenshuai.xi         {
2344*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropXStart += u16XPos;
2345*53ee8cc1Swenshuai.xi         }
2346*53ee8cc1Swenshuai.xi     	// Write trigger
2347*53ee8cc1Swenshuai.xi     	HAL_MVOP_SubLoadReg();
2348*53ee8cc1Swenshuai.xi #endif
2349*53ee8cc1Swenshuai.xi         break;
2350*53ee8cc1Swenshuai.xi         default:
2351*53ee8cc1Swenshuai.xi                 break;
2352*53ee8cc1Swenshuai.xi     }
2353*53ee8cc1Swenshuai.xi }
2354*53ee8cc1Swenshuai.xi 
2355*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetStartY(MVOP_DevID eID,MS_U16 u16YPos,MS_BOOL bIsInterlace)2356*53ee8cc1Swenshuai.xi void HAL_MVOP_SetStartY(MVOP_DevID eID, MS_U16 u16YPos, MS_BOOL bIsInterlace)
2357*53ee8cc1Swenshuai.xi {
2358*53ee8cc1Swenshuai.xi     switch(eID)
2359*53ee8cc1Swenshuai.xi     {
2360*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_0:
2361*53ee8cc1Swenshuai.xi     	HAL_WriteByteMask(VOP_REG_CROP_VSTART, u16YPos & 0xff, 0xff);
2362*53ee8cc1Swenshuai.xi     	HAL_WriteByteMask((VOP_REG_CROP_VSTART + 1), ((u16YPos) >> (8)) & (0x1f), 0x1f);
2363*53ee8cc1Swenshuai.xi         if(0 == u16YPos)
2364*53ee8cc1Swenshuai.xi         {
2365*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropYStart = 0;
2366*53ee8cc1Swenshuai.xi         }
2367*53ee8cc1Swenshuai.xi         else
2368*53ee8cc1Swenshuai.xi         {
2369*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropYStart += u16YPos;
2370*53ee8cc1Swenshuai.xi         }
2371*53ee8cc1Swenshuai.xi     	// Write trigger
2372*53ee8cc1Swenshuai.xi     	HAL_MVOP_LoadReg();
2373*53ee8cc1Swenshuai.xi         break;
2374*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_1:
2375*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2376*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_REG_CROP_VSTART), u16YPos & 0xff, 0xff);
2377*53ee8cc1Swenshuai.xi     	HAL_WriteByteMask(SUB_REG((VOP_REG_CROP_VSTART + 1)), ((u16YPos) >> (8)) & (0x1f), 0x1f);
2378*53ee8cc1Swenshuai.xi         if(0 == u16YPos)
2379*53ee8cc1Swenshuai.xi         {
2380*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropYStart = 0;
2381*53ee8cc1Swenshuai.xi         }
2382*53ee8cc1Swenshuai.xi         else
2383*53ee8cc1Swenshuai.xi         {
2384*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropYStart += u16YPos;
2385*53ee8cc1Swenshuai.xi         }
2386*53ee8cc1Swenshuai.xi     	// Write trigger
2387*53ee8cc1Swenshuai.xi     	HAL_MVOP_SubLoadReg();
2388*53ee8cc1Swenshuai.xi #endif
2389*53ee8cc1Swenshuai.xi         break;
2390*53ee8cc1Swenshuai.xi         default:
2391*53ee8cc1Swenshuai.xi                 break;
2392*53ee8cc1Swenshuai.xi     }
2393*53ee8cc1Swenshuai.xi }
2394*53ee8cc1Swenshuai.xi 
2395*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetPicWidthMinus(MVOP_DevID eID,MS_U16 u16XSizes,MS_U16 u16Width)2396*53ee8cc1Swenshuai.xi void HAL_MVOP_SetPicWidthMinus(MVOP_DevID eID, MS_U16 u16XSizes, MS_U16 u16Width)
2397*53ee8cc1Swenshuai.xi {
2398*53ee8cc1Swenshuai.xi     switch(eID)
2399*53ee8cc1Swenshuai.xi     {
2400*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_0:
2401*53ee8cc1Swenshuai.xi         u16XSizes = ALIGN_UPTO_2(u16XSizes);
2402*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_REG_CROP_HSIZE, u16XSizes & 0xff);
2403*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_REG_CROP_HSIZE + 1), ((u16XSizes) >> (8)) & (0x1f));
2404*53ee8cc1Swenshuai.xi 
2405*53ee8cc1Swenshuai.xi         if(0 == u16XSizes)
2406*53ee8cc1Swenshuai.xi         {
2407*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropXSize = 0;
2408*53ee8cc1Swenshuai.xi         }
2409*53ee8cc1Swenshuai.xi         else
2410*53ee8cc1Swenshuai.xi         {
2411*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropXSize = u16XSizes;
2412*53ee8cc1Swenshuai.xi         }
2413*53ee8cc1Swenshuai.xi         // Write trigger
2414*53ee8cc1Swenshuai.xi         HAL_MVOP_LoadReg();
2415*53ee8cc1Swenshuai.xi         break;
2416*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_1:
2417*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2418*53ee8cc1Swenshuai.xi         u16XSizes = ALIGN_UPTO_2(u16XSizes);
2419*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_REG_CROP_HSIZE), u16XSizes & 0xff);
2420*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG((VOP_REG_CROP_HSIZE + 1)), ((u16XSizes) >> (8)) & (0x1f));
2421*53ee8cc1Swenshuai.xi         if(0 == u16XSizes)
2422*53ee8cc1Swenshuai.xi         {
2423*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropXSize = 0;
2424*53ee8cc1Swenshuai.xi         }
2425*53ee8cc1Swenshuai.xi         else
2426*53ee8cc1Swenshuai.xi         {
2427*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropXSize = u16XSizes;
2428*53ee8cc1Swenshuai.xi         }
2429*53ee8cc1Swenshuai.xi         // Write trigger
2430*53ee8cc1Swenshuai.xi         HAL_MVOP_SubLoadReg();
2431*53ee8cc1Swenshuai.xi #endif
2432*53ee8cc1Swenshuai.xi             break;
2433*53ee8cc1Swenshuai.xi         default:
2434*53ee8cc1Swenshuai.xi                 break;
2435*53ee8cc1Swenshuai.xi     }
2436*53ee8cc1Swenshuai.xi }
2437*53ee8cc1Swenshuai.xi 
2438*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetPicHeightMinus(MVOP_DevID eID,MS_U16 u16YSizes,MS_U16 u16Height)2439*53ee8cc1Swenshuai.xi void HAL_MVOP_SetPicHeightMinus(MVOP_DevID eID, MS_U16 u16YSizes, MS_U16 u16Height)
2440*53ee8cc1Swenshuai.xi {
2441*53ee8cc1Swenshuai.xi     switch(eID)
2442*53ee8cc1Swenshuai.xi     {
2443*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_0:
2444*53ee8cc1Swenshuai.xi         if(TRUE == g_pHalMVOPCtx->bMirrorModeVer)
2445*53ee8cc1Swenshuai.xi         {
2446*53ee8cc1Swenshuai.xi             MS_U16 u16YstMir = 0;
2447*53ee8cc1Swenshuai.xi             if((g_pHalMVOPCtx->u16CropYStart + u16YSizes) < u16Height)
2448*53ee8cc1Swenshuai.xi             {
2449*53ee8cc1Swenshuai.xi                 u16YstMir = u16Height - g_pHalMVOPCtx->u16CropYStart - u16YSizes;
2450*53ee8cc1Swenshuai.xi                 HAL_MVOP_SetStartX(E_MVOP_DEV_0, u16YstMir);
2451*53ee8cc1Swenshuai.xi             }
2452*53ee8cc1Swenshuai.xi             else
2453*53ee8cc1Swenshuai.xi             {
2454*53ee8cc1Swenshuai.xi                 MVOP_PRINTF("[Warning] crop y size or start out of boundary.");
2455*53ee8cc1Swenshuai.xi                 return;
2456*53ee8cc1Swenshuai.xi             }
2457*53ee8cc1Swenshuai.xi         }
2458*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_REG_CROP_VSIZE, (u16YSizes) & 0xff);
2459*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_REG_CROP_VSIZE + 1), ((u16YSizes) >> (8)) & (0x1f));
2460*53ee8cc1Swenshuai.xi         if(0 == u16YSizes)
2461*53ee8cc1Swenshuai.xi         {
2462*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropYSize = 0;
2463*53ee8cc1Swenshuai.xi         }
2464*53ee8cc1Swenshuai.xi         else
2465*53ee8cc1Swenshuai.xi         {
2466*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropYSize += u16YSizes;
2467*53ee8cc1Swenshuai.xi         }
2468*53ee8cc1Swenshuai.xi         // Write trigger
2469*53ee8cc1Swenshuai.xi         HAL_MVOP_LoadReg();
2470*53ee8cc1Swenshuai.xi         break;
2471*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_1:
2472*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2473*53ee8cc1Swenshuai.xi         if(TRUE == g_pHalMVOPCtx->bSubMirrorModeVer)
2474*53ee8cc1Swenshuai.xi         {
2475*53ee8cc1Swenshuai.xi             MS_U16 u16YstMir = 0;
2476*53ee8cc1Swenshuai.xi             if((g_pHalMVOPCtx->u16SubCropYStart + u16YSizes) < u16Height)
2477*53ee8cc1Swenshuai.xi             {
2478*53ee8cc1Swenshuai.xi                 u16YstMir = u16Height - g_pHalMVOPCtx->u16SubCropYStart - u16YSizes;
2479*53ee8cc1Swenshuai.xi                 HAL_MVOP_SetStartX(E_MVOP_DEV_1, u16YstMir);
2480*53ee8cc1Swenshuai.xi             }
2481*53ee8cc1Swenshuai.xi             else
2482*53ee8cc1Swenshuai.xi             {
2483*53ee8cc1Swenshuai.xi                 MVOP_PRINTF("[Warning] crop y size or start out of boundary.");
2484*53ee8cc1Swenshuai.xi                 return;
2485*53ee8cc1Swenshuai.xi             }
2486*53ee8cc1Swenshuai.xi         }
2487*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_REG_CROP_VSIZE), (u16YSizes) & 0xff);
2488*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG((VOP_REG_CROP_VSIZE + 1)), ((u16YSizes) >> (8)) & (0x1f));
2489*53ee8cc1Swenshuai.xi         if(0 == u16YSizes)
2490*53ee8cc1Swenshuai.xi         {
2491*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropYSize = 0;
2492*53ee8cc1Swenshuai.xi         }
2493*53ee8cc1Swenshuai.xi         else
2494*53ee8cc1Swenshuai.xi         {
2495*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropYSize += u16YSizes;
2496*53ee8cc1Swenshuai.xi         }
2497*53ee8cc1Swenshuai.xi         // Write trigger
2498*53ee8cc1Swenshuai.xi         HAL_MVOP_SubLoadReg();
2499*53ee8cc1Swenshuai.xi 
2500*53ee8cc1Swenshuai.xi #endif
2501*53ee8cc1Swenshuai.xi             break;
2502*53ee8cc1Swenshuai.xi         default:
2503*53ee8cc1Swenshuai.xi                 break;
2504*53ee8cc1Swenshuai.xi     }
2505*53ee8cc1Swenshuai.xi }
2506*53ee8cc1Swenshuai.xi 
2507*53ee8cc1Swenshuai.xi 
2508*53ee8cc1Swenshuai.xi 
2509*53ee8cc1Swenshuai.xi /******************************************************************************/
2510*53ee8cc1Swenshuai.xi /// Set MVOP Saving BW Mode
2511*53ee8cc1Swenshuai.xi /// @ Napoli this command should be set after MDrv_MVOP_SetOutputCfg
2512*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_Set420BWSaveMode(MS_BOOL bEnable)2513*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_Set420BWSaveMode(MS_BOOL bEnable)
2514*53ee8cc1Swenshuai.xi {
2515*53ee8cc1Swenshuai.xi     MS_BOOL bValue = FALSE;
2516*53ee8cc1Swenshuai.xi 
2517*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)
2518*53ee8cc1Swenshuai.xi     bValue = (g_pHalMVOPCtx->b3DLRAltSBSOutput || g_pHalMVOPCtx->b3DLRAltOutput /*|| g_pHalMVOPCtx->b3DLRMode */|| g_pHalMVOPCtx->bIs422 );
2519*53ee8cc1Swenshuai.xi 
2520*53ee8cc1Swenshuai.xi     if(bValue)
2521*53ee8cc1Swenshuai.xi     {
2522*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s Hit the limitation of saving bw, disable BW Saving mode\n", __FUNCTION__);)
2523*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_DUMMY, 0, VOP_420_BW_SAVE);
2524*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_BW_SAVE, 0, VOP_420_BW_SAVE_EX);
2525*53ee8cc1Swenshuai.xi         HAL_MVOP_LoadReg();
2526*53ee8cc1Swenshuai.xi         return FALSE;
2527*53ee8cc1Swenshuai.xi     }
2528*53ee8cc1Swenshuai.xi     else
2529*53ee8cc1Swenshuai.xi     {
2530*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_DUMMY, bEnable, VOP_420_BW_SAVE);
2531*53ee8cc1Swenshuai.xi         if( g_pHalMVOPCtx->b3DLRMode == FALSE)
2532*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_REG_BW_SAVE, bEnable, VOP_420_BW_SAVE_EX);
2533*53ee8cc1Swenshuai.xi         else
2534*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_REG_BW_SAVE, 0, VOP_420_BW_SAVE_EX);
2535*53ee8cc1Swenshuai.xi         HAL_MVOP_LoadReg();
2536*53ee8cc1Swenshuai.xi         return TRUE;
2537*53ee8cc1Swenshuai.xi     }
2538*53ee8cc1Swenshuai.xi }
2539*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetEVDYUVBaseAdd(MVOP_EVDBaseAddInput * stEVDBaseAddInfo)2540*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SetEVDYUVBaseAdd(MVOP_EVDBaseAddInput *stEVDBaseAddInfo)
2541*53ee8cc1Swenshuai.xi {
2542*53ee8cc1Swenshuai.xi     //----------------------------------------------------
2543*53ee8cc1Swenshuai.xi     // Set MSB YUV Address
2544*53ee8cc1Swenshuai.xi     //----------------------------------------------------
2545*53ee8cc1Swenshuai.xi 
2546*53ee8cc1Swenshuai.xi     MS_PHY u64tmp = 0;
2547*53ee8cc1Swenshuai.xi 
2548*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
2549*53ee8cc1Swenshuai.xi     {
2550*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
2551*53ee8cc1Swenshuai.xi         return FALSE;
2552*53ee8cc1Swenshuai.xi     }
2553*53ee8cc1Swenshuai.xi     // Y offset
2554*53ee8cc1Swenshuai.xi     u64tmp = stEVDBaseAddInfo->u32MSBYOffset >> 3;
2555*53ee8cc1Swenshuai.xi     if ( !stEVDBaseAddInfo->bProgressive)
2556*53ee8cc1Swenshuai.xi     {   //Refine Y offset for interlace repeat bottom field
2557*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
2558*53ee8cc1Swenshuai.xi         {
2559*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
2560*53ee8cc1Swenshuai.xi             u64tmp += 2;
2561*53ee8cc1Swenshuai.xi         }
2562*53ee8cc1Swenshuai.xi         else
2563*53ee8cc1Swenshuai.xi         {
2564*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is TOP or NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
2565*53ee8cc1Swenshuai.xi         }
2566*53ee8cc1Swenshuai.xi     }
2567*53ee8cc1Swenshuai.xi     HAL_WriteByte(VOP_JPG_YSTR0_L, u64tmp & 0xff);
2568*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_L+1), (u64tmp >> 8) & 0xff);
2569*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_H), (u64tmp >> 16) & 0xff);
2570*53ee8cc1Swenshuai.xi     HAL_WriteByte((VOP_JPG_YSTR0_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
2571*53ee8cc1Swenshuai.xi 
2572*53ee8cc1Swenshuai.xi     if (!stEVDBaseAddInfo->bProgressive )
2573*53ee8cc1Swenshuai.xi     {   //Y offset of bottom field if interlace
2574*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_YSTR1_L, u64tmp & 0xff);
2575*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR1_L+1), (u64tmp >> 8) & 0xff);
2576*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR1_H), (u64tmp >> 16) & 0xff);
2577*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_YSTR1_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
2578*53ee8cc1Swenshuai.xi     }
2579*53ee8cc1Swenshuai.xi 
2580*53ee8cc1Swenshuai.xi     if (stEVDBaseAddInfo->b422Pack)
2581*53ee8cc1Swenshuai.xi     {
2582*53ee8cc1Swenshuai.xi         stEVDBaseAddInfo->u32MSBUVOffset = stEVDBaseAddInfo->u32MSBYOffset + 16; //add 16 for 128bit; add 8 for 64bit
2583*53ee8cc1Swenshuai.xi     }
2584*53ee8cc1Swenshuai.xi     // UV offset
2585*53ee8cc1Swenshuai.xi     u64tmp = stEVDBaseAddInfo->u32MSBUVOffset >> 3;
2586*53ee8cc1Swenshuai.xi     if( !stEVDBaseAddInfo->bProgressive )
2587*53ee8cc1Swenshuai.xi     {  //Refine UV offset for interlace repeat bottom field
2588*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
2589*53ee8cc1Swenshuai.xi         {
2590*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
2591*53ee8cc1Swenshuai.xi             u64tmp += 2;
2592*53ee8cc1Swenshuai.xi         }
2593*53ee8cc1Swenshuai.xi         else
2594*53ee8cc1Swenshuai.xi         {
2595*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is TOP/NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
2596*53ee8cc1Swenshuai.xi         }
2597*53ee8cc1Swenshuai.xi     }
2598*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_UVSTR0_L, u64tmp & 0xff);
2599*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR0_L+1), (u64tmp >> 8) & 0xff);
2600*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR0_H), (u64tmp >> 16) & 0xff);
2601*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR0_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
2602*53ee8cc1Swenshuai.xi 
2603*53ee8cc1Swenshuai.xi     if( !stEVDBaseAddInfo->bProgressive )
2604*53ee8cc1Swenshuai.xi     {  //UV offset of bottom field if interlace
2605*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_JPG_UVSTR1_L, u64tmp & 0xff);
2606*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR1_L+1), (u64tmp >> 8) & 0xff);
2607*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR1_H), (u64tmp >> 16) & 0xff);
2608*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_JPG_UVSTR1_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
2609*53ee8cc1Swenshuai.xi     }
2610*53ee8cc1Swenshuai.xi 
2611*53ee8cc1Swenshuai.xi     //----------------------------------------------------
2612*53ee8cc1Swenshuai.xi     // Set MSB YUV Address
2613*53ee8cc1Swenshuai.xi     //----------------------------------------------------
2614*53ee8cc1Swenshuai.xi     if(stEVDBaseAddInfo->bEnLSB)
2615*53ee8cc1Swenshuai.xi     {
2616*53ee8cc1Swenshuai.xi         //Enable LSB
2617*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_EVD_10B_EN, 1, VOP_EVD_10B_Y_EN);
2618*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_EVD_10B_EN, 1, VOP_EVD_10B_UV_EN);
2619*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_MASK, 0, VOP_LSB_REQ_MASK);
2620*53ee8cc1Swenshuai.xi 
2621*53ee8cc1Swenshuai.xi         // Y offset
2622*53ee8cc1Swenshuai.xi         u64tmp = stEVDBaseAddInfo->u32LSBYOffset >> 3;
2623*53ee8cc1Swenshuai.xi         if ( !stEVDBaseAddInfo->bProgressive)
2624*53ee8cc1Swenshuai.xi         {   //Refine Y offset for interlace repeat bottom field
2625*53ee8cc1Swenshuai.xi             if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
2626*53ee8cc1Swenshuai.xi             {
2627*53ee8cc1Swenshuai.xi                 MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
2628*53ee8cc1Swenshuai.xi                 u64tmp += 2;
2629*53ee8cc1Swenshuai.xi             }
2630*53ee8cc1Swenshuai.xi             else
2631*53ee8cc1Swenshuai.xi             {
2632*53ee8cc1Swenshuai.xi                 MVOP_DBG("%d eRepeatField(%x) is TOP or NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
2633*53ee8cc1Swenshuai.xi             }
2634*53ee8cc1Swenshuai.xi         }
2635*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_LSB_YSTR0_L, u64tmp & 0xff);
2636*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_LSB_YSTR0_L+1), (u64tmp >> 8) & 0xff);
2637*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_LSB_YSTR0_L), (u64tmp >> 16) & 0xff);
2638*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_LSB_YSTR0_L+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
2639*53ee8cc1Swenshuai.xi 
2640*53ee8cc1Swenshuai.xi         if (!stEVDBaseAddInfo->bProgressive )
2641*53ee8cc1Swenshuai.xi         {   //Y offset of bottom field if interlace
2642*53ee8cc1Swenshuai.xi             HAL_WriteByte(VOP_LSB_YSTR1_L, u64tmp & 0xff);
2643*53ee8cc1Swenshuai.xi             HAL_WriteByte((VOP_LSB_YSTR1_L+1), (u64tmp >> 8) & 0xff);
2644*53ee8cc1Swenshuai.xi             HAL_WriteByte((VOP_LSB_YSTR1_H), (u64tmp >> 16) & 0xff);
2645*53ee8cc1Swenshuai.xi             HAL_WriteByte((VOP_LSB_YSTR1_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
2646*53ee8cc1Swenshuai.xi         }
2647*53ee8cc1Swenshuai.xi 
2648*53ee8cc1Swenshuai.xi         if (stEVDBaseAddInfo->b422Pack)
2649*53ee8cc1Swenshuai.xi         {
2650*53ee8cc1Swenshuai.xi             stEVDBaseAddInfo->u32LSBUVOffset = stEVDBaseAddInfo->u32LSBYOffset + 16; //add 16 for 128bit; add 8 for 64bit
2651*53ee8cc1Swenshuai.xi         }
2652*53ee8cc1Swenshuai.xi         // UV offset
2653*53ee8cc1Swenshuai.xi         u64tmp = stEVDBaseAddInfo->u32LSBUVOffset >> 3;
2654*53ee8cc1Swenshuai.xi         if( !stEVDBaseAddInfo->bProgressive )
2655*53ee8cc1Swenshuai.xi         {  //Refine UV offset for interlace repeat bottom field
2656*53ee8cc1Swenshuai.xi             if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
2657*53ee8cc1Swenshuai.xi             {
2658*53ee8cc1Swenshuai.xi                 MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
2659*53ee8cc1Swenshuai.xi                 u64tmp += 2;
2660*53ee8cc1Swenshuai.xi             }
2661*53ee8cc1Swenshuai.xi             else
2662*53ee8cc1Swenshuai.xi             {
2663*53ee8cc1Swenshuai.xi                 MVOP_DBG("%d eRepeatField(%x) is TOP/NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
2664*53ee8cc1Swenshuai.xi             }
2665*53ee8cc1Swenshuai.xi         }
2666*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_LSB_UVSTR0_L, u64tmp & 0xff);
2667*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_LSB_UVSTR0_L+1), (u64tmp >> 8) & 0xff);
2668*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_LSB_UVSTR0_H), (u64tmp >> 16) & 0xff);
2669*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_LSB_UVSTR0_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
2670*53ee8cc1Swenshuai.xi 
2671*53ee8cc1Swenshuai.xi         if( !stEVDBaseAddInfo->bProgressive )
2672*53ee8cc1Swenshuai.xi         {  //UV offset of bottom field if interlace
2673*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_LSB_UVSTR1_L, u64tmp & 0xff);
2674*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_LSB_UVSTR1_L+1), (u64tmp >> 8) & 0xff);
2675*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_LSB_UVSTR1_H), (u64tmp >> 16) & 0xff);
2676*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_LSB_UVSTR1_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
2677*53ee8cc1Swenshuai.xi         }
2678*53ee8cc1Swenshuai.xi     }
2679*53ee8cc1Swenshuai.xi 
2680*53ee8cc1Swenshuai.xi     return TRUE;
2681*53ee8cc1Swenshuai.xi }
2682*53ee8cc1Swenshuai.xi 
2683*53ee8cc1Swenshuai.xi /******************************************************************************/
2684*53ee8cc1Swenshuai.xi /// Set MVOP repeat previous frame IF VDEC can not finish vsync.
2685*53ee8cc1Swenshuai.xi /// this command should be set disable as call VDEC Exit.
2686*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SetRptPreVsyncFrame(MVOP_DevID eID,MS_BOOL bEnable)2687*53ee8cc1Swenshuai.xi void HAL_MVOP_SetRptPreVsyncFrame(MVOP_DevID eID, MS_BOOL bEnable)
2688*53ee8cc1Swenshuai.xi {
2689*53ee8cc1Swenshuai.xi     switch(eID)
2690*53ee8cc1Swenshuai.xi     {
2691*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
2692*53ee8cc1Swenshuai.xi         {
2693*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->bRptPreVsync = bEnable;
2694*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_MIRROR_CFG_HI, bEnable, BIT3);
2695*53ee8cc1Swenshuai.xi             break;
2696*53ee8cc1Swenshuai.xi         }
2697*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
2698*53ee8cc1Swenshuai.xi         {
2699*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2700*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->bSubRptPreVsync = bEnable;
2701*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG_HI), bEnable, BIT3);
2702*53ee8cc1Swenshuai.xi #endif
2703*53ee8cc1Swenshuai.xi             break;
2704*53ee8cc1Swenshuai.xi         }
2705*53ee8cc1Swenshuai.xi         default:
2706*53ee8cc1Swenshuai.xi             MVOP_PRINTF("[Warning] MVOP_DevID not support!\n");
2707*53ee8cc1Swenshuai.xi             break;
2708*53ee8cc1Swenshuai.xi     }
2709*53ee8cc1Swenshuai.xi }
2710*53ee8cc1Swenshuai.xi 
HAL_MVOP_PowerStateSuspend(void)2711*53ee8cc1Swenshuai.xi void HAL_MVOP_PowerStateSuspend(void)
2712*53ee8cc1Swenshuai.xi {
2713*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bIsInit = 0;
2714*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2715*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsInit = 0;
2716*53ee8cc1Swenshuai.xi #endif
2717*53ee8cc1Swenshuai.xi }
2718*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetHandShakeMode(MVOP_DevID eID)2719*53ee8cc1Swenshuai.xi MVOP_HSMode HAL_MVOP_GetHandShakeMode(MVOP_DevID eID)
2720*53ee8cc1Swenshuai.xi {
2721*53ee8cc1Swenshuai.xi     MVOP_HSMode eRet = E_MVOP_HS_NOT_SUPPORT;
2722*53ee8cc1Swenshuai.xi     switch(eID)
2723*53ee8cc1Swenshuai.xi     {
2724*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
2725*53ee8cc1Swenshuai.xi             eRet = E_MVOP_HS_NOT_SUPPORT;
2726*53ee8cc1Swenshuai.xi             break;
2727*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
2728*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2729*53ee8cc1Swenshuai.xi             eRet = E_MVOP_HS_NOT_SUPPORT;
2730*53ee8cc1Swenshuai.xi #endif
2731*53ee8cc1Swenshuai.xi             break;
2732*53ee8cc1Swenshuai.xi         default:
2733*53ee8cc1Swenshuai.xi             eRet = E_MVOP_HS_INVALID_PARAM;
2734*53ee8cc1Swenshuai.xi             break;
2735*53ee8cc1Swenshuai.xi     }
2736*53ee8cc1Swenshuai.xi     return eRet;
2737*53ee8cc1Swenshuai.xi }
2738*53ee8cc1Swenshuai.xi 
HAL_MVOP_CheckSTCCW(void)2739*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_CheckSTCCW(void)
2740*53ee8cc1Swenshuai.xi {
2741*53ee8cc1Swenshuai.xi     MS_U16 u16STC_CW_L = 0;
2742*53ee8cc1Swenshuai.xi     MS_U16 u16STC_CW_H = 0;
2743*53ee8cc1Swenshuai.xi     MS_BOOL u16STC_CW_SEL = 0;
2744*53ee8cc1Swenshuai.xi     MS_BOOL u16TSP_CLK_EN = 0;
2745*53ee8cc1Swenshuai.xi 
2746*53ee8cc1Swenshuai.xi     u16STC_CW_L = HAL_Read2Byte(REG_STC0_CW_L)&0xffff;
2747*53ee8cc1Swenshuai.xi     u16STC_CW_H = HAL_Read2Byte(REG_STC0_CW_H)&0xffff;
2748*53ee8cc1Swenshuai.xi 
2749*53ee8cc1Swenshuai.xi     u16STC_CW_SEL = (HAL_ReadRegBit(REG_STC_CW_SLE_L, BIT1) == BIT1);
2750*53ee8cc1Swenshuai.xi     u16TSP_CLK_EN = !(HAL_ReadRegBit(REG_TSP_CLK, BIT0) == BIT0);
2751*53ee8cc1Swenshuai.xi 
2752*53ee8cc1Swenshuai.xi     if((((u16STC_CW_L || u16STC_CW_H) == 0) && (u16STC_CW_SEL == 0)) || ((u16STC_CW_SEL == 1) && (u16TSP_CLK_EN == 0)))
2753*53ee8cc1Swenshuai.xi         return FALSE;
2754*53ee8cc1Swenshuai.xi     else
2755*53ee8cc1Swenshuai.xi         return TRUE;
2756*53ee8cc1Swenshuai.xi 
2757*53ee8cc1Swenshuai.xi }
2758*53ee8cc1Swenshuai.xi 
2759*53ee8cc1Swenshuai.xi #define MIU1_REG_BASE       0x0600
HAL_MVOP_GetIsMiuIPControl(HALMVOPMIUCLIENTINFO stInfo)2760*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetIsMiuIPControl(HALMVOPMIUCLIENTINFO stInfo)
2761*53ee8cc1Swenshuai.xi {
2762*53ee8cc1Swenshuai.xi     MS_U32 u32RegMiu = 0;
2763*53ee8cc1Swenshuai.xi     MS_U16 u16Mask = 0;
2764*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
2765*53ee8cc1Swenshuai.xi 
2766*53ee8cc1Swenshuai.xi     u32RegMiu = MIU1_REG_BASE + (0xF0+(stInfo.u8Gp * 2));
2767*53ee8cc1Swenshuai.xi     if(stInfo.u8BitPos < 8)
2768*53ee8cc1Swenshuai.xi     {
2769*53ee8cc1Swenshuai.xi         u16Mask = 1<<stInfo.u8BitPos;
2770*53ee8cc1Swenshuai.xi     }
2771*53ee8cc1Swenshuai.xi     else
2772*53ee8cc1Swenshuai.xi     {
2773*53ee8cc1Swenshuai.xi         u16Mask = 1<<(stInfo.u8BitPos-8);
2774*53ee8cc1Swenshuai.xi         u32RegMiu += 1;
2775*53ee8cc1Swenshuai.xi     }
2776*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF("[%s] u32RegMiu = 0x%lx, u16Mask = 0x%x\n",__FUNCTION__, u32RegMiu,u16Mask);)
2777*53ee8cc1Swenshuai.xi     if(HAL_ReadRegBit(u32RegMiu, u16Mask))
2778*53ee8cc1Swenshuai.xi     {
2779*53ee8cc1Swenshuai.xi         bRet = TRUE;
2780*53ee8cc1Swenshuai.xi     }
2781*53ee8cc1Swenshuai.xi 
2782*53ee8cc1Swenshuai.xi     return bRet;
2783*53ee8cc1Swenshuai.xi }
2784*53ee8cc1Swenshuai.xi 
HAL_MVOP_SelMIU(MVOP_DevID eDevID,HALMVOPMIUSEL eMiuMSB0,HALMVOPMIUSEL eMiuMSB1,HALMVOPMIUSEL eMiuLSB0,HALMVOPMIUSEL eMiuLSB1)2785*53ee8cc1Swenshuai.xi void HAL_MVOP_SelMIU(MVOP_DevID eDevID, HALMVOPMIUSEL eMiuMSB0, HALMVOPMIUSEL eMiuMSB1, HALMVOPMIUSEL eMiuLSB0, HALMVOPMIUSEL eMiuLSB1)
2786*53ee8cc1Swenshuai.xi {
2787*53ee8cc1Swenshuai.xi     MS_U8 u8MSBVlue = 0;
2788*53ee8cc1Swenshuai.xi     MS_U8 u8LSBVlue = 0;
2789*53ee8cc1Swenshuai.xi 
2790*53ee8cc1Swenshuai.xi     if(eMiuMSB0 != eMiuMSB1)
2791*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_MIU_SEL, TRUE, BIT0);
2792*53ee8cc1Swenshuai.xi     else
2793*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_MIU_SEL, FALSE, BIT0);
2794*53ee8cc1Swenshuai.xi 
2795*53ee8cc1Swenshuai.xi     if(eMiuLSB0 != eMiuLSB1)
2796*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_MIU_SEL, TRUE, BIT1);
2797*53ee8cc1Swenshuai.xi     else
2798*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_MIU_SEL, FALSE, BIT1);
2799*53ee8cc1Swenshuai.xi 
2800*53ee8cc1Swenshuai.xi     u8MSBVlue |= (eMiuMSB0 << 4);
2801*53ee8cc1Swenshuai.xi     u8MSBVlue |= (eMiuMSB1 << 6);
2802*53ee8cc1Swenshuai.xi 
2803*53ee8cc1Swenshuai.xi     u8LSBVlue |= (eMiuLSB0 << 4);
2804*53ee8cc1Swenshuai.xi     u8LSBVlue |= (eMiuLSB1 << 6);
2805*53ee8cc1Swenshuai.xi 
2806*53ee8cc1Swenshuai.xi     switch(eDevID)
2807*53ee8cc1Swenshuai.xi     {
2808*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
2809*53ee8cc1Swenshuai.xi         {
2810*53ee8cc1Swenshuai.xi             // MSB
2811*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(VOP_MIU_SEL, u8MSBVlue, VOP_MSB_BUF0_MIU_SEL | VOP_MSB_BUF1_MIU_SEL);
2812*53ee8cc1Swenshuai.xi             // LSB
2813*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(VOP_MIU_SEL_LSB, u8LSBVlue, VOP_LSB_BUF0_MIU_SEL | VOP_LSB_BUF1_MIU_SEL);
2814*53ee8cc1Swenshuai.xi             break;
2815*53ee8cc1Swenshuai.xi         }
2816*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2817*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
2818*53ee8cc1Swenshuai.xi         {
2819*53ee8cc1Swenshuai.xi             // MSB
2820*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(SUB_REG(VOP_MIU_SEL), u8MSBVlue, VOP_MSB_BUF0_MIU_SEL | VOP_MSB_BUF1_MIU_SEL);
2821*53ee8cc1Swenshuai.xi             // LSB
2822*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(SUB_REG(VOP_MIU_SEL_LSB), u8LSBVlue, VOP_LSB_BUF0_MIU_SEL | VOP_LSB_BUF1_MIU_SEL);
2823*53ee8cc1Swenshuai.xi             break;
2824*53ee8cc1Swenshuai.xi         }
2825*53ee8cc1Swenshuai.xi #endif
2826*53ee8cc1Swenshuai.xi         default:
2827*53ee8cc1Swenshuai.xi             break;
2828*53ee8cc1Swenshuai.xi     }
2829*53ee8cc1Swenshuai.xi }
2830*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetIsOnlyMiuIPControl(void)2831*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetIsOnlyMiuIPControl(void)
2832*53ee8cc1Swenshuai.xi {
2833*53ee8cc1Swenshuai.xi     return TRUE;
2834*53ee8cc1Swenshuai.xi }
2835*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetMaxFramerate(MVOP_DevID eDevID,MVOP_GetMaxFps * stStreamInfo)2836*53ee8cc1Swenshuai.xi void HAL_MVOP_GetMaxFramerate(MVOP_DevID eDevID, MVOP_GetMaxFps* stStreamInfo)
2837*53ee8cc1Swenshuai.xi {
2838*53ee8cc1Swenshuai.xi     MS_U64 u64MaxClk = 0;
2839*53ee8cc1Swenshuai.xi     MS_U16 u16HsizeTiming = 0;
2840*53ee8cc1Swenshuai.xi     MS_U16 u16VsizeTiming = 0;
2841*53ee8cc1Swenshuai.xi 
2842*53ee8cc1Swenshuai.xi     if(NULL == stStreamInfo)
2843*53ee8cc1Swenshuai.xi     {
2844*53ee8cc1Swenshuai.xi         MVOP_PRINTF("[%s] Input parameter is NULL!\n",__FUNCTION__);
2845*53ee8cc1Swenshuai.xi         return;
2846*53ee8cc1Swenshuai.xi     }
2847*53ee8cc1Swenshuai.xi 
2848*53ee8cc1Swenshuai.xi     switch(eDevID)
2849*53ee8cc1Swenshuai.xi     {
2850*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
2851*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
2852*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
2853*53ee8cc1Swenshuai.xi #endif
2854*53ee8cc1Swenshuai.xi         {
2855*53ee8cc1Swenshuai.xi             if(_HAL_MVOP_IsSupport4k2k2P())
2856*53ee8cc1Swenshuai.xi             {
2857*53ee8cc1Swenshuai.xi                 u16HsizeTiming = stStreamInfo->u16HSize >> 1;
2858*53ee8cc1Swenshuai.xi             }
2859*53ee8cc1Swenshuai.xi             else
2860*53ee8cc1Swenshuai.xi             {
2861*53ee8cc1Swenshuai.xi                 u16HsizeTiming = stStreamInfo->u16HSize;
2862*53ee8cc1Swenshuai.xi                 u16HsizeTiming = ALIGN_UPTO_2(u16HsizeTiming);
2863*53ee8cc1Swenshuai.xi             }
2864*53ee8cc1Swenshuai.xi             if(stStreamInfo->b3DSBS)
2865*53ee8cc1Swenshuai.xi             {
2866*53ee8cc1Swenshuai.xi                 u16HsizeTiming *= 2;
2867*53ee8cc1Swenshuai.xi             }
2868*53ee8cc1Swenshuai.xi             if(stStreamInfo->u16HSize > 720)
2869*53ee8cc1Swenshuai.xi             {
2870*53ee8cc1Swenshuai.xi                 u16HsizeTiming +=  MVOP_HBlank_HD;
2871*53ee8cc1Swenshuai.xi             }
2872*53ee8cc1Swenshuai.xi             else
2873*53ee8cc1Swenshuai.xi             {
2874*53ee8cc1Swenshuai.xi                 u16HsizeTiming +=  MVOP_HBlank_SD;
2875*53ee8cc1Swenshuai.xi             }
2876*53ee8cc1Swenshuai.xi 
2877*53ee8cc1Swenshuai.xi             u64MaxClk = HAL_MVOP_GetMaximumClk();
2878*53ee8cc1Swenshuai.xi             if(stStreamInfo->b3DTB)
2879*53ee8cc1Swenshuai.xi             {
2880*53ee8cc1Swenshuai.xi                 u16VsizeTiming = stStreamInfo->u16VSize*2 + MVOP_VBlank;
2881*53ee8cc1Swenshuai.xi             }
2882*53ee8cc1Swenshuai.xi             else
2883*53ee8cc1Swenshuai.xi             {
2884*53ee8cc1Swenshuai.xi                 u16VsizeTiming = stStreamInfo->u16VSize + MVOP_VBlank;
2885*53ee8cc1Swenshuai.xi             }
2886*53ee8cc1Swenshuai.xi             do_div(u64MaxClk, u16HsizeTiming);
2887*53ee8cc1Swenshuai.xi             do_div(u64MaxClk, u16VsizeTiming);
2888*53ee8cc1Swenshuai.xi             stStreamInfo->u32Framerate = (MS_U32)u64MaxClk * 1000;
2889*53ee8cc1Swenshuai.xi         }
2890*53ee8cc1Swenshuai.xi             break;
2891*53ee8cc1Swenshuai.xi         default:
2892*53ee8cc1Swenshuai.xi             break;
2893*53ee8cc1Swenshuai.xi     }
2894*53ee8cc1Swenshuai.xi 
2895*53ee8cc1Swenshuai.xi }
2896*53ee8cc1Swenshuai.xi 
HAL_MVOP_ResetReg(MVOP_DevID eDevID,MS_U16 u16ECOVersion)2897*53ee8cc1Swenshuai.xi void HAL_MVOP_ResetReg(MVOP_DevID eDevID, MS_U16 u16ECOVersion)
2898*53ee8cc1Swenshuai.xi {
2899*53ee8cc1Swenshuai.xi 
2900*53ee8cc1Swenshuai.xi     switch(eDevID)
2901*53ee8cc1Swenshuai.xi     {
2902*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_0:
2903*53ee8cc1Swenshuai.xi     {
2904*53ee8cc1Swenshuai.xi #if ENABLE_3D_LR_MODE
2905*53ee8cc1Swenshuai.xi         HAL_MVOP_Enable3DLR(DISABLE);
2906*53ee8cc1Swenshuai.xi #endif
2907*53ee8cc1Swenshuai.xi #if SUPPORT_3DLR_ALT_SBS
2908*53ee8cc1Swenshuai.xi         HAL_MVOP_Set3DLRAltOutput(DISABLE);
2909*53ee8cc1Swenshuai.xi         HAL_MVOP_Set3DLRAltSBSOutput(DISABLE);
2910*53ee8cc1Swenshuai.xi #endif
2911*53ee8cc1Swenshuai.xi 
2912*53ee8cc1Swenshuai.xi         /*****************************************************/
2913*53ee8cc1Swenshuai.xi         // Reset MVOP setting
2914*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_TST_IMG, 0x40); //reset test pattern or BG
2915*53ee8cc1Swenshuai.xi         HAL_MVOP_Set3DLRAltOutput_VHalfScaling(DISABLE); //reset to default: disable 3D L/R alternative output.
2916*53ee8cc1Swenshuai.xi         HAL_MVOP_Set3DLR2ndCfg(DISABLE);    //reset to default: disable 3D L/R 2nd pitch.
2917*53ee8cc1Swenshuai.xi         HAL_MVOP_SetRgbFormat(E_MVOP_RGB_NONE); //reset rgb format
2918*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_CTRL1, 0, VOP_MVD_VS_MD); //default use original vsync
2919*53ee8cc1Swenshuai.xi         // Only for Monaco: Enable deciding bot by top address + 2
2920*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_MIRROR_CFG, 1, VOP_FIELD_FROM_ADDR);
2921*53ee8cc1Swenshuai.xi         // Reset Mono mode
2922*53ee8cc1Swenshuai.xi         HAL_MVOP_SetMonoMode(FALSE);
2923*53ee8cc1Swenshuai.xi 
2924*53ee8cc1Swenshuai.xi         //set MVOP test pattern to black
2925*53ee8cc1Swenshuai.xi         HAL_MVOP_SetBlackBG();
2926*53ee8cc1Swenshuai.xi 
2927*53ee8cc1Swenshuai.xi         // clear extend strip len bit by default
2928*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
2929*53ee8cc1Swenshuai.xi 
2930*53ee8cc1Swenshuai.xi         // set mvop to 128bit_i128 interface
2931*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_MIU_IF, VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
2932*53ee8cc1Swenshuai.xi 
2933*53ee8cc1Swenshuai.xi         // Disable H264 or RM Input
2934*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_INPUT_SWITCH1, 0, BIT2|BIT3);
2935*53ee8cc1Swenshuai.xi         // Clear 422 Flag
2936*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bIs422 = 0;
2937*53ee8cc1Swenshuai.xi         // Clear evd Flag for interlace mode setting
2938*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bIsH265 = 0;
2939*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_INT_TYPE, 0, VOP_EVD_INT_SEP);
2940*53ee8cc1Swenshuai.xi         //8*32 tile format
2941*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_WR, 0, BIT1);
2942*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_MIRROR_CFG_HI, 0, VOP_REF_SELF_FLD);
2943*53ee8cc1Swenshuai.xi         HAL_MVOP_SetFieldInverse(ENABLE, ENABLE);
2944*53ee8cc1Swenshuai.xi         // EVD mode disable
2945*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_INPUT_SWITCH0, 0, EVD_ENABLE);
2946*53ee8cc1Swenshuai.xi         // EVD 10 bits disable
2947*53ee8cc1Swenshuai.xi         //HAL_WriteByteMask(VOP_REG_MASK, BIT1, VOP_LSB_REQ_MASK);
2948*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_EVD_10B_EN, 0, VOP_EVD_10B_Y_EN);
2949*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_EVD_10B_EN, 0, VOP_EVD_10B_UV_EN);
2950*53ee8cc1Swenshuai.xi         // Enable 420 BW Saving mode
2951*53ee8cc1Swenshuai.xi         HAL_MVOP_Set420BWSaveMode(TRUE);
2952*53ee8cc1Swenshuai.xi         // Disable New Vsync Mode
2953*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bNewVSyncMode = FALSE;
2954*53ee8cc1Swenshuai.xi         // VP9 MODE disable
2955*53ee8cc1Swenshuai.xi         //HAL_WriteRegBit(VOP_INPUT_SWITCH0, 0, VOP_R2_WISHBONE);
2956*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_MPG_JPG_SWITCH, 0, VOP_DRAM_RD_MODE);
2957*53ee8cc1Swenshuai.xi         // Disable 2p mode
2958*53ee8cc1Swenshuai.xi         HAL_MVOP_SetEnable4k2k2P(FALSE);
2959*53ee8cc1Swenshuai.xi         // Setting MF burst len
2960*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_REG_MFDEC_0_L, 0x70, VOP_MF1_BURST|VOP_MF0_BURST|VOP_MFDEC_EN);
2961*53ee8cc1Swenshuai.xi         // Only for monaco: Disable mfdec setting from wb
2962*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_MFDEC_2_L, 0, VOP_MF_FROM_WB);
2963*53ee8cc1Swenshuai.xi         // MIU select from WB
2964*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(VOP_INFO_FROM_CODEC_H, 0x30, VOP_INFO_FROM_CODEC_MIU_BUF0_SEL|VOP_INFO_FROM_CODEC_MIU_BUF1_SEL);
2965*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_UV_SHIFT, 0, VOP_GCLK_MIU_ON);// yc seperate can not enable(1: saving power)
2966*53ee8cc1Swenshuai.xi         // All codec use WISHBONE(R2) interface in manhathan
2967*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_INPUT_SWITCH0, 1, VOP_R2_WISHBONE);
2968*53ee8cc1Swenshuai.xi         // MUJI default not support 10 bits display
2969*53ee8cc1Swenshuai.xi         // Disable 10 bits from codec
2970*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_INFO_FROM_CODEC_H, 0, VOP_INFO_FROM_CODEC_10BIT);
2971*53ee8cc1Swenshuai.xi         HAL_MVOP_SetHandShakeMode(E_MVOP_DEV_0, DISABLE, 25);
2972*53ee8cc1Swenshuai.xi         HAL_MVOP_SetStartX(E_MVOP_DEV_0, 0);
2973*53ee8cc1Swenshuai.xi         HAL_MVOP_SetStartY(E_MVOP_DEV_0, 0, 0);
2974*53ee8cc1Swenshuai.xi         HAL_MVOP_SetPicWidthMinus(E_MVOP_DEV_0, 0, 0);
2975*53ee8cc1Swenshuai.xi         HAL_MVOP_SetPicHeightMinus(E_MVOP_DEV_0, 0, 0);
2976*53ee8cc1Swenshuai.xi         //HAL_WriteRegBit(VOP_REG_MRQ, 1, VOP_MRQ_EN); //Manhathan only: merge mvop0/1 miu client
2977*53ee8cc1Swenshuai.xi         //HAL_SetSCFEMIUIPSel(NULL);
2978*53ee8cc1Swenshuai.xi 		g_pHalMVOPCtx->eRepeatField = E_MVOP_RPTFLD_NONE;
2979*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_DUMMY, 0, VOP_32x32_WB);
2980*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->eInterlaceType = E_MVOP_PRO;
2981*53ee8cc1Swenshuai.xi         //Disable DV vision
2982*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bIs265DV = 0;
2983*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_4K2K_2P, 0, VOP_TRIG_REFER_VB_END);
2984*53ee8cc1Swenshuai.xi #if SUPPORT_FILED_DB // t/b signal 30 lines forwarding
2985*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_MIRROR_CFG_HI, 1, VOP_DC2MVD_FLD_SEL);
2986*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_BW_THD_H, 0, REG_MVD_FLD_SEL);
2987*53ee8cc1Swenshuai.xi 
2988*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_TF_STR_MVD    ), 0);
2989*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_TF_STR_MVD + 1), 0);
2990*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_BF_STR_MVD    ), 0);
2991*53ee8cc1Swenshuai.xi         HAL_WriteByte((VOP_BF_STR_MVD + 1), 0);
2992*53ee8cc1Swenshuai.xi #endif
2993*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_REG_DUMMY_5D_L, 0, XC_RESET_HCOUNT); //disable hw patch for kano gop, only enable at xc gen  timing+de mode
2994*53ee8cc1Swenshuai.xi         //set for miu 16+16 in hsk mode
2995*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_LSB_DMA0, 0x10);
2996*53ee8cc1Swenshuai.xi         HAL_WriteByte(VOP_LSB_DMA1, 0x07);
2997*53ee8cc1Swenshuai.xi         HAL_MVOP_LoadReg();
2998*53ee8cc1Swenshuai.xi         /*****************************************************/
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 #if ENABLE_3D_LR_MODE
3005*53ee8cc1Swenshuai.xi         HAL_MVOP_SubEnable3DLR(DISABLE);
3006*53ee8cc1Swenshuai.xi #endif
3007*53ee8cc1Swenshuai.xi #if SUPPORT_3DLR_ALT_SBS
3008*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSet3DLRAltOutput(DISABLE);
3009*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSet3DLRAltSBSOutput(DISABLE);
3010*53ee8cc1Swenshuai.xi #endif
3011*53ee8cc1Swenshuai.xi         HAL_MVOP_SubEnableMVDInterface(FALSE);
3012*53ee8cc1Swenshuai.xi 
3013*53ee8cc1Swenshuai.xi         /*****************************************************/
3014*53ee8cc1Swenshuai.xi         // Reset MVOP setting
3015*53ee8cc1Swenshuai.xi         //Reset share mem
3016*53ee8cc1Swenshuai.xi         _HAL_MVOP_SubInitVarCtx();
3017*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_TST_IMG), 0x40);
3018*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetRgbFormat(E_MVOP_RGB_NONE);
3019*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_CTRL1), 0, VOP_MVD_VS_MD); //default use original vsync
3020*53ee8cc1Swenshuai.xi         // Only for Monaco: Enable deciding bot by top address + 2
3021*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), 1, VOP_FIELD_FROM_ADDR);
3022*53ee8cc1Swenshuai.xi         // Reset Mono mode
3023*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetMonoMode(FALSE);
3024*53ee8cc1Swenshuai.xi 
3025*53ee8cc1Swenshuai.xi         //set MVOP test pattern to black
3026*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetBlackBG();
3027*53ee8cc1Swenshuai.xi 
3028*53ee8cc1Swenshuai.xi         // clear extend strip len bit by default
3029*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_STRIP_ALIGN), 0, BIT0);
3030*53ee8cc1Swenshuai.xi 
3031*53ee8cc1Swenshuai.xi         // set mvop to 128bit_i128 interface
3032*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_MIU_IF), VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
3033*53ee8cc1Swenshuai.xi 
3034*53ee8cc1Swenshuai.xi         // Disable H264 or RM Input
3035*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH1), 0, BIT2|BIT3);
3036*53ee8cc1Swenshuai.xi         // Clear 422 Flag
3037*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubIs422 = 0;
3038*53ee8cc1Swenshuai.xi         // Clear evd Flag for interlace mode setting
3039*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubIsH265 = 0;
3040*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INT_TYPE), 0, VOP_EVD_INT_SEP);
3041*53ee8cc1Swenshuai.xi         //8*32 tile format
3042*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 0, BIT1);
3043*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG_HI), 0, VOP_REF_SELF_FLD);
3044*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetFieldInverse(ENABLE, ENABLE);
3045*53ee8cc1Swenshuai.xi         // EVD mode disable
3046*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 0, EVD_ENABLE);
3047*53ee8cc1Swenshuai.xi         // EVD 10 bits
3048*53ee8cc1Swenshuai.xi         //HAL_WriteByteMask(SUB_REG(VOP_REG_MASK), BIT1, VOP_LSB_REQ_MASK);
3049*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_EVD_10B_EN), 0, VOP_EVD_10B_Y_EN);
3050*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_EVD_10B_EN), 0, VOP_EVD_10B_UV_EN);
3051*53ee8cc1Swenshuai.xi         // Enable 420 BW Saving mode
3052*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSet420BWSaveMode(TRUE);
3053*53ee8cc1Swenshuai.xi         // VP9 MODE disable
3054*53ee8cc1Swenshuai.xi         //HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 0, VOP_R2_WISHBONE);
3055*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_MPG_JPG_SWITCH), 0, VOP_DRAM_RD_MODE);
3056*53ee8cc1Swenshuai.xi         // Disable 2p mode
3057*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetEnable4k2k2P(FALSE);
3058*53ee8cc1Swenshuai.xi         // Disable New Vsync Mode
3059*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubNewVSyncMode = FALSE;
3060*53ee8cc1Swenshuai.xi         // Sub mvop ds idx from DIU
3061*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INFO_FROM_CODEC_H), 1, VOP_INFO_FROM_CODEC_DS_IDX);
3062*53ee8cc1Swenshuai.xi         // Setting MF burst len
3063*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_REG_MFDEC_0_L), 0x70, VOP_MF1_BURST|VOP_MF0_BURST|VOP_MFDEC_EN);
3064*53ee8cc1Swenshuai.xi         // Only for monaco: Disable mfdec setting from wb
3065*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_MFDEC_2_L), 0, VOP_MF_FROM_WB);
3066*53ee8cc1Swenshuai.xi         // MIU select from WB
3067*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);
3068*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_UV_SHIFT), 0, VOP_GCLK_MIU_ON);// yc seperate can not enable(1: saving power)
3069*53ee8cc1Swenshuai.xi         // All codec use WISHBONE(R2) interface in manhathan
3070*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 1, VOP_R2_WISHBONE);
3071*53ee8cc1Swenshuai.xi         // MUJI default not support 10 bits display
3072*53ee8cc1Swenshuai.xi         // Disable 10 bits from codec
3073*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INFO_FROM_CODEC_H), 0, VOP_INFO_FROM_CODEC_10BIT);
3074*53ee8cc1Swenshuai.xi         HAL_MVOP_SetHandShakeMode(E_MVOP_DEV_1, DISABLE, 25);
3075*53ee8cc1Swenshuai.xi         HAL_MVOP_SetStartX(E_MVOP_DEV_1, 0);
3076*53ee8cc1Swenshuai.xi         HAL_MVOP_SetStartY(E_MVOP_DEV_1, 0, 0);
3077*53ee8cc1Swenshuai.xi         HAL_MVOP_SetPicWidthMinus(E_MVOP_DEV_1, 0, 0);
3078*53ee8cc1Swenshuai.xi         HAL_MVOP_SetPicHeightMinus(E_MVOP_DEV_1, 0, 0);
3079*53ee8cc1Swenshuai.xi         //HAL_WriteRegBit(SUB_REG(VOP_REG_MRQ), 1, VOP_MRQ_EN); //Manhathan only: merge mvop0/1 miu client
3080*53ee8cc1Swenshuai.xi         //HAL_SetSCFEMIUIPSel(NULL);
3081*53ee8cc1Swenshuai.xi 		g_pHalMVOPCtx->eSubRepeatField = E_MVOP_RPTFLD_NONE;
3082*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_DUMMY), 0, VOP_32x32_WB);
3083*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->eSubInterlaceType = E_MVOP_PRO;
3084*53ee8cc1Swenshuai.xi #if SUPPORT_FILED_DB // t/b signal 30 lines forwarding
3085*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG_HI), 1, VOP_DC2MVD_FLD_SEL);
3086*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_BW_THD_H), 0, REG_MVD_FLD_SEL);
3087*53ee8cc1Swenshuai.xi 
3088*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_TF_STR_MVD    ), 0);
3089*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_TF_STR_MVD + 1), 0);
3090*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_BF_STR_MVD    ), 0);
3091*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_BF_STR_MVD + 1), 0);
3092*53ee8cc1Swenshuai.xi #endif
3093*53ee8cc1Swenshuai.xi 
3094*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_DUMMY_5D_L), 0, XC_RESET_HCOUNT); //disable hw patch for kano gop, only enable at xc gen  timing+de mode
3095*53ee8cc1Swenshuai.xi         //set for miu 16+16 in hsk mode
3096*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_DMA0), 0x10);
3097*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_DMA1), 0x07);
3098*53ee8cc1Swenshuai.xi         HAL_MVOP_SubLoadReg();
3099*53ee8cc1Swenshuai.xi         /*****************************************************/
3100*53ee8cc1Swenshuai.xi         break;
3101*53ee8cc1Swenshuai.xi     }
3102*53ee8cc1Swenshuai.xi #endif
3103*53ee8cc1Swenshuai.xi     default:
3104*53ee8cc1Swenshuai.xi         MVOP_PRINTF("[%s] Input Device ID is Error!\n",__FUNCTION__);
3105*53ee8cc1Swenshuai.xi         break;
3106*53ee8cc1Swenshuai.xi     }
3107*53ee8cc1Swenshuai.xi }
3108*53ee8cc1Swenshuai.xi 
3109*53ee8cc1Swenshuai.xi /******************************************************************************/
3110*53ee8cc1Swenshuai.xi /// Set MVOP Handshake Mode, XC should be synchronous with MVOP.
3111*53ee8cc1Swenshuai.xi /// this command should be before mvop enable.(before 1st frame)
3112*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SetHandShakeMode(MVOP_DevID eID,MS_BOOL bEnable,MS_U8 u8Framerate)3113*53ee8cc1Swenshuai.xi void HAL_MVOP_SetHandShakeMode(MVOP_DevID eID, MS_BOOL bEnable, MS_U8 u8Framerate)
3114*53ee8cc1Swenshuai.xi {
3115*53ee8cc1Swenshuai.xi #if 0 //remove patch
3116*53ee8cc1Swenshuai.xi     MS_U8 u8FrmDur = 40;
3117*53ee8cc1Swenshuai.xi     MS_BOOL bMCU = FALSE;
3118*53ee8cc1Swenshuai.xi 
3119*53ee8cc1Swenshuai.xi     if(u8Framerate != 0)
3120*53ee8cc1Swenshuai.xi     {
3121*53ee8cc1Swenshuai.xi         u8FrmDur = 1000/u8Framerate; //time of one frame(ms).
3122*53ee8cc1Swenshuai.xi     }
3123*53ee8cc1Swenshuai.xi #endif
3124*53ee8cc1Swenshuai.xi     switch(eID)
3125*53ee8cc1Swenshuai.xi     {
3126*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
3127*53ee8cc1Swenshuai.xi         {
3128*53ee8cc1Swenshuai.xi             if(!((bEnable == FALSE) && (g_pHalMVOPCtx->bIsHS == FALSE)) && !(g_pHalMVOPCtx->bIs265DV)) //prevent switch VOP_CTRL0 (mvop enable), for MHEG5 verify
3129*53ee8cc1Swenshuai.xi             {
3130*53ee8cc1Swenshuai.xi 
3131*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_CTRL0, 0, BIT0);
3132*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->bIsHS = bEnable;
3133*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_REG_HS_OUTPUT, bEnable, VOP_HS_MODE);
3134*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_REG_HS_OUTPUT, bEnable, BIT2);//reg_vsync_from_sc
3135*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_REG_HS_OUTPUT, bEnable, BIT1);//reg_vsync_from_sc
3136*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_CTRL0, bEnable, BIT4);
3137*53ee8cc1Swenshuai.xi 
3138*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_MIRROR_CFG_HI, bEnable, VOP_HK_MASK); //bk background
3139*53ee8cc1Swenshuai.xi                 if(!g_pHalMVOPCtx->bIs2p)
3140*53ee8cc1Swenshuai.xi                     HAL_MVOP_SetEnable4k2k2P(bEnable);
3141*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(VOP_CTRL0, 1, BIT0);
3142*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->bIsXcTrig = TRUE;
3143*53ee8cc1Swenshuai.xi                 HAL_MVOP_LoadReg();
3144*53ee8cc1Swenshuai.xi             }
3145*53ee8cc1Swenshuai.xi             break;
3146*53ee8cc1Swenshuai.xi         }
3147*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
3148*53ee8cc1Swenshuai.xi         {
3149*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3150*53ee8cc1Swenshuai.xi             if(!((bEnable == FALSE) && (g_pHalMVOPCtx->bSubIsHS == FALSE)) && !(g_pHalMVOPCtx->bIs265DV)) //prevent switch VOP_CTRL0 (mvop enable), for MHEG5 verify
3151*53ee8cc1Swenshuai.xi             {
3152*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_CTRL0), 0, BIT0);
3153*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->bSubIsHS = bEnable;
3154*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_REG_HS_OUTPUT), bEnable, VOP_HS_MODE);
3155*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_REG_HS_OUTPUT), bEnable, BIT2);//reg_vsync_from_sc
3156*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_REG_HS_OUTPUT), bEnable, BIT1);//reg_vsync_from_sc
3157*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_CTRL0), bEnable, BIT4);
3158*53ee8cc1Swenshuai.xi 
3159*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG_HI), bEnable, VOP_HK_MASK); //bk background
3160*53ee8cc1Swenshuai.xi                 if(!g_pHalMVOPCtx->bSubIs2p)
3161*53ee8cc1Swenshuai.xi                     HAL_MVOP_SubSetEnable4k2k2P(bEnable);
3162*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_CTRL0), 1, BIT0);
3163*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->bSubIsXcTrig = TRUE;
3164*53ee8cc1Swenshuai.xi                 HAL_MVOP_SubLoadReg();
3165*53ee8cc1Swenshuai.xi             }
3166*53ee8cc1Swenshuai.xi #endif
3167*53ee8cc1Swenshuai.xi             break;
3168*53ee8cc1Swenshuai.xi         }
3169*53ee8cc1Swenshuai.xi         default:
3170*53ee8cc1Swenshuai.xi             MVOP_PRINTF("[Warning] MVOP_DevID not support!\n");
3171*53ee8cc1Swenshuai.xi             break;
3172*53ee8cc1Swenshuai.xi     }
3173*53ee8cc1Swenshuai.xi }
3174*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetCropforXC(MVOP_DevID eID,MVOP_XCGetCrop * stXCCrop,MS_U16 u16Width,MS_U16 u16Height)3175*53ee8cc1Swenshuai.xi void HAL_MVOP_SetCropforXC(MVOP_DevID eID, MVOP_XCGetCrop* stXCCrop, MS_U16 u16Width, MS_U16 u16Height)
3176*53ee8cc1Swenshuai.xi {
3177*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__,
3178*53ee8cc1Swenshuai.xi         stXCCrop->u16XStart, stXCCrop->>u16YStart, stXCCrop->>u16XSize, stXCCrop->u16YSize, u16Width, u16Height);)
3179*53ee8cc1Swenshuai.xi 
3180*53ee8cc1Swenshuai.xi     switch(eID)
3181*53ee8cc1Swenshuai.xi     {
3182*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
3183*53ee8cc1Swenshuai.xi         {
3184*53ee8cc1Swenshuai.xi             if(g_pHalMVOPCtx->u16CropXSize == 0)
3185*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->u16CropXSize = u16Width;
3186*53ee8cc1Swenshuai.xi 
3187*53ee8cc1Swenshuai.xi             if((stXCCrop->u16XStart + stXCCrop->u16XSize) > u16Width)
3188*53ee8cc1Swenshuai.xi             {
3189*53ee8cc1Swenshuai.xi                 MVOP_PRINTF("[Warning] crop x size or start out of boundary.");
3190*53ee8cc1Swenshuai.xi                 return;
3191*53ee8cc1Swenshuai.xi             }
3192*53ee8cc1Swenshuai.xi 
3193*53ee8cc1Swenshuai.xi             if(g_pHalMVOPCtx->u16CropYSize == 0)
3194*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->u16CropYSize = u16Height;
3195*53ee8cc1Swenshuai.xi 
3196*53ee8cc1Swenshuai.xi             if((stXCCrop->u16YStart + stXCCrop->u16YSize) > u16Height)
3197*53ee8cc1Swenshuai.xi             {
3198*53ee8cc1Swenshuai.xi                 MVOP_PRINTF("[Warning] crop y size or start out of boundary.");
3199*53ee8cc1Swenshuai.xi                 return;
3200*53ee8cc1Swenshuai.xi             }
3201*53ee8cc1Swenshuai.xi 
3202*53ee8cc1Swenshuai.xi             stXCCrop->u16XStart = ALIGN_UPTO_2(stXCCrop->u16XStart);
3203*53ee8cc1Swenshuai.xi             stXCCrop->u16XSize = ALIGN_UPTO_2(stXCCrop->u16XSize);
3204*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropXStart = stXCCrop->u16XStart;
3205*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropXSize = stXCCrop->u16XSize;
3206*53ee8cc1Swenshuai.xi 
3207*53ee8cc1Swenshuai.xi #if 0 //sw patch, for monet/manhattan: maserati fix
3208*53ee8cc1Swenshuai.xi             if((stXCCrop->u16YSize <= 512) && (stXCCrop->u16YStart == 0) && (g_pHalMVOPCtx->bMirrorModeVer == TRUE))
3209*53ee8cc1Swenshuai.xi             {
3210*53ee8cc1Swenshuai.xi                 MVOP_PRINTF("[MVOP][Dbg] crop + mirror patch\n");
3211*53ee8cc1Swenshuai.xi                 stXCCrop->u16YStart = 1;
3212*53ee8cc1Swenshuai.xi                 stXCCrop->u16YStart = stXCCrop->u16YStart | 0x2000;
3213*53ee8cc1Swenshuai.xi 
3214*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->u16CropYSize = stXCCrop->u16YSize;
3215*53ee8cc1Swenshuai.xi                 if(g_pHalMVOPCtx->bIsH265 == FALSE)
3216*53ee8cc1Swenshuai.xi                 {
3217*53ee8cc1Swenshuai.xi                     stXCCrop->u16YSize -= 1;
3218*53ee8cc1Swenshuai.xi                 }
3219*53ee8cc1Swenshuai.xi             }
3220*53ee8cc1Swenshuai.xi             else
3221*53ee8cc1Swenshuai.xi #endif
3222*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropYStart = stXCCrop->u16YStart;
3223*53ee8cc1Swenshuai.xi             //from maserati
3224*53ee8cc1Swenshuai.xi             if(g_pHalMVOPCtx->bMirrorModeVer == TRUE)
3225*53ee8cc1Swenshuai.xi             {
3226*53ee8cc1Swenshuai.xi                 stXCCrop->u16YStart |= 0x2000;
3227*53ee8cc1Swenshuai.xi             }
3228*53ee8cc1Swenshuai.xi             if(stXCCrop->u16YStart == 0)
3229*53ee8cc1Swenshuai.xi             {
3230*53ee8cc1Swenshuai.xi                 stXCCrop->u16YStart |= 0x4000;
3231*53ee8cc1Swenshuai.xi             }
3232*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16CropYSize = stXCCrop->u16YSize;
3233*53ee8cc1Swenshuai.xi 
3234*53ee8cc1Swenshuai.xi             break;
3235*53ee8cc1Swenshuai.xi         }
3236*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
3237*53ee8cc1Swenshuai.xi         {
3238*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3239*53ee8cc1Swenshuai.xi             if(g_pHalMVOPCtx->u16SubCropXSize == 0)
3240*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->u16SubCropXSize = u16Width;
3241*53ee8cc1Swenshuai.xi 
3242*53ee8cc1Swenshuai.xi             if((stXCCrop->u16XStart + stXCCrop->u16XSize) > u16Width)
3243*53ee8cc1Swenshuai.xi             {
3244*53ee8cc1Swenshuai.xi                 MVOP_PRINTF("[Warning] crop x size or start out of boundary.");
3245*53ee8cc1Swenshuai.xi                 return;
3246*53ee8cc1Swenshuai.xi             }
3247*53ee8cc1Swenshuai.xi 
3248*53ee8cc1Swenshuai.xi             if(g_pHalMVOPCtx->u16SubCropYSize == 0)
3249*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->u16SubCropYSize = u16Height;
3250*53ee8cc1Swenshuai.xi 
3251*53ee8cc1Swenshuai.xi             if((stXCCrop->u16YStart + stXCCrop->u16YSize) > u16Height)
3252*53ee8cc1Swenshuai.xi             {
3253*53ee8cc1Swenshuai.xi                 MVOP_PRINTF("[Warning] crop y size or start out of boundary.");
3254*53ee8cc1Swenshuai.xi                 return;
3255*53ee8cc1Swenshuai.xi             }
3256*53ee8cc1Swenshuai.xi 
3257*53ee8cc1Swenshuai.xi             stXCCrop->u16XStart = ALIGN_UPTO_2(stXCCrop->u16XStart);
3258*53ee8cc1Swenshuai.xi             stXCCrop->u16XSize = ALIGN_UPTO_2(stXCCrop->u16XSize);
3259*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropXStart = stXCCrop->u16XStart;
3260*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropXSize = stXCCrop->u16XSize;
3261*53ee8cc1Swenshuai.xi 
3262*53ee8cc1Swenshuai.xi #if 0 //sw patch, for monet/manhattan: maserati fix
3263*53ee8cc1Swenshuai.xi             if((stXCCrop->u16YSize <= 512) && (stXCCrop->u16YStart == 0) && (g_pHalMVOPCtx->bSubMirrorModeVer == TRUE))
3264*53ee8cc1Swenshuai.xi             {
3265*53ee8cc1Swenshuai.xi                 MVOP_PRINTF("[MVOP][Dbg] crop + mirror patch\n");
3266*53ee8cc1Swenshuai.xi                 stXCCrop->u16YStart = 1;
3267*53ee8cc1Swenshuai.xi                 stXCCrop->u16YStart = stXCCrop->u16YStart | 0x2000;
3268*53ee8cc1Swenshuai.xi 
3269*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->u16SubCropYSize = stXCCrop->u16YSize;
3270*53ee8cc1Swenshuai.xi                 if(g_pHalMVOPCtx->bSubIsH265 == FALSE)
3271*53ee8cc1Swenshuai.xi                 {
3272*53ee8cc1Swenshuai.xi                     stXCCrop->u16YSize -= 1;
3273*53ee8cc1Swenshuai.xi                 }
3274*53ee8cc1Swenshuai.xi             }
3275*53ee8cc1Swenshuai.xi             else
3276*53ee8cc1Swenshuai.xi #endif
3277*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropYStart = stXCCrop->u16YStart;
3278*53ee8cc1Swenshuai.xi             //from maserati
3279*53ee8cc1Swenshuai.xi             if(g_pHalMVOPCtx->bSubMirrorModeVer == TRUE)
3280*53ee8cc1Swenshuai.xi             {
3281*53ee8cc1Swenshuai.xi                 stXCCrop->u16YStart |= 0x2000;
3282*53ee8cc1Swenshuai.xi             }
3283*53ee8cc1Swenshuai.xi             if(stXCCrop->u16YStart == 0)
3284*53ee8cc1Swenshuai.xi             {
3285*53ee8cc1Swenshuai.xi                 stXCCrop->u16YStart |= 0x4000;
3286*53ee8cc1Swenshuai.xi             }
3287*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->u16SubCropYSize = stXCCrop->u16YSize;
3288*53ee8cc1Swenshuai.xi 
3289*53ee8cc1Swenshuai.xi #endif
3290*53ee8cc1Swenshuai.xi             break;
3291*53ee8cc1Swenshuai.xi         }
3292*53ee8cc1Swenshuai.xi         default:
3293*53ee8cc1Swenshuai.xi             MVOP_PRINTF("[Warning] MVOP_DevID not support!\n");
3294*53ee8cc1Swenshuai.xi             break;
3295*53ee8cc1Swenshuai.xi     }
3296*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF("[Debug][Crop to XC] xsize = %d, ysize = %d, xstart = %d, ystart=%d\n",stXCCrop->u16XSize,stXCCrop->u16YSize,stXCCrop->u16XStart,stXCCrop->u16YStart);)
3297*53ee8cc1Swenshuai.xi     return;
3298*53ee8cc1Swenshuai.xi }
3299*53ee8cc1Swenshuai.xi 
3300*53ee8cc1Swenshuai.xi 
HAL_MVOP_SupportFRCOutputFPS(MVOP_DevID eID)3301*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SupportFRCOutputFPS(MVOP_DevID eID)
3302*53ee8cc1Swenshuai.xi {
3303*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
3304*53ee8cc1Swenshuai.xi     switch(eID)
3305*53ee8cc1Swenshuai.xi     {
3306*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
3307*53ee8cc1Swenshuai.xi             bRet = TRUE;
3308*53ee8cc1Swenshuai.xi             break;
3309*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3310*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
3311*53ee8cc1Swenshuai.xi             bRet = TRUE;
3312*53ee8cc1Swenshuai.xi             break;
3313*53ee8cc1Swenshuai.xi #endif
3314*53ee8cc1Swenshuai.xi         default:
3315*53ee8cc1Swenshuai.xi             break;
3316*53ee8cc1Swenshuai.xi     }
3317*53ee8cc1Swenshuai.xi     return bRet;
3318*53ee8cc1Swenshuai.xi }
3319*53ee8cc1Swenshuai.xi 
HAL_MVOP_GetIsCurrentHSK(MVOP_DevID eID)3320*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetIsCurrentHSK(MVOP_DevID eID)
3321*53ee8cc1Swenshuai.xi {
3322*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
3323*53ee8cc1Swenshuai.xi     switch(eID)
3324*53ee8cc1Swenshuai.xi     {
3325*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
3326*53ee8cc1Swenshuai.xi             bRet = g_pHalMVOPCtx->bIsHS;
3327*53ee8cc1Swenshuai.xi             break;
3328*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
3329*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3330*53ee8cc1Swenshuai.xi             bRet = g_pHalMVOPCtx->bSubIsHS;
3331*53ee8cc1Swenshuai.xi #endif
3332*53ee8cc1Swenshuai.xi             break;
3333*53ee8cc1Swenshuai.xi         default:
3334*53ee8cc1Swenshuai.xi             bRet = E_MVOP_HS_INVALID_PARAM;
3335*53ee8cc1Swenshuai.xi             break;
3336*53ee8cc1Swenshuai.xi     }
3337*53ee8cc1Swenshuai.xi     return bRet;
3338*53ee8cc1Swenshuai.xi }
HAL_MVOP_ReadBank(MVOP_DevID eID,MS_U16 u16Length)3339*53ee8cc1Swenshuai.xi MS_U16 HAL_MVOP_ReadBank(MVOP_DevID eID ,MS_U16 u16Length)
3340*53ee8cc1Swenshuai.xi {
3341*53ee8cc1Swenshuai.xi 	MS_U16 u16Reg = 0;
3342*53ee8cc1Swenshuai.xi 	if(eID == E_MVOP_DEV_0)
3343*53ee8cc1Swenshuai.xi 	{
3344*53ee8cc1Swenshuai.xi 		u16Reg = HAL_Read2Byte(MVOP_REG_BASE + (u16Length << 1));
3345*53ee8cc1Swenshuai.xi 	}
3346*53ee8cc1Swenshuai.xi #ifdef MVOP_SUPPORT_SUB
3347*53ee8cc1Swenshuai.xi 	else if(eID == E_MVOP_DEV_1)
3348*53ee8cc1Swenshuai.xi 	{
3349*53ee8cc1Swenshuai.xi 		u16Reg = HAL_Read2Byte(SUB_REG(MVOP_REG_BASE + (u16Length << 1)));
3350*53ee8cc1Swenshuai.xi 	}
3351*53ee8cc1Swenshuai.xi #endif
3352*53ee8cc1Swenshuai.xi 	return u16Reg;
3353*53ee8cc1Swenshuai.xi }
3354*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetInterlaceType(MVOP_DevID eDevID,MS_U8 u8Interlace)3355*53ee8cc1Swenshuai.xi void HAL_MVOP_SetInterlaceType(MVOP_DevID eDevID, MS_U8 u8Interlace)
3356*53ee8cc1Swenshuai.xi {
3357*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF("%s u8Interlace = %d\n", __FUNCTION__ ,u8Interlace);)
3358*53ee8cc1Swenshuai.xi 
3359*53ee8cc1Swenshuai.xi     switch(eDevID)
3360*53ee8cc1Swenshuai.xi     {
3361*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_0:
3362*53ee8cc1Swenshuai.xi 
3363*53ee8cc1Swenshuai.xi         switch(u8Interlace)
3364*53ee8cc1Swenshuai.xi         {
3365*53ee8cc1Swenshuai.xi         case 0:
3366*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->eInterlaceType = E_MVOP_PRO;
3367*53ee8cc1Swenshuai.xi             break;
3368*53ee8cc1Swenshuai.xi         case 0x1:
3369*53ee8cc1Swenshuai.xi             if(g_pHalMVOPCtx->bIsH265)
3370*53ee8cc1Swenshuai.xi             {
3371*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->eInterlaceType = E_MVOP_INT_TB_SEP_FRAME;
3372*53ee8cc1Swenshuai.xi             }
3373*53ee8cc1Swenshuai.xi             else
3374*53ee8cc1Swenshuai.xi             {
3375*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->eInterlaceType = E_MVOP_INT_TB_ONE_FRAME;
3376*53ee8cc1Swenshuai.xi             }
3377*53ee8cc1Swenshuai.xi             break;
3378*53ee8cc1Swenshuai.xi         case 0x2:
3379*53ee8cc1Swenshuai.xi             if(g_pHalMVOPCtx->bIsH265)
3380*53ee8cc1Swenshuai.xi             {
3381*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->eInterlaceType = E_MVOP_INT_TB_ONE_FRAME;
3382*53ee8cc1Swenshuai.xi             }
3383*53ee8cc1Swenshuai.xi             else
3384*53ee8cc1Swenshuai.xi             {
3385*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->eInterlaceType = E_MVOP_INT_TB_SEP_FRAME;
3386*53ee8cc1Swenshuai.xi             }
3387*53ee8cc1Swenshuai.xi             break;
3388*53ee8cc1Swenshuai.xi         default:
3389*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->eInterlaceType = E_MVOP_PRO;
3390*53ee8cc1Swenshuai.xi             break;
3391*53ee8cc1Swenshuai.xi         }
3392*53ee8cc1Swenshuai.xi 
3393*53ee8cc1Swenshuai.xi         if((g_pHalMVOPCtx->eInterlaceType == E_MVOP_INT_TB_SEP_FRAME) && (g_pHalMVOPCtx->bIsH265))
3394*53ee8cc1Swenshuai.xi         {
3395*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_INT_TYPE, 1, VOP_EVD_INT_SEP);
3396*53ee8cc1Swenshuai.xi         }
3397*53ee8cc1Swenshuai.xi 		else if((g_pHalMVOPCtx->eInterlaceType == E_MVOP_INT_TB_ONE_FRAME) && (g_pHalMVOPCtx->bIsH265))
3398*53ee8cc1Swenshuai.xi 		{
3399*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_INT_TYPE, 0, VOP_EVD_INT_SEP);
3400*53ee8cc1Swenshuai.xi 			HAL_WriteRegBit(VOP_MIRROR_CFG, 0, VOP_FIELD_FROM_ADDR);
3401*53ee8cc1Swenshuai.xi         }
3402*53ee8cc1Swenshuai.xi 		HAL_MVOP_LoadReg();
3403*53ee8cc1Swenshuai.xi         break;
3404*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3405*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_1:
3406*53ee8cc1Swenshuai.xi 
3407*53ee8cc1Swenshuai.xi         switch(u8Interlace)
3408*53ee8cc1Swenshuai.xi         {
3409*53ee8cc1Swenshuai.xi         case 0:
3410*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->eSubInterlaceType = E_MVOP_PRO;
3411*53ee8cc1Swenshuai.xi             break;
3412*53ee8cc1Swenshuai.xi         case 0x1:
3413*53ee8cc1Swenshuai.xi             if(g_pHalMVOPCtx->bSubIsH265)
3414*53ee8cc1Swenshuai.xi             {
3415*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->eSubInterlaceType = E_MVOP_INT_TB_SEP_FRAME;
3416*53ee8cc1Swenshuai.xi             }
3417*53ee8cc1Swenshuai.xi             else
3418*53ee8cc1Swenshuai.xi             {
3419*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->eSubInterlaceType = E_MVOP_INT_TB_ONE_FRAME;
3420*53ee8cc1Swenshuai.xi             }
3421*53ee8cc1Swenshuai.xi             break;
3422*53ee8cc1Swenshuai.xi         case 0x2:
3423*53ee8cc1Swenshuai.xi             if(g_pHalMVOPCtx->bSubIsH265)
3424*53ee8cc1Swenshuai.xi             {
3425*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->eSubInterlaceType = E_MVOP_INT_TB_ONE_FRAME;
3426*53ee8cc1Swenshuai.xi             }
3427*53ee8cc1Swenshuai.xi             else
3428*53ee8cc1Swenshuai.xi             {
3429*53ee8cc1Swenshuai.xi                 g_pHalMVOPCtx->eSubInterlaceType = E_MVOP_INT_TB_SEP_FRAME;
3430*53ee8cc1Swenshuai.xi             }
3431*53ee8cc1Swenshuai.xi             break;
3432*53ee8cc1Swenshuai.xi         default:
3433*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->eSubInterlaceType = E_MVOP_PRO;
3434*53ee8cc1Swenshuai.xi             break;
3435*53ee8cc1Swenshuai.xi         }
3436*53ee8cc1Swenshuai.xi 
3437*53ee8cc1Swenshuai.xi         if((g_pHalMVOPCtx->eSubInterlaceType == E_MVOP_INT_TB_SEP_FRAME) && (g_pHalMVOPCtx->bSubIsH265))
3438*53ee8cc1Swenshuai.xi         {
3439*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(SUB_REG(VOP_INT_TYPE), 1, VOP_EVD_INT_SEP);
3440*53ee8cc1Swenshuai.xi         }
3441*53ee8cc1Swenshuai.xi 		else if((g_pHalMVOPCtx->eSubInterlaceType == E_MVOP_INT_TB_ONE_FRAME) && (g_pHalMVOPCtx->bSubIsH265))
3442*53ee8cc1Swenshuai.xi 		{
3443*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(SUB_REG(VOP_INT_TYPE), 0, VOP_EVD_INT_SEP);
3444*53ee8cc1Swenshuai.xi 			HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), 0, VOP_FIELD_FROM_ADDR);
3445*53ee8cc1Swenshuai.xi         }
3446*53ee8cc1Swenshuai.xi 		HAL_MVOP_SubLoadReg();
3447*53ee8cc1Swenshuai.xi         break;
3448*53ee8cc1Swenshuai.xi #endif
3449*53ee8cc1Swenshuai.xi     default:
3450*53ee8cc1Swenshuai.xi         MVOP_PRINTF("[Warning][%s] MVOP_DevID not support\n",__FUNCTION__);
3451*53ee8cc1Swenshuai.xi         break;
3452*53ee8cc1Swenshuai.xi     }
3453*53ee8cc1Swenshuai.xi }
3454*53ee8cc1Swenshuai.xi 
3455*53ee8cc1Swenshuai.xi #ifdef UFO_MVOP_GET_IS_XC_GEN_TIMING
HAL_MVOP_GetIsCurrentXCGenTiming(MVOP_DevID eID)3456*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetIsCurrentXCGenTiming(MVOP_DevID eID)
3457*53ee8cc1Swenshuai.xi {
3458*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
3459*53ee8cc1Swenshuai.xi     switch(eID)
3460*53ee8cc1Swenshuai.xi     {
3461*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
3462*53ee8cc1Swenshuai.xi             bRet = g_pHalMVOPCtx->bIsXcTrig;
3463*53ee8cc1Swenshuai.xi             break;
3464*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
3465*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3466*53ee8cc1Swenshuai.xi             bRet = g_pHalMVOPCtx->bSubIsXcTrig;
3467*53ee8cc1Swenshuai.xi #endif
3468*53ee8cc1Swenshuai.xi             break;
3469*53ee8cc1Swenshuai.xi         default:
3470*53ee8cc1Swenshuai.xi             bRet = E_MVOP_HS_INVALID_PARAM;
3471*53ee8cc1Swenshuai.xi             break;
3472*53ee8cc1Swenshuai.xi     }
3473*53ee8cc1Swenshuai.xi     return bRet;
3474*53ee8cc1Swenshuai.xi }
3475*53ee8cc1Swenshuai.xi #endif
3476*53ee8cc1Swenshuai.xi 
3477*53ee8cc1Swenshuai.xi #ifdef UFO_MVOP_GET_IS_MVOP_AUTO_GEN_BLACK
HAL_MVOP_GetIsMVOPSupportBLKBackground(MVOP_DevID eID)3478*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_GetIsMVOPSupportBLKBackground(MVOP_DevID eID)
3479*53ee8cc1Swenshuai.xi {
3480*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
3481*53ee8cc1Swenshuai.xi     switch(eID)
3482*53ee8cc1Swenshuai.xi     {
3483*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
3484*53ee8cc1Swenshuai.xi             bRet = TRUE;
3485*53ee8cc1Swenshuai.xi             break;
3486*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
3487*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3488*53ee8cc1Swenshuai.xi             bRet = TRUE;
3489*53ee8cc1Swenshuai.xi #endif
3490*53ee8cc1Swenshuai.xi             break;
3491*53ee8cc1Swenshuai.xi         default:
3492*53ee8cc1Swenshuai.xi             bRet = E_MVOP_HS_INVALID_PARAM;
3493*53ee8cc1Swenshuai.xi             break;
3494*53ee8cc1Swenshuai.xi     }
3495*53ee8cc1Swenshuai.xi     return bRet;
3496*53ee8cc1Swenshuai.xi }
3497*53ee8cc1Swenshuai.xi #endif
3498*53ee8cc1Swenshuai.xi 
HAL_MVOP_SetSramPower(MVOP_DevID eID,MS_BOOL bEnable)3499*53ee8cc1Swenshuai.xi void HAL_MVOP_SetSramPower(MVOP_DevID eID ,MS_BOOL bEnable)
3500*53ee8cc1Swenshuai.xi {
3501*53ee8cc1Swenshuai.xi     switch(eID)
3502*53ee8cc1Swenshuai.xi     {
3503*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_0:
3504*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3505*53ee8cc1Swenshuai.xi         if((bEnable== FALSE) && (g_pHalMVOPCtx->bSubIsEnable == FALSE)) //check sub disable -> mfdec sram disable
3506*53ee8cc1Swenshuai.xi         {
3507*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_DC_STRIP_H, 1, MFDEC_SRAM_SD_MASK);
3508*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_DC_STRIP_H, 1, VOP_SRAM_SD_MASK);
3509*53ee8cc1Swenshuai.xi         }
3510*53ee8cc1Swenshuai.xi         else
3511*53ee8cc1Swenshuai.xi         {
3512*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_DC_STRIP_H, 0, MFDEC_SRAM_SD_MASK);
3513*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_DC_STRIP_H, 0, VOP_SRAM_SD_MASK);
3514*53ee8cc1Swenshuai.xi         }
3515*53ee8cc1Swenshuai.xi #else
3516*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(VOP_DC_STRIP_H, !bEnable, VOP_SRAM_SD_MASK);
3517*53ee8cc1Swenshuai.xi #endif
3518*53ee8cc1Swenshuai.xi         break;
3519*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3520*53ee8cc1Swenshuai.xi     case E_MVOP_DEV_1:
3521*53ee8cc1Swenshuai.xi         if((bEnable== FALSE) && (g_pHalMVOPCtx->bIsEnable == FALSE))
3522*53ee8cc1Swenshuai.xi         {
3523*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_DC_STRIP_H, 1, MFDEC_SRAM_SD_MASK);
3524*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_DC_STRIP_H, 1, VOP_SRAM_SD_MASK);
3525*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(SUB_REG(VOP_DC_STRIP_H), 1, VOP_SRAM_SD_MASK);
3526*53ee8cc1Swenshuai.xi         }
3527*53ee8cc1Swenshuai.xi         else
3528*53ee8cc1Swenshuai.xi         {
3529*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_DC_STRIP_H, 0, MFDEC_SRAM_SD_MASK);
3530*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(VOP_DC_STRIP_H, 0, VOP_SRAM_SD_MASK); //main need to enable, if sub enable.
3531*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(SUB_REG(VOP_DC_STRIP_H), 0, VOP_SRAM_SD_MASK);
3532*53ee8cc1Swenshuai.xi         }
3533*53ee8cc1Swenshuai.xi         break;
3534*53ee8cc1Swenshuai.xi #endif
3535*53ee8cc1Swenshuai.xi     default:
3536*53ee8cc1Swenshuai.xi         break;
3537*53ee8cc1Swenshuai.xi     }
3538*53ee8cc1Swenshuai.xi     return;
3539*53ee8cc1Swenshuai.xi }
3540*53ee8cc1Swenshuai.xi 
3541*53ee8cc1Swenshuai.xi /******************************************************************************/
3542*53ee8cc1Swenshuai.xi /// Set MVOP Handshake Mode, XC should be synchronous with MVOP.
3543*53ee8cc1Swenshuai.xi /// this command should be before mvop enable.(before 1st frame)
3544*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SetTimingFromXC(MVOP_DevID eID,MS_BOOL bEnable)3545*53ee8cc1Swenshuai.xi void HAL_MVOP_SetTimingFromXC(MVOP_DevID eID, MS_BOOL bEnable)
3546*53ee8cc1Swenshuai.xi {
3547*53ee8cc1Swenshuai.xi     switch(eID)
3548*53ee8cc1Swenshuai.xi     {
3549*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("[MVOP] HAL_MVOP_SetTimingFromXC = %d\n",bEnable);)
3550*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_0:
3551*53ee8cc1Swenshuai.xi         {
3552*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->bIsXcTrig = bEnable;
3553*53ee8cc1Swenshuai.xi             if(bEnable)
3554*53ee8cc1Swenshuai.xi             {
3555*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(VOP_REG_HS_OUTPUT, 0x06, VOP_TRIG_FROM_XC|VOP_VSUNC_FROM_XC);
3556*53ee8cc1Swenshuai.xi                 //HAL_WriteRegBit(VOP_CTRL1, 0, BIT4); // disable inverse the field to IP - not in kano
3557*53ee8cc1Swenshuai.xi 
3558*53ee8cc1Swenshuai.xi             }
3559*53ee8cc1Swenshuai.xi             else
3560*53ee8cc1Swenshuai.xi             {
3561*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(VOP_REG_HS_OUTPUT, 0x00, VOP_TRIG_FROM_XC|VOP_VSUNC_FROM_XC);
3562*53ee8cc1Swenshuai.xi                 //HAL_WriteRegBit(VOP_CTRL1, 1, BIT4);  // inverse the field to IP - not in kano
3563*53ee8cc1Swenshuai.xi             }
3564*53ee8cc1Swenshuai.xi             HAL_MVOP_LoadReg();
3565*53ee8cc1Swenshuai.xi             break;
3566*53ee8cc1Swenshuai.xi         }
3567*53ee8cc1Swenshuai.xi         case E_MVOP_DEV_1:
3568*53ee8cc1Swenshuai.xi         {
3569*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
3570*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->bSubIsXcTrig = bEnable;
3571*53ee8cc1Swenshuai.xi             if(bEnable)
3572*53ee8cc1Swenshuai.xi             {
3573*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(SUB_REG(VOP_REG_HS_OUTPUT), 0x06, VOP_TRIG_FROM_XC|VOP_VSUNC_FROM_XC);
3574*53ee8cc1Swenshuai.xi             }
3575*53ee8cc1Swenshuai.xi             else
3576*53ee8cc1Swenshuai.xi             {
3577*53ee8cc1Swenshuai.xi                 HAL_WriteByteMask(SUB_REG(VOP_REG_HS_OUTPUT), 0x00, VOP_TRIG_FROM_XC|VOP_VSUNC_FROM_XC);
3578*53ee8cc1Swenshuai.xi             }
3579*53ee8cc1Swenshuai.xi             HAL_MVOP_SubLoadReg();
3580*53ee8cc1Swenshuai.xi #endif
3581*53ee8cc1Swenshuai.xi             break;
3582*53ee8cc1Swenshuai.xi         }
3583*53ee8cc1Swenshuai.xi         default:
3584*53ee8cc1Swenshuai.xi             MVOP_PRINTF("[Warning] MVOP_DevID not support!\n");
3585*53ee8cc1Swenshuai.xi             break;
3586*53ee8cc1Swenshuai.xi     }
3587*53ee8cc1Swenshuai.xi }
3588*53ee8cc1Swenshuai.xi 
3589*53ee8cc1Swenshuai.xi 
3590*53ee8cc1Swenshuai.xi ///////////////////////   Sub MVOP   ////////////////////////
3591*53ee8cc1Swenshuai.xi #if MVOP_SUPPORT_SUB
HAL_MVOP_SubRegSetBase(MS_VIRT u32Base)3592*53ee8cc1Swenshuai.xi void HAL_MVOP_SubRegSetBase(MS_VIRT u32Base)
3593*53ee8cc1Swenshuai.xi {
3594*53ee8cc1Swenshuai.xi     u32RiuBaseAdd = u32Base;
3595*53ee8cc1Swenshuai.xi }
3596*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubInitMirrorMode(MS_BOOL bMir)3597*53ee8cc1Swenshuai.xi void HAL_MVOP_SubInitMirrorMode(MS_BOOL bMir)
3598*53ee8cc1Swenshuai.xi {
3599*53ee8cc1Swenshuai.xi     //set bit[3:7] to support mirror mode
3600*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), bMir, VOP_MIRROR_CFG_ENABLE);
3601*53ee8cc1Swenshuai.xi }
3602*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubInit(void)3603*53ee8cc1Swenshuai.xi void HAL_MVOP_SubInit(void)
3604*53ee8cc1Swenshuai.xi {
3605*53ee8cc1Swenshuai.xi     MVOP_HalInitCtxResults eRet;
3606*53ee8cc1Swenshuai.xi     MS_BOOL pbFirstDrvInstant;
3607*53ee8cc1Swenshuai.xi 
3608*53ee8cc1Swenshuai.xi     eRet = _HAL_MVOP_InitContext(&pbFirstDrvInstant);
3609*53ee8cc1Swenshuai.xi     if(eRet == E_MVOP_INIT_FAIL)
3610*53ee8cc1Swenshuai.xi     {
3611*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("[%s] MVOP Context Init failed!\n",__FUNCTION__);)
3612*53ee8cc1Swenshuai.xi         return;
3613*53ee8cc1Swenshuai.xi     }
3614*53ee8cc1Swenshuai.xi     else if(eRet == E_MVOP_INIT_ALREADY_EXIST)
3615*53ee8cc1Swenshuai.xi     {
3616*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->bSubIsInit)
3617*53ee8cc1Swenshuai.xi         {
3618*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("[%s] Sub MVOP Context has Initialized!\n",__FUNCTION__);)
3619*53ee8cc1Swenshuai.xi             return;
3620*53ee8cc1Swenshuai.xi         }
3621*53ee8cc1Swenshuai.xi     }
3622*53ee8cc1Swenshuai.xi     HAL_MVOP_SubInitMirrorMode(TRUE);
3623*53ee8cc1Swenshuai.xi     //Enable dynamic clock gating
3624*53ee8cc1Swenshuai.xi     //Note: cannot enable VOP_GCLK_VCLK_ON, or hsync cannot be sent out.
3625*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_GCLK), VOP_GCLK_MIU_ON, VOP_GCLK_MIU_ON|VOP_GCLK_VCLK_ON);
3626*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsInit = 1;
3627*53ee8cc1Swenshuai.xi }
3628*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetVerticalMirrorMode(MS_BOOL bEnable)3629*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetVerticalMirrorMode(MS_BOOL bEnable)
3630*53ee8cc1Swenshuai.xi {
3631*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
3632*53ee8cc1Swenshuai.xi     {
3633*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
3634*53ee8cc1Swenshuai.xi         return;
3635*53ee8cc1Swenshuai.xi     }
3636*53ee8cc1Swenshuai.xi     if (VOP_MIRROR_CFG_ENABLE != HAL_ReadRegBit(SUB_REG(VOP_MIRROR_CFG), VOP_MIRROR_CFG_ENABLE))
3637*53ee8cc1Swenshuai.xi     {
3638*53ee8cc1Swenshuai.xi         //MVOP_PRINTF("Setup mirror mode\n");
3639*53ee8cc1Swenshuai.xi         HAL_MVOP_SubInitMirrorMode(TRUE);
3640*53ee8cc1Swenshuai.xi     }
3641*53ee8cc1Swenshuai.xi 
3642*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), bEnable, VOP_MIRROR_CFG_VEN);
3643*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubMirrorModeVer = bEnable;
3644*53ee8cc1Swenshuai.xi }
3645*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetHorizontallMirrorMode(MS_BOOL bEnable)3646*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetHorizontallMirrorMode(MS_BOOL bEnable)
3647*53ee8cc1Swenshuai.xi {
3648*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
3649*53ee8cc1Swenshuai.xi     {
3650*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
3651*53ee8cc1Swenshuai.xi         return;
3652*53ee8cc1Swenshuai.xi     }
3653*53ee8cc1Swenshuai.xi     if (VOP_MIRROR_CFG_ENABLE != HAL_ReadRegBit(SUB_REG(VOP_MIRROR_CFG), VOP_MIRROR_CFG_ENABLE))
3654*53ee8cc1Swenshuai.xi     {
3655*53ee8cc1Swenshuai.xi         //MVOP_PRINTF("Setup mirror mode\n");
3656*53ee8cc1Swenshuai.xi         HAL_MVOP_SubInitMirrorMode(TRUE);
3657*53ee8cc1Swenshuai.xi     }
3658*53ee8cc1Swenshuai.xi 
3659*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), bEnable, VOP_MIRROR_CFG_HEN);
3660*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubMirrorModeHor = bEnable;
3661*53ee8cc1Swenshuai.xi }
3662*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetFieldInverse(MS_BOOL b2MVD,MS_BOOL b2IP)3663*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetFieldInverse(MS_BOOL b2MVD, MS_BOOL b2IP)
3664*53ee8cc1Swenshuai.xi {
3665*53ee8cc1Swenshuai.xi     // Set fld inv & ofld_inv
3666*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_CTRL0+1), b2MVD, BIT3); //inverse the field to MVD
3667*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_CTRL0+1), b2IP, BIT4);  //inverse the field to IP
3668*53ee8cc1Swenshuai.xi }
3669*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetChromaWeighting(MS_BOOL bEnable)3670*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetChromaWeighting(MS_BOOL bEnable)
3671*53ee8cc1Swenshuai.xi {
3672*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WEIGHT_CTRL), bEnable, BIT1);
3673*53ee8cc1Swenshuai.xi }
3674*53ee8cc1Swenshuai.xi 
3675*53ee8cc1Swenshuai.xi //load new value into active registers 0x20-0x26
HAL_MVOP_SubLoadReg(void)3676*53ee8cc1Swenshuai.xi void HAL_MVOP_SubLoadReg(void)
3677*53ee8cc1Swenshuai.xi {
3678*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 1, BIT0);
3679*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 0, BIT0);
3680*53ee8cc1Swenshuai.xi 
3681*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 1, BIT4);
3682*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 0, BIT4);
3683*53ee8cc1Swenshuai.xi }
3684*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetMIUReqMask(MS_BOOL bEnable)3685*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetMIUReqMask(MS_BOOL bEnable)
3686*53ee8cc1Swenshuai.xi {
3687*53ee8cc1Swenshuai.xi #if 0
3688*53ee8cc1Swenshuai.xi     if (bEnable)
3689*53ee8cc1Swenshuai.xi     {   // mask MVOP2MI to protect MIU
3690*53ee8cc1Swenshuai.xi         HAL_MIU_SubSetReqMask(SUBMVOP_R, 1);
3691*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
3692*53ee8cc1Swenshuai.xi     }
3693*53ee8cc1Swenshuai.xi     else
3694*53ee8cc1Swenshuai.xi     {   // unmask MVOP2MI
3695*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
3696*53ee8cc1Swenshuai.xi         HAL_MIU_SubSetReqMask(SUBMVOP_R, 0);
3697*53ee8cc1Swenshuai.xi     }
3698*53ee8cc1Swenshuai.xi #endif
3699*53ee8cc1Swenshuai.xi 	MS_U8 u8Miu;
3700*53ee8cc1Swenshuai.xi 	if(HAL_MVOP_GetIsOnlyMiuIPControl() == TRUE)
3701*53ee8cc1Swenshuai.xi 	{
3702*53ee8cc1Swenshuai.xi         // mask msb mvop
3703*53ee8cc1Swenshuai.xi         u8Miu = (HAL_ReadByte(SUB_REG(VOP_MIU_SEL)) & VOP_MSB_BUF0_MIU_SEL) >> 4;
3704*53ee8cc1Swenshuai.xi 	}
3705*53ee8cc1Swenshuai.xi 	else
3706*53ee8cc1Swenshuai.xi 	{
3707*53ee8cc1Swenshuai.xi         u8Miu = SUBVOP_ON_MIU1;
3708*53ee8cc1Swenshuai.xi 	}
3709*53ee8cc1Swenshuai.xi     eMIUClientID eClientID = MIU_CLIENT_MVOP1_R;
3710*53ee8cc1Swenshuai.xi     //MVOP_PRINTF("Enter %s bEnable=%x ReqMask=0x%x, 0x%x, u8Miu=%x\n", __FUNCTION__, bEnable,
3711*53ee8cc1Swenshuai.xi     //    HAL_ReadByte(0x1266), HAL_ReadByte(0x0666), u8Miu);
3712*53ee8cc1Swenshuai.xi 
3713*53ee8cc1Swenshuai.xi     if (bEnable)
3714*53ee8cc1Swenshuai.xi     {   // mask MVOP2MI to protect MIU
3715*53ee8cc1Swenshuai.xi         MDrv_MIU_MaskReq(u8Miu, eClientID);
3716*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
3717*53ee8cc1Swenshuai.xi     }
3718*53ee8cc1Swenshuai.xi     else
3719*53ee8cc1Swenshuai.xi     {   // unmask MVOP2MI
3720*53ee8cc1Swenshuai.xi         MsOS_DelayTask(1);
3721*53ee8cc1Swenshuai.xi         MDrv_MIU_UnMaskReq(u8Miu, eClientID);
3722*53ee8cc1Swenshuai.xi     }
3723*53ee8cc1Swenshuai.xi 
3724*53ee8cc1Swenshuai.xi     //MVOP_PRINTF(">Exit %s bEnable=%x ReqMask=0x%x, 0x%x, u8Miu=%x\n", __FUNCTION__, bEnable,
3725*53ee8cc1Swenshuai.xi     //    HAL_ReadByte(0x1266), HAL_ReadByte(0x0666), u8Miu);
3726*53ee8cc1Swenshuai.xi }
3727*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubRst(void)3728*53ee8cc1Swenshuai.xi void HAL_MVOP_SubRst(void)
3729*53ee8cc1Swenshuai.xi {
3730*53ee8cc1Swenshuai.xi #if 0
3731*53ee8cc1Swenshuai.xi     MS_BOOL bMCU = FALSE;
3732*53ee8cc1Swenshuai.xi 
3733*53ee8cc1Swenshuai.xi     bMCU = HAL_ReadRegBit(SUB_REG(VOP_MPG_JPG_SWITCH), BIT1);
3734*53ee8cc1Swenshuai.xi #endif
3735*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_CTRL0), 0, BIT0);
3736*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_CTRL0), 1, BIT0);
3737*53ee8cc1Swenshuai.xi 
3738*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsEnable = 1;
3739*53ee8cc1Swenshuai.xi #if 0
3740*53ee8cc1Swenshuai.xi     // sw patch: for mvop hsk mode, switching mvop enable/disable may cause video was stuck.
3741*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF("[MVOP][DBG] HAL_MVOP_Enable patch \n");)
3742*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetBlackBG();
3743*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetPattern(MVOP_PATTERN_FRAMECOLOR);
3744*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 1, BIT4);
3745*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MPG_JPG_SWITCH), 1, BIT1);
3746*53ee8cc1Swenshuai.xi     MsOS_DelayTask(40);
3747*53ee8cc1Swenshuai.xi     if(bMCU == FALSE)
3748*53ee8cc1Swenshuai.xi     {
3749*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_MPG_JPG_SWITCH), 0, BIT1);
3750*53ee8cc1Swenshuai.xi     }
3751*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetPattern(MVOP_PATTERN_NORMAL);
3752*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 0, BIT4);
3753*53ee8cc1Swenshuai.xi #endif
3754*53ee8cc1Swenshuai.xi }
3755*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubEnable(MS_BOOL bEnable,MS_U8 u8Framerate)3756*53ee8cc1Swenshuai.xi void HAL_MVOP_SubEnable(MS_BOOL bEnable, MS_U8 u8Framerate)
3757*53ee8cc1Swenshuai.xi {
3758*53ee8cc1Swenshuai.xi     MS_U8 regval;
3759*53ee8cc1Swenshuai.xi #if 0
3760*53ee8cc1Swenshuai.xi     MS_U8 u8FrmDur = 40;
3761*53ee8cc1Swenshuai.xi     MS_BOOL bMCU = FALSE;
3762*53ee8cc1Swenshuai.xi 
3763*53ee8cc1Swenshuai.xi     bMCU = HAL_ReadRegBit(SUB_REG(VOP_MPG_JPG_SWITCH), BIT1);
3764*53ee8cc1Swenshuai.xi 
3765*53ee8cc1Swenshuai.xi     if(u8Framerate != 0)
3766*53ee8cc1Swenshuai.xi     {
3767*53ee8cc1Swenshuai.xi         u8FrmDur = 1000/u8Framerate; //time of one frame(ms).
3768*53ee8cc1Swenshuai.xi     }
3769*53ee8cc1Swenshuai.xi #endif
3770*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(SUB_REG(VOP_CTRL0));
3771*53ee8cc1Swenshuai.xi 
3772*53ee8cc1Swenshuai.xi     if ( bEnable )
3773*53ee8cc1Swenshuai.xi     {
3774*53ee8cc1Swenshuai.xi         regval |= 0x1;
3775*53ee8cc1Swenshuai.xi     }
3776*53ee8cc1Swenshuai.xi     else
3777*53ee8cc1Swenshuai.xi     {
3778*53ee8cc1Swenshuai.xi         regval &= ~0x1;
3779*53ee8cc1Swenshuai.xi         HAL_Write2Byte(SUB_REG(VOP_BF_VS_MVD), 0x200);
3780*53ee8cc1Swenshuai.xi         HAL_Write2Byte(SUB_REG(VOP_TF_VS_MVD), 0x200);
3781*53ee8cc1Swenshuai.xi     }
3782*53ee8cc1Swenshuai.xi #if 0
3783*53ee8cc1Swenshuai.xi     // sw patch: for mvop hsk mode, switching mvop enable/disable may cause video was stuck.
3784*53ee8cc1Swenshuai.xi     if ( bEnable && (g_pHalMVOPCtx->bSubIsEnable == FALSE)) // need patch only from off to on
3785*53ee8cc1Swenshuai.xi     {
3786*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("[MVOP][DBG] HAL_MVOP_Enable patch \n");)
3787*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetBlackBG();
3788*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetPattern(MVOP_PATTERN_FRAMECOLOR);
3789*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 1, BIT4);
3790*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_MPG_JPG_SWITCH), 1, BIT1);
3791*53ee8cc1Swenshuai.xi         MsOS_DelayTask(u8FrmDur);
3792*53ee8cc1Swenshuai.xi         if(bMCU == FALSE)
3793*53ee8cc1Swenshuai.xi         {
3794*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(SUB_REG(VOP_MPG_JPG_SWITCH), 0, BIT1);
3795*53ee8cc1Swenshuai.xi         }
3796*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetPattern(MVOP_PATTERN_NORMAL);
3797*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 0, BIT4);
3798*53ee8cc1Swenshuai.xi     }
3799*53ee8cc1Swenshuai.xi #endif
3800*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsEnable = bEnable;
3801*53ee8cc1Swenshuai.xi 
3802*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_CTRL0), regval);
3803*53ee8cc1Swenshuai.xi 
3804*53ee8cc1Swenshuai.xi }
3805*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubGetEnableState(void)3806*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubGetEnableState(void)
3807*53ee8cc1Swenshuai.xi {
3808*53ee8cc1Swenshuai.xi     return (HAL_ReadRegBit(SUB_REG(VOP_CTRL0), BIT0));
3809*53ee8cc1Swenshuai.xi }
3810*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubGetMaxFreerunClk()3811*53ee8cc1Swenshuai.xi HALMVOPFREQUENCY HAL_MVOP_SubGetMaxFreerunClk()
3812*53ee8cc1Swenshuai.xi {
3813*53ee8cc1Swenshuai.xi     return HALMVOP_160MHZ;
3814*53ee8cc1Swenshuai.xi }
3815*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubGet4k2kClk()3816*53ee8cc1Swenshuai.xi HALMVOPFREQUENCY HAL_MVOP_SubGet4k2kClk()
3817*53ee8cc1Swenshuai.xi {
3818*53ee8cc1Swenshuai.xi     return HALMVOP_320MHZ;
3819*53ee8cc1Swenshuai.xi }
3820*53ee8cc1Swenshuai.xi 
3821*53ee8cc1Swenshuai.xi //FIXME
HAL_MVOP_SubSetFrequency(HALMVOPFREQUENCY enFrequency)3822*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetFrequency(HALMVOPFREQUENCY enFrequency)
3823*53ee8cc1Swenshuai.xi {
3824*53ee8cc1Swenshuai.xi     // clear
3825*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(REG_CKG_SUB_DC0, 0, CKG_SUB_DC0_MASK);
3826*53ee8cc1Swenshuai.xi     switch(enFrequency)
3827*53ee8cc1Swenshuai.xi     {
3828*53ee8cc1Swenshuai.xi         case HALMVOP_SYNCMODE:
3829*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_SUB_DC0, CKG_SUB_DC0_SYNCHRONOUS, CKG_SUB_DC0_MASK);
3830*53ee8cc1Swenshuai.xi             break;
3831*53ee8cc1Swenshuai.xi         case HALMVOP_FREERUNMODE:
3832*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_SUB_DC0, CKG_SUB_DC0_FREERUN, CKG_SUB_DC0_MASK);
3833*53ee8cc1Swenshuai.xi             break;
3834*53ee8cc1Swenshuai.xi         case HALMVOP_160MHZ:
3835*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_SUB_DC0, CKG_SUB_DC0_160MHZ, CKG_SUB_DC0_MASK);
3836*53ee8cc1Swenshuai.xi             break;
3837*53ee8cc1Swenshuai.xi         case HALMVOP_144MHZ:
3838*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_SUB_DC0, CKG_SUB_DC0_144MHZ, CKG_SUB_DC0_MASK);
3839*53ee8cc1Swenshuai.xi             break;
3840*53ee8cc1Swenshuai.xi         case HALMVOP_320MHZ:
3841*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_SUB_DC0, CKG_SUB_DC0_320MHZ, CKG_SUB_DC0_MASK);
3842*53ee8cc1Swenshuai.xi             break;
3843*53ee8cc1Swenshuai.xi         default:
3844*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(REG_CKG_SUB_DC0, CKG_SUB_DC0_SYNCHRONOUS, CKG_SUB_DC0_MASK);
3845*53ee8cc1Swenshuai.xi             MVOP_PRINTF("Attention! In HAL_MVOP_SubSetFrequency default path!\n");
3846*53ee8cc1Swenshuai.xi             break;
3847*53ee8cc1Swenshuai.xi     }
3848*53ee8cc1Swenshuai.xi }
3849*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetOutputInterlace(MS_BOOL bEnable)3850*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetOutputInterlace(MS_BOOL bEnable)
3851*53ee8cc1Swenshuai.xi {
3852*53ee8cc1Swenshuai.xi     MS_U8 regval;
3853*53ee8cc1Swenshuai.xi 
3854*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(SUB_REG(VOP_CTRL0));
3855*53ee8cc1Swenshuai.xi 
3856*53ee8cc1Swenshuai.xi     if ( bEnable )
3857*53ee8cc1Swenshuai.xi     {
3858*53ee8cc1Swenshuai.xi         regval |= 0x80;
3859*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_BW_SAVE), 0, VOP_420_BW_SAVE_EX);
3860*53ee8cc1Swenshuai.xi     }
3861*53ee8cc1Swenshuai.xi     else
3862*53ee8cc1Swenshuai.xi     {
3863*53ee8cc1Swenshuai.xi         regval &= ~0x80;
3864*53ee8cc1Swenshuai.xi     }
3865*53ee8cc1Swenshuai.xi 
3866*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_CTRL0), regval);
3867*53ee8cc1Swenshuai.xi }
3868*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetPattern(MVOP_Pattern enMVOPPattern)3869*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetPattern(MVOP_Pattern enMVOPPattern)
3870*53ee8cc1Swenshuai.xi {
3871*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_TST_IMG), enMVOPPattern, BIT2 | BIT1 | BIT0);
3872*53ee8cc1Swenshuai.xi }
3873*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetTileFormat(MVOP_TileFormat eTileFmt)3874*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubSetTileFormat(MVOP_TileFormat eTileFmt)
3875*53ee8cc1Swenshuai.xi {
3876*53ee8cc1Swenshuai.xi     if (eTileFmt == E_MVOP_TILE_8x32)
3877*53ee8cc1Swenshuai.xi     {
3878*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 0, BIT1);
3879*53ee8cc1Swenshuai.xi         return TRUE;
3880*53ee8cc1Swenshuai.xi     }
3881*53ee8cc1Swenshuai.xi     else if (eTileFmt == E_MVOP_TILE_16x32)
3882*53ee8cc1Swenshuai.xi     {
3883*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 1, BIT1);
3884*53ee8cc1Swenshuai.xi         return TRUE;
3885*53ee8cc1Swenshuai.xi     }
3886*53ee8cc1Swenshuai.xi     else
3887*53ee8cc1Swenshuai.xi     {
3888*53ee8cc1Swenshuai.xi         return FALSE;
3889*53ee8cc1Swenshuai.xi     }
3890*53ee8cc1Swenshuai.xi }
3891*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetRgbFormat(MVOP_RgbFormat eRgbFmt)3892*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubSetRgbFormat(MVOP_RgbFormat eRgbFmt)
3893*53ee8cc1Swenshuai.xi {
3894*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
3895*53ee8cc1Swenshuai.xi 
3896*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
3897*53ee8cc1Swenshuai.xi     {
3898*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
3899*53ee8cc1Swenshuai.xi         return FALSE;
3900*53ee8cc1Swenshuai.xi     }
3901*53ee8cc1Swenshuai.xi     if (eRgbFmt == E_MVOP_RGB_NONE)
3902*53ee8cc1Swenshuai.xi     {
3903*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_RGB_FMT), 0, VOP_RGB_FMT_SEL);
3904*53ee8cc1Swenshuai.xi         bRet = TRUE;
3905*53ee8cc1Swenshuai.xi     }
3906*53ee8cc1Swenshuai.xi     else if (eRgbFmt == E_MVOP_RGB_565)
3907*53ee8cc1Swenshuai.xi     {
3908*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_RGB_FMT), VOP_RGB_FMT_565, VOP_RGB_FMT_SEL);
3909*53ee8cc1Swenshuai.xi         bRet = TRUE;
3910*53ee8cc1Swenshuai.xi     }
3911*53ee8cc1Swenshuai.xi     else if (eRgbFmt == E_MVOP_RGB_888)
3912*53ee8cc1Swenshuai.xi     {
3913*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_RGB_FMT), VOP_RGB_FMT_888, VOP_RGB_FMT_SEL);
3914*53ee8cc1Swenshuai.xi         bRet = TRUE;
3915*53ee8cc1Swenshuai.xi     }
3916*53ee8cc1Swenshuai.xi 
3917*53ee8cc1Swenshuai.xi     if (bRet == TRUE)
3918*53ee8cc1Swenshuai.xi     {
3919*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->eSubRgbFmt = eRgbFmt;
3920*53ee8cc1Swenshuai.xi     }
3921*53ee8cc1Swenshuai.xi     return bRet;
3922*53ee8cc1Swenshuai.xi }
3923*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetBlackBG(void)3924*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetBlackBG(void)
3925*53ee8cc1Swenshuai.xi {
3926*53ee8cc1Swenshuai.xi     MS_U8 regval;
3927*53ee8cc1Swenshuai.xi 
3928*53ee8cc1Swenshuai.xi     //set MVOP test pattern to black
3929*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TST_IMG + 1), 0x10);
3930*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_U_PAT      ), 0x80);
3931*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_U_PAT   + 1), 0x80);
3932*53ee8cc1Swenshuai.xi 
3933*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(SUB_REG(VOP_TST_IMG));
3934*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TST_IMG), 0x02);
3935*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TST_IMG), 0x00);
3936*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TST_IMG), regval);
3937*53ee8cc1Swenshuai.xi }
3938*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetCropWindow(MVOP_InputCfg * pparam)3939*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetCropWindow(MVOP_InputCfg *pparam)
3940*53ee8cc1Swenshuai.xi {
3941*53ee8cc1Swenshuai.xi #if 1
3942*53ee8cc1Swenshuai.xi     UNUSED(pparam);
3943*53ee8cc1Swenshuai.xi #else // enable it when test code is ready
3944*53ee8cc1Swenshuai.xi     MS_U32 x, y;
3945*53ee8cc1Swenshuai.xi     MS_U32 u32offset;
3946*53ee8cc1Swenshuai.xi 
3947*53ee8cc1Swenshuai.xi     if(!pparam)
3948*53ee8cc1Swenshuai.xi     {
3949*53ee8cc1Swenshuai.xi         return;
3950*53ee8cc1Swenshuai.xi     }
3951*53ee8cc1Swenshuai.xi     //set MVOP test pattern to black
3952*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetBlackBG();
3953*53ee8cc1Swenshuai.xi #if 0
3954*53ee8cc1Swenshuai.xi     if((pparam->enVideoType == MVOP_H264) && (pparam->u16StripSize == 1920))
3955*53ee8cc1Swenshuai.xi     {
3956*53ee8cc1Swenshuai.xi         pparam->u16StripSize = 1952;
3957*53ee8cc1Swenshuai.xi     }
3958*53ee8cc1Swenshuai.xi #endif
3959*53ee8cc1Swenshuai.xi     if((pparam->enVideoType == MVOP_MPG) || (pparam->enVideoType == MVOP_MPEG4))
3960*53ee8cc1Swenshuai.xi     {
3961*53ee8cc1Swenshuai.xi         pparam->u16CropX = (pparam->u16CropX >> 3) << 3; // 8 bytes align
3962*53ee8cc1Swenshuai.xi         pparam->u16CropY = (pparam->u16CropY >> 6) << 6; // 64 bytes align
3963*53ee8cc1Swenshuai.xi     }
3964*53ee8cc1Swenshuai.xi     else if((pparam->enVideoType == MVOP_H264) || (pparam->enVideoType == MVOP_RM))
3965*53ee8cc1Swenshuai.xi     {
3966*53ee8cc1Swenshuai.xi         pparam->u16CropX = (pparam->u16CropX >> 4) << 4; // 16 bytes align
3967*53ee8cc1Swenshuai.xi         pparam->u16CropY = (pparam->u16CropY >> 6) << 6; // 64 bytes align
3968*53ee8cc1Swenshuai.xi     }
3969*53ee8cc1Swenshuai.xi     else
3970*53ee8cc1Swenshuai.xi     {
3971*53ee8cc1Swenshuai.xi         MS_ASSERT(0);
3972*53ee8cc1Swenshuai.xi     }
3973*53ee8cc1Swenshuai.xi 
3974*53ee8cc1Swenshuai.xi     x = (MS_U32)pparam->u16CropX;
3975*53ee8cc1Swenshuai.xi     y = (MS_U32)pparam->u16CropY;
3976*53ee8cc1Swenshuai.xi 
3977*53ee8cc1Swenshuai.xi     // y offset
3978*53ee8cc1Swenshuai.xi     u32offset = ((y * pparam->u16StripSize + (x << 5)) >> 3);
3979*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_L    ), (MS_U8)(u32offset));
3980*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_L + 1), (MS_U8)(u32offset >> 8));
3981*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_H    ), (MS_U8)(u32offset >> 16));
3982*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_H + 1), (MS_U8)((u32offset >> 24) & VOP_YUV_STR_HIBITS));
3983*53ee8cc1Swenshuai.xi 
3984*53ee8cc1Swenshuai.xi     // uv offset
3985*53ee8cc1Swenshuai.xi     u32offset = ((y >> 1) * pparam->u16StripSize + (x << 5)) >> 3;
3986*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_L    ), (MS_U8)(u32offset));
3987*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_L + 1), (MS_U8)(u32offset >> 8));
3988*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_H    ), (MS_U8)(u32offset >> 16));
3989*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_H + 1), (MS_U8)((u32offset >> 24) & VOP_YUV_STR_HIBITS));
3990*53ee8cc1Swenshuai.xi 
3991*53ee8cc1Swenshuai.xi     pparam->u16CropWidth= (pparam->u16CropWidth >> 3) << 3;
3992*53ee8cc1Swenshuai.xi     // HSize, VSize
3993*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_HSIZE    ), LOWBYTE(pparam->u16CropWidth ));
3994*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_HSIZE + 1), HIGHBYTE(pparam->u16CropWidth ));
3995*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_VSIZE    ), LOWBYTE(pparam->u16CropHeight));
3996*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_VSIZE + 1), HIGHBYTE(pparam->u16CropHeight ));
3997*53ee8cc1Swenshuai.xi 
3998*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_MPG_JPG_SWITCH), BIT0, BIT1|BIT0);
3999*53ee8cc1Swenshuai.xi 
4000*53ee8cc1Swenshuai.xi     // clear extend strip len bit by default
4001*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_STRIP_ALIGN), 0, BIT0);
4002*53ee8cc1Swenshuai.xi     if((pparam->enVideoType == MVOP_MPG) || (pparam->enVideoType == MVOP_MPEG4))
4003*53ee8cc1Swenshuai.xi     {
4004*53ee8cc1Swenshuai.xi         // Disable H264 or RM Input
4005*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH), 0, BIT2|BIT3);
4006*53ee8cc1Swenshuai.xi         //8*32 tile format
4007*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 0, BIT1);
4008*53ee8cc1Swenshuai.xi     }
4009*53ee8cc1Swenshuai.xi     else if((pparam->enVideoType == MVOP_H264) || (pparam->enVideoType == MVOP_RM))
4010*53ee8cc1Swenshuai.xi     {
4011*53ee8cc1Swenshuai.xi         //16*32 tile format
4012*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 1, BIT1);
4013*53ee8cc1Swenshuai.xi         // SVD mode enable
4014*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_INPUT_SWITCH), BIT3, BIT2|BIT3);
4015*53ee8cc1Swenshuai.xi         // set mvop to 128bit_i128 interface
4016*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_MIU_IF), VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
4017*53ee8cc1Swenshuai.xi     }
4018*53ee8cc1Swenshuai.xi     HAL_MVOP_SubLoadReg();
4019*53ee8cc1Swenshuai.xi #endif
4020*53ee8cc1Swenshuai.xi }
4021*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetRepeatField(MVOP_RptFldMode eMode)4022*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetRepeatField(MVOP_RptFldMode eMode)
4023*53ee8cc1Swenshuai.xi {
4024*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
4025*53ee8cc1Swenshuai.xi     {
4026*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
4027*53ee8cc1Swenshuai.xi         return;
4028*53ee8cc1Swenshuai.xi     }
4029*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->eSubRepeatField = eMode;
4030*53ee8cc1Swenshuai.xi }
4031*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetInputMode(VOPINPUTMODE mode,MVOP_InputCfg * pparam,MS_U16 u16ECOVersion)4032*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetInputMode( VOPINPUTMODE mode, MVOP_InputCfg *pparam, MS_U16 u16ECOVersion )
4033*53ee8cc1Swenshuai.xi {
4034*53ee8cc1Swenshuai.xi     MS_U8 regval;
4035*53ee8cc1Swenshuai.xi     MS_U16 u16strip, u16strip_lsb;
4036*53ee8cc1Swenshuai.xi 
4037*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
4038*53ee8cc1Swenshuai.xi     {
4039*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
4040*53ee8cc1Swenshuai.xi         return;
4041*53ee8cc1Swenshuai.xi     }
4042*53ee8cc1Swenshuai.xi 
4043*53ee8cc1Swenshuai.xi #if 0
4044*53ee8cc1Swenshuai.xi     /*****************************************************/
4045*53ee8cc1Swenshuai.xi     // Reset MVOP setting
4046*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TST_IMG), 0x40);
4047*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetRgbFormat(E_MVOP_RGB_NONE);
4048*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_CTRL1), 0, VOP_MVD_VS_MD); //default use original vsync
4049*53ee8cc1Swenshuai.xi     // Only for Monaco: Enable deciding bot by top address + 2
4050*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), 1, VOP_FIELD_FROM_ADDR);
4051*53ee8cc1Swenshuai.xi 
4052*53ee8cc1Swenshuai.xi     //set MVOP test pattern to black
4053*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetBlackBG();
4054*53ee8cc1Swenshuai.xi 
4055*53ee8cc1Swenshuai.xi     // clear extend strip len bit by default
4056*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_STRIP_ALIGN), 0, BIT0);
4057*53ee8cc1Swenshuai.xi 
4058*53ee8cc1Swenshuai.xi     // set mvop to 128bit_i128 interface
4059*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_MIU_IF), VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
4060*53ee8cc1Swenshuai.xi 
4061*53ee8cc1Swenshuai.xi     // Disable H264 or RM Input
4062*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH1), 0, BIT2|BIT3);
4063*53ee8cc1Swenshuai.xi     // Clear 422 Flag
4064*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIs422 = 0;
4065*53ee8cc1Swenshuai.xi     // Clear evd Flag for interlace mode setting
4066*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsH265 = 0;
4067*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_INFO_FROM_CODEC_L), 1, BIT3);
4068*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), 1, BIT5);
4069*53ee8cc1Swenshuai.xi     //8*32 tile format
4070*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 0, BIT1);
4071*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG_HI), 0, VOP_REF_SELF_FLD);
4072*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetFieldInverse(ENABLE, ENABLE);
4073*53ee8cc1Swenshuai.xi     // EVD mode disable
4074*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 0, EVD_ENABLE);
4075*53ee8cc1Swenshuai.xi     // EVD 10 bits
4076*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_REG_MASK), BIT1, VOP_LSB_REQ_MASK);
4077*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_EVD_10B_EN), 0, VOP_EVD_10B_Y_EN);
4078*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_EVD_10B_EN), 0, VOP_EVD_10B_UV_EN);
4079*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_UV_SHIFT), 1, VOP_GCLK_MIU_ON);
4080*53ee8cc1Swenshuai.xi     // VP9 MODE disable
4081*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 0, VOP_R2_WISHBONE);
4082*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MPG_JPG_SWITCH), 0, VOP_DRAM_RD_MODE);
4083*53ee8cc1Swenshuai.xi     // Disable 2p mode
4084*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetEnable4k2k2P(FALSE);
4085*53ee8cc1Swenshuai.xi     /*****************************************************/
4086*53ee8cc1Swenshuai.xi #endif
4087*53ee8cc1Swenshuai.xi     regval = 0;
4088*53ee8cc1Swenshuai.xi     regval |= ( mode & 0x3 );
4089*53ee8cc1Swenshuai.xi 
4090*53ee8cc1Swenshuai.xi     if ( mode == VOPINPUT_HARDWIRE )
4091*53ee8cc1Swenshuai.xi     {
4092*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_MPG_JPG_SWITCH), regval);
4093*53ee8cc1Swenshuai.xi     }
4094*53ee8cc1Swenshuai.xi     else if ( mode == VOPINPUT_HARDWIRECLIP )
4095*53ee8cc1Swenshuai.xi     {
4096*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_MPG_JPG_SWITCH), regval);
4097*53ee8cc1Swenshuai.xi 
4098*53ee8cc1Swenshuai.xi         // HSize, VSize
4099*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_HSIZE    ), LOWBYTE( pparam->u16HSize ));
4100*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_HSIZE + 1), HIGHBYTE( pparam->u16HSize ));
4101*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_VSIZE    ), LOWBYTE( pparam->u16VSize ));
4102*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_VSIZE + 1), HIGHBYTE( pparam->u16VSize ));
4103*53ee8cc1Swenshuai.xi     }
4104*53ee8cc1Swenshuai.xi     else if (mode == VOPINPUT_MCUCTRL)
4105*53ee8cc1Swenshuai.xi     {
4106*53ee8cc1Swenshuai.xi         // disable from wb
4107*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_MFDEC_2_L), 0, VOP_MF_FROM_WB);
4108*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 0, VOP_R2_WISHBONE);
4109*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubMirrorMode = (g_pHalMVOPCtx->bSubMirrorModeVer||g_pHalMVOPCtx->bSubMirrorModeHor);
4110*53ee8cc1Swenshuai.xi         if ( pparam->bProgressive )
4111*53ee8cc1Swenshuai.xi             regval |= 0x4;
4112*53ee8cc1Swenshuai.xi         else
4113*53ee8cc1Swenshuai.xi         {
4114*53ee8cc1Swenshuai.xi             regval &= ~0x4;
4115*53ee8cc1Swenshuai.xi             regval |= 0x1;  //reg_dc_md=b'11 for interlace input
4116*53ee8cc1Swenshuai.xi             if (E_MVOP_RPTFLD_NONE == g_pHalMVOPCtx->eSubRepeatField)
4117*53ee8cc1Swenshuai.xi             {
4118*53ee8cc1Swenshuai.xi                 MVOP_DBG("%s normal NOT repeat field %x\n", __FUNCTION__, g_pHalMVOPCtx->eSubRepeatField);
4119*53ee8cc1Swenshuai.xi                 //To support mcu mode interlace, need to set h'3B[9]=1,
4120*53ee8cc1Swenshuai.xi                 //h'11[12]=0, and Y1/UV1 address equal to Y0/UV0 address.
4121*53ee8cc1Swenshuai.xi                 HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG_HI), 1, VOP_REF_SELF_FLD);
4122*53ee8cc1Swenshuai.xi                 HAL_MVOP_SubSetFieldInverse(ENABLE, DISABLE);
4123*53ee8cc1Swenshuai.xi             }
4124*53ee8cc1Swenshuai.xi         }
4125*53ee8cc1Swenshuai.xi 
4126*53ee8cc1Swenshuai.xi         if ( pparam->bYUV422 )
4127*53ee8cc1Swenshuai.xi             regval |= 0x10;
4128*53ee8cc1Swenshuai.xi         else
4129*53ee8cc1Swenshuai.xi             regval &= ~0x10;
4130*53ee8cc1Swenshuai.xi 
4131*53ee8cc1Swenshuai.xi         if ( pparam->b422pack )
4132*53ee8cc1Swenshuai.xi             regval |= 0x80;
4133*53ee8cc1Swenshuai.xi 
4134*53ee8cc1Swenshuai.xi         if ( pparam->bDramRdContd == 1 )
4135*53ee8cc1Swenshuai.xi             regval |= 0x20;
4136*53ee8cc1Swenshuai.xi         else
4137*53ee8cc1Swenshuai.xi             regval &= ~0x20;
4138*53ee8cc1Swenshuai.xi 
4139*53ee8cc1Swenshuai.xi         // for backward compatable to saturn
4140*53ee8cc1Swenshuai.xi         // [3] UV-7bit mode don't care
4141*53ee8cc1Swenshuai.xi         // [5] dram_rd_md =0
4142*53ee8cc1Swenshuai.xi         // [6] Fld don't care
4143*53ee8cc1Swenshuai.xi         // [7] 422pack don'care
4144*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_MPG_JPG_SWITCH), regval);
4145*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubIs422 = pparam->bYUV422;
4146*53ee8cc1Swenshuai.xi 
4147*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_DUMMY), !pparam->bYUV422, VOP_420_BW_SAVE);
4148*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_BW_SAVE), !pparam->bYUV422, VOP_420_BW_SAVE_EX);
4149*53ee8cc1Swenshuai.xi 
4150*53ee8cc1Swenshuai.xi         if (pparam->u16StripSize == 0)
4151*53ee8cc1Swenshuai.xi         {
4152*53ee8cc1Swenshuai.xi             if (pparam->bSD)
4153*53ee8cc1Swenshuai.xi             {
4154*53ee8cc1Swenshuai.xi                 u16strip = 720;
4155*53ee8cc1Swenshuai.xi                 u16strip_lsb = 720;
4156*53ee8cc1Swenshuai.xi             }
4157*53ee8cc1Swenshuai.xi             else
4158*53ee8cc1Swenshuai.xi             {
4159*53ee8cc1Swenshuai.xi                 u16strip = 1920;
4160*53ee8cc1Swenshuai.xi                 u16strip_lsb = 1920;
4161*53ee8cc1Swenshuai.xi             }
4162*53ee8cc1Swenshuai.xi         }
4163*53ee8cc1Swenshuai.xi         else
4164*53ee8cc1Swenshuai.xi         {
4165*53ee8cc1Swenshuai.xi             u16strip = pparam->u16StripSize;
4166*53ee8cc1Swenshuai.xi             u16strip_lsb = pparam->u16StripSize;
4167*53ee8cc1Swenshuai.xi         }
4168*53ee8cc1Swenshuai.xi 
4169*53ee8cc1Swenshuai.xi         // set dc_strip[7:0]
4170*53ee8cc1Swenshuai.xi         if (pparam->bDramRdContd == 0)
4171*53ee8cc1Swenshuai.xi         {
4172*53ee8cc1Swenshuai.xi             u16strip = (u16strip + 31) / 32 * 32; //need align for monaco
4173*53ee8cc1Swenshuai.xi             u16strip = u16strip/8;
4174*53ee8cc1Swenshuai.xi             u16strip_lsb = (u16strip_lsb+127)/128;
4175*53ee8cc1Swenshuai.xi             u16strip_lsb *= 4;
4176*53ee8cc1Swenshuai.xi         }
4177*53ee8cc1Swenshuai.xi         else
4178*53ee8cc1Swenshuai.xi         {
4179*53ee8cc1Swenshuai.xi             if ( pparam->b422pack )
4180*53ee8cc1Swenshuai.xi             {
4181*53ee8cc1Swenshuai.xi                 if (E_MVOP_RGB_888 == g_pHalMVOPCtx->eSubRgbFmt)
4182*53ee8cc1Swenshuai.xi                 {
4183*53ee8cc1Swenshuai.xi                     u16strip *= 2;
4184*53ee8cc1Swenshuai.xi                 }
4185*53ee8cc1Swenshuai.xi 
4186*53ee8cc1Swenshuai.xi                 if ((u16strip < 1024) || g_pHalMVOPCtx->bSubMirrorMode)
4187*53ee8cc1Swenshuai.xi                 {
4188*53ee8cc1Swenshuai.xi                     u16strip = u16strip/4;
4189*53ee8cc1Swenshuai.xi                     // dont extend strip len
4190*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(SUB_REG(VOP_REG_STRIP_ALIGN), 0, BIT0);
4191*53ee8cc1Swenshuai.xi                 }
4192*53ee8cc1Swenshuai.xi                 else
4193*53ee8cc1Swenshuai.xi                 {
4194*53ee8cc1Swenshuai.xi                     u16strip = u16strip/8;
4195*53ee8cc1Swenshuai.xi                     // extend strip len to 2048
4196*53ee8cc1Swenshuai.xi                     HAL_WriteRegBit(SUB_REG(VOP_REG_STRIP_ALIGN), 1, BIT0);
4197*53ee8cc1Swenshuai.xi                 }
4198*53ee8cc1Swenshuai.xi             }
4199*53ee8cc1Swenshuai.xi             else
4200*53ee8cc1Swenshuai.xi             {
4201*53ee8cc1Swenshuai.xi                 u16strip = u16strip/8;
4202*53ee8cc1Swenshuai.xi             }
4203*53ee8cc1Swenshuai.xi         }
4204*53ee8cc1Swenshuai.xi 
4205*53ee8cc1Swenshuai.xi         if (u16strip >= 256 )
4206*53ee8cc1Swenshuai.xi         {
4207*53ee8cc1Swenshuai.xi             HAL_WriteByte(SUB_REG(VOP_DC_STRIP_H), (u16strip>>8));
4208*53ee8cc1Swenshuai.xi             //reg_dc_strip_h[2:0] = reg_dc_strip[10:8]
4209*53ee8cc1Swenshuai.xi         }
4210*53ee8cc1Swenshuai.xi         else
4211*53ee8cc1Swenshuai.xi         {
4212*53ee8cc1Swenshuai.xi             HAL_WriteByteMask(SUB_REG(VOP_DC_STRIP_H), 0, BIT0 | BIT1 | BIT2);
4213*53ee8cc1Swenshuai.xi         }
4214*53ee8cc1Swenshuai.xi 
4215*53ee8cc1Swenshuai.xi         regval = u16strip;
4216*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_DC_STRIP), regval);
4217*53ee8cc1Swenshuai.xi         //LSB strip
4218*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_DC_STRIP_LSB), u16strip_lsb & 0x3ff);
4219*53ee8cc1Swenshuai.xi 
4220*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetYUVBaseAdd(pparam->u32YOffset, pparam->u32UVOffset,
4221*53ee8cc1Swenshuai.xi                                pparam->bProgressive, pparam->b422pack);
4222*53ee8cc1Swenshuai.xi 
4223*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_NONE != g_pHalMVOPCtx->eSubRepeatField)
4224*53ee8cc1Swenshuai.xi         {
4225*53ee8cc1Swenshuai.xi             MVOP_DBG("%s reset eRepeatField=%x ==>", __FUNCTION__, g_pHalMVOPCtx->eSubRepeatField);
4226*53ee8cc1Swenshuai.xi             //To output the same field for single field input,
4227*53ee8cc1Swenshuai.xi             //do NOT set h'3B[9]=1 and h'11[12]=0
4228*53ee8cc1Swenshuai.xi             g_pHalMVOPCtx->eSubRepeatField = E_MVOP_RPTFLD_NONE;    //reset the flag to repeat field
4229*53ee8cc1Swenshuai.xi             MVOP_DBG(" %x\n", g_pHalMVOPCtx->eSubRepeatField);
4230*53ee8cc1Swenshuai.xi         }
4231*53ee8cc1Swenshuai.xi 
4232*53ee8cc1Swenshuai.xi         // HSize
4233*53ee8cc1Swenshuai.xi         MS_U16 u16HSize = ALIGN_UPTO_16(pparam->u16HSize);
4234*53ee8cc1Swenshuai.xi         if (u16HSize != pparam->u16HSize)
4235*53ee8cc1Swenshuai.xi         {
4236*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("\n\n Change HSize %d to %d\n", pparam->u16HSize, u16HSize);)
4237*53ee8cc1Swenshuai.xi         }
4238*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_HSIZE    ), LOWBYTE( u16HSize ));
4239*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_HSIZE + 1), HIGHBYTE( u16HSize ));
4240*53ee8cc1Swenshuai.xi 
4241*53ee8cc1Swenshuai.xi         // VSize
4242*53ee8cc1Swenshuai.xi         MS_U16 u16VSize = pparam->u16VSize;
4243*53ee8cc1Swenshuai.xi         if (g_pHalMVOPCtx->bSubMirrorModeVer)
4244*53ee8cc1Swenshuai.xi         {
4245*53ee8cc1Swenshuai.xi             u16VSize = ALIGN_UPTO_4(pparam->u16VSize);
4246*53ee8cc1Swenshuai.xi             MVOP_DBG(MVOP_PRINTF("\n\n Change VSize %d to %d\n", pparam->u16VSize, u16VSize);)
4247*53ee8cc1Swenshuai.xi         }
4248*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_VSIZE    ), LOWBYTE( u16VSize ));
4249*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_VSIZE + 1), HIGHBYTE( u16VSize ));
4250*53ee8cc1Swenshuai.xi     }
4251*53ee8cc1Swenshuai.xi 
4252*53ee8cc1Swenshuai.xi     HAL_MVOP_SubLoadReg();
4253*53ee8cc1Swenshuai.xi }
4254*53ee8cc1Swenshuai.xi 
4255*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubEnableUVShift(MS_BOOL bEnable)4256*53ee8cc1Swenshuai.xi void HAL_MVOP_SubEnableUVShift(MS_BOOL bEnable)
4257*53ee8cc1Swenshuai.xi {
4258*53ee8cc1Swenshuai.xi     MS_U8 regval;
4259*53ee8cc1Swenshuai.xi 
4260*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(SUB_REG(VOP_MPG_JPG_SWITCH));
4261*53ee8cc1Swenshuai.xi 
4262*53ee8cc1Swenshuai.xi     if (((regval & BIT4) == BIT4) && ((regval & 0x3)== 0x2))
4263*53ee8cc1Swenshuai.xi     {   // 422 with MCU control mode
4264*53ee8cc1Swenshuai.xi         if (bEnable)
4265*53ee8cc1Swenshuai.xi         {
4266*53ee8cc1Swenshuai.xi             MS_ASSERT(0);
4267*53ee8cc1Swenshuai.xi         }
4268*53ee8cc1Swenshuai.xi     }
4269*53ee8cc1Swenshuai.xi 
4270*53ee8cc1Swenshuai.xi     // output 420 and interlace
4271*53ee8cc1Swenshuai.xi     //[IP - Sheet] : Main Page --- 420CUP
4272*53ee8cc1Swenshuai.xi     //[Project] :  Titania2
4273*53ee8cc1Swenshuai.xi     //[Description]:   Chroma artifacts when 420to422 is applied duplicate method.
4274*53ee8cc1Swenshuai.xi     //[Root cause]: Apply 420to422 average algorithm to all DTV input cases.
4275*53ee8cc1Swenshuai.xi     //The average algorithm must cooperate with MVOP.
4276*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_UV_SHIFT), (bEnable)?1:0, 0x3);
4277*53ee8cc1Swenshuai.xi }
4278*53ee8cc1Swenshuai.xi 
4279*53ee8cc1Swenshuai.xi static MS_BOOL _bSubEnable60P = false;
HAL_MVOP_SubSetEnable60P(MS_BOOL bEnable)4280*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetEnable60P(MS_BOOL bEnable)
4281*53ee8cc1Swenshuai.xi {
4282*53ee8cc1Swenshuai.xi     _bSubEnable60P = bEnable;
4283*53ee8cc1Swenshuai.xi }
4284*53ee8cc1Swenshuai.xi 
4285*53ee8cc1Swenshuai.xi static MS_BOOL _bSubEnable4k2kClk = false;
HAL_MVOP_SubSetEnable4k2kClk(MS_BOOL bEnable)4286*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetEnable4k2kClk(MS_BOOL bEnable)
4287*53ee8cc1Swenshuai.xi {
4288*53ee8cc1Swenshuai.xi     _bSubEnable4k2kClk = bEnable;
4289*53ee8cc1Swenshuai.xi }
4290*53ee8cc1Swenshuai.xi 
4291*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetEnable4k2k2P(MS_BOOL bEnable)4292*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetEnable4k2k2P(MS_BOOL bEnable)
4293*53ee8cc1Swenshuai.xi {
4294*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIs2p = bEnable;
4295*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_4K2K_2P), bEnable, VOP_4K2K_2P);
4296*53ee8cc1Swenshuai.xi 
4297*53ee8cc1Swenshuai.xi }
4298*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubEnableFreerunMode(MS_BOOL bEnable)4299*53ee8cc1Swenshuai.xi void HAL_MVOP_SubEnableFreerunMode(MS_BOOL bEnable)
4300*53ee8cc1Swenshuai.xi {
4301*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
4302*53ee8cc1Swenshuai.xi     {
4303*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
4304*53ee8cc1Swenshuai.xi         return;
4305*53ee8cc1Swenshuai.xi     }
4306*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubEnableFreerunMode = bEnable;
4307*53ee8cc1Swenshuai.xi }
4308*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetOutputTiming(MVOP_Timing * ptiming)4309*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetOutputTiming( MVOP_Timing *ptiming )
4310*53ee8cc1Swenshuai.xi {
4311*53ee8cc1Swenshuai.xi     MS_U8 regval;
4312*53ee8cc1Swenshuai.xi 
4313*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_FRAME_VCOUNT    ), LOWBYTE( ptiming->u16V_TotalCount ));
4314*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_FRAME_VCOUNT + 1), HIGHBYTE( ptiming->u16V_TotalCount ));
4315*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_FRAME_HCOUNT    ), LOWBYTE( ptiming->u16H_TotalCount ));
4316*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_FRAME_HCOUNT + 1), HIGHBYTE( ptiming->u16H_TotalCount ));
4317*53ee8cc1Swenshuai.xi 
4318*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_VB0_STR     ), LOWBYTE( ptiming->u16VBlank0_Start ));
4319*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_VB0_STR  + 1), HIGHBYTE( ptiming->u16VBlank0_Start ));
4320*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_VB0_END     ), LOWBYTE( ptiming->u16VBlank0_End ));
4321*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_VB0_END  + 1), HIGHBYTE( ptiming->u16VBlank0_End ));
4322*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_VB1_STR     ), LOWBYTE( ptiming->u16VBlank1_Start ));
4323*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_VB1_STR  + 1), HIGHBYTE( ptiming->u16VBlank1_Start ));
4324*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_VB1_END     ), LOWBYTE( ptiming->u16VBlank1_End ));
4325*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_VB1_END  + 1), HIGHBYTE( ptiming->u16VBlank1_End ));
4326*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TF_STR      ), LOWBYTE( ptiming->u16TopField_Start ));
4327*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TF_STR   + 1), HIGHBYTE( ptiming->u16TopField_Start ));
4328*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_BF_STR      ), LOWBYTE( ptiming->u16BottomField_Start ));
4329*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_BF_STR   + 1), HIGHBYTE( ptiming->u16BottomField_Start ));
4330*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_HACT_STR    ), LOWBYTE( ptiming->u16HActive_Start ));
4331*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_HACT_STR + 1), HIGHBYTE( ptiming->u16HActive_Start ));
4332*53ee8cc1Swenshuai.xi 
4333*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TF_VS      ), LOWBYTE( ptiming->u16TopField_VS ));
4334*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TF_VS   + 1), HIGHBYTE( ptiming->u16TopField_VS ));
4335*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_BF_VS      ), LOWBYTE( ptiming->u16BottomField_VS ));
4336*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_BF_VS   + 1), HIGHBYTE( ptiming->u16BottomField_VS ));
4337*53ee8cc1Swenshuai.xi 
4338*53ee8cc1Swenshuai.xi     if((ptiming->u16Height >= 2160 || ptiming->u16Width >= 3840) && (ptiming->bInterlace == FALSE))
4339*53ee8cc1Swenshuai.xi     {
4340*53ee8cc1Swenshuai.xi         //Monet 4k2k pmode default 30 lines forwarding.
4341*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubNewVSyncMode = TRUE;
4342*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->u16SubVsyncLines = 0;
4343*53ee8cc1Swenshuai.xi     }
4344*53ee8cc1Swenshuai.xi 
4345*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx->bSubNewVSyncMode)
4346*53ee8cc1Swenshuai.xi     {
4347*53ee8cc1Swenshuai.xi         #define SUB_NEW_VSYNC_MODE_ADVANCE_LINECNT 30
4348*53ee8cc1Swenshuai.xi         MS_U16 u16BottomField_VS2MVD;
4349*53ee8cc1Swenshuai.xi         MS_U16 u16TopField_VS2MVD;
4350*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("MVOP use new vync mode, forwarding %d lines\n",SUB_NEW_VSYNC_MODE_ADVANCE_LINECNT);)
4351*53ee8cc1Swenshuai.xi 
4352*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->u16SubVsyncLines == 0)
4353*53ee8cc1Swenshuai.xi             u16BottomField_VS2MVD = ptiming->u16BottomField_VS - SUB_NEW_VSYNC_MODE_ADVANCE_LINECNT;
4354*53ee8cc1Swenshuai.xi         else
4355*53ee8cc1Swenshuai.xi             u16BottomField_VS2MVD = ptiming->u16BottomField_VS - g_pHalMVOPCtx->u16SubVsyncLines;
4356*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("BottomField VS ori=0x%x, new=0x%x\n", ptiming->u16BottomField_VS, u16BottomField_VS2MVD);)
4357*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_BF_VS_MVD), LOWBYTE( u16BottomField_VS2MVD ));
4358*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG((VOP_BF_VS_MVD + 1)), HIGHBYTE( u16BottomField_VS2MVD ));
4359*53ee8cc1Swenshuai.xi 
4360*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->u16SubVsyncLines == 0)
4361*53ee8cc1Swenshuai.xi             u16TopField_VS2MVD = ptiming->u16V_TotalCount - SUB_NEW_VSYNC_MODE_ADVANCE_LINECNT;
4362*53ee8cc1Swenshuai.xi         else
4363*53ee8cc1Swenshuai.xi             u16TopField_VS2MVD = ptiming->u16V_TotalCount - g_pHalMVOPCtx->u16SubVsyncLines;
4364*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("TopField VS Vtt=0x%x, new=0x%x\n", ptiming->u16V_TotalCount, u16TopField_VS2MVD);)
4365*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_TF_VS_MVD), LOWBYTE( u16TopField_VS2MVD ));
4366*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG((VOP_TF_VS_MVD + 1)), HIGHBYTE( u16TopField_VS2MVD ));
4367*53ee8cc1Swenshuai.xi 
4368*53ee8cc1Swenshuai.xi #if SUPPORT_FILED_DB // t/b signal 30 lines forwarding
4369*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG_HI), 0, VOP_DC2MVD_FLD_SEL);
4370*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_BW_THD_H), 1, REG_MVD_FLD_SEL);
4371*53ee8cc1Swenshuai.xi 
4372*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_TF_STR_MVD    ), LOWBYTE( u16TopField_VS2MVD ));
4373*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_TF_STR_MVD + 1), HIGHBYTE( u16TopField_VS2MVD ));
4374*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_BF_STR_MVD    ), LOWBYTE( u16BottomField_VS2MVD ));
4375*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_BF_STR_MVD + 1), HIGHBYTE( u16BottomField_VS2MVD ));
4376*53ee8cc1Swenshuai.xi #endif
4377*53ee8cc1Swenshuai.xi 
4378*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_GCLK), 0, VOP_GCLK_MIU_ON);
4379*53ee8cc1Swenshuai.xi 
4380*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_CTRL1), 1, VOP_MVD_VS_MD); //Use new vsync
4381*53ee8cc1Swenshuai.xi 
4382*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubNewVSyncMode = FALSE; //restore to original mode
4383*53ee8cc1Swenshuai.xi     }
4384*53ee8cc1Swenshuai.xi 
4385*53ee8cc1Swenshuai.xi 
4386*53ee8cc1Swenshuai.xi     // + S3, set default IMG_HSTR, IMG_VSTR0, IMG_VSTR1
4387*53ee8cc1Swenshuai.xi #ifdef _SUPPORT_IMG_OFFSET_
4388*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_HSTR    ), LOWBYTE( ptiming->u16HImg_Start));
4389*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_HSTR + 1), HIGHBYTE( ptiming->u16HImg_Start ));
4390*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_VSTR0   ), LOWBYTE( ptiming->u16VImg_Start0));
4391*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_VSTR0+ 1), HIGHBYTE( ptiming->u16VImg_Start0 ));
4392*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_VSTR1   ), LOWBYTE( ptiming->u16VImg_Start1 ));
4393*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_VSTR1+ 1), HIGHBYTE( ptiming->u16VImg_Start1 ));
4394*53ee8cc1Swenshuai.xi #else
4395*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_HSTR    ), LOWBYTE( ptiming->u16HActive_Start ));
4396*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_HSTR + 1), HIGHBYTE( ptiming->u16HActive_Start ));
4397*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_VSTR0   ), LOWBYTE( ptiming->u16VBlank0_End ));
4398*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_VSTR0+ 1), HIGHBYTE( ptiming->u16VBlank0_End ));
4399*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_VSTR1   ), LOWBYTE( ptiming->u16VBlank1_End ));
4400*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_IMG_VSTR1+ 1), HIGHBYTE( ptiming->u16VBlank1_End ));
4401*53ee8cc1Swenshuai.xi #endif
4402*53ee8cc1Swenshuai.xi     // select mvop output from frame color(black)
4403*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TST_IMG + 1), 0x10);
4404*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_U_PAT      ), 0x80);
4405*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_U_PAT   + 1), 0x80);
4406*53ee8cc1Swenshuai.xi     // set mvop src to test pattern
4407*53ee8cc1Swenshuai.xi     regval = HAL_ReadByte(SUB_REG(VOP_TST_IMG));
4408*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TST_IMG), 0x02);
4409*53ee8cc1Swenshuai.xi     // make changed registers take effect
4410*53ee8cc1Swenshuai.xi     HAL_MVOP_SubLoadReg();
4411*53ee8cc1Swenshuai.xi 
4412*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetMIUReqMask(TRUE);
4413*53ee8cc1Swenshuai.xi     // reset mvop to avoid timing change cause mvop hang-up
4414*53ee8cc1Swenshuai.xi     HAL_MVOP_SubRst();
4415*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetMIUReqMask(FALSE);
4416*53ee8cc1Swenshuai.xi 
4417*53ee8cc1Swenshuai.xi     // select mvop output from mvd
4418*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TST_IMG), 0x00);
4419*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_TST_IMG), regval);
4420*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_CTRL0), ptiming->bHDuplicate, BIT2);// H pixel duplicate
4421*53ee8cc1Swenshuai.xi 
4422*53ee8cc1Swenshuai.xi #if 0
4423*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF("\nMVOP SetOutputTiming\n");)
4424*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" VTot=%u,\t",ptiming->u16V_TotalCount);)
4425*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" HTot=%u,\t",ptiming->u16H_TotalCount);)
4426*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" I/P=%u\n",ptiming->bInterlace);)
4427*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" W=%u,\t",ptiming->u16Width);)
4428*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" H=%u,\t",ptiming->u16Height);)
4429*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" FRate=%u,\t",ptiming->u8Framerate);)
4430*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" HFreq=%u\n",ptiming->u16H_Freq);)
4431*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" Num=0x%x,\t",ptiming->u16Num);)
4432*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" Den=0x%x,\t",ptiming->u16Den);)
4433*53ee8cc1Swenshuai.xi     MVOP_DBG(MVOP_PRINTF(" u16ExpFRate=%u #\n\n", ptiming->u16ExpFrameRate);)
4434*53ee8cc1Swenshuai.xi #endif
4435*53ee8cc1Swenshuai.xi }
4436*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetDCClk(MS_U8 clkNum,MS_BOOL bEnable)4437*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetDCClk(MS_U8 clkNum, MS_BOOL bEnable)
4438*53ee8cc1Swenshuai.xi {
4439*53ee8cc1Swenshuai.xi     MS_ASSERT( (clkNum==0) || (clkNum==1) );
4440*53ee8cc1Swenshuai.xi     if (clkNum==0)
4441*53ee8cc1Swenshuai.xi     {
4442*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_CKG_SUB_DC0, !bEnable, CKG_SUB_DC0_GATED);
4443*53ee8cc1Swenshuai.xi     }
4444*53ee8cc1Swenshuai.xi }
4445*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetDCSRAMClk(MS_U8 clkNum,MS_BOOL bEnable)4446*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetDCSRAMClk(MS_U8 clkNum, MS_BOOL bEnable)
4447*53ee8cc1Swenshuai.xi {
4448*53ee8cc1Swenshuai.xi     MS_ASSERT( (clkNum==0) || (clkNum==1) );
4449*53ee8cc1Swenshuai.xi     if (clkNum==0)
4450*53ee8cc1Swenshuai.xi     {
4451*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_CKG_DC_SRAM, !bEnable, CKG_DC1_SRAM);
4452*53ee8cc1Swenshuai.xi     }
4453*53ee8cc1Swenshuai.xi }
4454*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetSynClk(MVOP_Timing * ptiming)4455*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetSynClk(MVOP_Timing *ptiming)
4456*53ee8cc1Swenshuai.xi {
4457*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
4458*53ee8cc1Swenshuai.xi     {
4459*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
4460*53ee8cc1Swenshuai.xi         return;
4461*53ee8cc1Swenshuai.xi     }
4462*53ee8cc1Swenshuai.xi 
4463*53ee8cc1Swenshuai.xi     if ( g_pHalMVOPCtx->bIs265DV == 1)
4464*53ee8cc1Swenshuai.xi     {
4465*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubEnableFreerunMode = g_pHalMVOPCtx->bEnableFreerunMode;
4466*53ee8cc1Swenshuai.xi         _bSubEnable60P = _bEnable60P;
4467*53ee8cc1Swenshuai.xi         _bSubEnable4k2kClk = _bEnable4k2kClk;
4468*53ee8cc1Swenshuai.xi     }
4469*53ee8cc1Swenshuai.xi 
4470*53ee8cc1Swenshuai.xi     if(g_pHalMVOPCtx->bSubEnableFreerunMode)
4471*53ee8cc1Swenshuai.xi     {
4472*53ee8cc1Swenshuai.xi         MS_U64 u64mpll_clock = MPLL_CLOCK_216 << 27 ; //mvop hw bug, tsp default use 216MHz mpll clock @ maserati
4473*53ee8cc1Swenshuai.xi         if(HAL_ReadRegBit(REG_CLK_SYN_STC, BIT0) == BIT4) //check stc1 clock use 432 or 216
4474*53ee8cc1Swenshuai.xi         {
4475*53ee8cc1Swenshuai.xi             u64mpll_clock = MPLL_CLOCK_432 << 27 ;
4476*53ee8cc1Swenshuai.xi         }
4477*53ee8cc1Swenshuai.xi         MS_U64 u64exp_clock = (((MS_U64)ptiming->u16H_TotalCount * (MS_U64)ptiming->u16V_TotalCount * (MS_U64)ptiming->u16ExpFrameRate)/1000);
4478*53ee8cc1Swenshuai.xi         do_div(u64mpll_clock, u64exp_clock);
4479*53ee8cc1Swenshuai.xi         MS_U32 u32FreerunClk = (MS_U32)u64mpll_clock;
4480*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetFrequency(HALMVOP_FREERUNMODE);
4481*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC1_FREERUN_CW_L  ), LOWBYTE((MS_U16)u32FreerunClk));
4482*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC1_FREERUN_CW_L+1), HIGHBYTE((MS_U16)u32FreerunClk));
4483*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC1_FREERUN_CW_H  ), LOWBYTE((MS_U16)(u32FreerunClk >> 16)));
4484*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC1_FREERUN_CW_H+1), HIGHBYTE((MS_U16)(u32FreerunClk >> 16)));
4485*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_UPDATE_DC1_CW, 1, UPDATE_DC1_FREERUN_CW);
4486*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_UPDATE_DC1_CW, 0, UPDATE_DC1_FREERUN_CW);
4487*53ee8cc1Swenshuai.xi     }
4488*53ee8cc1Swenshuai.xi     else if (_bSubEnable60P)
4489*53ee8cc1Swenshuai.xi     {
4490*53ee8cc1Swenshuai.xi         //Set DC1 Timing
4491*53ee8cc1Swenshuai.xi         MS_U32 u32FrameRate = (MS_U32)ptiming->u16ExpFrameRate;
4492*53ee8cc1Swenshuai.xi         MS_U32 u32VSize = 1024;
4493*53ee8cc1Swenshuai.xi         MS_U32 u32HSize = ((86400000 / u32FrameRate) * 1000) / u32VSize;
4494*53ee8cc1Swenshuai.xi 
4495*53ee8cc1Swenshuai.xi         if(u32HSize > 4096)
4496*53ee8cc1Swenshuai.xi             MVOP_PRINTF("[Warning] xc support u32HSize > 4096 after CL 712830\n");
4497*53ee8cc1Swenshuai.xi 
4498*53ee8cc1Swenshuai.xi 
4499*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetFrequency(HAL_MVOP_SubGetMaxFreerunClk());
4500*53ee8cc1Swenshuai.xi 
4501*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_YC422_EN_H), 0, VOP_FRAME_RST); // reg_frame_rst = 0
4502*53ee8cc1Swenshuai.xi 
4503*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_CTRL0), DISABLE, VOP_FSYNC_EN); // frame sync disable
4504*53ee8cc1Swenshuai.xi     }
4505*53ee8cc1Swenshuai.xi     else if (_bSubEnable4k2kClk)
4506*53ee8cc1Swenshuai.xi     {
4507*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetFrequency(HAL_MVOP_SubGet4k2kClk());
4508*53ee8cc1Swenshuai.xi 
4509*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_YC422_EN_H), 0, VOP_FRAME_RST); // reg_frame_rst = 0
4510*53ee8cc1Swenshuai.xi 
4511*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_CTRL0), DISABLE, VOP_FSYNC_EN); // frame sync disable
4512*53ee8cc1Swenshuai.xi     }
4513*53ee8cc1Swenshuai.xi     else
4514*53ee8cc1Swenshuai.xi     {
4515*53ee8cc1Swenshuai.xi         HAL_MVOP_SubSetFrequency(HALMVOP_SYNCMODE);
4516*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC1_NUM  ), LOWBYTE( ptiming->u16Num));
4517*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC1_NUM+1), HIGHBYTE(ptiming->u16Num));
4518*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC1_DEN  ), LOWBYTE( ptiming->u16Den));
4519*53ee8cc1Swenshuai.xi         HAL_WriteByte((REG_DC1_DEN+1), HIGHBYTE(ptiming->u16Den));
4520*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_UPDATE_DC1_CW, 1, UPDATE_DC1_SYNC_CW);
4521*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(REG_UPDATE_DC1_CW, 0, UPDATE_DC1_SYNC_CW);
4522*53ee8cc1Swenshuai.xi     }
4523*53ee8cc1Swenshuai.xi }
4524*53ee8cc1Swenshuai.xi 
4525*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetMonoMode(MS_BOOL bEnable)4526*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetMonoMode(MS_BOOL bEnable)
4527*53ee8cc1Swenshuai.xi {
4528*53ee8cc1Swenshuai.xi     if(bEnable)
4529*53ee8cc1Swenshuai.xi     {
4530*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_U_PAT  ), 0x80);
4531*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_U_PAT+1), 0x80);
4532*53ee8cc1Swenshuai.xi 
4533*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH1), 1, BIT1);    // Mono mode enable
4534*53ee8cc1Swenshuai.xi     }
4535*53ee8cc1Swenshuai.xi     else
4536*53ee8cc1Swenshuai.xi     {
4537*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH1), 0, BIT1);    //Mono mode disable
4538*53ee8cc1Swenshuai.xi     }
4539*53ee8cc1Swenshuai.xi }
4540*53ee8cc1Swenshuai.xi 
4541*53ee8cc1Swenshuai.xi /******************************************************************************/
4542*53ee8cc1Swenshuai.xi /// Set MVOP for H264  Hardwire Mode
4543*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SubSetH264HardwireMode(void)4544*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetH264HardwireMode(void)
4545*53ee8cc1Swenshuai.xi {
4546*53ee8cc1Swenshuai.xi     // Hardwire mode
4547*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_MPG_JPG_SWITCH), 0x00);
4548*53ee8cc1Swenshuai.xi 
4549*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_STRIP_ALIGN), 0, BIT0);
4550*53ee8cc1Swenshuai.xi 
4551*53ee8cc1Swenshuai.xi     //16*32 tile format
4552*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 1, BIT1);
4553*53ee8cc1Swenshuai.xi 
4554*53ee8cc1Swenshuai.xi     // SVD mode enable
4555*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_INPUT_SWITCH1), BIT3, BIT2|BIT3);
4556*53ee8cc1Swenshuai.xi 
4557*53ee8cc1Swenshuai.xi     // set mvop to 64bit interface
4558*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_MIU_IF), VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
4559*53ee8cc1Swenshuai.xi 
4560*53ee8cc1Swenshuai.xi     // Only for Monaco: Disable deciding bot by top address + 2
4561*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), 0, VOP_FIELD_FROM_ADDR);
4562*53ee8cc1Swenshuai.xi 
4563*53ee8cc1Swenshuai.xi     // Enable mfdec setting from wb from Manhattan
4564*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_MFDEC_2_L), 1, VOP_MF_FROM_WB);
4565*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_DUMMY), 1, VOP_32x32_WB); //32x32 from wb
4566*53ee8cc1Swenshuai.xi 
4567*53ee8cc1Swenshuai.xi     // H264 use WISHBONE(R2) interface
4568*53ee8cc1Swenshuai.xi     //HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 1, VOP_R2_WISHBONE);
4569*53ee8cc1Swenshuai.xi 
4570*53ee8cc1Swenshuai.xi     // Write trigger
4571*53ee8cc1Swenshuai.xi     HAL_MVOP_SubLoadReg();
4572*53ee8cc1Swenshuai.xi }
4573*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubEnableMVDInterface(MS_BOOL bEnable)4574*53ee8cc1Swenshuai.xi void HAL_MVOP_SubEnableMVDInterface(MS_BOOL bEnable)
4575*53ee8cc1Swenshuai.xi {
4576*53ee8cc1Swenshuai.xi     MS_BOOL bMVOPMain2MVD = TRUE;
4577*53ee8cc1Swenshuai.xi     bMVOPMain2MVD = (bEnable) ? FALSE : TRUE;
4578*53ee8cc1Swenshuai.xi 
4579*53ee8cc1Swenshuai.xi     //This bit is only valid in main mvop bank.
4580*53ee8cc1Swenshuai.xi     //Select which mvop interrupt that mvd f/w recieve: 1 for main; 0 for sub.
4581*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(VOP_INPUT_SWITCH1, bMVOPMain2MVD, VOP_MVD_EN);
4582*53ee8cc1Swenshuai.xi 
4583*53ee8cc1Swenshuai.xi     //No need to "Write trigger" since HAL_MVOP_SubSetInputMode() will do it later.
4584*53ee8cc1Swenshuai.xi     //HAL_MVOP_SubLoadReg();
4585*53ee8cc1Swenshuai.xi }
4586*53ee8cc1Swenshuai.xi 
4587*53ee8cc1Swenshuai.xi /******************************************************************************/
4588*53ee8cc1Swenshuai.xi /// Set MVOP for RM  Hardwire Mode
4589*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SubSetRMHardwireMode(void)4590*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetRMHardwireMode(void)
4591*53ee8cc1Swenshuai.xi {
4592*53ee8cc1Swenshuai.xi     HAL_MVOP_SubSetH264HardwireMode();
4593*53ee8cc1Swenshuai.xi }
4594*53ee8cc1Swenshuai.xi 
4595*53ee8cc1Swenshuai.xi /******************************************************************************/
4596*53ee8cc1Swenshuai.xi /// Set MVOP for JPEG Hardwire Mode
4597*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SubSetJpegHardwireMode(void)4598*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetJpegHardwireMode(void)
4599*53ee8cc1Swenshuai.xi {
4600*53ee8cc1Swenshuai.xi     MS_U8 regval = 0x00;
4601*53ee8cc1Swenshuai.xi 
4602*53ee8cc1Swenshuai.xi     //16*32 tile format
4603*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 1, BIT1);
4604*53ee8cc1Swenshuai.xi 
4605*53ee8cc1Swenshuai.xi     // set mvop to 64bit interface
4606*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_MIU_IF), VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
4607*53ee8cc1Swenshuai.xi 
4608*53ee8cc1Swenshuai.xi     regval |= 0x80; // packmode
4609*53ee8cc1Swenshuai.xi     regval |= 0x20; // Dram Rd Contd
4610*53ee8cc1Swenshuai.xi     regval |= 0x10; // reg_img422
4611*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_MPG_JPG_SWITCH), regval);
4612*53ee8cc1Swenshuai.xi     /* There is no hardwire:mvd2dc_img422/hvd2dc_img422 0x20[4] in sub mvop*/
4613*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_INFO_FROM_CODEC_L), 0, VOP_INFO_FROM_CODEC_422_FMT);
4614*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIs422 = 1;
4615*53ee8cc1Swenshuai.xi 	HAL_WriteRegBit(SUB_REG(VOP_REG_DUMMY), 0, VOP_420_BW_SAVE);
4616*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_BW_SAVE), 0, VOP_420_BW_SAVE_EX);
4617*53ee8cc1Swenshuai.xi 
4618*53ee8cc1Swenshuai.xi     // Write trigger
4619*53ee8cc1Swenshuai.xi     HAL_MVOP_SubLoadReg();
4620*53ee8cc1Swenshuai.xi }
4621*53ee8cc1Swenshuai.xi /******************************************************************************/
4622*53ee8cc1Swenshuai.xi /// Set MVOP for EVD Hardwire Mode
4623*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SubSetEVDHardwireMode(MS_U16 u16ECOVersion)4624*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetEVDHardwireMode(MS_U16 u16ECOVersion)
4625*53ee8cc1Swenshuai.xi {
4626*53ee8cc1Swenshuai.xi     UNUSED(u16ECOVersion);
4627*53ee8cc1Swenshuai.xi 
4628*53ee8cc1Swenshuai.xi     // Hardwire mode
4629*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_MPG_JPG_SWITCH), 0x00);
4630*53ee8cc1Swenshuai.xi 
4631*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_STRIP_ALIGN), 0, BIT0);
4632*53ee8cc1Swenshuai.xi 
4633*53ee8cc1Swenshuai.xi     //16*32 tile format
4634*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 1, BIT1);
4635*53ee8cc1Swenshuai.xi 
4636*53ee8cc1Swenshuai.xi     // EVD use HVD interface
4637*53ee8cc1Swenshuai.xi     //HAL_WriteByteMask(SUB_REG(VOP_INPUT_SWITCH1), BIT3, BIT2|BIT3);
4638*53ee8cc1Swenshuai.xi 
4639*53ee8cc1Swenshuai.xi     // EVD mode enable
4640*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 1, EVD_ENABLE);
4641*53ee8cc1Swenshuai.xi 
4642*53ee8cc1Swenshuai.xi     // set mvop to 128bit_i128 interface
4643*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_MIU_IF), VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
4644*53ee8cc1Swenshuai.xi 
4645*53ee8cc1Swenshuai.xi     // set evd flag for interlace mode setting
4646*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSubIsH265 = 1;
4647*53ee8cc1Swenshuai.xi 
4648*53ee8cc1Swenshuai.xi     // Enable mfdec setting from wb
4649*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_MFDEC_2_L), 1, VOP_MF_FROM_WB);
4650*53ee8cc1Swenshuai.xi 
4651*53ee8cc1Swenshuai.xi     // 10 bits from wb
4652*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_INFO_FROM_CODEC_H), 1, VOP_INFO_FROM_CODEC_10BIT);
4653*53ee8cc1Swenshuai.xi 
4654*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_REG_MASK), 0, VOP_LSB_REQ_MASK); //10 bits bw control by vdec fw
4655*53ee8cc1Swenshuai.xi 
4656*53ee8cc1Swenshuai.xi     // Write trigger
4657*53ee8cc1Swenshuai.xi     HAL_MVOP_SubLoadReg();
4658*53ee8cc1Swenshuai.xi }
4659*53ee8cc1Swenshuai.xi 
4660*53ee8cc1Swenshuai.xi /******************************************************************************/
4661*53ee8cc1Swenshuai.xi /// Set MVOP for VP9 Hardwire Mode
4662*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SubSetVP9HardwireMode(void)4663*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetVP9HardwireMode(void)
4664*53ee8cc1Swenshuai.xi {
4665*53ee8cc1Swenshuai.xi     // Hardwire mode
4666*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_MPG_JPG_SWITCH), 0x00);
4667*53ee8cc1Swenshuai.xi 
4668*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_STRIP_ALIGN), 0, BIT0);
4669*53ee8cc1Swenshuai.xi 
4670*53ee8cc1Swenshuai.xi     //16*32 tile format
4671*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), 1, BIT1);
4672*53ee8cc1Swenshuai.xi 
4673*53ee8cc1Swenshuai.xi     // Enable VP9 dram continue mode
4674*53ee8cc1Swenshuai.xi     //HAL_WriteRegBit(SUB_REG(VOP_MPG_JPG_SWITCH), 1, VOP_DRAM_RD_MODE);
4675*53ee8cc1Swenshuai.xi 
4676*53ee8cc1Swenshuai.xi     // set mvop to 128bit_i128 interface
4677*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_MIU_IF), VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
4678*53ee8cc1Swenshuai.xi 
4679*53ee8cc1Swenshuai.xi     // Enable mfdec setting from wb
4680*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_MFDEC_2_L), 1, VOP_MF_FROM_WB);
4681*53ee8cc1Swenshuai.xi 
4682*53ee8cc1Swenshuai.xi     // EVD mode enable
4683*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_INPUT_SWITCH0), 1, EVD_ENABLE);
4684*53ee8cc1Swenshuai.xi 
4685*53ee8cc1Swenshuai.xi     // 10 bits from wb
4686*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_INFO_FROM_CODEC_H), 1, VOP_INFO_FROM_CODEC_10BIT);
4687*53ee8cc1Swenshuai.xi 
4688*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(SUB_REG(VOP_REG_MASK), 0, VOP_LSB_REQ_MASK); //10 bits bw control by vdec fw
4689*53ee8cc1Swenshuai.xi 
4690*53ee8cc1Swenshuai.xi     // Write trigger
4691*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
4692*53ee8cc1Swenshuai.xi 
4693*53ee8cc1Swenshuai.xi }
4694*53ee8cc1Swenshuai.xi 
4695*53ee8cc1Swenshuai.xi 
4696*53ee8cc1Swenshuai.xi ///Enable 3D L/R dual buffer mode
HAL_MVOP_SubEnable3DLR(MS_BOOL bEnable)4697*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubEnable3DLR(MS_BOOL bEnable)
4698*53ee8cc1Swenshuai.xi {
4699*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
4700*53ee8cc1Swenshuai.xi     {
4701*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
4702*53ee8cc1Swenshuai.xi         return FALSE;
4703*53ee8cc1Swenshuai.xi     }
4704*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MULTI_WIN_CFG0), bEnable, VOP_LR_BUF_MODE);
4705*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSub3DLRMode = bEnable;
4706*53ee8cc1Swenshuai.xi     if(bEnable)
4707*53ee8cc1Swenshuai.xi     {
4708*53ee8cc1Swenshuai.xi         //only for monaco: do not wait for data ready.
4709*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_NOT_WAIT_READ_DATA), 2, VOP_NOT_WAIT_RDLAT);
4710*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_BW_SAVE), 0, VOP_420_BW_SAVE_EX);
4711*53ee8cc1Swenshuai.xi     }
4712*53ee8cc1Swenshuai.xi     else
4713*53ee8cc1Swenshuai.xi     {
4714*53ee8cc1Swenshuai.xi         HAL_WriteByteMask(SUB_REG(VOP_NOT_WAIT_READ_DATA), 0, VOP_NOT_WAIT_RDLAT);
4715*53ee8cc1Swenshuai.xi     }
4716*53ee8cc1Swenshuai.xi     return TRUE;
4717*53ee8cc1Swenshuai.xi }
4718*53ee8cc1Swenshuai.xi 
4719*53ee8cc1Swenshuai.xi ///Get if 3D L/R mode is enabled
HAL_MVOP_SubGet3DLRMode(void)4720*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubGet3DLRMode(void)
4721*53ee8cc1Swenshuai.xi {
4722*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
4723*53ee8cc1Swenshuai.xi     {
4724*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
4725*53ee8cc1Swenshuai.xi         return FALSE;
4726*53ee8cc1Swenshuai.xi     }
4727*53ee8cc1Swenshuai.xi     return g_pHalMVOPCtx->bSub3DLRMode;
4728*53ee8cc1Swenshuai.xi }
4729*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubGetTimingInfoFromRegisters(MVOP_TimingInfo_FromRegisters * pMvopTimingInfo)4730*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubGetTimingInfoFromRegisters(MVOP_TimingInfo_FromRegisters *pMvopTimingInfo)
4731*53ee8cc1Swenshuai.xi {
4732*53ee8cc1Swenshuai.xi     if(NULL == pMvopTimingInfo)
4733*53ee8cc1Swenshuai.xi     {
4734*53ee8cc1Swenshuai.xi         MVOP_PRINTF("HAL_MVOP_SubGetTimingInfoFromRegisters():pMvopTimingInfo is NULL\n");
4735*53ee8cc1Swenshuai.xi         return FALSE;
4736*53ee8cc1Swenshuai.xi     }
4737*53ee8cc1Swenshuai.xi     if(HAL_MVOP_SubGetEnableState() == FALSE)
4738*53ee8cc1Swenshuai.xi     {
4739*53ee8cc1Swenshuai.xi         MVOP_PRINTF("MVOP is not enabled!\n");
4740*53ee8cc1Swenshuai.xi         pMvopTimingInfo->bEnabled = FALSE;
4741*53ee8cc1Swenshuai.xi         return FALSE;
4742*53ee8cc1Swenshuai.xi     }
4743*53ee8cc1Swenshuai.xi     pMvopTimingInfo->bEnabled = TRUE;
4744*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16H_TotalCount = (HAL_ReadByte(SUB_REG(VOP_FRAME_HCOUNT + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_FRAME_HCOUNT)));
4745*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16V_TotalCount = (HAL_ReadByte(SUB_REG(VOP_FRAME_VCOUNT + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_FRAME_VCOUNT)));
4746*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16VBlank0_Start = (HAL_ReadByte(SUB_REG(VOP_VB0_STR + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_VB0_STR)));
4747*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16VBlank0_End = (HAL_ReadByte(SUB_REG(VOP_VB0_END + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_VB0_END)));
4748*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16VBlank1_Start = (HAL_ReadByte(SUB_REG(VOP_VB1_STR + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_VB1_STR)));
4749*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16VBlank1_End = (HAL_ReadByte(SUB_REG(VOP_VB1_END + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_VB1_END)));
4750*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16TopField_Start = (HAL_ReadByte(SUB_REG(VOP_TF_STR + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_TF_STR)));
4751*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16BottomField_Start = (HAL_ReadByte(SUB_REG(VOP_BF_STR + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_BF_STR)));
4752*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16HActive_Start = (HAL_ReadByte(SUB_REG(VOP_HACT_STR + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_HACT_STR)));
4753*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16TopField_VS = (HAL_ReadByte(SUB_REG(VOP_TF_VS + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_TF_VS)));
4754*53ee8cc1Swenshuai.xi     pMvopTimingInfo->u16BottomField_VS = (HAL_ReadByte(SUB_REG(VOP_BF_VS + 1)<< 8)) | (HAL_ReadByte(SUB_REG(VOP_BF_VS)));
4755*53ee8cc1Swenshuai.xi     pMvopTimingInfo->bInterlace = (HAL_ReadRegBit(SUB_REG(VOP_CTRL0), BIT7) == BIT7);
4756*53ee8cc1Swenshuai.xi     return TRUE;
4757*53ee8cc1Swenshuai.xi }
4758*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetYUVBaseAdd(MS_PHY u32YOffset,MS_PHY u32UVOffset,MS_BOOL bProgressive,MS_BOOL b422pack)4759*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetYUVBaseAdd(MS_PHY u32YOffset, MS_PHY u32UVOffset, MS_BOOL bProgressive, MS_BOOL b422pack)
4760*53ee8cc1Swenshuai.xi {
4761*53ee8cc1Swenshuai.xi     MS_PHY u64tmp = 0;
4762*53ee8cc1Swenshuai.xi 
4763*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
4764*53ee8cc1Swenshuai.xi     {
4765*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
4766*53ee8cc1Swenshuai.xi         return;
4767*53ee8cc1Swenshuai.xi     }
4768*53ee8cc1Swenshuai.xi     // Y offset
4769*53ee8cc1Swenshuai.xi     u64tmp = u32YOffset >> 3;
4770*53ee8cc1Swenshuai.xi     if ( !bProgressive )
4771*53ee8cc1Swenshuai.xi     {   //Refine Y offset for interlace repeat bottom field
4772*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eSubRepeatField)
4773*53ee8cc1Swenshuai.xi         {
4774*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eSubRepeatField);
4775*53ee8cc1Swenshuai.xi             u64tmp += 2;
4776*53ee8cc1Swenshuai.xi         }
4777*53ee8cc1Swenshuai.xi         else
4778*53ee8cc1Swenshuai.xi         {
4779*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is TOP or NONE.\n", __LINE__, g_pHalMVOPCtx->eSubRepeatField);
4780*53ee8cc1Swenshuai.xi         }
4781*53ee8cc1Swenshuai.xi     }
4782*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_L), u64tmp & 0xff);
4783*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_L+1), (u64tmp >> 8) & 0xff);
4784*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_L+2), (u64tmp >> 16) & 0xff);
4785*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_L+3), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
4786*53ee8cc1Swenshuai.xi 
4787*53ee8cc1Swenshuai.xi     if (!bProgressive )
4788*53ee8cc1Swenshuai.xi     {  //Y offset of bottom field if interlace
4789*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_YSTR1_L), u64tmp & 0xff);
4790*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_YSTR1_L+1), (u64tmp >> 8) & 0xff);
4791*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_YSTR1_L+2), (u64tmp >> 16) & 0xff);
4792*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_YSTR1_L+3), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
4793*53ee8cc1Swenshuai.xi     }
4794*53ee8cc1Swenshuai.xi 
4795*53ee8cc1Swenshuai.xi     if (b422pack)
4796*53ee8cc1Swenshuai.xi     {
4797*53ee8cc1Swenshuai.xi         if (HAL_ReadRegBit(SUB_REG(VOP_MIU_IF), VOP_MIU_128B_I64) != VOP_MIU_128B_I64) //128-bit
4798*53ee8cc1Swenshuai.xi         {
4799*53ee8cc1Swenshuai.xi             u32UVOffset = u32YOffset + 16; //add 16 for 128bit; add 8 for 64bit
4800*53ee8cc1Swenshuai.xi         }
4801*53ee8cc1Swenshuai.xi         else    //64-bit
4802*53ee8cc1Swenshuai.xi         {
4803*53ee8cc1Swenshuai.xi             u32UVOffset = u32YOffset + 8; //add 16 for 128bit; add 8 for 64bit
4804*53ee8cc1Swenshuai.xi         }
4805*53ee8cc1Swenshuai.xi     }
4806*53ee8cc1Swenshuai.xi         // UV offset
4807*53ee8cc1Swenshuai.xi     u64tmp = u32UVOffset >> 3;
4808*53ee8cc1Swenshuai.xi     if( !bProgressive )
4809*53ee8cc1Swenshuai.xi     {  //Refine UV offset for interlace repeat bottom field
4810*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eSubRepeatField)
4811*53ee8cc1Swenshuai.xi         {
4812*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eSubRepeatField);
4813*53ee8cc1Swenshuai.xi             u64tmp += 2;
4814*53ee8cc1Swenshuai.xi         }
4815*53ee8cc1Swenshuai.xi         else
4816*53ee8cc1Swenshuai.xi         {
4817*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is TOP/NONE.\n", __LINE__, g_pHalMVOPCtx->eSubRepeatField);
4818*53ee8cc1Swenshuai.xi         }
4819*53ee8cc1Swenshuai.xi     }
4820*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_L), u64tmp & 0xff);
4821*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_L+1), (u64tmp >> 8) & 0xff);
4822*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_L+2), (u64tmp >> 16) & 0xff);
4823*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_L+3), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
4824*53ee8cc1Swenshuai.xi 
4825*53ee8cc1Swenshuai.xi     if( !bProgressive )
4826*53ee8cc1Swenshuai.xi     {  //UV offset of bottom field if interlace
4827*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR1_L), u64tmp & 0xff);
4828*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR1_L+1), (u64tmp >> 8) & 0xff);
4829*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR1_L+2), (u64tmp >> 16) & 0xff);
4830*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR1_L+3), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
4831*53ee8cc1Swenshuai.xi     }
4832*53ee8cc1Swenshuai.xi 
4833*53ee8cc1Swenshuai.xi     return;
4834*53ee8cc1Swenshuai.xi }
4835*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubGetYBaseAdd(void)4836*53ee8cc1Swenshuai.xi MS_PHY HAL_MVOP_SubGetYBaseAdd(void)
4837*53ee8cc1Swenshuai.xi {
4838*53ee8cc1Swenshuai.xi     MS_PHY u64YOffset;
4839*53ee8cc1Swenshuai.xi     u64YOffset = HAL_ReadByte(SUB_REG(VOP_JPG_YSTR0_L))&0xff;
4840*53ee8cc1Swenshuai.xi     u64YOffset |=((HAL_ReadByte(SUB_REG(VOP_JPG_YSTR0_L+1))<<8)&0xff00);
4841*53ee8cc1Swenshuai.xi     u64YOffset |=((HAL_ReadByte(SUB_REG(VOP_JPG_YSTR0_L+2))<<16)&0xff0000);
4842*53ee8cc1Swenshuai.xi     u64YOffset |= ((HAL_ReadByte(SUB_REG(VOP_JPG_YSTR0_L+3)) & VOP_YUV_STR_HIBITS) <<24);
4843*53ee8cc1Swenshuai.xi     return u64YOffset;
4844*53ee8cc1Swenshuai.xi }
4845*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubGetUVBaseAdd(void)4846*53ee8cc1Swenshuai.xi MS_PHY HAL_MVOP_SubGetUVBaseAdd(void)
4847*53ee8cc1Swenshuai.xi {
4848*53ee8cc1Swenshuai.xi     MS_PHY u64UVOffset;
4849*53ee8cc1Swenshuai.xi     u64UVOffset = HAL_ReadByte(SUB_REG(VOP_JPG_UVSTR0_L))&0xff;
4850*53ee8cc1Swenshuai.xi     u64UVOffset |=((HAL_ReadByte(SUB_REG(VOP_JPG_UVSTR0_L+1))<<8)&0xff00);
4851*53ee8cc1Swenshuai.xi     u64UVOffset |=((HAL_ReadByte(SUB_REG(VOP_JPG_UVSTR0_L+2))<<16)&0xff0000);
4852*53ee8cc1Swenshuai.xi     u64UVOffset |= ((HAL_ReadByte(SUB_REG(VOP_JPG_UVSTR0_L+3)) & VOP_YUV_STR_HIBITS) <<24);
4853*53ee8cc1Swenshuai.xi     return u64UVOffset;
4854*53ee8cc1Swenshuai.xi }
4855*53ee8cc1Swenshuai.xi 
4856*53ee8cc1Swenshuai.xi /******************************************************************************/
4857*53ee8cc1Swenshuai.xi /// Set MVOP Saving BW Mode
4858*53ee8cc1Swenshuai.xi /// @ Napoli this command should be set after MDrv_MVOP_SubSetOutputCfg
4859*53ee8cc1Swenshuai.xi /******************************************************************************/
HAL_MVOP_SubSet420BWSaveMode(MS_BOOL bEnable)4860*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubSet420BWSaveMode(MS_BOOL bEnable)
4861*53ee8cc1Swenshuai.xi {
4862*53ee8cc1Swenshuai.xi MS_BOOL bValue = FALSE;
4863*53ee8cc1Swenshuai.xi 
4864*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)
4865*53ee8cc1Swenshuai.xi     bValue = (g_pHalMVOPCtx->bSub3DLRAltSBSOutput || g_pHalMVOPCtx->bSub3DLRAltOutput /*|| g_pHalMVOPCtx->bSub3DLRMode*/ || g_pHalMVOPCtx->bSubIs422 );
4866*53ee8cc1Swenshuai.xi 
4867*53ee8cc1Swenshuai.xi     if(bValue)
4868*53ee8cc1Swenshuai.xi     {
4869*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s Hit the limitation of saving bw, disable BW Saving mode\n", __FUNCTION__);)
4870*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_DUMMY), 0, VOP_420_BW_SAVE);
4871*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_BW_SAVE), 0, VOP_420_BW_SAVE_EX);
4872*53ee8cc1Swenshuai.xi         HAL_MVOP_SubLoadReg();
4873*53ee8cc1Swenshuai.xi         return FALSE;
4874*53ee8cc1Swenshuai.xi     }
4875*53ee8cc1Swenshuai.xi     else
4876*53ee8cc1Swenshuai.xi     {
4877*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_DUMMY), bEnable, VOP_420_BW_SAVE);
4878*53ee8cc1Swenshuai.xi         if( g_pHalMVOPCtx->bSub3DLRMode == FALSE)
4879*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(SUB_REG(VOP_REG_BW_SAVE), bEnable, VOP_420_BW_SAVE_EX);
4880*53ee8cc1Swenshuai.xi         else
4881*53ee8cc1Swenshuai.xi             HAL_WriteRegBit(SUB_REG(VOP_REG_BW_SAVE), 0, VOP_420_BW_SAVE_EX);
4882*53ee8cc1Swenshuai.xi 
4883*53ee8cc1Swenshuai.xi         HAL_MVOP_SubLoadReg();
4884*53ee8cc1Swenshuai.xi         return TRUE;
4885*53ee8cc1Swenshuai.xi     }
4886*53ee8cc1Swenshuai.xi }
4887*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetEVDYUVBaseAdd(MVOP_EVDBaseAddInput * stEVDBaseAddInfo)4888*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubSetEVDYUVBaseAdd(MVOP_EVDBaseAddInput *stEVDBaseAddInfo)
4889*53ee8cc1Swenshuai.xi {
4890*53ee8cc1Swenshuai.xi     //----------------------------------------------------
4891*53ee8cc1Swenshuai.xi     // Set MSB YUV Address
4892*53ee8cc1Swenshuai.xi     //----------------------------------------------------
4893*53ee8cc1Swenshuai.xi 
4894*53ee8cc1Swenshuai.xi     MS_PHY u64tmp = 0;
4895*53ee8cc1Swenshuai.xi 
4896*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
4897*53ee8cc1Swenshuai.xi     {
4898*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
4899*53ee8cc1Swenshuai.xi         return FALSE;
4900*53ee8cc1Swenshuai.xi     }
4901*53ee8cc1Swenshuai.xi     // Y offset
4902*53ee8cc1Swenshuai.xi     u64tmp = stEVDBaseAddInfo->u32MSBYOffset >> 3;
4903*53ee8cc1Swenshuai.xi     if ( !stEVDBaseAddInfo->bProgressive)
4904*53ee8cc1Swenshuai.xi     {   //Refine Y offset for interlace repeat bottom field
4905*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
4906*53ee8cc1Swenshuai.xi         {
4907*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
4908*53ee8cc1Swenshuai.xi             u64tmp += 2;
4909*53ee8cc1Swenshuai.xi         }
4910*53ee8cc1Swenshuai.xi         else
4911*53ee8cc1Swenshuai.xi         {
4912*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is TOP or NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
4913*53ee8cc1Swenshuai.xi         }
4914*53ee8cc1Swenshuai.xi     }
4915*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_L), u64tmp & 0xff);
4916*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_L+1), (u64tmp >> 8) & 0xff);
4917*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_H), (u64tmp >> 16) & 0xff);
4918*53ee8cc1Swenshuai.xi     HAL_WriteByte(SUB_REG(VOP_JPG_YSTR0_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
4919*53ee8cc1Swenshuai.xi 
4920*53ee8cc1Swenshuai.xi     if (!stEVDBaseAddInfo->bProgressive )
4921*53ee8cc1Swenshuai.xi     {   //Y offset of bottom field if interlace
4922*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_YSTR1_L), u64tmp & 0xff);
4923*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_YSTR1_L+1), (u64tmp >> 8) & 0xff);
4924*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_YSTR1_H), (u64tmp >> 16) & 0xff);
4925*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_YSTR1_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
4926*53ee8cc1Swenshuai.xi     }
4927*53ee8cc1Swenshuai.xi 
4928*53ee8cc1Swenshuai.xi     if (stEVDBaseAddInfo->b422Pack)
4929*53ee8cc1Swenshuai.xi     {
4930*53ee8cc1Swenshuai.xi         stEVDBaseAddInfo->u32MSBUVOffset = stEVDBaseAddInfo->u32MSBYOffset + 16; //add 16 for 128bit; add 8 for 64bit
4931*53ee8cc1Swenshuai.xi     }
4932*53ee8cc1Swenshuai.xi     // UV offset
4933*53ee8cc1Swenshuai.xi     u64tmp = stEVDBaseAddInfo->u32MSBUVOffset >> 3;
4934*53ee8cc1Swenshuai.xi     if( !stEVDBaseAddInfo->bProgressive )
4935*53ee8cc1Swenshuai.xi     {  //Refine UV offset for interlace repeat bottom field
4936*53ee8cc1Swenshuai.xi         if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
4937*53ee8cc1Swenshuai.xi         {
4938*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
4939*53ee8cc1Swenshuai.xi             u64tmp += 2;
4940*53ee8cc1Swenshuai.xi         }
4941*53ee8cc1Swenshuai.xi         else
4942*53ee8cc1Swenshuai.xi         {
4943*53ee8cc1Swenshuai.xi             MVOP_DBG("%d eRepeatField(%x) is TOP/NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
4944*53ee8cc1Swenshuai.xi         }
4945*53ee8cc1Swenshuai.xi     }
4946*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_L), u64tmp & 0xff);
4947*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_L+1), (u64tmp >> 8) & 0xff);
4948*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_H), (u64tmp >> 16) & 0xff);
4949*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR0_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
4950*53ee8cc1Swenshuai.xi 
4951*53ee8cc1Swenshuai.xi     if( !stEVDBaseAddInfo->bProgressive )
4952*53ee8cc1Swenshuai.xi     {  //UV offset of bottom field if interlace
4953*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR1_L), u64tmp & 0xff);
4954*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR1_L+1), (u64tmp >> 8) & 0xff);
4955*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR1_H), (u64tmp >> 16) & 0xff);
4956*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_JPG_UVSTR1_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
4957*53ee8cc1Swenshuai.xi     }
4958*53ee8cc1Swenshuai.xi 
4959*53ee8cc1Swenshuai.xi     //----------------------------------------------------
4960*53ee8cc1Swenshuai.xi     // Set MSB YUV Address
4961*53ee8cc1Swenshuai.xi     //----------------------------------------------------
4962*53ee8cc1Swenshuai.xi     if(stEVDBaseAddInfo->bEnLSB)
4963*53ee8cc1Swenshuai.xi     {
4964*53ee8cc1Swenshuai.xi         //Enable LSB
4965*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_EVD_10B_EN), 1, VOP_EVD_10B_Y_EN);
4966*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_EVD_10B_EN), 1, VOP_EVD_10B_UV_EN);
4967*53ee8cc1Swenshuai.xi         HAL_WriteRegBit(SUB_REG(VOP_REG_MASK), 0, VOP_LSB_REQ_MASK);
4968*53ee8cc1Swenshuai.xi 
4969*53ee8cc1Swenshuai.xi         // Y offset
4970*53ee8cc1Swenshuai.xi         u64tmp = stEVDBaseAddInfo->u32LSBYOffset >> 3;
4971*53ee8cc1Swenshuai.xi         if ( !stEVDBaseAddInfo->bProgressive)
4972*53ee8cc1Swenshuai.xi         {   //Refine Y offset for interlace repeat bottom field
4973*53ee8cc1Swenshuai.xi             if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
4974*53ee8cc1Swenshuai.xi             {
4975*53ee8cc1Swenshuai.xi                 MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
4976*53ee8cc1Swenshuai.xi                 u64tmp += 2;
4977*53ee8cc1Swenshuai.xi             }
4978*53ee8cc1Swenshuai.xi             else
4979*53ee8cc1Swenshuai.xi             {
4980*53ee8cc1Swenshuai.xi                 MVOP_DBG("%d eRepeatField(%x) is TOP or NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
4981*53ee8cc1Swenshuai.xi             }
4982*53ee8cc1Swenshuai.xi         }
4983*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_YSTR0_L), u64tmp & 0xff);
4984*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_YSTR0_L+1), (u64tmp >> 8) & 0xff);
4985*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_YSTR0_L), (u64tmp >> 16) & 0xff);
4986*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_YSTR0_L+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
4987*53ee8cc1Swenshuai.xi 
4988*53ee8cc1Swenshuai.xi         if (!stEVDBaseAddInfo->bProgressive )
4989*53ee8cc1Swenshuai.xi         {   //Y offset of bottom field if interlace
4990*53ee8cc1Swenshuai.xi             HAL_WriteByte(SUB_REG(VOP_LSB_YSTR1_L), u64tmp & 0xff);
4991*53ee8cc1Swenshuai.xi             HAL_WriteByte(SUB_REG(VOP_LSB_YSTR1_L+1), (u64tmp >> 8) & 0xff);
4992*53ee8cc1Swenshuai.xi             HAL_WriteByte(SUB_REG(VOP_LSB_YSTR1_H), (u64tmp >> 16) & 0xff);
4993*53ee8cc1Swenshuai.xi             HAL_WriteByte(SUB_REG(VOP_LSB_YSTR1_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
4994*53ee8cc1Swenshuai.xi         }
4995*53ee8cc1Swenshuai.xi 
4996*53ee8cc1Swenshuai.xi         if (stEVDBaseAddInfo->b422Pack)
4997*53ee8cc1Swenshuai.xi         {
4998*53ee8cc1Swenshuai.xi             stEVDBaseAddInfo->u32LSBUVOffset = stEVDBaseAddInfo->u32LSBYOffset + 16; //add 16 for 128bit; add 8 for 64bit
4999*53ee8cc1Swenshuai.xi         }
5000*53ee8cc1Swenshuai.xi         // UV offset
5001*53ee8cc1Swenshuai.xi         u64tmp = stEVDBaseAddInfo->u32LSBUVOffset >> 3;
5002*53ee8cc1Swenshuai.xi         if( !stEVDBaseAddInfo->bProgressive )
5003*53ee8cc1Swenshuai.xi         {  //Refine UV offset for interlace repeat bottom field
5004*53ee8cc1Swenshuai.xi             if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
5005*53ee8cc1Swenshuai.xi             {
5006*53ee8cc1Swenshuai.xi                 MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
5007*53ee8cc1Swenshuai.xi                 u64tmp += 2;
5008*53ee8cc1Swenshuai.xi             }
5009*53ee8cc1Swenshuai.xi             else
5010*53ee8cc1Swenshuai.xi             {
5011*53ee8cc1Swenshuai.xi                 MVOP_DBG("%d eRepeatField(%x) is TOP/NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
5012*53ee8cc1Swenshuai.xi             }
5013*53ee8cc1Swenshuai.xi         }
5014*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_UVSTR0_L), u64tmp & 0xff);
5015*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_UVSTR0_L+1), (u64tmp >> 8) & 0xff);
5016*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_UVSTR0_H), (u64tmp >> 16) & 0xff);
5017*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_UVSTR0_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
5018*53ee8cc1Swenshuai.xi 
5019*53ee8cc1Swenshuai.xi         if( !stEVDBaseAddInfo->bProgressive )
5020*53ee8cc1Swenshuai.xi         {  //UV offset of bottom field if interlace
5021*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_UVSTR1_L), u64tmp & 0xff);
5022*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_UVSTR1_L+1), (u64tmp >> 8) & 0xff);
5023*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_UVSTR1_H), (u64tmp >> 16) & 0xff);
5024*53ee8cc1Swenshuai.xi         HAL_WriteByte(SUB_REG(VOP_LSB_UVSTR1_H+1), (u64tmp >> 24) & VOP_YUV_STR_HIBITS);
5025*53ee8cc1Swenshuai.xi         }
5026*53ee8cc1Swenshuai.xi     }
5027*53ee8cc1Swenshuai.xi 
5028*53ee8cc1Swenshuai.xi     return TRUE;
5029*53ee8cc1Swenshuai.xi }
5030*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubCheckSTCCW(void)5031*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubCheckSTCCW(void)
5032*53ee8cc1Swenshuai.xi {
5033*53ee8cc1Swenshuai.xi     MS_U16 u16STC_CW_L = 0;
5034*53ee8cc1Swenshuai.xi     MS_U16 u16STC_CW_H = 0;
5035*53ee8cc1Swenshuai.xi     MS_BOOL u16STC_CW_SEL = 0;
5036*53ee8cc1Swenshuai.xi     MS_BOOL u16TSP_CLK_EN = 0;
5037*53ee8cc1Swenshuai.xi 
5038*53ee8cc1Swenshuai.xi     u16STC_CW_L = HAL_Read2Byte(REG_STC1_CW_L)&0xffff;
5039*53ee8cc1Swenshuai.xi     u16STC_CW_H = HAL_Read2Byte(REG_STC1_CW_H)&0xffff;
5040*53ee8cc1Swenshuai.xi 
5041*53ee8cc1Swenshuai.xi     u16STC_CW_SEL = (HAL_ReadRegBit(REG_STC_CW_SLE_H, BIT1) == BIT1);
5042*53ee8cc1Swenshuai.xi     u16TSP_CLK_EN = !(HAL_ReadRegBit(REG_TSP_CLK, BIT0) == BIT0);
5043*53ee8cc1Swenshuai.xi 
5044*53ee8cc1Swenshuai.xi     if((((u16STC_CW_L || u16STC_CW_H) == 0) && (u16STC_CW_SEL == 0)) || ((u16STC_CW_SEL == 1) && (u16TSP_CLK_EN == 0)))
5045*53ee8cc1Swenshuai.xi         return FALSE;
5046*53ee8cc1Swenshuai.xi     else
5047*53ee8cc1Swenshuai.xi         return TRUE;
5048*53ee8cc1Swenshuai.xi }
5049*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSetVSyncMode(MS_U8 u8Mode)5050*53ee8cc1Swenshuai.xi void HAL_MVOP_SubSetVSyncMode(MS_U8 u8Mode)
5051*53ee8cc1Swenshuai.xi {
5052*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
5053*53ee8cc1Swenshuai.xi     {
5054*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
5055*53ee8cc1Swenshuai.xi         return;
5056*53ee8cc1Swenshuai.xi     }
5057*53ee8cc1Swenshuai.xi     if (1==u8Mode)
5058*53ee8cc1Swenshuai.xi     {
5059*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubNewVSyncMode = TRUE;
5060*53ee8cc1Swenshuai.xi     }
5061*53ee8cc1Swenshuai.xi     else
5062*53ee8cc1Swenshuai.xi     {
5063*53ee8cc1Swenshuai.xi         g_pHalMVOPCtx->bSubNewVSyncMode = FALSE;
5064*53ee8cc1Swenshuai.xi     }
5065*53ee8cc1Swenshuai.xi }
5066*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSet3DLRAltOutput_VHalfScaling(MS_BOOL bEnable)5067*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubSet3DLRAltOutput_VHalfScaling(MS_BOOL bEnable)
5068*53ee8cc1Swenshuai.xi {
5069*53ee8cc1Swenshuai.xi     MS_BOOL bEnDualBuff = bEnable ? ENABLE : DISABLE;     //enable dual buffer
5070*53ee8cc1Swenshuai.xi     MS_BOOL bEnSWDualBuff = bEnable ? DISABLE : ENABLE;   //buffer controlled by HK instead of FW
5071*53ee8cc1Swenshuai.xi     MS_BOOL bEnMirrMaskBase = bEnable ? DISABLE : ENABLE; //do not mask LSB
5072*53ee8cc1Swenshuai.xi     MS_BOOL bEnHwFldBase = bEnable ? DISABLE : ENABLE;    //hardware calculate field jump base address
5073*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
5074*53ee8cc1Swenshuai.xi     {
5075*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
5076*53ee8cc1Swenshuai.xi         return FALSE;
5077*53ee8cc1Swenshuai.xi     }
5078*53ee8cc1Swenshuai.xi     //Set 0x27[2] = 1 (enable SW dual buffer mode)
5079*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_WR), bEnDualBuff, VOP_BUF_DUAL);
5080*53ee8cc1Swenshuai.xi 
5081*53ee8cc1Swenshuai.xi     //Set 0x38[8] = 0 (use SW dual buffer mode)
5082*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_INFO_FROM_CODEC_H), bEnSWDualBuff, VOP_INFO_FROM_CODEC_DUAL_BUFF);
5083*53ee8cc1Swenshuai.xi 
5084*53ee8cc1Swenshuai.xi     //Set 0x3b[7] = 0 (use MVD/HVD firmware send base)
5085*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), bEnMirrMaskBase, VOP_MASK_BASE_LSB);
5086*53ee8cc1Swenshuai.xi 
5087*53ee8cc1Swenshuai.xi     //Set 0x3b[5] = 0 (hardware calculate field jump base address)
5088*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MIRROR_CFG), bEnHwFldBase, VOP_HW_FLD_BASE);
5089*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSub3DLRAltOutput = bEnable;
5090*53ee8cc1Swenshuai.xi     return TRUE;
5091*53ee8cc1Swenshuai.xi }
5092*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSet3DLRAltOutput(MS_BOOL bEnable)5093*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubSet3DLRAltOutput(MS_BOOL bEnable)
5094*53ee8cc1Swenshuai.xi {
5095*53ee8cc1Swenshuai.xi     //Set 0x3C[2] = 1 (enable 3D L/R dual buffer line alternative output)
5096*53ee8cc1Swenshuai.xi     //it works when 0x3C[0] = 1
5097*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MULTI_WIN_CFG0), bEnable, VOP_LR_LA_OUT);
5098*53ee8cc1Swenshuai.xi     // bw saving not support: LA/SBS
5099*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_DUMMY), 0, VOP_420_BW_SAVE);
5100*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_REG_BW_SAVE), 0, VOP_420_BW_SAVE_EX);
5101*53ee8cc1Swenshuai.xi     HAL_MVOP_LoadReg();
5102*53ee8cc1Swenshuai.xi 
5103*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSub3DLRAltOutput = bEnable;
5104*53ee8cc1Swenshuai.xi     return TRUE;
5105*53ee8cc1Swenshuai.xi }
5106*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubSet3DLRAltSBSOutput(MS_BOOL bEnable)5107*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubSet3DLRAltSBSOutput(MS_BOOL bEnable)
5108*53ee8cc1Swenshuai.xi {
5109*53ee8cc1Swenshuai.xi     //it works when 0x3C[0] = 1 and 0x3C[2] = 1
5110*53ee8cc1Swenshuai.xi     //Set 0x3C[3] = 1 (3D L/R line alternative read, side-by-side output)
5111*53ee8cc1Swenshuai.xi     HAL_WriteRegBit(SUB_REG(VOP_MULTI_WIN_CFG0), bEnable, VOP_LR_LA2SBS_OUT);
5112*53ee8cc1Swenshuai.xi     g_pHalMVOPCtx->bSub3DLRAltSBSOutput = bEnable;
5113*53ee8cc1Swenshuai.xi     return TRUE;
5114*53ee8cc1Swenshuai.xi }
5115*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubGet3DLRAltOutput(void)5116*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubGet3DLRAltOutput(void)
5117*53ee8cc1Swenshuai.xi {
5118*53ee8cc1Swenshuai.xi     if (g_pHalMVOPCtx == NULL)
5119*53ee8cc1Swenshuai.xi     {
5120*53ee8cc1Swenshuai.xi         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
5121*53ee8cc1Swenshuai.xi         return FALSE;
5122*53ee8cc1Swenshuai.xi     }
5123*53ee8cc1Swenshuai.xi     return g_pHalMVOPCtx->bSub3DLRAltOutput;
5124*53ee8cc1Swenshuai.xi }
5125*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubGet3DLRAltSBSOutput(void)5126*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_SubGet3DLRAltSBSOutput(void)
5127*53ee8cc1Swenshuai.xi {
5128*53ee8cc1Swenshuai.xi     return g_pHalMVOPCtx->bSub3DLRAltSBSOutput;
5129*53ee8cc1Swenshuai.xi }
5130*53ee8cc1Swenshuai.xi 
HAL_MVOP_SubGetOutput3DType(void)5131*53ee8cc1Swenshuai.xi EN_MVOP_Output_3D_TYPE HAL_MVOP_SubGetOutput3DType(void)
5132*53ee8cc1Swenshuai.xi {
5133*53ee8cc1Swenshuai.xi     EN_MVOP_Output_3D_TYPE en3DType = E_MVOP_OUTPUT_3D_NONE;
5134*53ee8cc1Swenshuai.xi     if(g_pHalMVOPCtx->bSub3DLRMode)
5135*53ee8cc1Swenshuai.xi     {
5136*53ee8cc1Swenshuai.xi         if(g_pHalMVOPCtx->bSub3DLRAltSBSOutput)
5137*53ee8cc1Swenshuai.xi         {
5138*53ee8cc1Swenshuai.xi             en3DType = E_MVOP_OUTPUT_3D_SBS;
5139*53ee8cc1Swenshuai.xi         }
5140*53ee8cc1Swenshuai.xi         else
5141*53ee8cc1Swenshuai.xi         {
5142*53ee8cc1Swenshuai.xi             en3DType = E_MVOP_OUTPUT_3D_TB;
5143*53ee8cc1Swenshuai.xi         }
5144*53ee8cc1Swenshuai.xi     }
5145*53ee8cc1Swenshuai.xi     else if(g_pHalMVOPCtx->bSub3DLRAltOutput)
5146*53ee8cc1Swenshuai.xi     {
5147*53ee8cc1Swenshuai.xi         en3DType = E_MVOP_OUTPUT_3D_LA;
5148*53ee8cc1Swenshuai.xi     }
5149*53ee8cc1Swenshuai.xi     return en3DType;
5150*53ee8cc1Swenshuai.xi }
5151*53ee8cc1Swenshuai.xi #endif
5152*53ee8cc1Swenshuai.xi 
5153*53ee8cc1Swenshuai.xi 
5154*53ee8cc1Swenshuai.xi #define MVOP_INT_UF BIT0
5155*53ee8cc1Swenshuai.xi #define MVOP_INT_OF BIT1
5156*53ee8cc1Swenshuai.xi #define MVOP_INT_VSYNC BIT2
5157*53ee8cc1Swenshuai.xi #define MVOP_INT_HSYNC BIT3
5158*53ee8cc1Swenshuai.xi #define MVOP_INT_RDY   BIT4
5159*53ee8cc1Swenshuai.xi #define MVOP_INT_FLD   BIT5
5160*53ee8cc1Swenshuai.xi #define MVOP_INT_ALL (BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0)
5161*53ee8cc1Swenshuai.xi 
5162*53ee8cc1Swenshuai.xi const MS_U16 u16MvopRegBase[2] = { MVOP_REG_BASE, MVOP_SUB_REG_BASE};
5163*53ee8cc1Swenshuai.xi #define MAP_REG(_id, _reg)        ((_reg) - MVOP_REG_BASE + u16MvopRegBase[(_id)])
5164*53ee8cc1Swenshuai.xi 
HAL_MVOP_IntEnableMask(MVOP_DevID eID,MS_U8 eIntType)5165*53ee8cc1Swenshuai.xi MS_BOOL HAL_MVOP_IntEnableMask(MVOP_DevID eID, MS_U8 eIntType)
5166*53ee8cc1Swenshuai.xi {
5167*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
5168*53ee8cc1Swenshuai.xi     MS_U16 u16Reg = MAP_REG( eID, VOP_INT_MASK);
5169*53ee8cc1Swenshuai.xi     MS_U8 u8Mask = 0;
5170*53ee8cc1Swenshuai.xi 
5171*53ee8cc1Swenshuai.xi     u8Mask = HAL_ReadByte(u16Reg);
5172*53ee8cc1Swenshuai.xi 
5173*53ee8cc1Swenshuai.xi     if (E_MVOP_INT_NONE != eIntType)
5174*53ee8cc1Swenshuai.xi     {
5175*53ee8cc1Swenshuai.xi         u8Mask = (E_MVOP_INT_VSYNC == (eIntType&E_MVOP_INT_VSYNC)) ?
5176*53ee8cc1Swenshuai.xi                  (u8Mask & ~MVOP_INT_VSYNC) : (u8Mask);
5177*53ee8cc1Swenshuai.xi         u8Mask = (E_MVOP_INT_HSYNC == (eIntType&E_MVOP_INT_HSYNC)) ?
5178*53ee8cc1Swenshuai.xi                  (u8Mask & ~MVOP_INT_HSYNC) : (u8Mask);
5179*53ee8cc1Swenshuai.xi         u8Mask = (E_MVOP_INT_FDCHNG == (eIntType&E_MVOP_INT_FDCHNG)) ?
5180*53ee8cc1Swenshuai.xi                  (u8Mask & ~MVOP_INT_FLD) : (u8Mask);
5181*53ee8cc1Swenshuai.xi         u8Mask = (E_MVOP_INT_RDY == (eIntType&E_MVOP_INT_RDY)) ?
5182*53ee8cc1Swenshuai.xi                  (u8Mask & ~MVOP_INT_RDY) : (u8Mask);
5183*53ee8cc1Swenshuai.xi         u8Mask = (E_MVOP_INT_BUFF_UF == (eIntType&E_MVOP_INT_BUFF_UF)) ?
5184*53ee8cc1Swenshuai.xi                  (u8Mask & ~MVOP_INT_UF) : (u8Mask);
5185*53ee8cc1Swenshuai.xi         u8Mask = (E_MVOP_INT_BUFF_OF == (eIntType&E_MVOP_INT_BUFF_OF)) ?
5186*53ee8cc1Swenshuai.xi                  (u8Mask & ~MVOP_INT_OF) : (u8Mask);
5187*53ee8cc1Swenshuai.xi     }
5188*53ee8cc1Swenshuai.xi     else    //mask all
5189*53ee8cc1Swenshuai.xi     {
5190*53ee8cc1Swenshuai.xi         u8Mask |= MVOP_INT_ALL;
5191*53ee8cc1Swenshuai.xi     }
5192*53ee8cc1Swenshuai.xi 
5193*53ee8cc1Swenshuai.xi     //MVOP_PRINTF("u8Mask %x ", u8Mask);
5194*53ee8cc1Swenshuai.xi     HAL_WriteByteMask(u16Reg, u8Mask, MVOP_INT_ALL);
5195*53ee8cc1Swenshuai.xi     //u8Mask = HAL_ReadByte(u16Reg);
5196*53ee8cc1Swenshuai.xi     //MVOP_PRINTF("==> %x \n", u8Mask);
5197*53ee8cc1Swenshuai.xi     return bRet;
5198*53ee8cc1Swenshuai.xi }
5199*53ee8cc1Swenshuai.xi 
HAL_MVOP_IntGetStatus(MVOP_DevID eID)5200*53ee8cc1Swenshuai.xi MS_U8 HAL_MVOP_IntGetStatus(MVOP_DevID eID)
5201*53ee8cc1Swenshuai.xi {
5202*53ee8cc1Swenshuai.xi     MS_U8 u8IntVal = 0;
5203*53ee8cc1Swenshuai.xi     MS_U8 u8IntType = E_MVOP_INT_NONE;
5204*53ee8cc1Swenshuai.xi     MS_U16 u16Reg = MAP_REG(eID, (VOP_INT_MASK+1));
5205*53ee8cc1Swenshuai.xi 
5206*53ee8cc1Swenshuai.xi     u8IntVal = HAL_ReadByte(u16Reg) & MVOP_INT_ALL;
5207*53ee8cc1Swenshuai.xi     //MVOP_PRINTF("u8IntVal %x\n", u8IntVal);
5208*53ee8cc1Swenshuai.xi     if ((u8IntVal & MVOP_INT_VSYNC) == MVOP_INT_VSYNC)
5209*53ee8cc1Swenshuai.xi     {
5210*53ee8cc1Swenshuai.xi         u8IntType |= E_MVOP_INT_VSYNC;
5211*53ee8cc1Swenshuai.xi     }
5212*53ee8cc1Swenshuai.xi     if ((u8IntVal & MVOP_INT_HSYNC) == MVOP_INT_HSYNC)
5213*53ee8cc1Swenshuai.xi     {
5214*53ee8cc1Swenshuai.xi         u8IntType |= E_MVOP_INT_HSYNC;
5215*53ee8cc1Swenshuai.xi     }
5216*53ee8cc1Swenshuai.xi     if ((u8IntVal & MVOP_INT_FLD) == MVOP_INT_FLD)
5217*53ee8cc1Swenshuai.xi     {
5218*53ee8cc1Swenshuai.xi         u8IntType |= E_MVOP_INT_FDCHNG;
5219*53ee8cc1Swenshuai.xi     }
5220*53ee8cc1Swenshuai.xi     if ((u8IntVal & MVOP_INT_RDY) == MVOP_INT_RDY)
5221*53ee8cc1Swenshuai.xi     {
5222*53ee8cc1Swenshuai.xi         u8IntType |= E_MVOP_INT_RDY;
5223*53ee8cc1Swenshuai.xi     }
5224*53ee8cc1Swenshuai.xi     if ((u8IntVal & MVOP_INT_UF) == MVOP_INT_UF)
5225*53ee8cc1Swenshuai.xi     {
5226*53ee8cc1Swenshuai.xi         u8IntType |= E_MVOP_INT_BUFF_UF;
5227*53ee8cc1Swenshuai.xi     }
5228*53ee8cc1Swenshuai.xi     if ((u8IntVal & MVOP_INT_OF) == MVOP_INT_OF)
5229*53ee8cc1Swenshuai.xi     {
5230*53ee8cc1Swenshuai.xi         u8IntType |= E_MVOP_INT_BUFF_OF;
5231*53ee8cc1Swenshuai.xi     }
5232*53ee8cc1Swenshuai.xi     return u8IntType;
5233*53ee8cc1Swenshuai.xi }
5234