xref: /utopia/UTPA2-700.0.x/modules/mvop/hal/maldives/mvop/halMVOP.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 //    Software and any modification/derivatives thereof.
18 //    No right, ownership, or interest to MStar Software and any
19 //    modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 //    supplied together with third party`s software and the use of MStar
23 //    Software may require additional licenses from third parties.
24 //    Therefore, you hereby agree it is your sole responsibility to separately
25 //    obtain any and all third party right and license necessary for your use of
26 //    such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 //    MStar`s confidential information and you agree to keep MStar`s
30 //    confidential information in strictest confidence and not disclose to any
31 //    third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35 //    without limitation, any warranties of merchantability, non-infringement of
36 //    intellectual property rights, fitness for a particular purpose, error free
37 //    and in conformity with any international standard.  You agree to waive any
38 //    claim against MStar for any loss, damage, cost or expense that you may
39 //    incur related to your use of MStar Software.
40 //    In no event shall MStar be liable for any direct, indirect, incidental or
41 //    consequential damages, including without limitation, lost of profit or
42 //    revenues, lost or damage of data, and unauthorized system use.
43 //    You agree that this Section 4 shall still apply without being affected
44 //    even if MStar Software has been modified by MStar in accordance with your
45 //    request or instruction for your use, except otherwise agreed by both
46 //    parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 //    services in relation with MStar Software to you for your use of
50 //    MStar Software in conjunction with your or your customer`s product
51 //    ("Services").
52 //    You understand and agree that, except otherwise agreed by both parties in
53 //    writing, Services are provided on an "AS IS" basis and the warranty
54 //    disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 //    or otherwise:
58 //    (a) conferring any license or right to use MStar name, trademark, service
59 //        mark, symbol or any other identification;
60 //    (b) obligating MStar or any of its affiliates to furnish any person,
61 //        including without limitation, you and your customers, any assistance
62 //        of any kind whatsoever, or any information; or
63 //    (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 //    of Taiwan, R.O.C., excluding its conflict of law rules.
67 //    Any and all dispute arising out hereof or related hereto shall be finally
68 //    settled by arbitration referred to the Chinese Arbitration Association,
69 //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 //    Rules of the Association by three (3) arbitrators appointed in accordance
71 //    with the said Rules.
72 //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73 //    be English.
74 //    The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 ////////////////////////////////////////////////////////////////////////////////
79 //
80 // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81 // All rights reserved.
82 //
83 // Unless otherwise stipulated in writing, any and all information contained
84 // herein regardless in any format shall remain the sole proprietary of
85 // MStar Semiconductor Inc. and be kept in strict confidence
86 // ("MStar Confidential Information") by the recipient.
87 // Any unauthorized act including without limitation unauthorized disclosure,
88 // copying, use, reproduction, sale, distribution, modification, disassembling,
89 // reverse engineering and compiling of the contents of MStar Confidential
90 // Information is unlawful and strictly prohibited. MStar hereby reserves the
91 // rights to any and all damages, losses, costs and expenses resulting therefrom.
92 //
93 ////////////////////////////////////////////////////////////////////////////////
94 
95 
96 //-------------------------------------------------------------------------------------------------
97 //  Include Files
98 //-------------------------------------------------------------------------------------------------
99 // Common Definition
100 #include "MsCommon.h"
101 #ifndef MSOS_TYPE_LINUX_KERNEL
102 #include <string.h>
103 #endif
104 #include "MsTypes.h"
105 #include "MsIRQ.h"
106 #include "MsOS.h"
107 #include "drvMVOP.h"
108 #include "drvMIU.h"
109 
110 // Internal Definition
111 #include "regMVOP.h"
112 #include "halMVOP.h"
113 
114 #ifndef ANDROID
115 #define MVOP_PRINTF printf
116 #else
117 #include <sys/mman.h>
118 #include <cutils/ashmem.h>
119 #include <cutils/log.h>
120 
121 #define MVOP_PRINTF ALOGD
122 #endif
123 //-------------------------------------------------------------------------------------------------
124 //  Driver Compiler Options
125 //-------------------------------------------------------------------------------------------------
126 
127 
128 //-------------------------------------------------------------------------------------------------
129 //  Local Defines
130 //-------------------------------------------------------------------------------------------------
131 #define MPLL_CLOCK           (432000000ULL)
132 
133 #define BIT0    BIT(0)
134 #define BIT1    BIT(1)
135 #define BIT2    BIT(2)
136 #define BIT3    BIT(3)
137 #define BIT4    BIT(4)
138 #define BIT5    BIT(5)
139 #define BIT6    BIT(6)
140 #define BIT7    BIT(7)
141 #define BIT15   BIT(15)
142 
143 #define ALIGN_UPTO_16(x)  ((((x) + 15) >> 4) << 4)
144 #define ALIGN_UPTO_4(x)   ((((x) + 3) >> 2) << 2)
145 #define ALIGN_UPTO_2(x)   ((((x) + 1) >> 1) << 1)
146 
147 #define MVOP_VBlank               45
148 #define MVOP_HBlank_SD            200
149 #define MVOP_HBlank_HD            300
150 
151 #if 0
152 static MS_U32 u32RiuBaseAdd=0;
153 static MS_BOOL bMirrorModeVer = 0;
154 static MS_BOOL bMirrorModeHor = 0;
155 static MS_BOOL bMirrorMode=0;
156 static MS_BOOL bEnableFreerunMode = FALSE;
157 static MS_BOOL b3DLRMode=0;    /// 3D L/R dual buffer mode
158 static MS_BOOL b3DLRAltOutput = FALSE;    /// 3D L/R line alternative output
159 static MS_BOOL b3DLRAltSBSOutput = FALSE;
160 static MS_BOOL bEnableFreerunMode = FALSE;
161 static MS_BOOL bNewVSyncMode = FALSE;
162 static MVOP_RptFldMode eRepeatField = E_MVOP_RPTFLD_NONE;      /// mvop output repeating fields for single field input.
163 static MVOP_RgbFormat eMainRgbFmt = E_MVOP_RGB_NONE;
164 #endif
165 
166 typedef struct
167 {
168     MS_BOOL bMirrorModeVer;
169     MS_BOOL bMirrorModeHor;
170     MS_BOOL bMirrorMode;
171     MS_BOOL bEnableFreerunMode;
172     MS_BOOL b3DLRMode;    /// 3D L/R dual buffer mode
173     MS_BOOL b3DLRAltOutput;    /// 3D L/R line alternative output
174     MS_BOOL b3DLRAltSBSOutput; /// 3D L/R side by side output
175     MS_BOOL bNewVSyncMode;
176     MVOP_RptFldMode eRepeatField;      /// mvop output repeating fields for single field input.
177     MVOP_RgbFormat eMainRgbFmt;
178     MS_BOOL bIsInit;
179     MS_BOOL bIs422;
180     MS_BOOL bIsH265;
181 }MVOP_CTX_HAL;
182 
183 static MVOP_CTX_HAL *g_pHalMVOPCtx = NULL;
184 static MS_U32 u32RiuBaseAdd=0;
185 static MS_U16  u16InsVBlank=0;
186 
187 #ifndef MSOS_TYPE_LINUX
188     MVOP_CTX_HAL g_stmvopHalCtx;
189 #endif
190 #define RIU_MAP u32RiuBaseAdd  //obtained in init
191 
192 #define RIU8    ((unsigned char  volatile *) RIU_MAP)
193 #define RIU16    ((MS_U16  volatile *) RIU_MAP)
194 #define MST_MACRO_START     do {
195 #define MST_MACRO_END       } while (0)
196 
197 #define HAL_WriteByte( u32Reg, u8Val )                                                 \
198     MST_MACRO_START                                                                     \
199     if ( __builtin_constant_p( u32Reg ) )                                               \
200     {                                                                                   \
201         RIU8[((u32Reg) * 2) - ((u32Reg) & 1)] = u8Val;                                  \
202     }                                                                                   \
203     else                                                                                \
204     {                                                                                   \
205         RIU8[(u32Reg << 1) - (u32Reg & 1)] = u8Val;                                     \
206     }                                                                                   \
207     MST_MACRO_END
208 
209 #define HAL_ReadByte( u32Reg )                                                         \
210     (__builtin_constant_p( u32Reg ) ?                                                   \
211         (((u32Reg) & 0x01) ? RIU8[(u32Reg) * 2 - 1] : RIU8[(u32Reg) * 2]) :             \
212         (RIU8[(u32Reg << 1) - (u32Reg & 1)]))
213 
214 #define HAL_Read2Byte( u32Reg )                                                         \
215 			(RIU16[u32Reg])
216 
217 #define HAL_ReadRegBit( u32Reg, u8Mask )                                               \
218         (RIU8[(u32Reg) * 2 - ((u32Reg) & 1)] & (u8Mask))
219 
220 #define HAL_WriteRegBit( u32Reg, bEnable, u8Mask )                                     \
221     MST_MACRO_START                                                                     \
222     MS_U32 u32Reg8 = ((u32Reg) * 2) - ((u32Reg) & 1);                                   \
223     RIU8[u32Reg8] = (bEnable) ? (RIU8[u32Reg8] |  (u8Mask)) :                           \
224                                 (RIU8[u32Reg8] & ~(u8Mask));                            \
225     MST_MACRO_END
226 
227 #define HAL_WriteByteMask( u32Reg, u8Val, u8Msk )                                      \
228     MST_MACRO_START                                                                     \
229     MS_U32 u32Reg8 = ((u32Reg) * 2) - ((u32Reg) & 1);                                   \
230     RIU8[u32Reg8] = (RIU8[u32Reg8] & ~(u8Msk)) | ((u8Val) & (u8Msk));                   \
231     MST_MACRO_END
232 
233 #define SUB_REG(x)         (x-MVOP_REG_BASE+MVOP_SUB_REG_BASE)
234 
235 #define _FUNC_NOT_USED()        do {} while ( 0 )
236 #ifndef UNUSED
237 #define UNUSED(x) (void)(x)
238 #endif
239 
240 #define LOWBYTE(u16)            ((MS_U8)(u16))
241 #define HIGHBYTE(u16)           ((MS_U8)((u16) >> 8))
242 
243 
244 #define VOP_ON_MIU1                     ((HAL_ReadByte(0x12F2) & BIT3) == BIT3)
245 #define _MaskMiuReq_MVOP_R( m )         HAL_WriteRegBit(0x1266, m, BIT3)
246 #define _MaskMiu1Req_MVOP_R( m )        HAL_WriteRegBit(0x0666, m, BIT3)
247 
248 #define HAL_MIU_SetReqMask( miu_clients, mask ) \
249    do { \
250        if (VOP_ON_MIU1 == 0) \
251            _MaskMiuReq_##miu_clients( mask ); \
252        else \
253            _MaskMiu1Req_##miu_clients( mask ); \
254    }while(0)
255 
256 #define SUBVOP_ON_MIU1                  ((HAL_ReadByte(0x12F2) & BIT4) == BIT4)
257 #define _MaskMiuReq_SUBMVOP_R( m )         HAL_WriteRegBit(0x1266, m, BIT4)
258 #define _MaskMiu1Req_SUBMVOP_R( m )        HAL_WriteRegBit(0x0666, m, BIT4)
259 
260 #define HAL_MIU_SubSetReqMask( miu_clients, mask ) \
261    do { \
262        if (SUBVOP_ON_MIU1 == 0) \
263            _MaskMiuReq_##miu_clients( mask ); \
264        else \
265            _MaskMiu1Req_##miu_clients( mask ); \
266    }while(0)
267 
268 #define MVOP_DBG_ENABLE 0
269 #if MVOP_DBG_ENABLE
270 #define MVOP_DBG(fmt, args...)       MVOP_PRINTF(fmt, ##args)
271 #else
272 #define MVOP_DBG(fmt, args...)       {}
273 #endif
274 
275 typedef enum
276 {
277     E_MVOP_INIT_OK            = 0,
278     E_MVOP_INIT_FAIL          = 1,
279     E_MVOP_INIT_ALREADY_EXIST = 2
280 } MVOP_HalInitCtxResults;
281 //-------------------------------------------------------------------------------------------------
282 //  Local Structures
283 //-------------------------------------------------------------------------------------------------
284 
285 
286 //-------------------------------------------------------------------------------------------------
287 //  Global Variables
288 //-------------------------------------------------------------------------------------------------
289 
290 
291 //-------------------------------------------------------------------------------------------------
292 //  Local Variables
293 //-------------------------------------------------------------------------------------------------
294 
295 
296 //-------------------------------------------------------------------------------------------------
297 //  Debug Functions
298 //-------------------------------------------------------------------------------------------------
299 
300 
301 //-------------------------------------------------------------------------------------------------
302 //  Local Functions
303 //-------------------------------------------------------------------------------------------------
304 
305 
306 //-------------------------------------------------------------------------------------------------
307 //  Global Functions
308 //-------------------------------------------------------------------------------------------------
309 
_HAL_MVOP_InitVarCtx(void)310 void _HAL_MVOP_InitVarCtx(void)
311 {
312     g_pHalMVOPCtx->bMirrorModeVer = 0;
313     g_pHalMVOPCtx->bMirrorModeHor = 0;
314     g_pHalMVOPCtx->bMirrorMode=0;
315     g_pHalMVOPCtx->bEnableFreerunMode = FALSE;
316     g_pHalMVOPCtx->b3DLRMode=0;    /// 3D L/R dual buffer mode
317     g_pHalMVOPCtx->b3DLRAltOutput = FALSE;    /// 3D L/R line alternative output
318     g_pHalMVOPCtx->b3DLRAltSBSOutput = FALSE;
319     g_pHalMVOPCtx->bNewVSyncMode = FALSE;
320     g_pHalMVOPCtx->eRepeatField = E_MVOP_RPTFLD_NONE;      /// mvop output repeating fields for single field input.
321     g_pHalMVOPCtx->eMainRgbFmt = E_MVOP_RGB_NONE;
322     g_pHalMVOPCtx->bIsInit = 0;
323     g_pHalMVOPCtx->bIs422 = 0;
324     g_pHalMVOPCtx->bIsH265 = 0;
325 }
326 
_HAL_MVOP_InitContext(MS_BOOL * pbFirstDrvInstant)327 MVOP_HalInitCtxResults _HAL_MVOP_InitContext(MS_BOOL *pbFirstDrvInstant)
328 {
329     MS_BOOL bNeedInitShared = FALSE;
330 
331 //check first init by MsOS_SHM_GetId / MSOS_SHM_QUERY
332 #if 0
333     if (g_pHalMVOPCtx)
334     {
335         // The context instance has been created already
336         // before somewhere sometime in the same process.
337         *pbFirstDrvInstant = bNeedInitShared;
338         //return E_MVOP_INIT_FAIL;
339         return E_MVOP_INIT_OK;
340     }
341 #endif
342 
343 #ifdef MSOS_TYPE_LINUX
344     MS_U32 u32ShmId;
345     MS_U32 u32Addr;
346     MS_U32 u32BufSize;
347 
348     //MsOS_SHM_Init(); init in msos_init
349     if (FALSE == MsOS_SHM_GetId((MS_U8*)"Linux MVOP HAL driver", sizeof(MVOP_CTX_HAL), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_QUERY))
350     {
351         if (FALSE == MsOS_SHM_GetId((MS_U8*)"Linux MVOP HAL driver", sizeof(MVOP_CTX_HAL), &u32ShmId, &u32Addr, &u32BufSize, MSOS_SHM_CREATE))
352         {
353             MVOP_DBG(MVOP_PRINTF("MVOP: SHM allocation failed!\n");)
354             return E_MVOP_INIT_FAIL;
355         }
356         MVOP_DBG(MVOP_PRINTF("MVOP: [%s][%d] This is first initial 0x%08lx\n", __FUNCTION__, __LINE__, u32Addr);)
357         memset( (MS_U8*)u32Addr, 0, sizeof(MVOP_CTX_HAL));
358         bNeedInitShared = TRUE;
359         g_pHalMVOPCtx = (MVOP_CTX_HAL*)u32Addr;
360         _HAL_MVOP_InitVarCtx();
361     }
362     else
363     {
364         g_pHalMVOPCtx = (MVOP_CTX_HAL*)u32Addr;
365         bNeedInitShared = FALSE;
366         *pbFirstDrvInstant = bNeedInitShared;
367 
368         return E_MVOP_INIT_ALREADY_EXIST;
369     }
370 #else
371       g_pHalMVOPCtx =  &g_stmvopHalCtx;
372       bNeedInitShared = TRUE;
373 #endif
374       *pbFirstDrvInstant = bNeedInitShared;
375 
376     if (bNeedInitShared)
377     {
378         memset(g_pHalMVOPCtx, 0, sizeof(*g_pHalMVOPCtx));
379     }
380 
381       return E_MVOP_INIT_OK;
382 }
383 
_HAL_MVOP_IsSupport4k2k2P(void)384 MS_BOOL _HAL_MVOP_IsSupport4k2k2P(void)
385 {
386     return FALSE;
387 }
388 
HAL_MVOP_RegSetBase(MS_U32 u32Base)389 void HAL_MVOP_RegSetBase(MS_U32 u32Base)
390 {
391     u32RiuBaseAdd = u32Base;
392 }
393 
HAL_MVOP_InitMirrorMode(MS_BOOL bMir)394 void HAL_MVOP_InitMirrorMode(MS_BOOL bMir)
395 {
396     //set bit[3:7] to support mirror mode
397     HAL_WriteRegBit(VOP_MIRROR_CFG, bMir, VOP_MIRROR_CFG_ENABLE);
398 }
399 
HAL_MVOP_SetVerticalMirrorMode(MS_BOOL bEnable)400 void HAL_MVOP_SetVerticalMirrorMode(MS_BOOL bEnable)
401 {
402     if (g_pHalMVOPCtx == NULL)
403     {
404         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
405         return;
406     }
407 
408     if (VOP_MIRROR_CFG_ENABLE != HAL_ReadRegBit(VOP_MIRROR_CFG, VOP_MIRROR_CFG_ENABLE))
409     {
410         //MVOP_PRINTF("Setup mirror mode\n");
411         HAL_MVOP_InitMirrorMode(TRUE);
412     }
413 
414     HAL_WriteRegBit(VOP_MIRROR_CFG, bEnable, VOP_MIRROR_CFG_VEN);
415     g_pHalMVOPCtx->bMirrorModeVer = bEnable;
416 }
417 
HAL_MVOP_SetHorizontallMirrorMode(MS_BOOL bEnable)418 void HAL_MVOP_SetHorizontallMirrorMode(MS_BOOL bEnable)
419 {
420     if (g_pHalMVOPCtx == NULL)
421     {
422         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
423         return;
424     }
425 
426     if (VOP_MIRROR_CFG_ENABLE != HAL_ReadRegBit(VOP_MIRROR_CFG, VOP_MIRROR_CFG_ENABLE))
427     {
428         //MVOP_PRINTF("Setup mirror mode\n");
429         HAL_MVOP_InitMirrorMode(TRUE);
430     }
431 
432     HAL_WriteRegBit(VOP_MIRROR_CFG, bEnable, VOP_MIRROR_CFG_HEN);
433     g_pHalMVOPCtx->bMirrorModeHor = bEnable;
434 }
435 
HAL_MVOP_Init(void)436 void HAL_MVOP_Init(void)
437 {
438     MVOP_HalInitCtxResults eRet;
439     MS_BOOL pbFirstDrvInstant;
440 
441     eRet = _HAL_MVOP_InitContext(&pbFirstDrvInstant);
442     if(eRet == E_MVOP_INIT_FAIL)
443     {
444         MVOP_DBG(MVOP_PRINTF("[%s] MVOP Context Init failed!\n",__FUNCTION__);)
445         return;
446     }
447     else if(eRet == E_MVOP_INIT_ALREADY_EXIST)
448     {
449         if(g_pHalMVOPCtx->bIsInit)
450         {
451             MVOP_DBG(MVOP_PRINTF("[%s] Main MVOP Context has Initialized!\n",__FUNCTION__);)
452             return;
453         }
454     }
455 
456     HAL_MVOP_InitMirrorMode(TRUE);
457     //Enable dynamic clock gating
458     //Note: cannot enable VOP_GCLK_VCLK_ON, or hsync cannot be sent out.
459     HAL_WriteByteMask(VOP_GCLK, VOP_GCLK_MIU_ON, VOP_GCLK_MIU_ON|VOP_GCLK_VCLK_ON);
460     g_pHalMVOPCtx->bIsInit = 1;
461 }
462 
HAL_MVOP_SetFieldInverse(MS_BOOL b2MVD,MS_BOOL b2IP)463 void HAL_MVOP_SetFieldInverse(MS_BOOL b2MVD, MS_BOOL b2IP)
464 {
465     // Set fld inv & ofld_inv
466     HAL_WriteRegBit(VOP_CTRL0+1, b2MVD, BIT3); //inverse the field to MVD
467     HAL_WriteRegBit(VOP_CTRL0+1, b2IP, BIT4);  //inverse the field to IP
468 }
469 
HAL_MVOP_SetChromaWeighting(MS_BOOL bEnable)470 void HAL_MVOP_SetChromaWeighting(MS_BOOL bEnable)
471 {
472     HAL_WriteRegBit(VOP_REG_WEIGHT_CTRL, bEnable, BIT1);
473 }
474 
475 //load new value into active registers 0x20-0x26
HAL_MVOP_LoadReg(void)476 void HAL_MVOP_LoadReg(void)
477 {
478     HAL_WriteRegBit(VOP_REG_WR, 1, BIT0);
479     HAL_WriteRegBit(VOP_REG_WR, 0, BIT0);
480 
481 	HAL_WriteRegBit(VOP_REG_WR, 1, BIT4);
482     HAL_WriteRegBit(VOP_REG_WR, 0, BIT4);
483 }
484 
485 
HAL_MVOP_SetMIUReqMask(MS_BOOL bEnable)486 void HAL_MVOP_SetMIUReqMask(MS_BOOL bEnable)
487 {
488 #if 0   //[FIXME]
489     if (bEnable)
490     {   // mask MVOP2MI to protect MIU
491         HAL_MIU_SetReqMask(MVOP_R, 1);
492         MsOS_DelayTask(1);
493     }
494     else
495     {   // unmask MVOP2MI
496         MsOS_DelayTask(1);
497         HAL_MIU_SetReqMask(MVOP_R, 0);
498     }
499 #endif
500     MS_U8 u8Miu = VOP_ON_MIU1;
501     eMIUClientID eClientID = MIU_CLIENT_MVOP_128BIT_R;
502     //MVOP_PRINTF("Enter %s bEnable=%x ReqMask=0x%x, 0x%x\n", __FUNCTION__, bEnable,
503     //    HAL_ReadByte(0x1266), HAL_ReadByte(0x0666));
504     if (bEnable)
505     {   // mask MVOP2MI to protect MIU
506         MDrv_MIU_MaskReq(u8Miu,eClientID);
507         MsOS_DelayTask(1);
508     }
509     else
510     {   // unmask MVOP2MI
511         MsOS_DelayTask(1);
512         MDrv_MIU_UnMaskReq(u8Miu,eClientID);
513     }
514 
515     //MVOP_PRINTF(">Exit %s bEnable=%x ReqMask=0x%x, 0x%x\n", __FUNCTION__, bEnable,
516     //    HAL_ReadByte(0x1266), HAL_ReadByte(0x0666));
517 }
518 
HAL_MVOP_Rst(void)519 void HAL_MVOP_Rst(void)
520 {
521     HAL_WriteRegBit(VOP_CTRL0, 0, BIT0);
522     HAL_WriteRegBit(VOP_CTRL0, 1, BIT0);
523 }
524 
HAL_MVOP_Enable(MS_BOOL bEnable)525 void HAL_MVOP_Enable(MS_BOOL bEnable)
526 {
527     MS_U8 regval;
528 
529     regval = HAL_ReadByte(VOP_CTRL0);
530 
531     if ( bEnable )
532     {
533         regval |= 0x1;
534     }
535     else
536     {
537         regval &= ~0x1;
538     }
539 
540     HAL_WriteByte(VOP_CTRL0, regval);
541 }
542 
HAL_MVOP_GetEnableState(void)543 MS_BOOL HAL_MVOP_GetEnableState(void)
544 {
545     return (HAL_ReadRegBit(VOP_CTRL0, BIT0));
546 }
547 
HAL_MVOP_GetMaxFreerunClk(void)548 HALMVOPFREQUENCY HAL_MVOP_GetMaxFreerunClk(void)
549 {
550     return HALMVOP_160MHZ;
551 }
552 
HAL_MVOP_SetFrequency(HALMVOPFREQUENCY enFrequency)553 void HAL_MVOP_SetFrequency(HALMVOPFREQUENCY enFrequency)
554 {
555     // clear
556     HAL_WriteByteMask(REG_CKG_DC0, 0, CKG_DC0_MASK);
557     switch(enFrequency)
558     {
559         case HALMVOP_SYNCMODE:
560             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_SYNCHRONOUS, CKG_DC0_MASK);
561             break;
562         case HALMVOP_FREERUNMODE:
563             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_FREERUN, CKG_DC0_MASK);
564             break;
565         case HALMVOP_160MHZ:
566             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_160MHZ, CKG_DC0_MASK);
567             break;
568         case HALMVOP_144MHZ:
569             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_144MHZ, CKG_DC0_MASK);
570             break;
571         default:
572             HAL_WriteByteMask(REG_CKG_DC0, CKG_DC0_SYNCHRONOUS, CKG_DC0_MASK);
573             MVOP_PRINTF("Attention! In HAL_MVOP_SetFrequency default path!\n");
574             break;
575     }
576 }
577 
HAL_MVOP_GetMaximumClk(void)578 HALMVOPFREQUENCY HAL_MVOP_GetMaximumClk(void)
579 {
580     return HALMVOP_160MHZ;
581 }
582 
HAL_MVOP_GetCurrentClk(void)583 HALMVOPFREQUENCY HAL_MVOP_GetCurrentClk(void)
584 {
585     (MVOP_DBG("%s err: HAL_MVOP_GetCurrentClk=NULL\n", __FUNCTION__));
586     return 0;
587 }
588 
HAL_MVOP_SetOutputInterlace(MS_BOOL bEnable)589 void HAL_MVOP_SetOutputInterlace(MS_BOOL bEnable)
590 {
591     MS_U8 regval;
592 
593     regval = HAL_ReadByte(VOP_CTRL0);
594 
595     if ( bEnable )
596     {
597         regval |= 0x80;
598         // set h265 interlace mode
599         if(g_pHalMVOPCtx->bIsH265)
600         {
601             HAL_WriteRegBit(VOP_INT_TYPE, 1, VOP_EVD_INT_SEP);
602         }
603     }
604     else
605     {
606         regval &= ~0x80;
607     }
608 
609     HAL_WriteByte(VOP_CTRL0, regval);
610 }
611 
HAL_MVOP_SetPattern(MVOP_Pattern enMVOPPattern)612 void HAL_MVOP_SetPattern(MVOP_Pattern enMVOPPattern)
613 {
614     HAL_WriteByteMask(VOP_TST_IMG, enMVOPPattern, BIT2 | BIT1 | BIT0);
615 }
616 
HAL_MVOP_SetTileFormat(MVOP_TileFormat eTileFmt)617 MS_BOOL HAL_MVOP_SetTileFormat(MVOP_TileFormat eTileFmt)
618 {
619     if (eTileFmt == E_MVOP_TILE_8x32)
620     {
621         HAL_WriteRegBit(VOP_REG_WR, 0, BIT1);
622         return TRUE;
623     }
624     else if (eTileFmt == E_MVOP_TILE_16x32)
625     {
626         HAL_WriteRegBit(VOP_REG_WR, 1, BIT1);
627         return TRUE;
628     }
629     else
630     {
631         return FALSE;
632     }
633 }
634 
HAL_MVOP_GetSupportRgbFormat(MVOP_RgbFormat eRgbFmt)635 MS_BOOL HAL_MVOP_GetSupportRgbFormat(MVOP_RgbFormat eRgbFmt)
636 {
637     if ((eRgbFmt == E_MVOP_RGB_565) || (eRgbFmt == E_MVOP_RGB_888))
638     {
639         return TRUE;
640     }
641     return FALSE;
642 }
643 
HAL_MVOP_SetRgbFormat(MVOP_RgbFormat eRgbFmt)644 MS_BOOL HAL_MVOP_SetRgbFormat(MVOP_RgbFormat eRgbFmt)
645 {
646     MS_BOOL bRet = FALSE;
647 
648     if (g_pHalMVOPCtx == NULL)
649     {
650         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
651         return FALSE;
652     }
653 
654     if (eRgbFmt == E_MVOP_RGB_NONE)
655     {
656         HAL_WriteByteMask(VOP_RGB_FMT, 0, VOP_RGB_FMT_SEL);
657         bRet = TRUE;
658     }
659     else if (eRgbFmt == E_MVOP_RGB_565)
660     {
661         HAL_WriteByteMask(VOP_RGB_FMT, VOP_RGB_FMT_565, VOP_RGB_FMT_SEL);
662         bRet = TRUE;
663     }
664     else if (eRgbFmt == E_MVOP_RGB_888)
665     {
666         HAL_WriteByteMask(VOP_RGB_FMT, VOP_RGB_FMT_888, VOP_RGB_FMT_SEL);
667         bRet = TRUE;
668     }
669 
670     if (bRet == TRUE)
671     {
672         g_pHalMVOPCtx->eMainRgbFmt = eRgbFmt;
673     }
674     return bRet;
675 }
676 
HAL_MVOP_SetBlackBG(void)677 void HAL_MVOP_SetBlackBG(void)
678 {
679     MS_U8 regval;
680 
681     //set MVOP test pattern to black
682     HAL_WriteByte((VOP_TST_IMG + 1), 0x10);
683     HAL_WriteByte(VOP_U_PAT      , 0x80);
684     HAL_WriteByte((VOP_U_PAT   + 1), 0x80);
685 
686     regval = HAL_ReadByte(VOP_TST_IMG);
687     HAL_WriteByte(VOP_TST_IMG, 0x02);
688     HAL_WriteByte(VOP_TST_IMG, 0x00);
689     HAL_WriteByte(VOP_TST_IMG, regval);
690 }
691 
HAL_MVOP_SetCropWindow(MVOP_InputCfg * pparam)692 void HAL_MVOP_SetCropWindow(MVOP_InputCfg *pparam)
693 {
694 #if 1
695     UNUSED(pparam);
696 #else // enable it when test code is ready
697     MS_U32 x, y;
698     MS_U32 u32offset;
699 
700     if(!pparam)
701     {
702         return;
703     }
704     //set MVOP test pattern to black
705     HAL_MVOP_SetBlackBG();
706 #if 0
707     if((pparam->enVideoType == MVOP_H264) && (pparam->u16StripSize == 1920))
708     {
709         pparam->u16StripSize = 1952;
710     }
711 #endif
712     if((pparam->enVideoType == MVOP_MPG) || (pparam->enVideoType == MVOP_MPEG4))
713     {
714         pparam->u16CropX = (pparam->u16CropX >> 3) << 3; // 8 bytes align
715         pparam->u16CropY = (pparam->u16CropY >> 6) << 6; // 64 bytes align
716     }
717     else if((pparam->enVideoType == MVOP_H264) || (pparam->enVideoType == MVOP_RM))
718     {
719         pparam->u16CropX = (pparam->u16CropX >> 4) << 4; // 16 bytes align
720         pparam->u16CropY = (pparam->u16CropY >> 6) << 6; // 64 bytes align
721     }
722     else
723     {
724         MS_ASSERT(0);
725     }
726 
727     x = (MS_U32)pparam->u16CropX;
728     y = (MS_U32)pparam->u16CropY;
729 
730     // y offset
731     u32offset = ((y * pparam->u16StripSize + (x << 5)) >> 3);
732     HAL_WriteByte((VOP_JPG_YSTR0_L    ), (MS_U8)(u32offset));
733     HAL_WriteByte((VOP_JPG_YSTR0_L + 1), (MS_U8)(u32offset >> 8));
734     HAL_WriteByte((VOP_JPG_YSTR0_H    ), (MS_U8)(u32offset >> 16));
735     HAL_WriteByte((VOP_JPG_YSTR0_H + 1), (MS_U8)((u32offset >> 24) & VOP_YUV_STR_HIBITS));
736 
737     // uv offset
738     u32offset = ((y >> 1) * pparam->u16StripSize + (x << 5)) >> 3;
739     HAL_WriteByte((VOP_JPG_UVSTR0_L    ), (MS_U8)(u32offset));
740     HAL_WriteByte((VOP_JPG_UVSTR0_L + 1), (MS_U8)(u32offset >> 8));
741     HAL_WriteByte((VOP_JPG_UVSTR0_H    ), (MS_U8)(u32offset >> 16));
742     HAL_WriteByte((VOP_JPG_UVSTR0_H + 1), (MS_U8)((u32offset >> 24) & VOP_YUV_STR_HIBITS));
743 
744     pparam->u16CropWidth= (pparam->u16CropWidth >> 3) << 3;
745     // HSize, VSize
746     HAL_WriteByte((VOP_JPG_HSIZE    ), LOWBYTE(pparam->u16CropWidth ));
747     HAL_WriteByte((VOP_JPG_HSIZE + 1), HIGHBYTE(pparam->u16CropWidth ));
748     HAL_WriteByte((VOP_JPG_VSIZE    ), LOWBYTE(pparam->u16CropHeight));
749     HAL_WriteByte((VOP_JPG_VSIZE + 1), HIGHBYTE(pparam->u16CropHeight ));
750 
751     HAL_WriteByteMask(VOP_MPG_JPG_SWITCH, BIT0, BIT1|BIT0);
752 
753     // clear extend strip len bit by default
754     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
755     if((pparam->enVideoType == MVOP_MPG) || (pparam->enVideoType == MVOP_MPEG4))
756     {
757         // Disable H264 or RM Input
758         HAL_WriteRegBit(VOP_INPUT_SWITCH1, 0, BIT2|BIT3);
759         //8*32 tile format
760         HAL_WriteRegBit(VOP_REG_WR, 0, BIT1);
761     }
762     else if((pparam->enVideoType == MVOP_H264) || (pparam->enVideoType == MVOP_RM))
763     {
764         //16*32 tile format
765         HAL_WriteRegBit(VOP_REG_WR, 1, BIT1);
766         // SVD mode enable
767         HAL_WriteByteMask(VOP_INPUT_SWITCH1, BIT3, BIT2|BIT3);
768         // set mvop to 64bit interface
769         HAL_WriteByteMask(VOP_MIU_IF, VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
770     }
771     HAL_MVOP_LoadReg();
772 #endif
773 }
774 
HAL_MVOP_SetRepeatField(MVOP_RptFldMode eMode)775 void HAL_MVOP_SetRepeatField(MVOP_RptFldMode eMode)
776 {
777     if (g_pHalMVOPCtx == NULL)
778     {
779         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
780         return;
781     }
782     g_pHalMVOPCtx->eRepeatField = eMode;
783 }
784 
HAL_MVOP_SetInputMode(VOPINPUTMODE mode,MVOP_InputCfg * pparam,MS_U16 u16ECOVersion)785 void HAL_MVOP_SetInputMode( VOPINPUTMODE mode, MVOP_InputCfg *pparam, MS_U16 u16ECOVersion )
786 {
787     MS_U8 regval;
788     MS_U16 u16strip;
789 
790     if (g_pHalMVOPCtx == NULL)
791     {
792         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
793         return;
794     }
795 #if 0
796     /*****************************************************/
797     // Reset MVOP setting
798     HAL_WriteByte(VOP_TST_IMG, 0x40); //reset test pattern or BG
799     HAL_MVOP_Set3DLRAltOutput_VHalfScaling(DISABLE); //reset to default: disable 3D L/R alternative output.
800     HAL_MVOP_Set3DLR2ndCfg(DISABLE);    //reset to default: disable 3D L/R 2nd pitch.
801     HAL_MVOP_SetRgbFormat(E_MVOP_RGB_NONE); //reset rgb format
802     HAL_WriteRegBit(VOP_CTRL1, 0, VOP_MVD_VS_MD); //default use original vsync
803 
804     //set MVOP test pattern to black
805     HAL_MVOP_SetBlackBG();
806 
807     //regval = HAL_ReadByte(VOP_MPG_JPG_SWITCH);
808     regval = 0;
809     regval |= ( mode & 0x3 );
810 
811     // clear extend strip len bit by default
812     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
813 
814     // set mvop to 128bit_i128 interface
815     HAL_WriteByteMask(VOP_MIU_IF, VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
816 
817     // Disable H264 or RM Input
818     HAL_WriteRegBit(VOP_INPUT_SWITCH1, 0, BIT2|BIT3);
819     // Clear 422 Flag
820     g_pHalMVOPCtx->bIs422 = 0;
821     // Clear evd Flag for interlace mode setting
822     g_pHalMVOPCtx->bIsH265 = 0;
823     HAL_WriteRegBit(VOP_INFO_FROM_CODEC_L, 1, BIT3);
824     HAL_WriteRegBit(VOP_MIRROR_CFG, 1, BIT5);
825     //8*32 tile format
826     HAL_WriteRegBit(VOP_REG_WR, 0, BIT1);
827     HAL_WriteRegBit(VOP_MIRROR_CFG_HI, 0, VOP_REF_SELF_FLD);
828     HAL_MVOP_SetFieldInverse(ENABLE, ENABLE);
829     // Disable New Vsync Mode
830     g_pHalMVOPCtx->bNewVSyncMode = FALSE;
831     // EVD mode disable
832     HAL_WriteRegBit(VOP_INPUT_SWITCH0, 0, EVD_ENABLE);
833     /*****************************************************/
834 #endif
835     regval = 0;
836     regval |= ( mode & 0x3 );
837 
838     if ( mode == VOPINPUT_HARDWIRE )
839     {
840         HAL_WriteByte(VOP_MPG_JPG_SWITCH, regval);
841     }
842     else if ( mode == VOPINPUT_HARDWIRECLIP )
843     {
844         HAL_WriteByte(VOP_MPG_JPG_SWITCH, regval);
845 
846         // HSize, VSize
847         HAL_WriteByte(VOP_JPG_HSIZE    , LOWBYTE( pparam->u16HSize ));
848         HAL_WriteByte((VOP_JPG_HSIZE + 1), HIGHBYTE( pparam->u16HSize ));
849         HAL_WriteByte(VOP_JPG_VSIZE    , LOWBYTE( pparam->u16VSize ));
850         HAL_WriteByte((VOP_JPG_VSIZE + 1), HIGHBYTE( pparam->u16VSize ));
851     }
852     else if (mode == VOPINPUT_MCUCTRL)
853     {
854         g_pHalMVOPCtx->bMirrorMode = (g_pHalMVOPCtx->bMirrorModeVer||g_pHalMVOPCtx->bMirrorModeHor);
855         if ( pparam->bProgressive )
856             regval |= 0x4;
857         else
858         {
859             regval &= ~0x4;
860             regval |= 0x1;  //reg_dc_md=b'11 for interlace input
861             if (E_MVOP_RPTFLD_NONE == g_pHalMVOPCtx->eRepeatField)
862             {
863                 MVOP_DBG("%s normal NOT repeat field %x\n", __FUNCTION__, g_pHalMVOPCtx->eRepeatField);
864                 //To support mcu mode interlace, need to set h'3B[9]=1,
865                 //h'11[12]=0, and Y1/UV1 address equal to Y0/UV0 address.
866                 HAL_WriteRegBit(VOP_MIRROR_CFG_HI, 1, VOP_REF_SELF_FLD);
867                 HAL_MVOP_SetFieldInverse(ENABLE, DISABLE);
868             }
869         }
870 
871         if ( pparam->bYUV422 )
872             regval |= 0x10;
873         else
874             regval &= ~0x10;
875 
876         if ( pparam->b422pack )
877             regval |= 0x80;
878 
879         if ( pparam->bDramRdContd == 1 )
880             regval |= 0x20;
881         else
882             regval &= ~0x20;
883 
884         // for backward compatable to saturn
885         // [3] UV-7bit mode don't care
886         // [5] dram_rd_md =0
887         // [6] Fld don't care
888         // [7] 422pack don'care
889         HAL_WriteByte(VOP_MPG_JPG_SWITCH, regval);
890         g_pHalMVOPCtx->bIs422 = pparam->bYUV422;
891 		HAL_WriteRegBit(VOP_REG_DUMMY, !(pparam->bYUV422), VOP_420_BW_SAVE);
892 
893         if (pparam->u16StripSize == 0)
894         {
895             if (pparam->bSD)
896                 u16strip = 720;
897             else
898                 u16strip = 1920;
899         }
900         else
901         {
902             u16strip = pparam->u16StripSize;
903         }
904 
905         // set dc_strip[7:0]
906         if ( pparam->bDramRdContd == 0 ) {
907             u16strip = u16strip/8;
908         }
909         else
910         {
911             if ( pparam->b422pack )
912             {
913                 if (E_MVOP_RGB_888 == g_pHalMVOPCtx->eMainRgbFmt)
914                 {
915                     u16strip *= 2; //4bytes/pixel (yuv422:2bytes/pixel)
916                 }
917                 //VOP_REG_STRIP_ALIGN and Mirror mode are mutually exclusive, after M10(support mirror), VOP_DC_STRIP_H
918                 //replace VOP_REG_STRIP_ALIGN, which supported maximun Hsize is 8188
919 #if 0
920                 // [071016 Andy] support YUV422 pack mode
921                 if ((u16strip < 1024) || g_pHalMVOPCtx->bMirrorMode)
922                 {
923                     u16strip = u16strip/4;
924                     // dont extend strip len
925                     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
926                 }
927                 else
928                 {
929                     u16strip = u16strip/8;
930                     // extend strip len to 2048
931                     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 1, BIT0);
932                 }
933 #endif
934                 u16strip = u16strip/4;
935                 HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
936             }
937             else
938             {
939                 u16strip = u16strip/8;
940             }
941         }
942 
943         if (u16strip >= 256 )
944         {
945             HAL_WriteByte(VOP_DC_STRIP_H, (u16strip>>8));
946             //reg_dc_strip_h[2:0] = reg_dc_strip[10:8]
947         }
948         else
949         {
950             HAL_WriteByteMask(VOP_DC_STRIP_H, 0, BIT0 | BIT1 | BIT2);
951         }
952 
953         regval = u16strip;
954         HAL_WriteByte(VOP_DC_STRIP, regval);
955 
956         HAL_MVOP_SetYUVBaseAdd(pparam->u32YOffset, pparam->u32UVOffset,
957                                pparam->bProgressive, pparam->b422pack);
958 
959         if (E_MVOP_RPTFLD_NONE != g_pHalMVOPCtx->eRepeatField)
960         {
961             MVOP_DBG("%s reset eRepeatField=%x ==>", __FUNCTION__, g_pHalMVOPCtx->eRepeatField);
962             //To output the same field for single field input,
963             //do NOT set h'3B[9]=1 and h'11[12]=0
964             g_pHalMVOPCtx->eRepeatField = E_MVOP_RPTFLD_NONE;    //reset the flag to repeat field
965             MVOP_DBG(" %x\n", g_pHalMVOPCtx->eRepeatField);
966         }
967 
968         // HSize
969         MS_U16 u16HSize = ALIGN_UPTO_16(pparam->u16HSize);
970         if (u16HSize != pparam->u16HSize)
971         {
972             MVOP_DBG(MVOP_PRINTF("\n\n Change HSize %d to %d\n", pparam->u16HSize, u16HSize);)
973         }
974         HAL_WriteByte(VOP_JPG_HSIZE    , LOWBYTE( u16HSize ));
975         HAL_WriteByte((VOP_JPG_HSIZE + 1), HIGHBYTE( u16HSize ));
976 
977         // VSize
978         MS_U16 u16VSize = pparam->u16VSize;
979         if (g_pHalMVOPCtx->bMirrorModeVer)
980         {
981             u16VSize = ALIGN_UPTO_4(pparam->u16VSize);
982             MVOP_DBG(MVOP_PRINTF("\n\n Change VSize %d to %d\n", pparam->u16VSize, u16VSize);)
983         }
984         HAL_WriteByte(VOP_JPG_VSIZE    , LOWBYTE( u16VSize ));
985         HAL_WriteByte((VOP_JPG_VSIZE + 1), HIGHBYTE( u16VSize ));
986     }
987 
988     HAL_MVOP_LoadReg();
989 }
990 
991 
HAL_MVOP_EnableUVShift(MS_BOOL bEnable)992 void HAL_MVOP_EnableUVShift(MS_BOOL bEnable)
993 {
994     MS_U8 regval;
995 
996     regval = HAL_ReadByte(VOP_MPG_JPG_SWITCH);
997 
998     if (((regval & BIT4) == BIT4) && ((regval & 0x3)== 0x2))
999     {   // 422 with MCU control mode
1000         if (bEnable)
1001         {
1002             MS_ASSERT(0);
1003         }
1004     }
1005 
1006     // output 420 and interlace
1007     //[IP - Sheet] : Main Page --- 420CUP
1008     //[Project] :  Titania2
1009     //[Description]:   Chroma artifacts when 420to422 is applied duplicate method.
1010     //[Root cause]: Apply 420to422 average algorithm to all DTV input cases.
1011     //The average algorithm must cooperate with MVOP.
1012     HAL_WriteByteMask(VOP_UV_SHIFT, (bEnable)?1:0, 0x3);
1013 }
1014 
1015 static MS_BOOL _bEnable60P = false;
HAL_MVOP_SetEnable60P(MS_BOOL bEnable)1016 void HAL_MVOP_SetEnable60P(MS_BOOL bEnable)
1017 {
1018     _bEnable60P = bEnable;
1019 }
1020 
HAL_MVOP_EnableFreerunMode(MS_BOOL bEnable)1021 void HAL_MVOP_EnableFreerunMode(MS_BOOL bEnable)
1022 {
1023     if (g_pHalMVOPCtx == NULL)
1024     {
1025         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1026         return;
1027     }
1028     g_pHalMVOPCtx->bEnableFreerunMode = bEnable;
1029 }
1030 
HAL_MVOP_SetVSyncMode(MS_U8 u8Mode)1031 void HAL_MVOP_SetVSyncMode(MS_U8 u8Mode)
1032 {
1033     if (g_pHalMVOPCtx == NULL)
1034     {
1035         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1036         return;
1037     }
1038     if (1==u8Mode)
1039     {
1040         g_pHalMVOPCtx->bNewVSyncMode = TRUE;
1041     }
1042     else
1043     {
1044         g_pHalMVOPCtx->bNewVSyncMode = FALSE;
1045     }
1046 }
1047 
HAL_MVOP_SetOutputTiming(MVOP_Timing * ptiming)1048 void HAL_MVOP_SetOutputTiming( MVOP_Timing *ptiming )
1049 {
1050     MS_U8 regval;
1051 
1052     if (g_pHalMVOPCtx == NULL)
1053     {
1054         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1055         return;
1056     }
1057 
1058     HAL_WriteByte(VOP_FRAME_VCOUNT    , LOWBYTE( ptiming->u16V_TotalCount ));
1059     HAL_WriteByte((VOP_FRAME_VCOUNT + 1), HIGHBYTE( ptiming->u16V_TotalCount ));
1060     HAL_WriteByte(VOP_FRAME_HCOUNT    , LOWBYTE( ptiming->u16H_TotalCount ));
1061     HAL_WriteByte((VOP_FRAME_HCOUNT + 1), HIGHBYTE( ptiming->u16H_TotalCount ));
1062 
1063     HAL_WriteByte((VOP_VB0_STR     ), LOWBYTE( ptiming->u16VBlank0_Start ));
1064     HAL_WriteByte((VOP_VB0_STR  + 1), HIGHBYTE( ptiming->u16VBlank0_Start ));
1065     HAL_WriteByte((VOP_VB0_END     ), LOWBYTE( ptiming->u16VBlank0_End ));
1066     HAL_WriteByte((VOP_VB0_END  + 1), HIGHBYTE( ptiming->u16VBlank0_End ));
1067     HAL_WriteByte((VOP_VB1_STR     ), LOWBYTE( ptiming->u16VBlank1_Start ));
1068     HAL_WriteByte((VOP_VB1_STR  + 1), HIGHBYTE( ptiming->u16VBlank1_Start ));
1069     HAL_WriteByte((VOP_VB1_END     ), LOWBYTE( ptiming->u16VBlank1_End ));
1070     HAL_WriteByte((VOP_VB1_END  + 1), HIGHBYTE( ptiming->u16VBlank1_End ));
1071     HAL_WriteByte((VOP_TF_STR      ), LOWBYTE( ptiming->u16TopField_Start ));
1072     HAL_WriteByte((VOP_TF_STR   + 1), HIGHBYTE( ptiming->u16TopField_Start ));
1073     HAL_WriteByte((VOP_BF_STR      ), LOWBYTE( ptiming->u16BottomField_Start ));
1074     HAL_WriteByte((VOP_BF_STR   + 1), HIGHBYTE( ptiming->u16BottomField_Start ));
1075     HAL_WriteByte((VOP_HACT_STR    ), LOWBYTE( ptiming->u16HActive_Start ));
1076     HAL_WriteByte((VOP_HACT_STR + 1), HIGHBYTE( ptiming->u16HActive_Start ));
1077 
1078     HAL_WriteByte((VOP_TF_VS      ), LOWBYTE( ptiming->u16TopField_VS ));
1079     HAL_WriteByte((VOP_TF_VS   + 1), HIGHBYTE( ptiming->u16TopField_VS ));
1080     HAL_WriteByte((VOP_BF_VS      ), LOWBYTE( ptiming->u16BottomField_VS ));
1081     HAL_WriteByte((VOP_BF_VS   + 1), HIGHBYTE( ptiming->u16BottomField_VS ));
1082 
1083     if (g_pHalMVOPCtx->bNewVSyncMode)
1084     {
1085         #define NEW_VSYNC_MODE_ADVANCE_LINECNT 30
1086         MVOP_DBG(MVOP_PRINTF("MVOP use new vync mode, forwarding %d lines\n",NEW_VSYNC_MODE_ADVANCE_LINECNT);)
1087 
1088         MS_U16 u16BottomField_VS2MVD = ptiming->u16BottomField_VS - NEW_VSYNC_MODE_ADVANCE_LINECNT;
1089         MVOP_DBG(MVOP_PRINTF("BottomField VS ori=0x%x, new=0x%x\n", ptiming->u16BottomField_VS, u16BottomField_VS2MVD);)
1090         HAL_WriteByte((VOP_BF_VS_MVD    ), LOWBYTE( u16BottomField_VS2MVD ));
1091         HAL_WriteByte((VOP_BF_VS_MVD + 1), HIGHBYTE( u16BottomField_VS2MVD ));
1092 
1093         MS_U16 u16TopField_VS2MVD = ptiming->u16V_TotalCount - NEW_VSYNC_MODE_ADVANCE_LINECNT;
1094         MVOP_DBG(MVOP_PRINTF("TopField VS Vtt=0x%x, new=0x%x\n", ptiming->u16V_TotalCount, u16TopField_VS2MVD);)
1095         HAL_WriteByte((VOP_TF_VS_MVD    ), LOWBYTE( u16TopField_VS2MVD ));
1096         HAL_WriteByte((VOP_TF_VS_MVD + 1), HIGHBYTE( u16TopField_VS2MVD ));
1097 
1098         HAL_WriteRegBit(VOP_GCLK, 0, VOP_GCLK_MIU_ON);
1099 
1100         HAL_WriteRegBit(VOP_CTRL1, 1, VOP_MVD_VS_MD); //Use new vsync
1101 
1102         g_pHalMVOPCtx->bNewVSyncMode = FALSE; //restore to original mode
1103     }
1104     else
1105     {
1106         MS_U16 u16BottomField_VS2MVD = 0x200;
1107         HAL_WriteByte((VOP_BF_VS_MVD    ), LOWBYTE( u16BottomField_VS2MVD ));
1108         HAL_WriteByte((VOP_BF_VS_MVD + 1), HIGHBYTE( u16BottomField_VS2MVD ));
1109 
1110         MS_U16 u16TopField_VS2MVD = 0x200;
1111         HAL_WriteByte((VOP_TF_VS_MVD    ), LOWBYTE( u16TopField_VS2MVD ));
1112         HAL_WriteByte((VOP_TF_VS_MVD + 1), HIGHBYTE( u16TopField_VS2MVD ));
1113         HAL_WriteRegBit(VOP_CTRL1, 0, VOP_MVD_VS_MD);
1114     }
1115 
1116     // + S3, set default IMG_HSTR, IMG_VSTR0, IMG_VSTR1
1117 #ifdef _SUPPORT_IMG_OFFSET_
1118     HAL_WriteByte((VOP_IMG_HSTR    ), LOWBYTE( ptiming->u16HImg_Start));
1119     HAL_WriteByte((VOP_IMG_HSTR + 1), HIGHBYTE( ptiming->u16HImg_Start ));
1120     HAL_WriteByte((VOP_IMG_VSTR0   ), LOWBYTE( ptiming->u16VImg_Start0));
1121     HAL_WriteByte((VOP_IMG_VSTR0+ 1), HIGHBYTE( ptiming->u16VImg_Start0 ));
1122     HAL_WriteByte((VOP_IMG_VSTR1   ), LOWBYTE( ptiming->u16VImg_Start1 ));
1123     HAL_WriteByte((VOP_IMG_VSTR1+ 1), HIGHBYTE( ptiming->u16VImg_Start1 ));
1124 #else
1125     HAL_WriteByte((VOP_IMG_HSTR    ), LOWBYTE( ptiming->u16HActive_Start ));
1126     HAL_WriteByte((VOP_IMG_HSTR + 1), HIGHBYTE( ptiming->u16HActive_Start ));
1127     HAL_WriteByte((VOP_IMG_VSTR0   ), LOWBYTE( ptiming->u16VBlank0_End ));
1128     HAL_WriteByte((VOP_IMG_VSTR0+ 1), HIGHBYTE( ptiming->u16VBlank0_End ));
1129     HAL_WriteByte((VOP_IMG_VSTR1   ), LOWBYTE( ptiming->u16VBlank1_End ));
1130     HAL_WriteByte((VOP_IMG_VSTR1+ 1), HIGHBYTE( ptiming->u16VBlank1_End ));
1131 #endif
1132     // select mvop output from frame color(black)
1133     HAL_WriteByte((VOP_TST_IMG + 1), 0x10);
1134     HAL_WriteByte((VOP_U_PAT      ), 0x80);
1135     HAL_WriteByte((VOP_U_PAT   + 1), 0x80);
1136     // set mvop src to test pattern
1137     regval = HAL_ReadByte(VOP_TST_IMG);
1138     HAL_WriteByte(VOP_TST_IMG, 0x02);
1139     // make changed registers take effect
1140     HAL_MVOP_LoadReg();
1141 
1142     HAL_MVOP_SetMIUReqMask(TRUE);
1143     // reset mvop to avoid timing change cause mvop hang-up
1144     HAL_MVOP_Rst();
1145     HAL_MVOP_SetMIUReqMask(FALSE);
1146 
1147     // select mvop output from mvd
1148     HAL_WriteByte(VOP_TST_IMG, 0x00);
1149     HAL_WriteByte(VOP_TST_IMG, regval);
1150     HAL_WriteRegBit(VOP_CTRL0, ptiming->bHDuplicate, BIT2);// H pixel duplicate
1151 
1152 #if 0
1153     MVOP_DBG(MVOP_PRINTF("\nMVOP SetOutputTiming\n");)
1154     MVOP_DBG(MVOP_PRINTF(" VTot=%u,\t",ptiming->u16V_TotalCount);)
1155     MVOP_DBG(MVOP_PRINTF(" HTot=%u,\t",ptiming->u16H_TotalCount);)
1156     MVOP_DBG(MVOP_PRINTF(" I/P=%u\n",ptiming->bInterlace);)
1157     MVOP_DBG(MVOP_PRINTF(" W=%u,\t",ptiming->u16Width);)
1158     MVOP_DBG(MVOP_PRINTF(" H=%u,\t",ptiming->u16Height);)
1159     MVOP_DBG(MVOP_PRINTF(" FRate=%u,\t",ptiming->u8Framerate);)
1160     MVOP_DBG(MVOP_PRINTF(" HFreq=%u\n",ptiming->u16H_Freq);)
1161     MVOP_DBG(MVOP_PRINTF(" Num=0x%x,\t",ptiming->u16Num);)
1162     MVOP_DBG(MVOP_PRINTF(" Den=0x%x,\t",ptiming->u16Den);)
1163     MVOP_DBG(MVOP_PRINTF(" u16ExpFRate=%u #\n\n", ptiming->u16ExpFrameRate);)
1164 #endif
1165 }
1166 
HAL_MVOP_SetDCClk(MS_U8 clkNum,MS_BOOL bEnable)1167 void HAL_MVOP_SetDCClk(MS_U8 clkNum, MS_BOOL bEnable)
1168 {
1169     MS_ASSERT( (clkNum==0) || (clkNum==1) );
1170     if (clkNum==0)
1171     {
1172         HAL_WriteRegBit(REG_CKG_DC0, !bEnable, CKG_DC0_GATED);
1173     }
1174 }
1175 
1176 
HAL_MVOP_SetSynClk(MVOP_Timing * ptiming)1177 void HAL_MVOP_SetSynClk(MVOP_Timing *ptiming)
1178 {
1179     if (g_pHalMVOPCtx == NULL)
1180     {
1181         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1182         return;
1183     }
1184     if(g_pHalMVOPCtx->bEnableFreerunMode)
1185     {
1186         MS_U32 u32FreerunClk = (MS_U32)((MS_U64)(MPLL_CLOCK << 27) / ((MS_U32)ptiming->u16H_TotalCount * (MS_U32)ptiming->u16V_TotalCount * (MS_U32)ptiming->u8Framerate));
1187         HAL_MVOP_SetFrequency(HALMVOP_FREERUNMODE);
1188         HAL_WriteByte((REG_DC0_FREERUN_CW_L  ), LOWBYTE((MS_U16)u32FreerunClk));
1189         HAL_WriteByte((REG_DC0_FREERUN_CW_L+1), HIGHBYTE((MS_U16)u32FreerunClk));
1190         HAL_WriteByte((REG_DC0_FREERUN_CW_H  ), LOWBYTE((MS_U16)(u32FreerunClk >> 16)));
1191         HAL_WriteByte((REG_DC0_FREERUN_CW_H+1), HIGHBYTE((MS_U16)(u32FreerunClk >> 16)));
1192         HAL_WriteRegBit(REG_UPDATE_DC0_CW, 1, UPDATE_DC0_FREERUN_CW);
1193         HAL_WriteRegBit(REG_UPDATE_DC0_CW, 0, UPDATE_DC0_FREERUN_CW);
1194     }
1195     else if (_bEnable60P)
1196     {
1197         //Set DC1 Timing
1198         MS_U32 u32FrameRate = (MS_U32)ptiming->u16ExpFrameRate;
1199         MS_U32 u32VSize = 1024;
1200         MS_U32 u32HSize = ((86400000 / u32FrameRate) * 1000) / u32VSize;
1201 
1202         MS_ASSERT(u32HSize <= 4096);
1203 
1204         HAL_MVOP_SetFrequency(HAL_MVOP_GetMaxFreerunClk());
1205 
1206         HAL_WriteRegBit(VOP_REG_FRAME_RST, 0, BIT15); // reg_frame_rst = 0
1207 
1208         HAL_WriteRegBit(VOP_CTRL0, DISABLE, VOP_FSYNC_EN); // frame sync disable
1209     }
1210     else
1211     {
1212         HAL_MVOP_SetFrequency(HALMVOP_SYNCMODE);
1213         HAL_WriteByte((REG_DC0_NUM  ), LOWBYTE( ptiming->u16Num));
1214         HAL_WriteByte((REG_DC0_NUM+1), HIGHBYTE(ptiming->u16Num));
1215         HAL_WriteByte((REG_DC0_DEN  ), LOWBYTE( ptiming->u16Den));
1216         HAL_WriteByte((REG_DC0_DEN+1), HIGHBYTE(ptiming->u16Den));
1217         HAL_WriteRegBit(REG_UPDATE_DC0_CW, 1, UPDATE_DC0_SYNC_CW);
1218         HAL_WriteRegBit(REG_UPDATE_DC0_CW, 0, UPDATE_DC0_SYNC_CW);
1219     }
1220 }
1221 
1222 
HAL_MVOP_SetMonoMode(MS_BOOL bEnable)1223 void HAL_MVOP_SetMonoMode(MS_BOOL bEnable)
1224 {
1225     if(bEnable)
1226     {
1227         HAL_WriteByte(VOP_U_PAT  , 0x80);
1228         HAL_WriteByte((VOP_U_PAT+1), 0x80);
1229 
1230         HAL_WriteRegBit(VOP_INPUT_SWITCH1, 1, BIT1);    // Mono mode enable
1231     }
1232     else
1233     {
1234         HAL_WriteRegBit(VOP_INPUT_SWITCH1, 0, BIT1);    //Mono mode disable
1235     }
1236 }
1237 
1238 /******************************************************************************/
1239 /// Set MVOP for H264  Hardwire Mode
1240 /******************************************************************************/
HAL_MVOP_SetH264HardwireMode(void)1241 void HAL_MVOP_SetH264HardwireMode(void)
1242 {
1243     // Hardwire mode
1244     HAL_WriteByte(VOP_MPG_JPG_SWITCH, 0x00);
1245 
1246     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
1247 
1248     //16*32 tile format
1249     HAL_WriteRegBit(VOP_REG_WR, 1, BIT1);
1250 
1251     // SVD mode enable
1252     HAL_WriteByteMask(VOP_INPUT_SWITCH1, BIT3, BIT2|BIT3);
1253 
1254     // set mvop to 128bit_i128 interface
1255     HAL_WriteByteMask(VOP_MIU_IF, VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
1256 
1257     // Write trigger
1258     HAL_MVOP_LoadReg();
1259 }
1260 
1261 /******************************************************************************/
1262 /// Set MVOP for RM  Hardwire Mode
1263 /******************************************************************************/
HAL_MVOP_SetRMHardwireMode(void)1264 void HAL_MVOP_SetRMHardwireMode(void)
1265 {
1266     HAL_MVOP_SetH264HardwireMode();
1267 }
1268 
1269 /******************************************************************************/
1270 /// Set MVOP for JPEG Hardwire Mode
1271 /******************************************************************************/
HAL_MVOP_SetJpegHardwireMode(void)1272 void HAL_MVOP_SetJpegHardwireMode(void)
1273 {
1274     MS_U8 regval = 0x00;
1275 
1276     regval |= 0x80; // packmode
1277     regval |= 0x20; // Dram Rd Contd
1278     HAL_WriteByte(VOP_MPG_JPG_SWITCH, regval);
1279     g_pHalMVOPCtx->bIs422 = 1;
1280 	HAL_WriteRegBit(VOP_REG_DUMMY, 0, VOP_420_BW_SAVE);
1281 
1282     // Write trigger
1283     HAL_MVOP_LoadReg();
1284 }
1285 
1286 /******************************************************************************/
1287 /// Set MVOP for EVD Hardwire Mode
1288 /******************************************************************************/
HAL_MVOP_SetEVDHardwireMode(void)1289 void HAL_MVOP_SetEVDHardwireMode(void)
1290 {
1291     // Hardwire mode
1292     HAL_WriteByte(VOP_MPG_JPG_SWITCH, 0x00);
1293 
1294     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
1295 
1296     //16*32 tile format
1297     HAL_WriteRegBit(VOP_REG_WR, 1, BIT1);
1298 
1299     // SVD mode enable
1300     // EVD use HVD interface
1301     HAL_WriteByteMask(VOP_INPUT_SWITCH1, BIT3, BIT2|BIT3);
1302 
1303     // EVD use WISHBONE(R2) interface
1304     //HAL_WriteRegBit(VOP_INPUT_SWITCH0, 1, VOP_R2_WISHBONE);
1305 
1306     // MIU select from WB
1307     //HAL_WriteByteMask(VOP_INFO_FROM_CODEC_H, 0x30, VOP_INFO_FROM_CODEC_MIU_BUF0_SEL|VOP_INFO_FROM_CODEC_MIU_BUF1_SEL);
1308 
1309     // EVD mode enable
1310     HAL_WriteRegBit(VOP_INPUT_SWITCH0, 1, EVD_ENABLE);
1311 
1312     // set mvop to 128bit_i128 interface
1313     HAL_WriteByteMask(VOP_MIU_IF, VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
1314 
1315     // set evd flag for interlace mode setting
1316     g_pHalMVOPCtx->bIsH265 = 1;
1317 
1318 #if defined(CONFIG_PURE_SN)
1319     HAL_WriteByteMask(VOP_REG_MASK, 0, VOP_LSB_REQ_MASK);
1320 #endif
1321     // Write trigger
1322     HAL_MVOP_LoadReg();
1323 }
1324 
1325 /******************************************************************************/
1326 /// Set MVOP for VP9 Hardwire Mode
1327 /******************************************************************************/
HAL_MVOP_SetVP9HardwireMode(void)1328 void HAL_MVOP_SetVP9HardwireMode(void)
1329 {
1330     // Hardwire mode
1331     HAL_WriteByte(VOP_MPG_JPG_SWITCH, 0x00);
1332 
1333     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
1334 
1335     // SVD mode enable
1336     // EVD use HVD interface
1337     HAL_WriteByteMask(VOP_INPUT_SWITCH1, BIT3, BIT2|BIT3);
1338 
1339     // EVD mode enable
1340     HAL_WriteRegBit(VOP_INPUT_SWITCH0, 1, EVD_ENABLE);
1341 
1342     // set mvop to 128bit_i128 interface
1343     HAL_WriteByteMask(VOP_MIU_IF, VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
1344 
1345     // Write trigger
1346     HAL_MVOP_LoadReg();
1347 }
1348 
1349 
1350 ///Enable 3D L/R dual buffer mode
HAL_MVOP_Enable3DLR(MS_BOOL bEnable)1351 MS_BOOL HAL_MVOP_Enable3DLR(MS_BOOL bEnable)
1352 {
1353     if (g_pHalMVOPCtx == NULL)
1354     {
1355         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1356         return FALSE;
1357     }
1358     HAL_WriteRegBit(VOP_MULTI_WIN_CFG0, bEnable, VOP_LR_BUF_MODE);
1359     g_pHalMVOPCtx->b3DLRMode = bEnable;
1360     return TRUE;
1361 }
1362 
1363 ///Get if 3D L/R mode is enabled
HAL_MVOP_Get3DLRMode(void)1364 MS_BOOL HAL_MVOP_Get3DLRMode(void)
1365 {
1366     if (g_pHalMVOPCtx == NULL)
1367     {
1368         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1369         return FALSE;
1370     }
1371     return g_pHalMVOPCtx->b3DLRMode;
1372 }
1373 
HAL_MVOP_Set3DLRInsVBlank(MS_U16 u16InsLines)1374 MS_BOOL HAL_MVOP_Set3DLRInsVBlank(MS_U16 u16InsLines)
1375 {
1376     u16InsVBlank = u16InsLines;
1377     return TRUE;
1378 }
1379 
HAL_MVOP_GetTimingInfoFromRegisters(MVOP_TimingInfo_FromRegisters * pMvopTimingInfo)1380 MS_BOOL HAL_MVOP_GetTimingInfoFromRegisters(MVOP_TimingInfo_FromRegisters *pMvopTimingInfo)
1381 {
1382     if(NULL == pMvopTimingInfo)
1383     {
1384         MVOP_PRINTF("HAL_MVOP_GetTimingInfoFromRegisters():pMvopTimingInfo is NULL\n");
1385         return FALSE;
1386     }
1387     if(HAL_MVOP_GetEnableState() == FALSE)
1388     {
1389         MVOP_PRINTF("MVOP is not enabled!\n");
1390         pMvopTimingInfo->bEnabled = FALSE;
1391         return FALSE;
1392     }
1393     pMvopTimingInfo->bEnabled = TRUE;
1394     pMvopTimingInfo->u16H_TotalCount = (HAL_ReadByte((VOP_FRAME_HCOUNT + 1))<< 8) | (HAL_ReadByte((VOP_FRAME_HCOUNT)));
1395     pMvopTimingInfo->u16V_TotalCount = (HAL_ReadByte((VOP_FRAME_VCOUNT + 1))<< 8) | (HAL_ReadByte((VOP_FRAME_VCOUNT)));
1396     pMvopTimingInfo->u16VBlank0_Start = (HAL_ReadByte((VOP_VB0_STR + 1))<< 8) | (HAL_ReadByte((VOP_VB0_STR)));
1397     pMvopTimingInfo->u16VBlank0_End = (HAL_ReadByte((VOP_VB0_END + 1))<< 8) | (HAL_ReadByte((VOP_VB0_END)));
1398     pMvopTimingInfo->u16VBlank1_Start = (HAL_ReadByte((VOP_VB1_STR + 1))<< 8) | (HAL_ReadByte((VOP_VB1_STR)));
1399     pMvopTimingInfo->u16VBlank1_End = (HAL_ReadByte((VOP_VB1_END + 1))<< 8) | (HAL_ReadByte((VOP_VB1_END)));
1400     pMvopTimingInfo->u16TopField_Start = (HAL_ReadByte((VOP_TF_STR + 1))<< 8) | (HAL_ReadByte((VOP_TF_STR)));
1401     pMvopTimingInfo->u16BottomField_Start = (HAL_ReadByte((VOP_BF_STR + 1))<< 8) | (HAL_ReadByte((VOP_BF_STR)));
1402     pMvopTimingInfo->u16HActive_Start = (HAL_ReadByte((VOP_HACT_STR + 1))<< 8) | (HAL_ReadByte((VOP_HACT_STR)));
1403     pMvopTimingInfo->u16TopField_VS = (HAL_ReadByte((VOP_TF_VS + 1))<< 8) | (HAL_ReadByte((VOP_TF_VS)));
1404     pMvopTimingInfo->u16BottomField_VS = (HAL_ReadByte((VOP_BF_VS + 1))<< 8) | (HAL_ReadByte((VOP_BF_VS)));
1405     pMvopTimingInfo->bInterlace = (HAL_ReadRegBit(VOP_CTRL0, BIT7) == BIT7);
1406     return TRUE;
1407 }
1408 
HAL_MVOP_SetYUVBaseAdd(MS_U32 u32YOffset,MS_U32 u32UVOffset,MS_BOOL bProgressive,MS_BOOL b422pack)1409 void HAL_MVOP_SetYUVBaseAdd(MS_U32 u32YOffset, MS_U32 u32UVOffset, MS_BOOL bProgressive, MS_BOOL b422pack)
1410 {
1411     MS_U32 u32tmp = 0;
1412 
1413     if (g_pHalMVOPCtx == NULL)
1414     {
1415         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1416         return;
1417     }
1418     // Y offset
1419     u32tmp = u32YOffset >> 3;
1420     if ( !bProgressive )
1421     {   //Refine Y offset for interlace repeat bottom field
1422         if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
1423         {
1424             MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
1425             u32tmp += 2;
1426         }
1427         else
1428         {
1429             MVOP_DBG("%d eRepeatField(%x) is TOP or NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
1430         }
1431     }
1432     HAL_WriteByte(VOP_JPG_YSTR0_L, u32tmp & 0xff);
1433     HAL_WriteByte((VOP_JPG_YSTR0_L+1), (u32tmp >> 8) & 0xff);
1434     HAL_WriteByte((VOP_JPG_YSTR0_L+2), (u32tmp >> 16) & 0xff);
1435     HAL_WriteByte((VOP_JPG_YSTR0_L+3), (u32tmp >> 24) & VOP_YUV_STR_HIBITS);
1436 
1437     if (!bProgressive )
1438     {   //Y offset of bottom field if interlace
1439         HAL_WriteByte(VOP_JPG_YSTR1_L, u32tmp & 0xff);
1440         HAL_WriteByte((VOP_JPG_YSTR1_L+1), (u32tmp >> 8) & 0xff);
1441         HAL_WriteByte((VOP_JPG_YSTR1_L+2), (u32tmp >> 16) & 0xff);
1442         HAL_WriteByte((VOP_JPG_YSTR1_L+3), (u32tmp >> 24) & VOP_YUV_STR_HIBITS);
1443     }
1444 
1445     if (b422pack)
1446     {
1447         u32UVOffset = u32YOffset + 16; //add 16 for 128bit; add 8 for 64bit
1448     }
1449     // UV offset
1450     u32tmp = u32UVOffset >> 3;
1451     if( !bProgressive )
1452     {  //Refine UV offset for interlace repeat bottom field
1453         if (E_MVOP_RPTFLD_BOT == g_pHalMVOPCtx->eRepeatField)
1454         {
1455             MVOP_DBG("%d eRepeatField(%x) is bottom!\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
1456             u32tmp += 2;
1457         }
1458         else
1459         {
1460             MVOP_DBG("%d eRepeatField(%x) is TOP/NONE.\n", __LINE__, g_pHalMVOPCtx->eRepeatField);
1461         }
1462     }
1463     HAL_WriteByte(VOP_JPG_UVSTR0_L, u32tmp & 0xff);
1464     HAL_WriteByte((VOP_JPG_UVSTR0_L+1), (u32tmp >> 8) & 0xff);
1465     HAL_WriteByte((VOP_JPG_UVSTR0_L+2), (u32tmp >> 16) & 0xff);
1466     HAL_WriteByte((VOP_JPG_UVSTR0_L+3), (u32tmp >> 24) & VOP_YUV_STR_HIBITS);
1467 
1468     if( !bProgressive )
1469     {  //UV offset of bottom field if interlace
1470         HAL_WriteByte(VOP_JPG_UVSTR1_L, u32tmp & 0xff);
1471         HAL_WriteByte((VOP_JPG_UVSTR1_L+1), (u32tmp >> 8) & 0xff);
1472         HAL_WriteByte((VOP_JPG_UVSTR1_L+2), (u32tmp >> 16) & 0xff);
1473         HAL_WriteByte((VOP_JPG_UVSTR1_L+3), (u32tmp >> 24) & VOP_YUV_STR_HIBITS);
1474     }
1475 
1476     return;
1477 }
1478 
HAL_MVOP_SetYUVBaseAddMultiView(MVOP_BaseAddInput * stBaseAddInfo)1479 MS_BOOL HAL_MVOP_SetYUVBaseAddMultiView(MVOP_BaseAddInput *stBaseAddInfo)
1480 {
1481     MS_U32 u32tmpY = 0;
1482     MS_U32 u32tmpUV = 0;
1483 
1484     if (stBaseAddInfo == NULL)
1485     {
1486         MVOP_DBG(MVOP_PRINTF("%s stBaseAddInfo is NULL pointer\n", __FUNCTION__);)
1487         return FALSE;
1488     }
1489     // Y offset
1490     u32tmpY = (stBaseAddInfo->u32YOffset) >> 3;
1491     // UV offset
1492     u32tmpUV = (stBaseAddInfo->u32UVOffset) >> 3;
1493 
1494     switch(stBaseAddInfo->eView)
1495     {
1496     case E_MVOP_MAIN_VIEW:
1497         // Y offset
1498         HAL_WriteByte(VOP_JPG_YSTR0_L, u32tmpY & 0xff);
1499         HAL_WriteByte((VOP_JPG_YSTR0_L+1), (u32tmpY >> 8) & 0xff);
1500         HAL_WriteByte((VOP_JPG_YSTR0_L+2), (u32tmpY >> 16) & 0xff);
1501         HAL_WriteByte((VOP_JPG_YSTR0_L+3), (u32tmpY >> 24) & VOP_YUV_STR_HIBITS);
1502 
1503         // UV offset
1504         HAL_WriteByte(VOP_JPG_UVSTR0_L, u32tmpUV & 0xff);
1505         HAL_WriteByte((VOP_JPG_UVSTR0_L+1), (u32tmpUV >> 8) & 0xff);
1506         HAL_WriteByte((VOP_JPG_UVSTR0_L+2), (u32tmpUV >> 16) & 0xff);
1507         HAL_WriteByte((VOP_JPG_UVSTR0_L+3), (u32tmpUV >> 24) & VOP_YUV_STR_HIBITS);
1508         break;
1509     case E_MVOP_2ND_VIEW:
1510         // Y offset
1511         HAL_WriteByte(VOP_JPG_YSTR1_L, u32tmpY & 0xff);
1512         HAL_WriteByte((VOP_JPG_YSTR1_L+1), (u32tmpY >> 8) & 0xff);
1513         HAL_WriteByte((VOP_JPG_YSTR1_L+2), (u32tmpY >> 16) & 0xff);
1514         HAL_WriteByte((VOP_JPG_YSTR1_L+3), (u32tmpY >> 24) & VOP_YUV_STR_HIBITS);
1515 
1516         //UV offset
1517         HAL_WriteByte(VOP_JPG_UVSTR1_L, u32tmpUV & 0xff);
1518         HAL_WriteByte((VOP_JPG_UVSTR1_L+1), (u32tmpUV >> 8) & 0xff);
1519         HAL_WriteByte((VOP_JPG_UVSTR1_L+2), (u32tmpUV >> 16) & 0xff);
1520         HAL_WriteByte((VOP_JPG_UVSTR1_L+3), (u32tmpUV >> 24) & VOP_YUV_STR_HIBITS);
1521         break;
1522     default:
1523         break;
1524     }
1525     return TRUE;
1526 }
1527 
HAL_MVOP_GetYBaseAdd(void)1528 MS_U32 HAL_MVOP_GetYBaseAdd(void)
1529 {
1530     MS_U32 u32YOffset;
1531     u32YOffset = HAL_ReadByte(VOP_JPG_YSTR0_L)&0xff;
1532     u32YOffset |=((HAL_ReadByte((VOP_JPG_YSTR0_L+1))<<8)&0xff00);
1533     u32YOffset |=((HAL_ReadByte((VOP_JPG_YSTR0_L+2))<<16)&0xff0000);
1534     u32YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR0_L+3)) & VOP_YUV_STR_HIBITS) <<24);
1535     return u32YOffset;
1536 }
1537 
HAL_MVOP_GetUVBaseAdd(void)1538 MS_U32 HAL_MVOP_GetUVBaseAdd(void)
1539 {
1540     MS_U32 u32UVOffset;
1541     u32UVOffset = HAL_ReadByte(VOP_JPG_UVSTR0_L)&0xff;
1542     u32UVOffset |=((HAL_ReadByte((VOP_JPG_UVSTR0_L+1))<<8)&0xff00);
1543     u32UVOffset |=((HAL_ReadByte((VOP_JPG_UVSTR0_L+2))<<16)&0xff0000);
1544     u32UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR0_L+3)) & VOP_YUV_STR_HIBITS) <<24);
1545     return u32UVOffset;
1546 }
1547 
HAL_MVOP_GetYBaseAddMultiView(MVOP_3DView eView)1548 MS_U32 HAL_MVOP_GetYBaseAddMultiView(MVOP_3DView eView)
1549 {
1550     MS_U32 u32YOffset;
1551     switch(eView)
1552     {
1553         case E_MVOP_MAIN_VIEW:
1554             u32YOffset = HAL_ReadByte(VOP_JPG_YSTR0_L)&0xff;
1555             u32YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR0_L+1))<<8)&0xff00);
1556             u32YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR0_L+2))<<16)&0xff0000);
1557             u32YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR0_L+3)) & VOP_YUV_STR_HIBITS) <<24);
1558             break;
1559         case E_MVOP_2ND_VIEW:
1560             u32YOffset = HAL_ReadByte(VOP_JPG_YSTR1_L)&0xff;
1561             u32YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR1_L+1))<<8)&0xff00);
1562             u32YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR1_L+2))<<16)&0xff0000);
1563             u32YOffset |= ((HAL_ReadByte((VOP_JPG_YSTR1_L+3))<<24)&0x7000000);
1564             break;
1565         default:
1566             u32YOffset = 0;
1567             break;
1568     }
1569     return u32YOffset;
1570 }
1571 
HAL_MVOP_GetUVBaseAddMultiView(MVOP_3DView eView)1572 MS_U32 HAL_MVOP_GetUVBaseAddMultiView(MVOP_3DView eView)
1573 {
1574     MS_U32 u32UVOffset;
1575     switch(eView)
1576     {
1577         case E_MVOP_MAIN_VIEW:
1578             u32UVOffset = HAL_ReadByte(VOP_JPG_UVSTR0_L)&0xff;
1579             u32UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR0_L+1))<<8)&0xff00);
1580             u32UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR0_L+2))<<16)&0xff0000);
1581             u32UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR0_L+3)) & VOP_YUV_STR_HIBITS) <<24);
1582             break;
1583         case E_MVOP_2ND_VIEW:
1584             u32UVOffset = HAL_ReadByte(VOP_JPG_UVSTR1_L)&0xff;
1585             u32UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR1_L+1))<<8)&0xff00);
1586             u32UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR1_L+2))<<16)&0xff0000);
1587             u32UVOffset |= ((HAL_ReadByte((VOP_JPG_UVSTR1_L+3))<<24)&0x7000000);
1588             break;
1589         default:
1590             u32UVOffset = 0;
1591             break;
1592     }
1593     return u32UVOffset;
1594 }
1595 
HAL_MVOP_Set3DLRAltOutput_VHalfScaling(MS_BOOL bEnable)1596 MS_BOOL HAL_MVOP_Set3DLRAltOutput_VHalfScaling(MS_BOOL bEnable)
1597 {
1598     MS_BOOL bEnDualBuff = bEnable ? ENABLE : DISABLE;     //enable dual buffer
1599     MS_BOOL bEnSWDualBuff = bEnable ? DISABLE : ENABLE;   //buffer controlled by HK instead of FW
1600     MS_BOOL bEnMirrMaskBase = bEnable ? DISABLE : ENABLE; //do not mask LSB
1601     MS_BOOL bEnHwFldBase = bEnable ? DISABLE : ENABLE;    //hardware calculate field jump base address
1602     if (g_pHalMVOPCtx == NULL)
1603     {
1604         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1605         return FALSE;
1606     }
1607     //Set 0x27[2] = 1 (enable SW dual buffer mode)
1608     HAL_WriteRegBit(VOP_REG_WR, bEnDualBuff, VOP_BUF_DUAL);
1609 
1610     //Set 0x38[8] = 0 (use SW dual buffer mode)
1611     HAL_WriteRegBit(VOP_INFO_FROM_CODEC_H, bEnSWDualBuff, VOP_INFO_FROM_CODEC_DUAL_BUFF);
1612 
1613     //Set 0x3b[7] = 0 (use MVD/HVD firmware send base)
1614     HAL_WriteRegBit(VOP_MIRROR_CFG, bEnMirrMaskBase, VOP_MASK_BASE_LSB);
1615 
1616     //Set 0x3b[5] = 0 (hardware calculate field jump base address)
1617     HAL_WriteRegBit(VOP_MIRROR_CFG, bEnHwFldBase, VOP_HW_FLD_BASE);
1618     g_pHalMVOPCtx->b3DLRAltOutput = bEnable;
1619     return TRUE;
1620 }
1621 
HAL_MVOP_Set3DLRAltOutput(MS_BOOL bEnable)1622 MS_BOOL HAL_MVOP_Set3DLRAltOutput(MS_BOOL bEnable)
1623 {
1624     //Set 0x3C[2] = 1 (enable 3D L/R dual buffer line alternative output)
1625     //it works when 0x3C[0] = 1
1626     HAL_WriteRegBit(VOP_MULTI_WIN_CFG0, bEnable, VOP_LR_LA_OUT);
1627 
1628     g_pHalMVOPCtx->b3DLRAltOutput = bEnable;
1629     return TRUE;
1630 }
1631 
HAL_MVOP_Set3DLRAltSBSOutput(MS_BOOL bEnable)1632 MS_BOOL HAL_MVOP_Set3DLRAltSBSOutput(MS_BOOL bEnable)
1633 {
1634     //it works when 0x3C[0] = 1 and 0x3C[2] = 1
1635     //Set 0x3C[3] = 1 (3D L/R line alternative read, side-by-side output)
1636     HAL_WriteRegBit(VOP_MULTI_WIN_CFG0, bEnable, VOP_LR_LA2SBS_OUT);
1637     g_pHalMVOPCtx->b3DLRAltSBSOutput = bEnable;
1638     return TRUE;
1639 }
1640 
HAL_MVOP_Get3DLRAltOutput(void)1641 MS_BOOL HAL_MVOP_Get3DLRAltOutput(void)
1642 {
1643     if (g_pHalMVOPCtx == NULL)
1644     {
1645         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1646         return FALSE;
1647     }
1648     return g_pHalMVOPCtx->b3DLRAltOutput;
1649 }
1650 
HAL_MVOP_Get3DLRAltSBSOutput(void)1651 MS_BOOL HAL_MVOP_Get3DLRAltSBSOutput(void)
1652 {
1653     return g_pHalMVOPCtx->b3DLRAltSBSOutput;
1654 }
1655 
HAL_MVOP_GetOutput3DType(void)1656 EN_MVOP_Output_3D_TYPE HAL_MVOP_GetOutput3DType(void)
1657 {
1658     EN_MVOP_Output_3D_TYPE en3DType = E_MVOP_OUTPUT_3D_NONE;
1659     if(g_pHalMVOPCtx->b3DLRMode)
1660     {
1661         if(g_pHalMVOPCtx->b3DLRAltSBSOutput)
1662         {
1663             en3DType = E_MVOP_OUTPUT_3D_SBS;
1664         }
1665         else
1666         {
1667             en3DType = E_MVOP_OUTPUT_3D_TB;
1668         }
1669     }
1670     else if(g_pHalMVOPCtx->b3DLRAltOutput)
1671     {
1672         en3DType = E_MVOP_OUTPUT_3D_LA;
1673     }
1674     return en3DType;
1675 }
1676 
HAL_MVOP_Set3DLR2ndCfg(MS_BOOL bEnable)1677 MS_BOOL HAL_MVOP_Set3DLR2ndCfg(MS_BOOL bEnable)
1678 {
1679     //Set 0x3c[7] as 1 to enable
1680     HAL_WriteRegBit(VOP_MULTI_WIN_CFG0, bEnable, VOP_LR_DIFF_SIZE);
1681     return TRUE;
1682 }
1683 
HAL_MVOP_Get3DLR2ndCfg(void)1684 MS_BOOL HAL_MVOP_Get3DLR2ndCfg(void)
1685 {
1686     MS_BOOL bEnable = FALSE;
1687     if (VOP_LR_DIFF_SIZE == (VOP_LR_DIFF_SIZE & HAL_ReadRegBit(VOP_MULTI_WIN_CFG0, VOP_LR_DIFF_SIZE)))
1688     {
1689         bEnable = TRUE;
1690     }
1691     return bEnable;
1692 }
1693 
HAL_MVOP_GetMirrorMode(MVOP_DevID eID)1694 MVOP_DrvMirror HAL_MVOP_GetMirrorMode(MVOP_DevID eID)
1695 {
1696     MVOP_DrvMirror enMirror = E_VOPMIRROR_NONE;
1697     if (g_pHalMVOPCtx == NULL)
1698     {
1699         MVOP_DBG(MVOP_PRINTF("%s g_pHalMVOPCtx is NULL pointer\n", __FUNCTION__);)
1700         return FALSE;
1701     }
1702     switch(eID)
1703     {
1704         case E_MVOP_DEV_0:
1705             if(g_pHalMVOPCtx->bMirrorModeVer && g_pHalMVOPCtx->bMirrorModeHor)
1706             {
1707                 enMirror = E_VOPMIRROR_HVBOTH;
1708             }
1709             else if(g_pHalMVOPCtx->bMirrorModeHor)
1710             {
1711                 enMirror = E_VOPMIRROR_HORIZONTALL;
1712             }
1713             else if(g_pHalMVOPCtx->bMirrorModeVer)
1714             {
1715                 enMirror = E_VOPMIRROR_VERTICAL;
1716             }
1717             break;
1718         default:
1719             break;
1720     }
1721     return enMirror;
1722 }
1723 
HAL_MVOP_SetVerDup(MS_BOOL bEnable)1724 MS_BOOL HAL_MVOP_SetVerDup(MS_BOOL bEnable)
1725 {
1726     HAL_WriteRegBit(VOP_CTRL0, bEnable, BIT3);// V line duplicate
1727     return TRUE;
1728 }
1729 
HAL_MVOP_GetVerDup(void)1730 MS_BOOL HAL_MVOP_GetVerDup(void)
1731 {
1732     return (HAL_ReadRegBit(VOP_CTRL0, BIT3) == BIT3);
1733 }
1734 
HAL_MVOP_SetVerx4Dup(MS_BOOL bEnable)1735 MS_BOOL HAL_MVOP_SetVerx4Dup(MS_BOOL bEnable)
1736 {
1737     HAL_WriteRegBit(VOP_CTRL0, bEnable, BIT3);// x4 duplicate should raise V line duplicate first
1738     HAL_WriteRegBit(VOP_RGB_FMT, bEnable, BIT3);// V line x4 duplicate
1739     return TRUE;
1740 }
1741 
HAL_MVOP_SetHorx4Dup(MS_BOOL bEnable)1742 MS_BOOL HAL_MVOP_SetHorx4Dup(MS_BOOL bEnable)
1743 {
1744     HAL_WriteRegBit(VOP_CTRL0, bEnable, BIT2);// x4 duplicate should raise H pixel duplicate first
1745     HAL_WriteRegBit(VOP_RGB_FMT, bEnable, BIT2);// H line x4 duplicate
1746     return TRUE;
1747 }
1748 
HAL_MVOP_GetVerx4Dup(void)1749 MS_BOOL HAL_MVOP_GetVerx4Dup(void)
1750 {
1751     return ((HAL_ReadRegBit(VOP_RGB_FMT, BIT3) & HAL_ReadRegBit(VOP_CTRL0, BIT3)) == BIT3);
1752 }
1753 
HAL_MVOP_GetHorx4Dup(void)1754 MS_BOOL HAL_MVOP_GetHorx4Dup(void)
1755 {
1756     return ((HAL_ReadRegBit(VOP_RGB_FMT, BIT2) & HAL_ReadRegBit(VOP_CTRL0, BIT3)) == BIT2);
1757 }
1758 
HAL_MVOP_GetTopVStart(MVOP_DevID eID)1759 MS_U16 HAL_MVOP_GetTopVStart(MVOP_DevID eID)
1760 {
1761     MS_U16 u16TopVStart = 0;
1762     switch(eID)
1763     {
1764         case E_MVOP_DEV_0:
1765             u16TopVStart = HAL_Read2Byte(VOP_IMG_VSTR0)&0x1fff;
1766             break;
1767         default:
1768             break;
1769     }
1770     return u16TopVStart;
1771 }
1772 
HAL_MVOP_GetBottomVStart(MVOP_DevID eID)1773 MS_U16 HAL_MVOP_GetBottomVStart(MVOP_DevID eID)
1774 {
1775     MS_U16 u16BotVStart = 0;
1776     switch(eID)
1777     {
1778         case E_MVOP_DEV_0:
1779             u16BotVStart = HAL_Read2Byte(VOP_IMG_VSTR1)&0x1fff;
1780             break;
1781         default:
1782             break;
1783     }
1784     return u16BotVStart;
1785 }
1786 
HAL_MVOP_GetVCount(MVOP_DevID eID)1787 MS_U16 HAL_MVOP_GetVCount(MVOP_DevID eID)
1788 {
1789     MS_U16 u16VCount = 0;
1790     switch(eID)
1791     {
1792         case E_MVOP_DEV_0:
1793             u16VCount = HAL_Read2Byte(VOP_DEBUG_2A)&0x1fff;
1794             break;
1795         default:
1796             break;
1797     }
1798     return u16VCount;
1799 }
1800 
HAL_MVOP_SetVC1RangeMap(MVOP_DevID eID,MVOP_VC1RangeMapInfo * stVC1RangeMapInfo)1801 MS_BOOL HAL_MVOP_SetVC1RangeMap(MVOP_DevID eID, MVOP_VC1RangeMapInfo *stVC1RangeMapInfo)
1802 {
1803     MS_U32 u8Luma = 0;
1804     MS_U32 u8Chroma = 0;
1805 
1806     if (stVC1RangeMapInfo == NULL)
1807     {
1808         MVOP_DBG(MVOP_PRINTF("%s stBaseAddInfo is NULL pointer\n", __FUNCTION__);)
1809         return FALSE;
1810     }
1811 
1812     // Luma value
1813     u8Luma = stVC1RangeMapInfo->u8LumaValue;
1814     // Chroma value
1815     u8Chroma = stVC1RangeMapInfo->u8ChromaValue;
1816 
1817     switch(eID)
1818     {
1819         case E_MVOP_DEV_0:
1820             //set VC1 Luma value
1821             if(stVC1RangeMapInfo->bIsEnableLuma)
1822             {
1823                 HAL_WriteRegBit(VOP_RAMAP_LUMA, 1, BIT7);
1824                 HAL_WriteByteMask(VOP_RAMAP_LUMA, u8Luma, VOP_RAMAP_LUMA_VAL);
1825             }
1826             else //disable
1827             {
1828                 HAL_WriteRegBit(VOP_RAMAP_LUMA, 0, BIT7);
1829             }
1830 
1831             //set VC1 Chroma value
1832             if(stVC1RangeMapInfo->bIsEnableChroma)
1833             {
1834                 HAL_WriteRegBit(VOP_RAMAP_CHROMA, 1, BIT7);
1835                 HAL_WriteByteMask(VOP_RAMAP_CHROMA, u8Chroma, VOP_RAMAP_CHROMA_VAL);
1836             }
1837             else
1838             {
1839                 HAL_WriteRegBit(VOP_RAMAP_CHROMA, 0, BIT7);
1840             }
1841             break;
1842         default:
1843                 break;
1844     }
1845     return TRUE;
1846 }
1847 
1848 MS_U16 g_u16SetStartX = 0;
1849 MS_U16 g_u16SetStartY = 0;
1850 MS_BOOL g_bIsY4Align = 0;
1851 
HAL_MVOP_SetStartX(MS_U16 u16Length)1852 void HAL_MVOP_SetStartX(MS_U16 u16Length)
1853 {
1854 	g_u16SetStartX = u16Length;
1855 	HAL_WriteByte(VOP_REG_CROP_HSTART, u16Length & 0xff);
1856 	HAL_WriteByte((VOP_REG_CROP_HSTART + 1),((u16Length) >> (8)) & (0x1f));
1857 	// Write trigger
1858 	HAL_MVOP_LoadReg();
1859 }
1860 
1861 
HAL_MVOP_SetStartY(MS_U16 u16Length,MS_BOOL bIs4Align)1862 void HAL_MVOP_SetStartY(MS_U16 u16Length, MS_BOOL bIs4Align)
1863 {
1864 	g_u16SetStartY = u16Length;
1865         g_bIsY4Align = bIs4Align;
1866 	HAL_WriteByte(VOP_REG_CROP_VSTART, u16Length & 0xff);
1867 	HAL_WriteByte((VOP_REG_CROP_VSTART + 1), ((u16Length) >> (8)) & (0x1f));
1868 	// Write trigger
1869 	HAL_MVOP_LoadReg();
1870 }
1871 
1872 
HAL_MVOP_SetPicWidthMinus(MS_U16 u16Sizes)1873 void HAL_MVOP_SetPicWidthMinus(MS_U16 u16Sizes)
1874 {
1875 	u16Sizes = u16Sizes + 1 - g_u16SetStartX ;
1876     HAL_WriteByte(VOP_REG_CROP_HSIZE, u16Sizes & 0xff);
1877     HAL_WriteByte((VOP_REG_CROP_HSIZE + 1), ((u16Sizes) >> (8)) & (0x1f));
1878 	// Write trigger
1879     HAL_MVOP_LoadReg();
1880 }
1881 
HAL_MVOP_SetPicHeightMinus(MS_U16 u16Sizes)1882 void HAL_MVOP_SetPicHeightMinus(MS_U16 u16Sizes)
1883 {
1884 	u16Sizes = u16Sizes + 1 - g_u16SetStartY ;
1885     if(g_bIsY4Align)
1886         u16Sizes -= 2;
1887 
1888     HAL_WriteByte(VOP_REG_CROP_VSIZE, (u16Sizes) & 0xff);
1889     HAL_WriteByte((VOP_REG_CROP_VSIZE + 1), ((u16Sizes) >> (8)) & (0x1f));
1890     // Write trigger
1891     HAL_MVOP_LoadReg();
1892 }
1893 
HAL_MVOP_PowerStateSuspend(void)1894 void HAL_MVOP_PowerStateSuspend(void)
1895 {
1896     g_pHalMVOPCtx->bIsInit = 0;
1897 }
1898 
HAL_MVOP_GetHandShakeMode(MVOP_DevID eID)1899 MVOP_HSMode HAL_MVOP_GetHandShakeMode(MVOP_DevID eID)
1900 {
1901     MVOP_HSMode eRet = E_MVOP_HS_NOT_SUPPORT;
1902     switch(eID)
1903     {
1904         case E_MVOP_DEV_0:
1905             eRet = E_MVOP_HS_NOT_SUPPORT;
1906             break;
1907         case E_MVOP_DEV_1:
1908 #if MVOP_SUPPORT_SUB
1909             eRet = E_MVOP_HS_INVALID_PARAM;
1910 #endif
1911             break;
1912         default:
1913             eRet = E_MVOP_HS_INVALID_PARAM;
1914             break;
1915     }
1916     return eRet;
1917 }
1918 
HAL_MVOP_CheckSTCCW(void)1919 MS_BOOL HAL_MVOP_CheckSTCCW(void)
1920 {
1921     MS_U16 u16STC_CW_L = 0;
1922     MS_U16 u16STC_CW_H = 0;
1923 
1924     u16STC_CW_L = HAL_Read2Byte(REG_STC0_CW_L)&0xffff;
1925     u16STC_CW_H = HAL_Read2Byte(REG_STC0_CW_H)&0xffff;
1926 
1927     if((u16STC_CW_L || u16STC_CW_H) == 0)
1928         return FALSE;
1929     else
1930         return TRUE;
1931 
1932 }
1933 
1934 // munich not support miu control by ip
1935 #if 0
1936 #define MIU1_REG_BASE       0x0600
1937 MS_BOOL HAL_MVOP_GetIsMiuIPControl(HALMVOPMIUCLIENTINFO stInfo)
1938 {
1939     MS_U32 u32RegMiu = 0;
1940     MS_U16 u16Mask = 0;
1941     MS_BOOL bRet = FALSE;
1942 
1943     u32RegMiu = MIU1_REG_BASE + (0xF0+(stInfo.u8Gp * 2));
1944     if(stInfo.u8BitPos < 8)
1945     {
1946         u16Mask = 1<<stInfo.u8BitPos;
1947     }
1948     else
1949     {
1950         u16Mask = 1<<(stInfo.u8BitPos-8);
1951         u32RegMiu += 1;
1952     }
1953     MVOP_DBG(MVOP_PRINTF("[%s] u32RegMiu = 0x%lx, u16Mask = 0x%x\n",__FUNCTION__, u32RegMiu,u16Mask);)
1954     if(HAL_ReadRegBit(u32RegMiu, u16Mask))
1955     {
1956         bRet = TRUE;
1957     }
1958 
1959     return bRet;
1960 }
1961 #endif
1962 
1963 /* Y and UV buffer can not be in seperated buffer in Madison*/
HAL_MVOP_SelMIU(MVOP_DevID eDevID,HALMVOPMIUSEL eMiuMSB0,HALMVOPMIUSEL eMiuMSB1,HALMVOPMIUSEL eMiuLSB0,HALMVOPMIUSEL eMiuLSB1)1964 void HAL_MVOP_SelMIU(MVOP_DevID eDevID, HALMVOPMIUSEL eMiuMSB0, HALMVOPMIUSEL eMiuMSB1, HALMVOPMIUSEL eMiuLSB0, HALMVOPMIUSEL eMiuLSB1)
1965 {
1966     switch(eDevID)
1967     {
1968         case E_MVOP_DEV_0:
1969         {
1970             HAL_WriteRegBit(VOP_MIU_SEL, eMiuMSB0, VOP_BUF_MIU_SEL);
1971             break;
1972         }
1973 #if MVOP_SUPPORT_SUB
1974         case E_MVOP_DEV_1:
1975         {
1976             HAL_WriteRegBit(SUB_REG(VOP_MIU_SEL), eMiuMSB0, VOP_BUF_MIU_SEL);
1977             break;
1978         }
1979 #endif
1980         default:
1981             break;
1982     }
1983 }
1984 
HAL_MVOP_GetMaxFramerate(MVOP_DevID eDevID,MVOP_GetMaxFps * stStreamInfo)1985 void HAL_MVOP_GetMaxFramerate(MVOP_DevID eDevID, MVOP_GetMaxFps* stStreamInfo)
1986 {
1987     MS_U64 u64MaxClk = 0;
1988     MS_U16 u16HsizeTiming = 0;
1989     MS_U16 u16VsizeTiming = 0;
1990 
1991     if(NULL == stStreamInfo)
1992     {
1993         MVOP_PRINTF("[%s] Input parameter is NULL!\n",__FUNCTION__);
1994         return;
1995     }
1996 
1997     switch(eDevID)
1998     {
1999         case E_MVOP_DEV_0:
2000 #if MVOP_SUPPORT_SUB
2001         case E_MVOP_DEV_1:
2002 #endif
2003         {
2004             if(_HAL_MVOP_IsSupport4k2k2P())
2005             {
2006                 u16HsizeTiming = stStreamInfo->u16HSize >> 1;
2007             }
2008             else
2009             {
2010                 u16HsizeTiming = stStreamInfo->u16HSize;
2011                 u16HsizeTiming = ALIGN_UPTO_2(u16HsizeTiming);
2012             }
2013             if(stStreamInfo->b3DSBS)
2014             {
2015                 u16HsizeTiming *= 2;
2016             }
2017             if(stStreamInfo->u16HSize > 720)
2018             {
2019                 u16HsizeTiming +=  MVOP_HBlank_HD;
2020             }
2021             else
2022             {
2023                 u16HsizeTiming +=  MVOP_HBlank_SD;
2024             }
2025 
2026             u64MaxClk = HAL_MVOP_GetMaximumClk();
2027             if(stStreamInfo->b3DTB)
2028             {
2029                 u16VsizeTiming = stStreamInfo->u16VSize*2 + MVOP_VBlank;
2030             }
2031             else
2032             {
2033                 u16VsizeTiming = stStreamInfo->u16VSize + MVOP_VBlank;
2034             }
2035 
2036             stStreamInfo->u32Framerate = (u64MaxClk / u16HsizeTiming / u16VsizeTiming)*1000;
2037         }
2038             break;
2039         default:
2040             break;
2041     }
2042 
2043 }
2044 
HAL_MVOP_ResetReg(MVOP_DevID eDevID)2045 void HAL_MVOP_ResetReg(MVOP_DevID eDevID)
2046 {
2047 
2048     switch(eDevID)
2049     {
2050     case E_MVOP_DEV_0:
2051     {
2052 #if ENABLE_3D_LR_MODE
2053         HAL_MVOP_Enable3DLR(DISABLE);
2054 #endif
2055 #if SUPPORT_3DLR_ALT_SBS
2056         HAL_MVOP_Set3DLRAltOutput(DISABLE);
2057         HAL_MVOP_Set3DLRAltSBSOutput(DISABLE);
2058 #endif
2059 
2060     /*****************************************************/
2061     // Reset MVOP setting
2062     HAL_WriteByte(VOP_TST_IMG, 0x40); //reset test pattern or BG
2063     HAL_MVOP_Set3DLRAltOutput_VHalfScaling(DISABLE); //reset to default: disable 3D L/R alternative output.
2064     HAL_MVOP_Set3DLR2ndCfg(DISABLE);    //reset to default: disable 3D L/R 2nd pitch.
2065     HAL_MVOP_SetRgbFormat(E_MVOP_RGB_NONE); //reset rgb format
2066     HAL_WriteRegBit(VOP_CTRL1, 0, VOP_MVD_VS_MD); //default use original vsync
2067     // Reset Mono mode
2068     HAL_MVOP_SetMonoMode(FALSE);
2069 
2070     //set MVOP test pattern to black
2071     HAL_MVOP_SetBlackBG();
2072 
2073     // clear extend strip len bit by default
2074     HAL_WriteRegBit(VOP_REG_STRIP_ALIGN, 0, BIT0);
2075 
2076     // set mvop to 128bit_i128 interface
2077     HAL_WriteByteMask(VOP_MIU_IF, VOP_MIU_128BIT, VOP_MIU_128BIT|VOP_MIU_128B_I64);
2078 
2079     // Disable H264 or RM Input
2080     HAL_WriteRegBit(VOP_INPUT_SWITCH1, 0, BIT2|BIT3);
2081     // Clear 422 Flag
2082     g_pHalMVOPCtx->bIs422 = 0;
2083     // Clear evd Flag for interlace mode setting
2084     g_pHalMVOPCtx->bIsH265 = 0;
2085     HAL_WriteRegBit(VOP_INT_TYPE, 0, VOP_EVD_INT_SEP);
2086     //8*32 tile format
2087     HAL_WriteRegBit(VOP_REG_WR, 0, BIT1);
2088     HAL_WriteRegBit(VOP_MIRROR_CFG_HI, 0, VOP_REF_SELF_FLD);
2089     HAL_MVOP_SetFieldInverse(ENABLE, ENABLE);
2090     // Disable New Vsync Mode
2091     g_pHalMVOPCtx->bNewVSyncMode = FALSE;
2092     // EVD mode disable
2093     HAL_WriteRegBit(VOP_INPUT_SWITCH0, 0, EVD_ENABLE);
2094 	HAL_WriteRegBit(VOP_REG_DUMMY, 1, VOP_420_BW_SAVE);
2095 	//FIFO threshold for netflix
2096     HAL_WriteByteMask(VOP_DMA0, 0x1A, VOP_FORCE_HIGH|VOP_HI_TSH|VOP_BURST_EXT);
2097     HAL_WriteByteMask(VOP_DMA1, 0xA2, VOP_FORCE_HIGH|VOP_HI_TSH|VOP_BURST_EXT);
2098     HAL_WriteByte(VOP_BURST_CTRL0, 0x04);
2099     HAL_WriteRegBit(VOP_CTRL1, 1, VOP_MVD_VS_SEL);
2100     HAL_MVOP_LoadReg();
2101     /*****************************************************/
2102         break;
2103     }
2104 #if MVOP_SUPPORT_SUB
2105     case E_MVOP_DEV_1:
2106     {
2107 #if ENABLE_3D_LR_MODE
2108         HAL_MVOP_SubEnable3DLR(DISABLE);
2109 #endif
2110         HAL_MVOP_SubEnableMVDInterface(FALSE);
2111         MVOP_PRINTF("[%s] Not Support sub MVOP!\n",__FUNCTION__);
2112         break;
2113     }
2114 #endif
2115     default:
2116         MVOP_PRINTF("[%s] Input Device ID is Error!\n",__FUNCTION__);
2117         break;
2118     }
2119 }
2120 
HAL_MVOP_SupportFRCOutputFPS(MVOP_DevID eID)2121 MS_BOOL HAL_MVOP_SupportFRCOutputFPS(MVOP_DevID eID)
2122 {
2123     MS_BOOL bRet = FALSE;
2124     switch(eID)
2125     {
2126         case E_MVOP_DEV_0:
2127             bRet = TRUE;
2128             break;
2129 #if MVOP_SUPPORT_SUB
2130         case E_MVOP_DEV_1:
2131             bRet = TRUE;
2132             break;
2133 #endif
2134         default:
2135             break;
2136     }
2137     return bRet;
2138 }
2139 
2140 #define MVOP_INT_UF BIT0
2141 #define MVOP_INT_OF BIT1
2142 #define MVOP_INT_VSYNC BIT2
2143 #define MVOP_INT_HSYNC BIT3
2144 #define MVOP_INT_RDY   BIT4
2145 #define MVOP_INT_FLD   BIT5
2146 #define MVOP_INT_ALL (BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0)
2147 
2148 const MS_U16 u16MvopRegBase[2] = { MVOP_REG_BASE, MVOP_SUB_REG_BASE};
2149 #define MAP_REG(_id, _reg)        ((_reg) - MVOP_REG_BASE + u16MvopRegBase[(_id)])
2150 
HAL_MVOP_IntEnableMask(MVOP_DevID eID,MS_U8 eIntType)2151 MS_BOOL HAL_MVOP_IntEnableMask(MVOP_DevID eID, MS_U8 eIntType)
2152 {
2153     MS_BOOL bRet = TRUE;
2154     MS_U16 u16Reg = MAP_REG( eID, VOP_INT_MASK);
2155     MS_U8 u8Mask = 0;
2156 
2157     u8Mask = HAL_ReadByte(u16Reg);
2158 
2159     if (E_MVOP_INT_NONE != eIntType)
2160     {
2161         u8Mask = (E_MVOP_INT_VSYNC == (eIntType&E_MVOP_INT_VSYNC)) ?
2162                  (u8Mask & ~MVOP_INT_VSYNC) : (u8Mask);
2163         u8Mask = (E_MVOP_INT_HSYNC == (eIntType&E_MVOP_INT_HSYNC)) ?
2164                  (u8Mask & ~MVOP_INT_HSYNC) : (u8Mask);
2165         u8Mask = (E_MVOP_INT_FDCHNG == (eIntType&E_MVOP_INT_FDCHNG)) ?
2166                  (u8Mask & ~MVOP_INT_FLD) : (u8Mask);
2167         u8Mask = (E_MVOP_INT_RDY == (eIntType&E_MVOP_INT_RDY)) ?
2168                  (u8Mask & ~MVOP_INT_RDY) : (u8Mask);
2169         u8Mask = (E_MVOP_INT_BUFF_UF == (eIntType&E_MVOP_INT_BUFF_UF)) ?
2170                  (u8Mask & ~MVOP_INT_UF) : (u8Mask);
2171         u8Mask = (E_MVOP_INT_BUFF_OF == (eIntType&E_MVOP_INT_BUFF_OF)) ?
2172                  (u8Mask & ~MVOP_INT_OF) : (u8Mask);
2173     }
2174     else    //mask all
2175     {
2176         u8Mask |= MVOP_INT_ALL;
2177     }
2178 
2179     //MVOP_PRINTF("u8Mask %x ", u8Mask);
2180     HAL_WriteByteMask(u16Reg, u8Mask, MVOP_INT_ALL);
2181     //u8Mask = HAL_ReadByte(u16Reg);
2182     //MVOP_PRINTF("==> %x \n", u8Mask);
2183     return bRet;
2184 }
2185 
HAL_MVOP_IntGetStatus(MVOP_DevID eID)2186 MS_U8 HAL_MVOP_IntGetStatus(MVOP_DevID eID)
2187 {
2188     MS_U8 u8IntVal = 0;
2189     MS_U8 u8IntType = E_MVOP_INT_NONE;
2190     MS_U16 u16Reg = MAP_REG(eID, (VOP_INT_MASK+1));
2191 
2192     u8IntVal = HAL_ReadByte(u16Reg) & MVOP_INT_ALL;
2193     //MVOP_PRINTF("u8IntVal %x\n", u8IntVal);
2194     if ((u8IntVal & MVOP_INT_VSYNC) == MVOP_INT_VSYNC)
2195     {
2196         u8IntType |= E_MVOP_INT_VSYNC;
2197     }
2198     if ((u8IntVal & MVOP_INT_HSYNC) == MVOP_INT_HSYNC)
2199     {
2200         u8IntType |= E_MVOP_INT_HSYNC;
2201     }
2202     if ((u8IntVal & MVOP_INT_FLD) == MVOP_INT_FLD)
2203     {
2204         u8IntType |= E_MVOP_INT_FDCHNG;
2205     }
2206     if ((u8IntVal & MVOP_INT_RDY) == MVOP_INT_RDY)
2207     {
2208         u8IntType |= E_MVOP_INT_RDY;
2209     }
2210     if ((u8IntVal & MVOP_INT_UF) == MVOP_INT_UF)
2211     {
2212         u8IntType |= E_MVOP_INT_BUFF_UF;
2213     }
2214     if ((u8IntVal & MVOP_INT_OF) == MVOP_INT_OF)
2215     {
2216         u8IntType |= E_MVOP_INT_BUFF_OF;
2217     }
2218     return u8IntType;
2219 }
2220 
2221 
2222