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