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