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 <string.h>
101
102 #include "MsCommon.h"
103 #include "drvMVD_EX.h"
104 #include "drvBDMA.h"
105
106 // Internal Definition
107 #include "regMVD_EX.h"
108 #include "halMVD_EX.h"
109 #include "halVPU_EX.h"
110 #include "osalMVD_EX.h"
111 #include "mvd4_interface.h" //firmware header
112 #include "asmCPU.h"
113 #include "controller.h"
114 #include "MVD_EX_Common.h"
115 #include "halCHIP.h"
116 #include "drvCMAPool.h"
117 #if defined(MSOS_TYPE_LINUX)
118 #include "msos/linux/ion_uapi.h"
119 #include "msos/linux/mdrv_cma_pool_st.h"
120 #endif
121
122 #if !defined(MSOS_TYPE_NUTTX) || defined(SUPPORT_X_MODEL_FEATURE)
123
124
125
126 #ifndef ANDROID
127 #define VPRINTF printf
128 #else
129 #include <sys/mman.h>
130 #include <cutils/ashmem.h>
131 #include <cutils/log.h>
132 #define VPRINTF ALOGD
133 #endif
134
135 //-------------------------------------------------------------------------------------------------
136 // Driver Compiler Options
137 //-------------------------------------------------------------------------------------------------
138 #define SLQ_NEW_PUSH 1
139 #define VIRTUAL_CMD_TIMEOUT 50
140 #ifdef VDEC3
141 #define v3_temp 1
142 #define v3_thinplayer 0
143 #else
144 #define v3_temp 0
145 #define v3_thinplayer 0
146 #endif
147
148 //-------------------------------------------------------------------------------------------------
149 // Local Defines
150 //-------------------------------------------------------------------------------------------------
151 #define MIU1_BASEADDR pMVDHalContext->stMiuCfg.u32Miu1BaseAddr
152 #define _PA2Offset(x) (((x)>=MIU1_BASEADDR)?(x-MIU1_BASEADDR):(x))
153
154 #ifndef MS_ASSERT
155 #ifdef MS_DEBUG
156 #define MS_ASSERT(expr) do { \
157 if(!(expr)) \
158 printf("MVD assert fail %s %d!\n", __FILE__, __LINE__); \
159 } while(0)
160 #else
161 #define MS_ASSERT(expr)
162 #endif
163 #endif
164
165 #ifndef UNUSED
166 #define UNUSED(x) (void)(x)
167 #endif
168 //constant
169 #define MVD_PollingTimes 0x40000UL
170
171 #define MVD_DEBUGVERBAL(x) if (_u8HalDbgLevel>3) { (x); }
172 #define MVD_DEBUG_FWCMD(x) if (_u8HalDbgLevel>2) { (x); }
173 #define MVD_DEBUGINFO(x) if (_u8HalDbgLevel>1) { (x); }
174 #define MVD_DEBUGERROR(x) if (_u8HalDbgLevel>0) { (x); }
175 #define MVD_ERROR(x) x
176
177 #define RIU ((unsigned short volatile *) (u32RiuBaseAdd))
178 #define RIU8 ((unsigned char volatile *) (u32RiuBaseAdd))
179
180 #define MVDCPU_ON_MIU1 ((HAL_MVD_RegReadByte(MIU0_SEL0_H) & BIT0) == BIT0)
181 #define MVDHW_ON_MIU1 ((HAL_MVD_RegReadByte(MIU0_SEL2_L) & BIT4) == BIT4)
182
183 // MVD5
184 #define SLQ_TBL_ENTRY_LEN 0x7FFFFFFF //31-bit
185
186 #define MVD_WIDTH_ALIGN_BYTE 16
187 #define MVD_WIDTH_ALIGN_MASK (MVD_WIDTH_ALIGN_BYTE - 1)
188 #define MVD_WIDTH_ALIGN_BITS 4
189
190 #define MVD_FBNUM_DEFAULT 4
191 #define MVD_FBNUM_MAX 5
192 #define MVD_FBNUM_MIN MVD_FBNUM_DEFAULT
193
194 #define MVD_DHD_FBSIZE 0x5FA000 //Framebuffer size minimum for Dual HD: (1920*2)*1088*1.5
195 #define MVD_HD_FBSIZE 0x2FD000 //Framebuffer size minimum for High Definition
196 #define MVD4_VC1_FBSIZE_HDMIN 0xEF1000 //5 * 1920 * 1088 * 1.5 = 14.95MB
197 #define MVD4_VC1_FBSIZE_HDMIN1 0xBF4000 //4 * 1920 * 1088 * 1.5 = 11.96MB
198 #define MVD4_VC1_FBSIZE_SDMIN 0x2F7600 //5 * 720 * 576 * 1.5 = 2.97MB
199 #define MVD4_MPEG_FBSIZE_HDMIN 0xBF4000 //4 * 1920 * 1088 * 1.5 = 11.96MB
200 #define MVD4_MPEG_FBSIZE_SDMIN 0x25F800 //4 * 720 * 576 * 1.5 = 2.38MB
201
202 #define _IS_VC1(x) ((x==E_MVD_CODEC_VC1_ADV) || (x==E_MVD_CODEC_VC1_MAIN))
203
204 #define SLQ_ENTRY_LEN 8 //8-byte per entry
205
206 #define MVD_U32_MAX 0xffffffffUL
207 #define MVD_U64_MAX 0xffffffffffffffffULL
208 #define MVD_GENERAL_MAX ((size_t)(-1))
209
210 #define MAX_ADD_28BIT 0x0fffffffUL
211
212 #define SLQ_ADDR_LEN SLQ_TBL_ENTRY_LEN //Slq address length is the same as SlqTbl
213
214 //Initial value for PTS table
215 #define _INIT_ADDR MVD_U32_MAX
216 #define _INIT_LEN 0
217 #define _INIT_TIMESTAMP MVD_U32_MAX
218 #define _INIT_ID MVD_U32_MAX
219
220 #define _MS_TO_90K(x) (x*90) //ms ==> 90k counter
221 #define _90K_TO_MS(x) ((x!=MVD_U32_MAX)?(x/90):(x)) //90k counter ==> ms
222 #define _90K_TO_MS_U64(x) ((x!=MVD_U64_MAX)?(x/90):(x)) //90k counter ==> ms
223
224 #define MVD_DBG_STS(x) {}
225 #define _SLQTBL_DUMP_PTS FALSE//TRUE
226 #define _SLQTBL_DUMP_PUSHQ FALSE//TRUE
227 #define _SLQTBL_DUMP_PKT FALSE//TRUE
228 #define MVD_TURBO_INIT FALSE//TRUE
229
230 #define SLQ_ENTRY_MAX 1024
231 #define SLQ_ENTRY_LEN 8 //8-byte per entry
232 #define SLQ_TBL_SIZE (SLQ_ENTRY_MAX * SLQ_ENTRY_LEN)
233 #define ES_TBL_SIZE (SLQ_ENTRY_MAX * 8) //8-byte per entry
234
235 #define MVD_FW_SLQTBL_PTS_LEN 32
236
237 #define SLQ_TBL_SAFERANGE (40*SLQ_ENTRY_LEN)
238 //this should be smaller than FW's lookup range (current it's 16 entries)
239
240 #define SLQTBL_CHECKVACANCY_WATERLEVEL (44*SLQ_ENTRY_LEN)
241
242
243 #define DIVX_PATTERN 0x63643030
244 #define FLV_PATTERN 0xffff0000
245 #define MPEG_PATTERN_0 0xC6010000 //this SC just for mpeg2/4
246 #if SLQ_NEW_PUSH
247 #define SLQ_PIC_START_FLAG 0x40000000
248 #define VC1_PATTERN 0x0D010000
249 #define RCV_PATTERN 0xFF00A55A
250 #endif
251 #define VC1_PATTERN_0 0xff010000
252 #define VC1_PATTERN_1 0x0000ffff
253 #define VC1_PATTERN_2 0xffffff01
254 #define VC1_PATTERN_3 0x0000ffee
255
256 #define RCV_PATTERN_0 0x00000000
257 #define RCV_PATTERN_1 0xffffffff
258 #define RCV_PATTERN_2 0x00000000
259 #define RCV_PATTERN_3 0xeeeeeeee
260
261 #define DUMMY_PATTERN 0xBE010000
262 #define DUMMY_SIZE 0x2000 //8K
263
264 #define END_PATTERN_0 0xFF010000
265 #define END_PATTERN_1 0xDDCCBBAA
266 #define END_PATTERN_2 0xBBAAFFEE
267 #define END_PATTERN_3 0xFFEEDDCC
268 #define END_PATTERN_SIZE 256
269
270 #define SKIP_PATTERN_0 0xc5010000
271 #define SKIP_PATTERN_1 0x270608ab
272 #define SKIP_PATTERN_SIZE 8
273
274 #define CMD_TIMEOUT_MS 500
275 #define SKIP_DATA_TIMEOUT_MS 15
276
277 //Length of internal buffers
278 #define MVD_FW_IAP_BUF_LEN (0x4000UL) // 16k
279 #define MVD_FW_DP_BUF_LEN (0x80000UL) //512k
280 #define MVD_FW_MV_BUF_LEN (0x48000UL) //288K
281 //Alignment of HW buffers start address
282 #define MVD_FW_IAP_BUF_ALIGN (0x4000UL) // 16k
283 #define MVD_FW_DP_BUF_ALIGN (0x8000UL) // 32k
284 #define MVD_FW_MV_BUF_ALIGN (0x8000UL) // 32k
285
286 //Three HW buffers are allocated after framebuffer, so we need to
287 //consider these buffers when checking the available framebuffer size/number.
288 #define MVD_HW_BUF_TOTAL_LEN (MVD_FW_IAP_BUF_LEN + MVD_FW_DP_BUF_LEN + MVD_FW_MV_BUF_LEN) //u32HWBuffTotalSize
289
290 #define MVD_FW_CODE_LEN (OFFSET_BASE)//refer to the define in mvd4_interface.h
291 #define MVD_FW_CODE_LEN_V00 (0x70000UL) //length for old layout
292 #define MVD_FW_MPOOL_START_OFFSET (0x90000UL) //576K
293 #define MVD_FW_TASK_OFFSET (0x100000UL) //1M
294
295 #define MVD3_FW_VOL_INFO_BUF_LEN (0x1000UL) // 4K
296 #define MVD3_FW_FRAME_INFO_BUF_LEN (0x1000UL) // 4K
297 #define MVD3_FW_DIVX_INFO_BUF_LEN (0x1000UL) // 4K
298 #define MVD3_FW_USER_DATA_BUF_LEN (0x4000UL) // 16K
299 #define MVD3_FW_USER_DATA_BUF_BACKUP_LEN MVD3_FW_USER_DATA_BUF_LEN // 16K
300 #define MVD3_FW_SLQ_TAB_TMPBUF_LEN (0x200UL)
301 #define MVD_FW_SLQTBL_PTS_BUF_LEN (SLQ_ENTRY_MAX*MVD_FW_SLQTBL_PTS_LEN)
302 #define MVD_FW_DYN_SCALE_BUF_LEN (0x2000UL) // 8K
303 #define MVD_FW_SCALER_INFO_BUF_LEN (0x100UL) // 256bytes reserved
304 #define MVD_FW_DECFRM_INFO_BUF_LEN (0x100UL) // 256bytes reserved
305 #define MVD_FW_VBBU_TABLE_LEN (0x2000UL) // 8K
306
307 #define MVD_FW_USER_DATA_HDR_LEN (6)
308 #define MVD_FW_USER_DATA_PKT_LEN (256)
309 #define MVD_FW_USER_DATA_EXT_HDR_LEN (16)
310 #define FW_BUFF_ALIGN (0x1000) //4k align
311
312 #define SLQ_ENTRY_MAX 1024
313 #define MVD_FW_SLQTBL_PTS_LEN 32
314 #define MVD_NULLPKT_PTS MVD_U32_MAX
315
316 #define MVD_HW_MAX_PIXEL (1920*1088*61000ULL) // FHD@60p
317
318 //Get the start address, and the next start address.
319 #define GET_FW_BUFFADD(cur, size, start) \
320 do { \
321 start = cur; \
322 cur += size; \
323 } while(0)
324
325 //Get the aligned start address, and the next start address.
326 #define GET_FW_BUFFADD_ALIGN(cur, align, size, alignStart) \
327 do { \
328 cur = (MemAlign(cur, align)); \
329 GET_FW_BUFFADD(cur, size, alignStart); \
330 } while(0)
331
332 //Init command arguments
333 #define SETUP_CMDARG(x) \
334 do { \
335 x.Arg0 = 0; \
336 x.Arg1 = 0; \
337 x.Arg2 = 0; \
338 x.Arg3 = 0; \
339 x.Arg4 = 0; \
340 x.Arg5 = 0; \
341 } while(0)
342
343 //Set command arguments
344 #define SET_CMDARG(cmd, u32val, u8Num) \
345 do { \
346 cmd.Arg0 = L_WORD(u32val); \
347 cmd.Arg1 = H_WORD(u32val); \
348 cmd.Arg2 = L_DWORD(u32val); \
349 cmd.Arg3 = H_DWORD(u32val); \
350 cmd.Arg4 = 0; \
351 cmd.Arg5 = u8Num; \
352 } while(0)
353
354 #define SET_CMD_RET_FALSE(_cmdVal, _pStcmdArg) \
355 do { \
356 if (HAL_MVD_MVDCommand(_cmdVal, (_pStcmdArg)) == FALSE) \
357 { \
358 MVD_DEBUGERROR(printf("Command: 0x%x fail!!\r\n", _cmdVal)); \
359 return FALSE; \
360 } \
361 } while(0)
362
363 #define SET_CMD_RET_VOID(_cmdVal, _pStcmdArg) \
364 do { \
365 if (HAL_MVD_MVDCommand(_cmdVal, (_pStcmdArg)) == FALSE) \
366 { \
367 MVD_DEBUGERROR(printf("Command: 0x%x fail!!\r\n", _cmdVal)); \
368 return; \
369 } \
370 } while(0)
371
372 #define HAL_MVD_InvalidBuffRetFalse(x) \
373 do { \
374 if ((x)==0) \
375 { \
376 MVD_DEBUGERROR(printf("%s(%d) error: NULL buffer address.\n", __FUNCTION__, __LINE__)); \
377 return FALSE; \
378 } \
379 } while(0)
380
381 #define _MVD_Memset(pDstAddr, u32value, u32Size) \
382 do { \
383 MS_U32 x = 0; \
384 for (x = 0; x < (u32Size/4); x=x+4) \
385 { \
386 HAL_MVD_Memset4Byte(pDstAddr+x,u32value); \
387 } \
388 HAL_MVD_CPU_Sync(); \
389 HAL_MVD_ReadMemory(); \
390 } while (0)
391
392 #define _MVD_MemResetBit(pDstAddr, mask_num) \
393 do{ \
394 *pDstAddr = (*pDstAddr) & (~(0x1<<mask_num)); \
395 }while(0) \
396
397
398 typedef enum
399 {
400 MVD_HKSLQ_GET_READPTR = 0,
401 MVD_HKSLQ_GET_WRITEPTR = 1,
402 MVD_HKSLQ_NONE = 2,
403 } MVD_HKSLQ_CMD;
404
405 #if SLQ_NEW_PUSH
406 typedef struct _MVD_SLQ_STATUS
407 {
408 MS_BOOL bSlqPicStart;
409 MS_BOOL bSlqPicCollect;
410 MS_BOOL bSlqPicWaitNextStart;
411 MS_BOOL bSlqFireRdy;
412 MS_BOOL bSlqCtrlBit;
413 MS_BOOL bSlqEnLastFrameShow;
414 MS_VIRT u32SlqPatternAddr;
415 MS_U32 u32SlqPushLength;
416 MS_VIRT u32VaildWptrAddr;
417 } MVD_SLQ_STATUS;
418 #endif
419
420 typedef struct _MVD_SLQ_TBL_ST
421 {
422 MS_VIRT u32StAdd;
423 MS_VIRT u32EndAdd;
424 MS_U32 u32EntryCntMax;
425
426 MS_VIRT u32RdPtr;
427 MS_VIRT u32WrPtr;
428 MS_VIRT u32Empty;
429 MS_VIRT* pu32LastEntry;
430 } MVD_SLQ_TBL_ST;
431
432 typedef struct _MVD_ALIVEInfo
433 {
434 MS_U32 u32decode_count;
435 MS_U32 u32searchbuf_count;
436 MS_U32 u32searchcode_count;
437 MS_U32 u32prebuf_count;
438 MS_U32 u32vfifobuf_count;
439 MS_U32 u32searchheader_count;
440 MS_U32 u32flashpattern_count;
441 MS_U32 u32IdleCount;
442 } MVD_ALIVEInfo;
443
444
445 typedef struct _MVD_SLQ_ES_ST
446 {
447 MS_VIRT u32StAdd;
448 MS_VIRT u32EndAdd;
449
450 MS_VIRT u32RdPtr;
451 MS_VIRT u32WrPtr;
452 } MVD_SLQ_ES_ST;
453
454 typedef struct _MVD_FWBuff
455 {
456 MS_VIRT pu8MVDGetVolBufStart;
457 MS_VIRT u32VolAdd;
458 MS_VIRT pu8MVDGetFrameInfoBufStart;
459 MS_VIRT pu8MVDSetHeaderBufStart;
460 MS_VIRT u32UserDataBuf;
461 MS_VIRT u32MVDFWSLQTABTmpbufAdr;
462 MS_VIRT u32MVDFWPtsTblAddr;
463 MS_VIRT u32DynScalingAdd;
464 MS_VIRT u32ScalerInfoAdd;
465 MS_VIRT u32DecFrmInfoAdd;
466 MS_VIRT u32VBBUTableAdd;
467 } MVD_FWBuff;
468
469 typedef enum _FW_BUFF_TYPE
470 {
471 FW_BUFF_VOLINFO,
472 FW_BUFF_FRMINFO,
473 FW_BUFF_HDR,
474 FW_BUFF_USRDATA,
475 FW_BUFF_SLQTBL,
476 FW_BUFF_FWSLQTAB,
477 FW_BUFF_PTSTBL,
478 FW_BUFF_DS,
479 FW_BUFF_XCINFO,
480 FW_BUFF_DECFRMINFO,
481 } FW_BUFF_TYPE;
482
483 typedef struct _MVD_SLQTBLInfo
484 {
485 MS_U32 u32LastPts; ///< record the last PTS to handle the repeat case
486 MS_U32 u32DummyPktCnt; ///< accumulated dummy packet counter
487 MS_U32 u32SlqByteCnt; ///< accumulated byte counter
488 MS_VIRT u32ESBuffEnd; ///< miu offset of ES buffer end, used for report TS read/write ptr.
489 MS_VIRT u32FileEndPtr; ///< write ptr of file-end
490 MS_VIRT u32PreEsRd; ///< previous ES read ptr
491 MS_VIRT u32PreEsWr; ///< previous ES write ptr
492 MS_BOOL bRdyToFireCmd; ///< TRUE after FW is ready to update write pointer
493 MS_BOOL bSlqTblHasValidData; ///< TRUE if the write ptr is not updated
494 MS_BOOL bEnSlqTblHkCtrl;
495 BDMA_CpyType bdmaCpyType;
496 MVD_SLQ_STATUS* pSlqStatus;
497 MVD_SLQ_TBL_ST* pDrvSlqTbl;
498 MVD_SLQ_ES_ST* pDrvEsTbl;
499 MVD_SLQ_ES_ST* pDrvDivxTbl;
500 } MVD_SLQTBLInfo;
501
502 //Only keep one record of MIU setting since there should be only one,
503 //even for multiple decoders.
504 typedef struct _MVDMiuCfg
505 {
506 MS_PHY u32Miu1BaseAddr;
507 MS_PHY u32Miu2BaseAddr;
508 MS_PHY u32Miu3BaseAddr;
509 MS_U8 u8FWMiuSel;
510 MS_U8 u8HWMiuSel;
511 } MVDMiuCfg;
512
513
514 typedef enum
515 {
516 E_MVD_DEC_0 = 0,
517 E_MVD_DEC_1,
518 E_MVD_DEC_MAX
519 } MVD_DecNum;
520 #ifdef VDEC3
521 #define MAX_DEC_NUM 16
522 #else
523 #define MAX_DEC_NUM E_MVD_DEC_MAX
524 #endif
525
526 //-------------------------------------------------------------------------------------------------
527 // Local Structures
528 //-------------------------------------------------------------------------------------------------
529
530
531 //-------------------------------------------------------------------------------------------------
532 // Global Variables
533 //-------------------------------------------------------------------------------------------------
534 static MS_VIRT u32RiuBaseAdd = 0;
535 MS_U8 _u8HalDbgLevel = 0;
536 #ifdef VDEC3//#ifdef VDEC3
537 static MS_U32 u32SharememoryBase[MAX_DEC_NUM] ={MVD_U32_MAX,MVD_U32_MAX,MVD_U32_MAX,MVD_U32_MAX};
538 #else
539 static MS_U32 u32SharememoryBase[MAX_DEC_NUM] ={MVD_U32_MAX,MVD_U32_MAX};
540 #endif
541 static MS_U8 u8SHMMiuSel=0;
542 #if 0
543 static MVD_MEMCfg stMemCfg[MAX_DEC_NUM];
544 static MVD_CtrlCfg stCtrlCfg[MAX_DEC_NUM];
545 static MVD_FWCfg stFwCfg[MAX_DEC_NUM];
546
547 // For SLQ table link
548 static MVD_SLQTBLInfo stSlqTblInfo[MAX_DEC_NUM];
549 static MVD_SLQ_STATUS _SlqStatus[MAX_DEC_NUM]; //for SLQ_NEW_PUSH
550 static MVD_SLQ_TBL_ST _drvSlqTbl[MAX_DEC_NUM];
551 static MVD_SLQ_ES_ST _drvEsTbl[MAX_DEC_NUM]; //maintain to report ES read/write ptr
552 static MVD_SLQ_ES_ST _drvDivxTbl[MAX_DEC_NUM]; //header for divx311
553 static FW_DIVX_INFO gdivxInfo[MAX_DEC_NUM];
554
555 MS_BOOL bSlqTblHKCtrl = FALSE; //read/write pointer can be accessed by HK directly
556 static MS_BOOL bStopped = TRUE;
557
558 static HAL_MVD_Stream _stMVDStream[MAX_DEC_NUM] = {
559 {E_HAL_MVD_MAIN_STREAM0, FALSE},
560 {E_HAL_MVD_SUB_STREAM0, FALSE},
561 //{E_HAL_MVD_SUB_STREAM1, FALSE},
562 };
563 static MVD_FWBuff stFWBuff[MAX_DEC_NUM];
564 #endif
565
566 #define FRM_RATE_CODE_NUM 9
567
568 typedef struct
569 {
570 MVD_MEMCfg stMemCfg[MAX_DEC_NUM];
571 MVD_CtrlCfg stCtrlCfg[MAX_DEC_NUM];
572 MVD_FWCfg stFwCfg[MAX_DEC_NUM];
573
574 // For SLQ table link
575 MVD_SLQTBLInfo stSlqTblInfo[MAX_DEC_NUM];
576 MVD_SLQ_STATUS _SlqStatus[MAX_DEC_NUM]; //for SLQ_NEW_PUSH
577 MVD_SLQ_TBL_ST _drvSlqTbl[MAX_DEC_NUM];
578 MVD_SLQ_ES_ST _drvEsTbl[MAX_DEC_NUM]; //maintain to report ES read/write ptr
579 MVD_SLQ_ES_ST _drvDivxTbl[MAX_DEC_NUM]; //header for divx311
580 FW_DIVX_INFO gdivxInfo[MAX_DEC_NUM];
581
582 MS_BOOL bSlqTblHKCtrl[MAX_DEC_NUM]; //read/write pointer can be accessed by HK directly
583 MS_BOOL bStopped[MAX_DEC_NUM];
584
585 HAL_MVD_Stream _stMVDStream[MAX_DEC_NUM];
586
587 MVD_FWBuff stFWBuff[MAX_DEC_NUM];
588
589 #if _SLQTBL_DUMP_PKT
590 MS_U32 u32SendTimes[MAX_DEC_NUM];//HAL_MVD_SLQTblSendPacket
591 #endif
592
593 MS_U32 u32pqTimes[MAX_DEC_NUM];//HAL_MVD_PushQueue
594 MS_BOOL bSetSkip[MAX_DEC_NUM];//MVD_FlushTSQueue
595
596 MS_U32 u32PreVdCnt[MAX_DEC_NUM];//HAL_MVD_DbgDump
597 MS_U32 u32PreErrCnt[MAX_DEC_NUM];
598 MS_BOOL b1stDump[MAX_DEC_NUM];
599 //pre_set
600 HAL_MVD_Pre_Ctrl gMVDPreCtrl[MAX_DEC_NUM];
601 MS_BOOL bAutoInsertDummyPattern[MAX_DEC_NUM];
602 MVDMiuCfg stMiuCfg;
603 MS_BOOL bDropOnePTS[MAX_DEC_NUM];
604 MVD_ALIVEInfo aliveInfo[MAX_DEC_NUM];
605
606 MS_U32 u32DmxFrameRate[MAX_DEC_NUM];
607 MS_U32 u32DmxFrameRateBase[MAX_DEC_NUM];
608 MS_BOOL bCMAUsed;
609
610 struct CMA_Pool_Init_Param cmaInitParam; // support two MIU
611 struct CMA_Pool_Free_Param cmaFreeParam[MAX_DEC_NUM];
612 MS_BOOL bCMATwoMIU[MAX_DEC_NUM];
613
614 MS_U32 u32LastAliveTime[MAX_DEC_NUM];
615 } MVD_Hal_CTX;
616
617 //global variables
618 MVD_Hal_CTX* pMVDHalContext = NULL;
619 MVD_Hal_CTX gMVDHalContext;
620 const MS_U16 stFrameRateCode[FRM_RATE_CODE_NUM]=
621 {
622 NULL,23976,24000,25000,29976,30000,50000,59947,60000
623 };
624
625
626 #define GET_VOL_BUFFADD(idx) pMVDHalContext->stFWBuff[(idx)].pu8MVDGetVolBufStart
627 #define GET_VOL_BUFFADD_NONCACHE(idx) pMVDHalContext->stFWBuff[(idx)].u32VolAdd
628 #define GET_FRMINFO_BUFFADD(idx) pMVDHalContext->stFWBuff[(idx)].pu8MVDGetFrameInfoBufStart
629 #define GET_HDR_BUFFADD(idx) pMVDHalContext->stFWBuff[(idx)].pu8MVDSetHeaderBufStart
630 #define GET_USRDATA_BUFFADD(idx) pMVDHalContext->stFWBuff[(idx)].u32UserDataBuf
631 #define GET_SLQ_BUFFADD(idx) pMVDHalContext->stFWBuff[(idx)].u32MVDFWSLQTABTmpbufAdr
632 #define GET_PTSTBL_BUFFADD(idx) pMVDHalContext->stFWBuff[(idx)].u32MVDFWPtsTblAddr
633 #define GET_DS_BUFFADD(idx) pMVDHalContext->stFWBuff[(idx)].u32DynScalingAdd
634 #define GET_XCINFO_BUFFADD(idx) pMVDHalContext->stFWBuff[(idx)].u32ScalerInfoAdd
635 #define GET_DECFRMINFO_BUFFADD(idx) pMVDHalContext->stFWBuff[(idx)].u32DecFrmInfoAdd
636 #define GET_VBBUTABLEADD(idx) pMVDHalContext->stFWBuff[(idx)].u32VBBUTableAdd
637
638
639
640 //-------------------------------------------------------------------------------------------------
641 // Local Variables
642 //-------------------------------------------------------------------------------------------------
643
644
645 //-------------------------------------------------------------------------------------------------
646 // Debug Functions
647 //-------------------------------------------------------------------------------------------------
648
649
650 //-------------------------------------------------------------------------------------------------
651 // Local Functions
652 //-------------------------------------------------------------------------------------------------
653
HAL_MVD_Context_Init(void)654 static void HAL_MVD_Context_Init(void)
655 {
656 #ifdef VDEC3
657 MS_U8 i;
658
659 for (i = 0; i < MAX_DEC_NUM; i++)
660 {
661 pMVDHalContext->bStopped[i] = TRUE;
662 pMVDHalContext->b1stDump[i] = TRUE;
663 pMVDHalContext->_stMVDStream[i].eStreamId = E_HAL_MVD_N_STREAM0 + i;
664 }
665 #else
666 pMVDHalContext->bStopped[0] = TRUE;
667 pMVDHalContext->bStopped[1] = TRUE;
668 pMVDHalContext->_stMVDStream[0].eStreamId = E_HAL_MVD_MAIN_STREAM0;
669 pMVDHalContext->_stMVDStream[1].eStreamId = E_HAL_MVD_SUB_STREAM0;
670
671 pMVDHalContext->b1stDump[0] = TRUE;
672 pMVDHalContext->b1stDump[1] = TRUE;
673 #endif
674 }
675
676
677
HAL_MVD_SetIsUsed(MS_U8 u8Idx,MS_BOOL bUsed)678 static void HAL_MVD_SetIsUsed(MS_U8 u8Idx, MS_BOOL bUsed)
679 {
680 pMVDHalContext->_stMVDStream[u8Idx].bUsed = bUsed;
681 }
682
683 //Given the start address & the available size for the FW buffers,
684 //return the address of each buffers.
685 //Now only support u8Size==1, 2, 4
MVD_GetFWBuffData(MS_U8 u8Idx,FW_BUFF_TYPE eBuffType,MS_U16 u8Offset,MS_U8 u8Size)686 static MS_U32 MVD_GetFWBuffData(MS_U8 u8Idx, FW_BUFF_TYPE eBuffType, MS_U16 u8Offset, MS_U8 u8Size)
687 {
688 MS_U32 u32Val = 0;
689 MS_VIRT u32BufStart = NULL;
690 switch (eBuffType)
691 {
692 case FW_BUFF_VOLINFO: u32BufStart = GET_VOL_BUFFADD(u8Idx); break;
693 case FW_BUFF_FRMINFO: u32BufStart = GET_FRMINFO_BUFFADD(u8Idx); break;
694 case FW_BUFF_HDR: u32BufStart = GET_HDR_BUFFADD(u8Idx); break;
695 case FW_BUFF_USRDATA: u32BufStart = GET_USRDATA_BUFFADD(u8Idx); break;
696 case FW_BUFF_FWSLQTAB: u32BufStart = GET_SLQ_BUFFADD(u8Idx); break;
697 case FW_BUFF_PTSTBL: u32BufStart = GET_PTSTBL_BUFFADD(u8Idx); break;
698 case FW_BUFF_DS: u32BufStart = GET_DS_BUFFADD(u8Idx); break;
699 case FW_BUFF_XCINFO: u32BufStart = GET_XCINFO_BUFFADD(u8Idx); break;
700 case FW_BUFF_DECFRMINFO: u32BufStart = GET_DECFRMINFO_BUFFADD(u8Idx); break;
701 default:
702 break;
703 }
704 if (NULL == u32BufStart)
705 {
706 printf("%s err: u8Idx=0x%x, bufType=0x%x, offset=%d, size=%d\n",
707 __FUNCTION__, u8Idx, eBuffType, u8Offset, u8Size);
708 return 0;
709 }
710
711 if (u8Size == sizeof(MS_U8))
712 {
713 u32Val = (MS_U32)HAL_MVD_MemReadByte(u32BufStart+u8Offset);
714 }
715 else if (u8Size == sizeof(MS_U32))
716 {
717 u32Val = HAL_MVD_MemRead4Byte(u32BufStart+u8Offset);
718 }
719 else if (u8Size == sizeof(MS_U16))
720 {
721 u32Val = HAL_MVD_MemRead2Byte(u32BufStart+u8Offset);
722 }
723
724 MVD_DEBUGVERBAL(printf("%s: u32Val=%d for u8Idx=0x%x, bufType=0x%x, offset=%d, size=%d\n",
725 __FUNCTION__, u32Val, u8Idx, eBuffType, u8Offset, u8Size));
726 return u32Val;
727 }
728
729 #ifdef VDEC3
MVD_SetFWBuffData(MS_U8 u8Idx,FW_BUFF_TYPE eBuffType,MS_U8 u8Offset,MS_U8 u8Size,MS_U32 u32Value)730 static void MVD_SetFWBuffData(MS_U8 u8Idx, FW_BUFF_TYPE eBuffType, MS_U8 u8Offset, MS_U8 u8Size, MS_U32 u32Value)
731 {
732 MS_VIRT u32BufStart = NULL;
733
734 switch (eBuffType)
735 {
736 case FW_BUFF_VOLINFO: u32BufStart = GET_VOL_BUFFADD(u8Idx); break;
737 case FW_BUFF_FRMINFO: u32BufStart = GET_FRMINFO_BUFFADD(u8Idx); break;
738 case FW_BUFF_HDR: u32BufStart = GET_HDR_BUFFADD(u8Idx); break;
739 case FW_BUFF_USRDATA: u32BufStart = GET_USRDATA_BUFFADD(u8Idx); break;
740 case FW_BUFF_FWSLQTAB: u32BufStart = GET_SLQ_BUFFADD(u8Idx); break;
741 case FW_BUFF_PTSTBL: u32BufStart = GET_PTSTBL_BUFFADD(u8Idx); break;
742 case FW_BUFF_DS: u32BufStart = GET_DS_BUFFADD(u8Idx); break;
743 case FW_BUFF_XCINFO: u32BufStart = GET_XCINFO_BUFFADD(u8Idx); break;
744 case FW_BUFF_DECFRMINFO: u32BufStart = GET_DECFRMINFO_BUFFADD(u8Idx); break;
745 default:
746 break;
747 }
748
749 if (NULL == u32BufStart)
750 {
751 printf("%s err: u8Idx=0x%x, bufType=0x%x, offset=%d, size=%d, value=%d\n",
752 __FUNCTION__, (unsigned int)u8Idx,(unsigned int) eBuffType,(unsigned int) u8Offset,(unsigned int) u8Size,(unsigned int)u32Value);
753 }
754
755 if (pMVDHalContext->stMiuCfg.u8HWMiuSel == MIU_SEL_1)
756 {
757 u32BufStart += HAL_MIU1_BASE;
758 }
759 /* else if (pMVDHalContext->stMiuCfg.u8HWMiuSel == MIU_SEL_2)
760 {
761 u32BufStart += HAL_MIU2_BASE;
762 }*/
763
764 if (u8Size == sizeof(MS_U8))
765 {
766 MS_U8* temp = (MS_U8*)MsOS_PA2KSEG1(u32BufStart+u8Offset);
767 *temp = (MS_U8)u32Value;
768 }
769 else if (u8Size == sizeof(MS_U32))
770 {
771 MS_U32* temp = (MS_U32*)MsOS_PA2KSEG1(u32BufStart+u8Offset);
772 *temp = (MS_U32)u32Value;
773 }
774 else if (u8Size == sizeof(MS_U16))
775 {
776 MS_U16* temp = (MS_U16*)MsOS_PA2KSEG1(u32BufStart+u8Offset);
777 *temp = (MS_U16)u32Value;
778 }
779
780 MVD_DEBUGVERBAL(printf("%s: u8Idx=0x%x, bufType=0x%x, offset=%d, size=%d, value=%d\n",
781 __FUNCTION__, (unsigned int)u8Idx, (unsigned int)eBuffType, (unsigned int)u8Offset, (unsigned int)u8Size,(unsigned int)u32Value));
782 }
783 #endif
784
785
786 //-------------------------------------------------------------------------------------------------
787 // Global Functions
788 //-------------------------------------------------------------------------------------------------
HAL_MVD_SetDbgLevel(MS_U8 level)789 void HAL_MVD_SetDbgLevel(MS_U8 level)
790 {
791 _u8HalDbgLevel = level;
792 return;
793 }
794
795
HAL_MVD_GetCaps(void)796 MS_U8 HAL_MVD_GetCaps(void)
797 {
798 MS_U8 caps = 0;
799
800 caps |= (MVD_SUPPORT_MPEG2|MVD_SUPPORT_MPEG4|MVD_SUPPORT_VC1);
801 return caps;
802 }
803
HAL_MVD_GetMaxPixel(MS_U32 u32Id)804 MS_U64 HAL_MVD_GetMaxPixel(MS_U32 u32Id)
805 {
806 return (MS_U64)MVD_HW_MAX_PIXEL/1000;
807 }
808
HAL_MVD_GetDrvFwVer(void)809 MS_U32 HAL_MVD_GetDrvFwVer(void)
810 {
811 return MVD_FW_VERSION;
812 }
813
814 #if 0
815 MS_U32 HAL_MVD_GetMiu1BaseAdd(void)
816 {
817 return MIU1_BASEADDR;
818 }
819 #endif
820
821 //#if defined(CHIP_MUJI)
HAL_MVD_GetMiu1BaseAdd(void)822 MS_VIRT HAL_MVD_GetMiu1BaseAdd(void)
823 {
824 return MIU1_BASEADDR;
825 }
826
HAL_MVD_GetFWSelMiu1(void)827 MS_BOOL HAL_MVD_GetFWSelMiu1(void)
828 {
829 return MVDCPU_ON_MIU1;
830 }
831 //#endif
832
833
HAL_MVD_GetFWSelMiu(void)834 MS_U8 HAL_MVD_GetFWSelMiu(void)
835 {
836 return pMVDHalContext->stMiuCfg.u8FWMiuSel;
837 }
838
839
840
HAL_MVD_MemGetMap(MS_U8 u8Idx,MS_U8 u8type,MS_VIRT * pu32addr,MS_SIZE * pu32len)841 void HAL_MVD_MemGetMap(MS_U8 u8Idx, MS_U8 u8type, MS_VIRT* pu32addr, MS_SIZE* pu32len)
842 {
843 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
844 MS_VIRT u32StartOffset;
845 MS_U8 u8MiuSel;
846
847 switch (u8type)
848 {
849 case E_MVD_MMAP_ALL:
850 case E_MVD_MMAP_FW:
851 _phy_to_miu_offset(u8MiuSel, u32StartOffset, pstMemCfg->u32FWCodeAddr);
852 *pu32addr = u32StartOffset;
853 *pu32len = pstMemCfg->u32FWCodeSize;
854 break;
855 case E_MVD_MMAP_BS:
856 _phy_to_miu_offset(u8MiuSel, u32StartOffset, pstMemCfg->u32BSAddr);
857 *pu32addr = u32StartOffset;
858 *pu32len = pstMemCfg->u32BSSize;
859 break;
860 case E_MVD_MMAP_FB:
861 _phy_to_miu_offset(u8MiuSel, u32StartOffset, pstMemCfg->u32FBAddr);
862 *pu32addr = u32StartOffset;
863 *pu32len = pstMemCfg->u32FBSize;
864 break;
865 case E_MVD_MMAP_DRV:
866 _phy_to_miu_offset(u8MiuSel, u32StartOffset, pstMemCfg->u32DrvBufAddr);
867 *pu32addr = u32StartOffset;
868 *pu32len = pstMemCfg->u32DrvBufSize;
869 break;
870 default:
871 break;
872 }
873
874 MVD_DEBUGINFO(printf("HAL_MVD_MemGetMap[%d] add=0x%lx len=0x%lx\n",u8type,(unsigned long)*pu32addr,(unsigned long)*pu32len));
875 return;
876 }
877
HAL_MVD_RegSetBase(MS_VIRT u32Base)878 void HAL_MVD_RegSetBase(MS_VIRT u32Base)
879 {
880 u32RiuBaseAdd = u32Base;
881 HAL_VPU_EX_InitRegBase(u32Base);
882 }
883
HAL_MVD_RegWriteByte(MS_VIRT u32Reg,MS_U8 u8Val)884 void HAL_MVD_RegWriteByte(MS_VIRT u32Reg, MS_U8 u8Val)
885 {
886 if ( __builtin_constant_p( u32Reg ) )
887 {
888 RIU8[((u32Reg) * 2) - ((u32Reg) & 1)] = u8Val;
889 }
890 else
891 {
892 RIU8[(u32Reg << 1) - (u32Reg & 1)] = u8Val;
893 }
894 }
895
HAL_MVD_RegReadByte(MS_VIRT u32Reg)896 MS_U8 HAL_MVD_RegReadByte(MS_VIRT u32Reg)
897 {
898 return (__builtin_constant_p( u32Reg ) ?
899 (((u32Reg) & 0x01) ? RIU8[(u32Reg) * 2 - 1] : RIU8[(u32Reg) * 2]) :
900 (RIU8[(u32Reg << 1) - (u32Reg & 1)]));
901 }
902
HAL_MVD_RegWriteBit(MS_VIRT u32Reg,MS_BOOL bEnable,MS_U8 u8Mask)903 void HAL_MVD_RegWriteBit(MS_VIRT u32Reg, MS_BOOL bEnable, MS_U8 u8Mask)
904 {
905 MS_VIRT u32Reg8 = ((u32Reg) * 2) - ((u32Reg) & 1);
906 RIU8[u32Reg8] = (bEnable) ? (RIU8[u32Reg8] | (u8Mask)) :
907 (RIU8[u32Reg8] & ~(u8Mask));
908 }
909
HAL_MVD_RegWriteByteMask(MS_VIRT u32Reg,MS_U8 u8Val,MS_U8 u8Msk)910 void HAL_MVD_RegWriteByteMask(MS_VIRT u32Reg, MS_U8 u8Val, MS_U8 u8Msk)
911 {
912 MS_VIRT u32Reg8 = ((u32Reg) * 2) - ((u32Reg) & 1);
913 RIU8[u32Reg8] = (RIU8[u32Reg8] & ~(u8Msk)) | ((u8Val) & (u8Msk));
914 }
915
HAL_MVD_RegWrite4Byte(MS_VIRT u32Reg,MS_U32 u32Val)916 void HAL_MVD_RegWrite4Byte(MS_VIRT u32Reg, MS_U32 u32Val)
917 {
918 if ( __builtin_constant_p( u32Reg ) && !((u32Reg) & 0x01) )
919 {
920 RIU[u32Reg] = (MS_U16)(u32Val);
921 RIU[(u32Reg) + 2] = (MS_U16)((u32Val) >> 16);
922 }
923 else
924 {
925 if (u32Reg & 0x01)
926 {
927 RIU8[(u32Reg << 1) - 1] = u32Val;
928 RIU[u32Reg + 1] = (u32Val >> 8);
929 RIU8[((u32Reg + 3) << 1)] = (u32Val >> 24);
930 }
931 else
932 {
933 RIU[u32Reg] = u32Val;
934 RIU[u32Reg + 2] = (u32Val >> 16);
935 }
936 }
937 }
938
939
HAL_MVD_MemRead4Byte(MS_VIRT u32Address)940 MS_U32 HAL_MVD_MemRead4Byte(MS_VIRT u32Address)
941 {
942 volatile MS_U32 u32Val;
943 MS_ASSERT(!(u32Address & 0x03UL));
944
945 HAL_MVD_CPU_Sync();
946 HAL_MVD_ReadMemory();
947
948 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,u32Address,u32Address);
949
950 u32Val = *(volatile MS_U32*) HAL_MVD_PA2NonCacheSeg(u32Address);
951
952 //printf("mvd rd 0x%lx = 0x%lx\n", u32Address, u32Val);
953 return u32Val;
954 }
955
HAL_MVD_MemRead2Byte(MS_VIRT u32Address)956 MS_U16 HAL_MVD_MemRead2Byte(MS_VIRT u32Address)
957 {
958 MS_VIRT u32ReadAddr;
959 MS_U32 u32ReadValue;
960 MS_U16 u16Value;
961 MS_U8 u8Shift;
962 u32ReadAddr = (u32Address >> 2) << 2;
963 u8Shift = (MS_U8)((u32Address & 0x03) * 8);
964 u32ReadValue = HAL_MVD_MemRead4Byte(u32ReadAddr);
965
966 u16Value = (MS_U16)(u32ReadValue >> u8Shift);
967 if(u8Shift == 24)
968 {
969 u32ReadValue = HAL_MVD_MemRead4Byte(u32ReadAddr+4);
970 u16Value = u16Value << 8 || (MS_U16)(u32ReadValue & 0xFF);
971 }
972 return u16Value;
973 }
974
HAL_MVD_MemReadByte(MS_VIRT u32Address)975 MS_U8 HAL_MVD_MemReadByte(MS_VIRT u32Address)
976 {
977 MS_VIRT u32ReadAddr;
978 MS_U32 u32ReadValue;
979 MS_U8 u8Value;
980 MS_U8 u8Shift;
981 u32ReadAddr = (u32Address >> 2) << 2;
982 u8Shift = (MS_U8)((u32Address & 0x03) * 8);
983 u32ReadValue = HAL_MVD_MemRead4Byte(u32ReadAddr);
984 u8Value = (MS_U8)(u32ReadValue >> u8Shift);
985
986 return u8Value;
987 }
988
HAL_MVD_MemWrite4Byte(MS_VIRT u32Address,MS_U32 u32Value)989 MS_BOOL HAL_MVD_MemWrite4Byte(MS_VIRT u32Address, MS_U32 u32Value)
990 {
991
992 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,u32Address,u32Address);
993
994 *(volatile MS_U32 *) HAL_MVD_PA2NonCacheSeg(u32Address) = u32Value;
995
996 HAL_MVD_CPU_Sync();
997 HAL_MVD_FlushMemory();
998
999 return TRUE;
1000 }
1001
HAL_MVD_MemWriteByte(MS_VIRT u32Address,MS_U8 u8Value)1002 MS_BOOL HAL_MVD_MemWriteByte(MS_VIRT u32Address, MS_U8 u8Value)
1003 {
1004 MS_VIRT u32ReadAddr;
1005 MS_U32 u32ReadValue;
1006 MS_U8 u8Shift;
1007
1008 u32ReadAddr = (u32Address >> 2) << 2;
1009 u8Shift = (MS_U8)((u32Address & 0x03UL) * 8);
1010 u32ReadValue = HAL_MVD_MemRead4Byte(u32ReadAddr);
1011 u32ReadValue &= ~(0xFFUL << u8Shift);
1012 u32ReadValue |= ((MS_U32)u8Value << u8Shift);
1013 HAL_MVD_MemWrite4Byte(u32ReadAddr, u32ReadValue);
1014 return TRUE;
1015 }
1016
HAL_MVD_MemWrite2Byte(MS_VIRT u32Address,MS_U16 u16Value)1017 MS_BOOL HAL_MVD_MemWrite2Byte(MS_VIRT u32Address, MS_U16 u16Value)
1018 {
1019 MS_VIRT u32ReadAddr;
1020 MS_U32 u32ReadValue;
1021 MS_U8 u8Shift;
1022
1023 u8Shift = (MS_U8)((u32Address & 0x03UL) * 8) ;
1024 if(u8Shift < 24)
1025 {
1026 u32ReadAddr = (u32Address >> 2) << 2;
1027 u32ReadValue = HAL_MVD_MemRead4Byte(u32ReadAddr);
1028 u32ReadValue &= ~(0xFFFF << u8Shift);
1029 u32ReadValue |= ((MS_U32)u16Value << u8Shift);
1030 HAL_MVD_MemWrite4Byte(u32ReadAddr, u32ReadValue);
1031 }
1032 else
1033 {
1034 HAL_MVD_MemWriteByte(u32Address, (MS_U8)(u16Value));
1035 HAL_MVD_MemWriteByte(u32Address+1, (MS_U8)(u16Value >> 8));
1036 }
1037 return TRUE;
1038 }
1039
1040
HAL_MVD_SetReqMask(MS_BOOL bEnMask)1041 void HAL_MVD_SetReqMask(MS_BOOL bEnMask)
1042 {
1043 HAL_VPU_EX_MIU_RW_Protect(bEnMask);
1044
1045 if (MVDHW_ON_MIU1)
1046 {
1047 HAL_MVD_RegWriteBit(MIU1_RQ2_MASK_L, bEnMask, BIT4); //MVD R/W
1048 HAL_MVD_RegWriteBit(MIU1_RQ0_MASK_H, bEnMask, BIT4); //MVD bbu R/W
1049 HAL_MVD_RegWriteBit(MIU1_RQ4_MASK_L, bEnMask, BIT6); //MVD TLB Mheg Codec
1050 }
1051 else
1052 {
1053 HAL_MVD_RegWriteBit(MIU0_RQ2_MASK_L, bEnMask, BIT4); //MVD R/W
1054 HAL_MVD_RegWriteBit(MIU0_RQ0_MASK_H, bEnMask, BIT4); //MVD bbu R/W
1055 HAL_MVD_RegWriteBit(MIU0_RQ4_MASK_L, bEnMask, BIT6); //MVD TLB Mheg Codec
1056 }
1057 HAL_MVD_Delayms(1);
1058
1059 return;
1060 }
1061
HAL_MVD_Memset4Byte(MS_VIRT u32Address,MS_U32 u32Value)1062 static MS_BOOL HAL_MVD_Memset4Byte(MS_VIRT u32Address, MS_U32 u32Value)
1063 {
1064 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,u32Address,u32Address);
1065
1066 *(volatile MS_U32 *) HAL_MVD_PA2NonCacheSeg(u32Address) = u32Value;
1067
1068 return TRUE;
1069 }
1070
1071 //------------------------------------------------------------------------------
1072 /// Initialize MVD
1073 /// @return -result of resetting MVD hardware
1074 //------------------------------------------------------------------------------
HAL_MVD_RstHW(void)1075 MS_BOOL HAL_MVD_RstHW(void)
1076 {
1077 MS_U32 u32Time = 0;
1078
1079 OSAL_MVD_LockHwMutex();
1080
1081 HAL_MVD_SetReqMask(ENABLE);
1082
1083 HAL_MVD_RegWriteBit(MVD_CTRL, 1, MVD_CTRL_DISCONNECT_MIU);//disconnect MIU
1084 HAL_MVD_RegWriteBit(MVD_CTRL, 0, MVD_CTRL_DISCONNECT_MIU);//release reset
1085
1086 HAL_MVD_RegWriteBit(MVD_CTRL, 1, MVD_CTRL_RST);//reset MVD
1087 HAL_MVD_RegWriteBit(MVD_CTRL, 0, MVD_CTRL_RST);//release reset
1088
1089 u32Time = HAL_MVD_GetTime();
1090 while ( ((HAL_MVD_RegReadByte(MVD_STATUS) & MVD_STATUS_READY) == 0)
1091 && ((HAL_MVD_GetTime() - u32Time) < 200) );
1092
1093 #if 0 //bring up
1094 printf("====================>>>>MVD Ctrl status1.5a : 0x%x\n",HAL_MVD_RegReadByte(MVD_STATUS));
1095 HAL_MVD_RegWriteBit(MVD_STATUS, 1, MVD_T8_MIU_128_0);//release reset
1096 HAL_MVD_RegWriteBit(MVD_STATUS, 1, MVD_T8_MIU_128_1);//release reset
1097 MVD_DEBUGINFO(printf("MVD Ctrl status : 0x%x\n",HAL_MVD_RegReadByte(MVD_STATUS)));
1098 printf("====================>>>>MVD Ctrl status1.5b : 0x%x\n",HAL_MVD_RegReadByte(MVD_STATUS));
1099 #endif
1100
1101 HAL_MVD_SetReqMask(DISABLE);
1102
1103 OSAL_MVD_UnlockHwMutex();
1104
1105 return TRUE;
1106 }
1107
1108
1109 //------------------------------------------------------------------------------
1110 /// Release CPU
1111 /// @return -release CPU successfully or not
1112 //------------------------------------------------------------------------------
HAL_MVD_ReleaseFW(void)1113 MS_BOOL HAL_MVD_ReleaseFW(void)
1114 {
1115 //For dual decoder, we only release VPU if it is not released yet.
1116 if (TRUE == HAL_VPU_EX_IsRsted())
1117 {
1118 MVD_DEBUGINFO(printf("%s VPU_IsRsted\n", __FUNCTION__));
1119 return TRUE;
1120 }
1121
1122 HAL_VPU_EX_SwRstRelse();
1123 return TRUE;
1124 }
1125
HAL_MVD_PA2NonCacheSeg(MS_PHY u32PhyAddr)1126 MS_VIRT HAL_MVD_PA2NonCacheSeg(MS_PHY u32PhyAddr)
1127 {
1128 return MS_PA2KSEG1(u32PhyAddr);
1129 }
1130
HAL_MVD_GetTime(void)1131 MS_U32 HAL_MVD_GetTime(void)
1132 {
1133 return MsOS_GetSystemTime();
1134 }
1135
HAL_MVD_Delayms(MS_U32 u32msecs)1136 void HAL_MVD_Delayms(MS_U32 u32msecs)
1137 {
1138 MsOS_DelayTask(u32msecs);
1139 }
1140
HAL_MVD_CPU_Sync(void)1141 void HAL_MVD_CPU_Sync(void)
1142 {
1143 MAsm_CPU_Sync();
1144 }
1145
HAL_MVD_FlushMemory(void)1146 void HAL_MVD_FlushMemory(void)
1147 {
1148 MsOS_FlushMemory();
1149 }
1150
HAL_MVD_ReadMemory(void)1151 void HAL_MVD_ReadMemory(void)
1152 {
1153 MsOS_ReadMemory();
1154 }
1155
1156 //Record the memory layout from system configuration
HAL_MVD_SetMEMCfg(MS_U8 u8Idx,MVD_MEMCfg * pMEMCfg)1157 MS_BOOL HAL_MVD_SetMEMCfg(MS_U8 u8Idx, MVD_MEMCfg* pMEMCfg)
1158 {
1159 memcpy(&(pMVDHalContext->stMemCfg[u8Idx]), pMEMCfg, sizeof(MVD_MEMCfg));
1160 //record the MIU settings
1161 pMVDHalContext->stMiuCfg.u32Miu1BaseAddr = pMEMCfg->u32Miu1BaseAddr;
1162 pMVDHalContext->stMiuCfg.u32Miu2BaseAddr = pMEMCfg->u32Miu2BaseAddr;
1163 pMVDHalContext->stMiuCfg.u32Miu3BaseAddr = pMEMCfg->u32Miu3BaseAddr;
1164 pMVDHalContext->stMiuCfg.u8FWMiuSel = pMEMCfg->u8FWMiuSel;
1165 pMVDHalContext->stMiuCfg.u8HWMiuSel = pMEMCfg->u8HWMiuSel;
1166 return TRUE;
1167 }
1168
HAL_MVD_GetMEMCfg(MS_U8 u8Idx)1169 MVD_MEMCfg* HAL_MVD_GetMEMCfg(MS_U8 u8Idx)
1170 {
1171 //printf("%s: u8Idx=0x%x\n", __FUNCTION__, u8Idx);
1172 MVD_MEMCfg* pInfo = NULL;
1173 pInfo = &(pMVDHalContext->stMemCfg[u8Idx]);
1174 return pInfo;
1175 }
1176
HAL_MVD_SetFWCfg(MS_U8 u8Idx,MVD_FWCfg * pFWCfg)1177 MS_BOOL HAL_MVD_SetFWCfg(MS_U8 u8Idx, MVD_FWCfg* pFWCfg)
1178 {
1179 //printf("%s: u8Idx=0x%x\n", __FUNCTION__, u8Idx);
1180 memcpy(&(pMVDHalContext->stFwCfg[u8Idx]), pFWCfg, sizeof(MVD_FWCfg));
1181 memcpy(&(pMVDHalContext->stFwCfg[u8Idx].stFBReduction), &pFWCfg->stFBReduction,sizeof(MVD_FB_Reduction));
1182 return TRUE;
1183 }
1184
HAL_MVD_GetFWCfg(MS_U8 u8Idx)1185 MVD_FWCfg* HAL_MVD_GetFWCfg(MS_U8 u8Idx)
1186 {
1187 MVD_FWCfg* pInfo = NULL;
1188 //printf("%s: u8Idx=0x%x\n", __FUNCTION__, u8Idx);
1189 pInfo = &(pMVDHalContext->stFwCfg[u8Idx]);
1190 return pInfo;
1191 }
1192
HAL_MVD_GetFBMode(MS_U8 u8Idx)1193 MS_U8 HAL_MVD_GetFBMode(MS_U8 u8Idx)
1194 {
1195 MS_U8 u8Mode = MVD3_SD_MODE;
1196 u8Mode = pMVDHalContext->stFwCfg[u8Idx].u8FBMode;
1197 MVD_DEBUGINFO(printf("FBMode=0x%x\n", u8Mode));
1198 return u8Mode;
1199 }
1200
HAL_MVD_GetCodecType(MS_U8 u8Idx)1201 MVD_CodecType HAL_MVD_GetCodecType(MS_U8 u8Idx)
1202 {
1203 MVD_CodecType eCodecType = E_MVD_CODEC_UNKNOWN;
1204 eCodecType = pMVDHalContext->stFwCfg[u8Idx].eCodecType;
1205 return eCodecType;
1206 }
1207
HAL_MVD_GetSrcMode(MS_U8 u8Idx)1208 MVD_SrcMode HAL_MVD_GetSrcMode(MS_U8 u8Idx)
1209 {
1210 MVD_SrcMode eSrcMode = E_MVD_SRC_UNKNOWN;
1211 eSrcMode = pMVDHalContext->stFwCfg[u8Idx].eSrcMode;
1212 return eSrcMode;
1213 }
1214
HAL_MVD_SetSrcMode(MS_U8 u8Idx,MVD_SrcMode mode)1215 MS_BOOL HAL_MVD_SetSrcMode(MS_U8 u8Idx,MVD_SrcMode mode)
1216 {
1217 if(pMVDHalContext != NULL)
1218 {
1219 pMVDHalContext->stFwCfg[u8Idx].eSrcMode = mode;
1220 return TRUE;
1221 }
1222 else
1223 {
1224 return FALSE;
1225 }
1226 }
1227
1228
HAL_MVD_GetCtrlCfg(MS_U8 u8Idx)1229 MVD_CtrlCfg* HAL_MVD_GetCtrlCfg(MS_U8 u8Idx)
1230 {
1231 MVD_CtrlCfg* pInfo = NULL;
1232 pInfo = &(pMVDHalContext->stCtrlCfg[u8Idx]);
1233 return pInfo;
1234 }
1235
HAL_MVD_GetSlqTblInfo(MS_U8 u8Idx)1236 MVD_SLQTBLInfo* HAL_MVD_GetSlqTblInfo(MS_U8 u8Idx)
1237 {
1238 MVD_SLQTBLInfo* pInfo = NULL;
1239 pInfo = &(pMVDHalContext->stSlqTblInfo[u8Idx]);
1240 return pInfo;
1241 }
1242
HAL_MVD_PowerCtrl(MS_BOOL bOn)1243 void HAL_MVD_PowerCtrl(MS_BOOL bOn)
1244 {
1245 HAL_MVD_RegWriteByteMask(REG_CKG_MVD, CKG_MVD_216MHZ, CKG_MVD_MASK);
1246 HAL_MVD_RegWriteBit(REG_CKG_MVD, !bOn, CKG_MVD_GATED);
1247 HAL_MVD_RegWriteBit(REG_CKG_MVD, !bOn, CKG_MVD_INVERT);
1248
1249 #ifdef SUPPORT_MVD2// macan mvd2 is null
1250 HAL_MVD_RegWriteByteMask(REG_CKG_MVD2, CKG_MVD2_216MHZ, CKG_MVD2_MASK);
1251 HAL_MVD_RegWriteBit(REG_CKG_MVD2, !bOn, CKG_MVD2_GATED);
1252 HAL_MVD_RegWriteBit(REG_CKG_MVD2, !bOn, CKG_MVD2_INVERT);
1253 #endif
1254
1255 HAL_MVD_RegWriteBit(REG_CKG_MVD_CHROMA_A, !bOn, CKG_MVD_CHROMA_A_GATED);
1256 HAL_MVD_RegWriteBit(REG_CKG_MVD_CHROMA_A, !bOn, CKG_MVD_CHROMA_A_INVERT);
1257
1258 HAL_MVD_RegWriteBit(REG_CKG_MVD_CHROMA_B, !bOn, CKG_MVD_CHROMA_B_GATED);
1259 HAL_MVD_RegWriteBit(REG_CKG_MVD_CHROMA_B, !bOn, CKG_MVD_CHROMA_B_INVERT);
1260
1261 HAL_MVD_RegWriteBit(REG_CKG_MVD_CHROMA_C, !bOn, CKG_MVD_CHROMA_C_GATED);
1262 HAL_MVD_RegWriteBit(REG_CKG_MVD_CHROMA_C, !bOn, CKG_MVD_CHROMA_C_INVERT);
1263
1264 HAL_MVD_RegWriteBit(REG_CKG_MVD_LUMA_A, !bOn, CKG_MVD_LUMA_A_GATED);
1265 HAL_MVD_RegWriteBit(REG_CKG_MVD_LUMA_A, !bOn, CKG_MVD_LUMA_A_INVERT);
1266
1267 HAL_MVD_RegWriteBit(REG_CKG_MVD_LUMA_B, !bOn, CKG_MVD_LUMA_B_GATED);
1268 HAL_MVD_RegWriteBit(REG_CKG_MVD_LUMA_B, !bOn, CKG_MVD_LUMA_B_INVERT);
1269
1270 HAL_MVD_RegWriteBit(REG_CKG_MVD_LUMA_C, !bOn, CKG_MVD_LUMA_C_GATED);
1271 HAL_MVD_RegWriteBit(REG_CKG_MVD_LUMA_C, !bOn, CKG_MVD_LUMA_C_INVERT);
1272
1273 HAL_MVD_RegWriteBit(REG_CKG_MVD_RMEM, !bOn, CKG_MVD_RMEM_GATED);
1274 HAL_MVD_RegWriteBit(REG_CKG_MVD_RMEM, !bOn, CKG_MVD_RMEM_INVERT);
1275
1276 HAL_MVD_RegWriteBit(REG_CKG_MVD_RMEM1, !bOn, CKG_MVD_RMEM1_GATED);
1277 HAL_MVD_RegWriteBit(REG_CKG_MVD_RMEM1, !bOn, CKG_MVD_RMEM1_INVERT);
1278
1279 HAL_MVD_RegWriteBit(REG_CKG_MVD_RREFDAT, !bOn, CKG_MVD_RREFDAT_GATED);
1280 HAL_MVD_RegWriteBit(REG_CKG_MVD_RREFDAT, !bOn, CKG_MVD_RREFDAT_INVERT);
1281
1282 //Set MVD all clock sources equal to clk_miu_p 0: enable 1: disable
1283 //Per Lawrence, mark this line:
1284 // Sync mode is debug mode, so driver shouldn't write 1 to this register in normal case.
1285 //HAL_MVD_RegWriteBit(REG_CKG_MVD_SYNC, !bOn, CKG_MVD_SYNC_GATED);
1286
1287 return;
1288 }
1289
1290 #if 0
1291 void HAL_MVD_Sleep(MS_U32 u32us)
1292 {
1293 MsOS_DelayTaskUs(u32us);
1294 }
1295 #endif
HAL_MVD_ResetHandShake(MS_U8 u8Idx,MVD_HANDSHAKE_CMD cmd)1296 void HAL_MVD_ResetHandShake(MS_U8 u8Idx, MVD_HANDSHAKE_CMD cmd)
1297 {
1298 MS_U32 u32BufAddr = GET_FRMINFO_BUFFADD(u8Idx);
1299 HAL_MVD_CPU_Sync();
1300 HAL_MVD_ReadMemory();
1301 MVD_CMD_HANDSHADE_INDEX u32CmdState;
1302 u32CmdState.value= HAL_MVD_MemRead4Byte(u32BufAddr + OFFSET_CMD_HANDSHAKE_INDEX);
1303 switch (cmd)
1304 {
1305 case MVD_HANDSHAKE_PAUSE:
1306 (u32CmdState.mvdcmd_handshake_pause) = 0;
1307 break;
1308 case MVD_HANDSHAKE_SLQ_RST:
1309 (u32CmdState.mvdcmd_handshake_slq_reset) = 0;
1310 break;
1311 case MVD_HANDSHAKE_STOP:
1312 (u32CmdState.mvdcmd_handshake_stop) = 0;
1313 break;
1314 case MVD_HANDSHAKE_SKIP_DATA:
1315 (u32CmdState.mvdcmd_handshake_skip_data) = 0;
1316 break;
1317 case MVD_HANDSHAKE_SINGLE_STEP:
1318 (u32CmdState.mvdcmd_handshake_single_step) = 0;
1319 break;
1320 case MVD_HANDSHAKE_SCALER_INFO:
1321 (u32CmdState.mvdcmd_handshake_scaler_data_ready) = 0;
1322 break;
1323 case MVD_HANDSHAKE_GET_NXTDISPFRM:
1324 (u32CmdState.mvdcmd_handshake_get_nextdispfrm_ready) = 0;
1325 break;
1326 case MVD_HANDSHAKE_PARSER_RST:
1327 (u32CmdState.mvdcmd_handshake_parser_rst) = 0;
1328 break;
1329 case MVD_HANDSHAKE_RST_CC608:
1330 (u32CmdState.mvdcmd_handshake_cc608_rst) = 0;
1331 break;
1332 case MVD_HANDSHAKE_RST_CC708:
1333 (u32CmdState.mvdcmd_handshake_cc708_rst) = 0;
1334 break;
1335 case MVD_HANDSHAKE_VIRTUAL_COMMAND:
1336 (u32CmdState.mvdcmd_handshake_virtualCommand) = 0;
1337 break;
1338 case MVD_HANDSHAKE_FLUSHQUEUE_COMMAND:
1339 (u32CmdState.mvdcmd_handshake_flush) = 0;
1340 break;
1341 case MVD_HANDSHAKE_VSYNC_CONTROL:
1342 (u32CmdState.mvdcmd_handshake_vsync_control) = 0;
1343 break;
1344 default:
1345 break;
1346 }
1347 HAL_MVD_MemWrite4Byte(u32BufAddr + OFFSET_CMD_HANDSHAKE_INDEX,u32CmdState.value);
1348 MsOS_FlushMemory();
1349 }
1350
1351 //------------------------------------------------------------------------------
1352 /// Wait MVD command ready or timeout
1353 /// @return -MVD command ready or timeout
1354 //------------------------------------------------------------------------------
HAL_MVD_TimeOut(MS_U8 u8Idx)1355 MS_BOOL HAL_MVD_TimeOut(MS_U8 u8Idx)
1356 {
1357 MS_U32 i;
1358 MS_U32 u32StartTime = MsOS_GetSystemTime();
1359
1360 for ( i = 0; i < MVD_PollingTimes; i++ )
1361 {
1362 ///- wait until MVD command ready or timeout
1363 if ( ( HAL_MVD_RegReadByte(MVD_STATUS) & MVD_STATUS_READY ) == MVD_STATUS_READY )
1364 {
1365 return FALSE;
1366 }
1367
1368 if (/*(TRUE == pMVDHalContext->bStopped[u8Idx]) ||*/ ((MsOS_GetSystemTime()-u32StartTime)>1300))
1369 {
1370 MVD_DEBUGINFO(printf("%s: bStopped(%x) or timeout(%d)\n", __FUNCTION__, pMVDHalContext->bStopped[u8Idx], MsOS_GetSystemTime()-u32StartTime));
1371 return TRUE;
1372 }
1373
1374 //HAL_MVD_Sleep(5);
1375 }
1376 MVD_DEBUGERROR( printf("MVD_TimeOut=%x\n", i) );
1377 return TRUE;
1378 }
1379
1380 //------------------------------------------------------------------------------
1381 /// Set MVD firmware command
1382 /// @param -u8cmd \b IN : MVD command
1383 /// @param -pstCmdArg \b IN : pointer to command argument
1384 //------------------------------------------------------------------------------
HAL_MVD_MVDCommand(MS_U8 u8cmd,MVD_CmdArg * pstCmdArg)1385 MS_BOOL HAL_MVD_MVDCommand ( MS_U8 u8cmd, MVD_CmdArg *pstCmdArg )
1386 {
1387 MS_BOOL bRet = TRUE;
1388 #ifdef VDEC3
1389 MS_U32 u32CmdArg;
1390 MS_U32 u32Ret = FALSE;
1391 MS_U32 u32Timeout;
1392 MS_U8 u8HalIdx = pstCmdArg->Arg5;
1393 MS_U32 u32Id = MVD_GetStreamId(u8HalIdx);
1394 MS_U8 u8VPUIdx = HAL_VPU_EX_GetTaskId(u32Id);
1395 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8HalIdx);
1396 CMD_QUEUE *pShm = (CMD_QUEUE *)MsOS_PA2KSEG1(pstMemCfg->u32FWCodeAddr + VCOMMANDQ_INFO_START + u8VPUIdx*0x100000);
1397 MS_VIRT u32BufStart2 = NULL;
1398 MS_BOOL bResponse = FALSE;
1399 #endif
1400 OSAL_MVD_LockHwMutex();
1401
1402 #ifdef VDEC3
1403 if(HAL_MVD_IsDisplayCommand(u8cmd) == TRUE)
1404 {
1405 if(HAL_MVD_IsNeedResponseCommand(u8cmd) == TRUE)
1406 {
1407 // clear handshake dram
1408 u32BufStart2 = GET_VOL_BUFFADD(u8HalIdx);
1409
1410 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,u32BufStart2,u32BufStart2);
1411
1412 MS_U8* temp2 = (MS_U8*)MsOS_PA2KSEG1(u32BufStart2+OFFSET_VCHANDSHAKE);
1413
1414 *temp2 = 0;
1415
1416 MsOS_FlushMemory();
1417 }
1418
1419
1420 u32CmdArg = pstCmdArg->Arg0 | (pstCmdArg->Arg1<<8) | (pstCmdArg->Arg2 << 16) | (pstCmdArg->Arg3 << 24);
1421
1422 u32Timeout = MsOS_GetSystemTime()+VIRTUAL_CMD_TIMEOUT;
1423
1424 do
1425 {
1426 u32Ret = HAL_VPU_EX_DRAMStreamDispCMDQueueSend(u32Id,(void*)pShm,E_HVD_CMDQ_ARG,u32CmdArg);
1427
1428
1429 if(u32Ret == E_HVD_COMMAND_QUEUE_NOT_INITIALED)
1430 {
1431 bRet = FALSE;
1432 break;
1433 }
1434 else if (MsOS_GetSystemTime() > u32Timeout && u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL )
1435 {
1436 bRet = FALSE;
1437 break;
1438 }
1439 }while(u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL);
1440
1441 if(bRet == FALSE || u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL)
1442 {
1443 bRet = FALSE;
1444 goto _CMD_DONE;
1445 }
1446
1447
1448 u32Timeout = MsOS_GetSystemTime()+VIRTUAL_CMD_TIMEOUT;
1449
1450 do
1451 {
1452 u32Ret = HAL_VPU_EX_DRAMStreamDispCMDQueueSend(u32Id,(void*)pShm,E_HVD_CMDQ_CMD,u8cmd|(u8VPUIdx<<24)|(pstCmdArg->Arg4<<16));
1453
1454 if(u32Ret == E_HVD_COMMAND_QUEUE_NOT_INITIALED)
1455 {
1456 bRet = FALSE;
1457 break;
1458 }
1459 else if (MsOS_GetSystemTime() > u32Timeout && u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL)
1460 {
1461 bRet = FALSE;
1462 break;
1463 }
1464 }while(u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL);
1465
1466 if(bRet == FALSE || u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL)
1467 {
1468 bRet = FALSE;
1469 goto _CMD_DONE;
1470 }
1471
1472 if(HAL_MVD_IsNeedResponseCommand(u8cmd) == TRUE)
1473 {
1474 u32Timeout = MsOS_GetSystemTime()+VIRTUAL_CMD_TIMEOUT;
1475
1476 while(MsOS_GetSystemTime() < u32Timeout)
1477 {
1478 #if 0
1479 if (HAL_MVD_IsCmdFinished(u8HalIdx, MVD_HANDSHAKE_VIRTUAL_COMMAND))
1480 {
1481 bResponse = TRUE;
1482 break;
1483 }
1484 #else
1485 if(MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VCHANDSHAKE, sizeof(MS_U8)) == 1)
1486 {
1487 bResponse = TRUE;
1488 break;
1489 }
1490 #endif
1491 }
1492
1493 if(bResponse == FALSE) // fail case
1494 {
1495 bRet = FALSE;
1496 goto _CMD_DONE;
1497 }
1498
1499 pstCmdArg->Arg0 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG0, sizeof(MS_U8));
1500 pstCmdArg->Arg1 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG1, sizeof(MS_U8));
1501 pstCmdArg->Arg2 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG2, sizeof(MS_U8));
1502 pstCmdArg->Arg3 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG3, sizeof(MS_U8));
1503 pstCmdArg->Arg4 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG4, sizeof(MS_U8));
1504 }
1505
1506 }
1507 else if(HAL_MVD_IsNormalCommand(u8cmd) == TRUE)
1508 {
1509 if(HAL_MVD_IsNeedResponseCommand(u8cmd) == TRUE)
1510 {
1511 // clear handshake dram
1512 u32BufStart2 = GET_VOL_BUFFADD(u8HalIdx);
1513
1514 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,u32BufStart2,u32BufStart2);
1515
1516 MS_U8* temp2 = (MS_U8*)MsOS_PA2KSEG1(u32BufStart2+OFFSET_VCHANDSHAKE);
1517
1518 *temp2 = 0;
1519
1520 MsOS_ReadMemory();
1521 MsOS_FlushMemory();
1522 }
1523
1524 u32CmdArg = pstCmdArg->Arg0 | (pstCmdArg->Arg1<<8) | (pstCmdArg->Arg2 << 16) | (pstCmdArg->Arg3 << 24);
1525
1526 u32Timeout = MsOS_GetSystemTime()+VIRTUAL_CMD_TIMEOUT;
1527
1528 do
1529 {
1530 //u32Ret = HAL_VPU_EX_DRAMStreamCMDQueueSend_MVD(pstCmdArg->Arg5,E_HVD_CMDQ_ARG,u32CmdArg);
1531 u32Ret = HAL_VPU_EX_DRAMStreamCMDQueueSend(u32Id,(void*)pShm,E_HVD_CMDQ_ARG,u32CmdArg);
1532
1533 if(u32Ret == E_HVD_COMMAND_QUEUE_NOT_INITIALED)
1534 {
1535 bRet = FALSE;
1536 break;
1537 }
1538 else if (MsOS_GetSystemTime() > u32Timeout && u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL )
1539 {
1540 bRet = FALSE;
1541 break;
1542 }
1543 }while(u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL);
1544
1545
1546 if(bRet == FALSE || u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL)
1547 {
1548 bRet = FALSE;
1549 goto _CMD_DONE;
1550 }
1551
1552
1553 u32Timeout = MsOS_GetSystemTime()+VIRTUAL_CMD_TIMEOUT;
1554 do
1555 {
1556 //u32Ret = HAL_VPU_EX_DRAMStreamCMDQueueSend_MVD(pstCmdArg->Arg5,E_HVD_CMDQ_CMD,u8cmd|(pstCmdArg->Arg5<<24)|(pstCmdArg->Arg4<<16));
1557 u32Ret = HAL_VPU_EX_DRAMStreamCMDQueueSend(u32Id,(void*)pShm,E_HVD_CMDQ_CMD,u8cmd|(u8VPUIdx<<24)|(pstCmdArg->Arg4<<16));
1558
1559 if(u32Ret == E_HVD_COMMAND_QUEUE_NOT_INITIALED)
1560 {
1561 bRet = FALSE;
1562 break;
1563 }
1564 else if (MsOS_GetSystemTime() > u32Timeout && u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL)
1565 {
1566 bRet = FALSE;
1567 break;
1568 }
1569 }while(u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL);
1570
1571 if(bRet == FALSE || u32Ret != E_HVD_COMMAND_QUEUE_SEND_SUCCESSFUL)
1572 {
1573 bRet = FALSE;
1574 goto _CMD_DONE;
1575 }
1576
1577 if(HAL_MVD_IsNeedResponseCommand(u8cmd) == TRUE)
1578 {
1579 u32Timeout = MsOS_GetSystemTime()+VIRTUAL_CMD_TIMEOUT;
1580
1581 while(MsOS_GetSystemTime() < u32Timeout)
1582 {
1583 #if 0
1584 if (HAL_MVD_IsCmdFinished(u8HalIdx, MVD_HANDSHAKE_VIRTUAL_COMMAND))
1585 {
1586 bResponse = TRUE;
1587 break;
1588 }
1589 #else
1590 if(MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VCHANDSHAKE, sizeof(MS_U8)) == 1)
1591 {
1592 bResponse = TRUE;
1593 break;
1594 }
1595 #endif
1596 }
1597
1598 if(bResponse == FALSE) // fail case
1599 {
1600 bRet = FALSE;
1601 goto _CMD_DONE;
1602 }
1603
1604 pstCmdArg->Arg0 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG0, sizeof(MS_U8));
1605 pstCmdArg->Arg1 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG1, sizeof(MS_U8));
1606 pstCmdArg->Arg2 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG2, sizeof(MS_U8));
1607 pstCmdArg->Arg3 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG3, sizeof(MS_U8));
1608 pstCmdArg->Arg4 = MVD_GetFWBuffData(u8HalIdx, FW_BUFF_VOLINFO, OFFSET_VIRTUAL_COMMANDARG4, sizeof(MS_U8));
1609 }
1610 }
1611 else
1612 #endif
1613 {
1614 if ( HAL_MVD_TimeOut(pstCmdArg->Arg5) == TRUE )
1615 {
1616 bRet = FALSE;
1617 goto _CMD_DONE;
1618 }
1619
1620 HAL_MVD_RegWriteByte(MVD_ARG0, pstCmdArg->Arg0);
1621 HAL_MVD_RegWriteByte(MVD_ARG1, pstCmdArg->Arg1);
1622 HAL_MVD_RegWriteByte(MVD_ARG2, pstCmdArg->Arg2);
1623 HAL_MVD_RegWriteByte(MVD_ARG3, pstCmdArg->Arg3);
1624 HAL_MVD_RegWriteByte(MVD_ARG4, pstCmdArg->Arg4);
1625 HAL_MVD_RegWriteByte(MVD_ARG5, pstCmdArg->Arg5);
1626 HAL_MVD_RegWriteByte(MVD_COMMAND, u8cmd);
1627 if ((CMD_GET_AFD != u8cmd) && (CMD_SLQ_GET_TBL_RPTR != u8cmd) &&
1628 (CMD_SLQ_UPDATE_TBL_WPTR != u8cmd) && (CMD_GET_NEXTDISPFRM != u8cmd) &&
1629 (CMD_DECODE_STATUS != u8cmd) && (CMD_RD_PTS != u8cmd) &&
1630 (CMD_GET_INT_STAT != u8cmd) && (CMD_RD_IO != u8cmd))
1631 {
1632 MVD_DEBUG_FWCMD(printf("MVD_CMD: %x; %x, %x, %x, %x, %x, %x\n", u8cmd, pstCmdArg->Arg0,
1633 pstCmdArg->Arg1, pstCmdArg->Arg2, pstCmdArg->Arg3, pstCmdArg->Arg4, pstCmdArg->Arg5));
1634 }
1635
1636 if ( HAL_MVD_TimeOut(pstCmdArg->Arg5) == TRUE )
1637 {
1638 bRet = FALSE;
1639 goto _CMD_DONE;
1640 }
1641
1642 pstCmdArg->Arg0 = HAL_MVD_RegReadByte(MVD_ARG0);
1643 pstCmdArg->Arg1 = HAL_MVD_RegReadByte(MVD_ARG1);
1644 pstCmdArg->Arg2 = HAL_MVD_RegReadByte(MVD_ARG2);
1645 pstCmdArg->Arg3 = HAL_MVD_RegReadByte(MVD_ARG3);
1646 pstCmdArg->Arg4 = HAL_MVD_RegReadByte(MVD_ARG4);
1647 pstCmdArg->Arg5 = HAL_MVD_RegReadByte(MVD_ARG5);
1648 }
1649
1650 _CMD_DONE:
1651 OSAL_MVD_UnlockHwMutex();
1652
1653 if (!bRet)
1654 {
1655 MVD_DEBUG_FWCMD(printf("%s timeout dump pc\n", __FUNCTION__));
1656 MS_U32 x=0;
1657 for (x=0; x<30; x++)
1658 MVD_DEBUG_FWCMD(printf("0x%x\n", HAL_VPU_EX_GetProgCnt()));
1659 MVD_DEBUG_FWCMD(printf("###\n"));
1660 }
1661
1662 return bRet;
1663 }
1664
HAL_MVD_SetSyncClk(MS_BOOL bEnable)1665 void HAL_MVD_SetSyncClk(MS_BOOL bEnable)
1666 {
1667 MS_ASSERT(0==bEnable);//Notice: Euclid & T3 have no sync_mode; Bit4 must be 0.
1668
1669 OSAL_MVD_LockHwMutex();
1670 HAL_MVD_RegWriteBit(MVD_CTRL, bEnable, MVD_CTRL_CLK_SYNCMODE);
1671 OSAL_MVD_UnlockHwMutex();
1672
1673 return;
1674 }
1675
HAL_MVD_InitHW(void)1676 MS_BOOL HAL_MVD_InitHW(void)
1677 {
1678 //Set MVD Clock @ reg_CHIPTOP
1679 HAL_MVD_PowerCtrl(ENABLE);
1680
1681 //Set MVD Clock aync
1682 HAL_MVD_SetSyncClk(DISABLE);
1683
1684 //MVD reset
1685 if(!HAL_MVD_RstHW())
1686 {
1687 MVD_DEBUGERROR(printf("MDrv_MVD_MVDInit:MVD4ResetHW failed\n"));
1688 return FALSE;
1689 }
1690 else
1691 {
1692 MVD_DEBUGINFO(printf("MDrv_MVD_MVDInit:MVD4ResetHW success\n"));
1693 }
1694
1695 return TRUE;
1696 }
1697
1698
1699 //------------------------------------------------------------------------------
1700 /// Get MVD firmware version
1701 /// @return -firmware version
1702 //------------------------------------------------------------------------------
HAL_MVD_GetFWVer(MS_U32 u32VpuSid)1703 MS_U32 HAL_MVD_GetFWVer(MS_U32 u32VpuSid)
1704 {
1705 #if 0
1706 return HAL_VPU_EX_GetFWVer(u32VpuSid, E_VPU_EX_FW_VER_MVD_FW);
1707 #else
1708 UNUSED(u32VpuSid);
1709 MVD_CmdArg mvdcmd;
1710
1711 SETUP_CMDARG(mvdcmd);
1712 if (HAL_MVD_MVDCommand( CMD_GET_FW_VERSION, &mvdcmd ) == FALSE)
1713 {
1714 MVD_ERROR( printf( "Command: 0x%x fail!!\r\n", CMD_GET_FW_VERSION ) );
1715 return 0;
1716 }
1717 return COMBU32(mvdcmd.Arg3,mvdcmd.Arg2,mvdcmd.Arg1,mvdcmd.Arg0);
1718 #endif
1719 }
1720
1721 //------------------------------------------------------------------------------
1722 /// Get MVD firmware interface version
1723 /// @return -firmware interface version
1724 //------------------------------------------------------------------------------
HAL_MVD_GetFWIfVer(MS_U32 u32VpuSid)1725 MS_U32 HAL_MVD_GetFWIfVer(MS_U32 u32VpuSid)
1726 {
1727 #if 0
1728 return HAL_VPU_EX_GetFWVer(u32VpuSid, E_VPU_EX_FW_VER_MVD_IF);
1729 #else
1730 UNUSED(u32VpuSid);
1731 MVD_CmdArg mvdcmd;
1732
1733 SETUP_CMDARG(mvdcmd);
1734 if (HAL_MVD_MVDCommand( CMD_INTERFACE_VERSION, &mvdcmd ) == FALSE)
1735 {
1736 MVD_ERROR( printf( "Command: 0x%x fail!!\r\n", CMD_INTERFACE_VERSION ) );
1737 return 0;
1738 }
1739 return COMBU32(mvdcmd.Arg3,mvdcmd.Arg2,mvdcmd.Arg1,mvdcmd.Arg0);
1740 #endif
1741 }
1742
1743 //------------------------------------------------------------------------------
1744 /// Check MVD firmware status
1745 /// @return -firmware is ready or not
1746 //------------------------------------------------------------------------------
1747
1748 #ifdef VDEC3
_MVD_Check_FW_Rdy(MS_U32 u32VpuSid)1749 static MS_BOOL _MVD_Check_FW_Rdy(MS_U32 u32VpuSid)
1750 {
1751 MS_U32 u32Id = MVD_GetStreamId(u32VpuSid);
1752 MS_U8 u8VPUIdx = HAL_VPU_EX_GetTaskId(u32Id);
1753 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u32VpuSid);
1754 MS_U32 u32TimeOut = MsOS_GetSystemTime() + 500;
1755 unsigned int* pVersion = (unsigned int*)MsOS_PA2KSEG1(pstMemCfg->u32FWCodeAddr + OFFSET_BASE + u8VPUIdx*0x100000);
1756 MS_BOOL ret = FALSE;
1757
1758 while(MsOS_GetSystemTime() < u32TimeOut)
1759 {
1760 if(((*pVersion) == FW_VERSION) && ((*(pVersion+4)) == INTERFACE_VERSION))
1761 {
1762 ret = TRUE;
1763 break;
1764 }
1765 }
1766
1767 if (ret == FALSE)
1768 {
1769 MVD_ERROR(printf("MVD f/w header version is wrong,%x,%x,%x,%x\n",(*(pVersion+4)), INTERFACE_VERSION,(*pVersion), FW_VERSION));
1770 }
1771
1772 return ret;
1773 }
1774
1775 #else
_MVD_Check_FW_Rdy(MS_U32 u32VpuSid)1776 static MS_BOOL _MVD_Check_FW_Rdy(MS_U32 u32VpuSid)
1777 {
1778 MS_U32 u32TimeOut = 2000;
1779
1780 //check firmware version consistent with header file
1781 while ((INTERFACE_VERSION != HAL_MVD_GetFWIfVer(u32VpuSid)) && (--u32TimeOut));
1782 if (u32TimeOut == 0)
1783 {
1784 MVD_ERROR(printf("MVD_FW_IF_Version=%lx inconsistent with header file(%x)!\n",
1785 HAL_MVD_GetFWIfVer(u32VpuSid), INTERFACE_VERSION));
1786 return FALSE;
1787 }
1788
1789 if (FW_VERSION != HAL_MVD_GetFWVer(u32VpuSid))
1790 {
1791 MVD_DEBUGINFO(printf("Warning! FWBinVer(%lx) != FWHdrVer(%x)\n", HAL_MVD_GetFWVer(u32VpuSid), FW_VERSION));
1792 }
1793 MVD_DEBUGINFO(printf("MVD version Interface = %x, FW = %x\n", INTERFACE_VERSION, FW_VERSION));
1794
1795 return TRUE;
1796 }
1797 #endif
_DumpCtrl(MS_U8 u8Idx)1798 MS_BOOL _DumpCtrl(MS_U8 u8Idx)
1799 {
1800 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
1801
1802 //printf("u32VA=0x%lx, PA=0x%x\n", u32VA, pstMemCfg->u32FWCodeAddr);
1803 struct _ctl_info *ctl_ptr = (struct _ctl_info *)
1804 HAL_MVD_PA2NonCacheSeg(pstMemCfg->u32FWCodeAddr + CTL_INFO_ADDR);
1805 MS_U32 u32timeout = HAL_MVD_GetTime() + 1000;//u32HVDCmdTimeout;
1806
1807 HAL_MVD_ReadMemory();
1808
1809 MVD_DEBUGINFO(printf("version=0x%x, statue=0x%x, last_ctl_cmd=0x%x, last_ctl_arg=0x%x\n",
1810 ctl_ptr->verion, ctl_ptr->statue, ctl_ptr->last_ctl_cmd, ctl_ptr->last_ctl_arg));
1811
1812 while (CTL_TASK_CMDRDY != ctl_ptr->statue)
1813 {
1814 if (HAL_MVD_GetTime() > u32timeout)
1815 {
1816 MVD_DEBUGERROR(printf("CTRL timeout!!! %d\n", __LINE__));
1817 return FALSE;
1818 }
1819 }
1820
1821 MVD_DEBUGINFO(printf("Version=0x%x, statue=0x%x, last_ctl_cmd=0x%x, last_ctl_arg=0x%x\n",
1822 ctl_ptr->verion, ctl_ptr->statue, ctl_ptr->last_ctl_cmd, ctl_ptr->last_ctl_arg));
1823
1824 MS_U8 i;
1825
1826 for (i = 0; i < 4; i++)
1827 {
1828 MVD_DEBUGINFO(printf("%s: Task %d, status=%d\n", __FUNCTION__, i, ctl_ptr->task_statue[i]));
1829 }
1830 return TRUE;
1831 }
1832
1833
MVD_MapVpuSrcType(MVD_SrcMode eSrcMode)1834 static VPU_EX_SourceType MVD_MapVpuSrcType(MVD_SrcMode eSrcMode)
1835 {
1836 VPU_EX_SourceType eVpuSrcType = E_VPU_EX_INPUT_NONE;
1837 switch (eSrcMode)
1838 {
1839 case E_MVD_TS_MODE:
1840 case E_MVD_TS_FILE_MODE:
1841 eVpuSrcType = E_VPU_EX_INPUT_TSP;
1842 break;
1843
1844 case E_MVD_SLQ_TBL_MODE:
1845 case E_MVD_SLQ_MODE:
1846 case E_MVD_FILE_MODE:
1847 eVpuSrcType = E_VPU_EX_INPUT_FILE;
1848 break;
1849
1850 case E_MVD_SRC_UNKNOWN:
1851 default:
1852 break;
1853 }
1854 return eVpuSrcType;
1855 }
1856
MVD_GetTaskInfo(VPU_EX_TaskInfo * pstTaskInfo,MS_U8 u8Idx,HAL_VPU_StreamId eVpuId)1857 static void MVD_GetTaskInfo(VPU_EX_TaskInfo* pstTaskInfo, MS_U8 u8Idx, HAL_VPU_StreamId eVpuId)
1858 {
1859 pstTaskInfo->u32Id = (u8Idx << 8 | eVpuId);
1860 pstTaskInfo->eDecType = E_VPU_EX_DECODER_MVD;
1861 pstTaskInfo->eVpuId = eVpuId;
1862 pstTaskInfo->eSrcType = MVD_MapVpuSrcType(HAL_MVD_GetSrcMode(u8Idx));
1863 pstTaskInfo->u32HeapSize = MVD_DRAM_SIZE;
1864 }
1865
1866
HAL_MVD_CreateTask(MS_U8 u8Idx,HAL_VPU_StreamId eVpuId)1867 MS_BOOL HAL_MVD_CreateTask(MS_U8 u8Idx, HAL_VPU_StreamId eVpuId)
1868 {
1869 MS_BOOL bRet = FALSE;
1870 MS_BOOL bFWdecideFB = FALSE;
1871 MVD_FWCfg* pstCfg = HAL_MVD_GetFWCfg(u8Idx);
1872 HAL_VPU_EX_SetFWReload(!(pstCfg->bNotReload));
1873
1874 MVD_DEBUGINFO(printf("\n\n Create Task(%x)!!!\n", u8Idx));
1875 VPU_EX_TaskInfo stTaskInfo;
1876 MVD_GetTaskInfo(&stTaskInfo, u8Idx, eVpuId);
1877
1878 VPU_EX_FWCodeCfg stVpuFWCfg;
1879 VPU_EX_NDecInitPara stVpuInitPara;
1880 stVpuInitPara.pFWCodeCfg = &stVpuFWCfg;
1881 stVpuInitPara.pTaskInfo = &stTaskInfo;
1882 stVpuInitPara.pVLCCfg = NULL;
1883
1884 MVD_MEMCfg* pMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
1885 stVpuFWCfg.u32BinAddr = HAL_MVD_PA2NonCacheSeg(pMemCfg->u32FWBinAddr);
1886 stVpuFWCfg.u32BinSize = pMemCfg->u32FWBinSize;
1887 stVpuFWCfg.u32DstAddr = HAL_MVD_PA2NonCacheSeg(pMemCfg->u32FWCodeAddr);
1888 stVpuFWCfg.u32DstSize = pMemCfg->u32FWCodeSize;
1889 stVpuFWCfg.u8SrcType = pMemCfg->eFWSrcType;
1890
1891 #ifdef VDEC3
1892 VPU_EX_FBCfg pFBCfg;
1893 stVpuInitPara.pFBCfg = &pFBCfg;
1894
1895 if(pMVDHalContext->bCMAUsed == TRUE)
1896 {
1897 stVpuInitPara.pFBCfg->u32FrameBufAddr = (MS_VIRT)pMVDHalContext->cmaInitParam.heap_miu_start_offset;
1898 stVpuInitPara.pFBCfg->u32FrameBufSize = (MS_VIRT)pMVDHalContext->cmaInitParam.heap_length;
1899 bFWdecideFB = TRUE;
1900
1901 }
1902 stTaskInfo.u8HalId = u8Idx;
1903 pMVDHalContext->_stMVDStream[u8Idx].u32SLQId = HAL_VPU_EX_GetBBUId(stTaskInfo.u32Id, &stTaskInfo, FALSE);
1904 if(pMVDHalContext->_stMVDStream[u8Idx].u32SLQId == HAL_VPU_INVALID_BBU_ID)
1905 {
1906 MVD_DEBUGINFO(printf("ERROR!!!MVD GetBBU Id Fail \n"));
1907 }
1908 else
1909 {
1910 bRet = HAL_VPU_EX_TaskCreate((MS_U32)eVpuId, (void*)&stVpuInitPara, bFWdecideFB, pMVDHalContext->_stMVDStream[u8Idx].u32SLQId);
1911 }
1912
1913 if(bRet == FALSE)
1914 {
1915 if(!HAL_VPU_EX_FreeBBUId(stTaskInfo.u32Id, pMVDHalContext->_stMVDStream[u8Idx].u32SLQId, &stTaskInfo))
1916 {
1917 MVD_DEBUGERROR(printf("[%s][%d]ERROR!!! Free BBU Id Fail !!!\n",__FUNCTION__,__LINE__));
1918 }
1919 }
1920 #else
1921 bRet = HAL_VPU_EX_TaskCreate((MS_U32)eVpuId, (void*)&stVpuInitPara);
1922 #endif
1923 MVD_DEBUGINFO(printf(" Create Task!!! bRet=%x ###\n\n", bRet));
1924 _DumpCtrl(u8Idx);
1925
1926 return bRet;
1927 }
1928
HAL_MVD_DeleteTask(MS_U8 u8Idx,HAL_VPU_StreamId eVpuId)1929 MS_BOOL HAL_MVD_DeleteTask(MS_U8 u8Idx, HAL_VPU_StreamId eVpuId)
1930 {
1931 MS_BOOL bRet = FALSE;
1932 MVD_DEBUGINFO(printf("\n\n Delete Task(%x)!!!\n", u8Idx));
1933
1934 VPU_EX_TaskInfo stTaskInfo;
1935 MVD_GetTaskInfo(&stTaskInfo, u8Idx, eVpuId);
1936
1937 VPU_EX_FWCodeCfg stVpuFWCfg;
1938 VPU_EX_NDecInitPara stVpuInitPara;
1939 stVpuInitPara.pFWCodeCfg = &stVpuFWCfg;
1940 stVpuInitPara.pTaskInfo = &stTaskInfo;
1941
1942 MVD_MEMCfg* pMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
1943 stVpuFWCfg.u32BinAddr = HAL_MVD_PA2NonCacheSeg(pMemCfg->u32FWBinAddr);
1944 stVpuFWCfg.u32BinSize = pMemCfg->u32FWBinSize;
1945 stVpuFWCfg.u32DstAddr = HAL_MVD_PA2NonCacheSeg(pMemCfg->u32FWCodeAddr);
1946 stVpuFWCfg.u8SrcType = pMemCfg->eFWSrcType;
1947
1948 #ifdef VDEC3
1949 if(!HAL_VPU_EX_FreeBBUId(stTaskInfo.u32Id, pMVDHalContext->_stMVDStream[u8Idx].u32SLQId, &stTaskInfo))
1950 {
1951 MVD_DEBUGINFO(printf("ERROR!!! Free BBU Id Fail !!!\n"));
1952 }
1953 #endif
1954 bRet = HAL_VPU_EX_TaskDelete((MS_U32) eVpuId, &stVpuInitPara);
1955 MVD_DEBUGINFO(printf(" Delete Task!!! ###\n\n"));
1956 _DumpCtrl(u8Idx);
1957 return bRet;
1958 }
1959
HAL_MVD_InitFW(MS_U32 u32VpuSid)1960 MS_BOOL HAL_MVD_InitFW(MS_U32 u32VpuSid)
1961 {
1962 //to fix the timing issue of getting FWIfVer on Chakra2
1963 HAL_MVD_Delayms(1);
1964
1965 //check FW ready
1966 if ( !_MVD_Check_FW_Rdy(u32VpuSid))
1967 {
1968 MS_ASSERT(0);
1969 return FALSE;
1970 }
1971
1972 #if 0
1973 if(pMVDHalContext->_stMVDStream[0].bUsed == FALSE && pMVDHalContext->_stMVDStream[1].bUsed == FALSE) // no mvd is used
1974 {
1975 MVD_CmdArg mvdcmd;
1976 SETUP_CMDARG(mvdcmd);
1977 mvdcmd.Arg0 = 1; //reset mvd engine,if have only one mvd
1978 SET_DECNUM(mvdcmd, ((MS_U8)u32VpuSid));
1979 if (HAL_MVD_MVDCommand( CMD_SW_RESET, &mvdcmd ) == FALSE)
1980 {
1981 MVD_ERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SW_RESET ) );
1982 return FALSE;
1983 }
1984 }
1985 #endif
1986 return TRUE;
1987 }
1988
1989 #define _MVD_INIT_FAIL_RET() \
1990 do { \
1991 HAL_MVD_SetIsUsed(u8HalIdx, FALSE); \
1992 return FALSE; \
1993 } while (0)
1994
1995
HAL_MVD_Init(MS_U8 u8HalIdx,MVD_CodecType eCodecType,MS_U32 u32VpuSid)1996 MS_BOOL HAL_MVD_Init(MS_U8 u8HalIdx,MVD_CodecType eCodecType, MS_U32 u32VpuSid)
1997 {
1998 //OSAL_MVD_MutexInit();
1999 MS_BOOL no_use = FALSE;
2000 MS_BOOL ret;
2001 #ifndef CONFIG_MBOOT //Add For GPL (content protection)
2002
2003 ret = MDrv_MVD_AUTH_IPCheck(eCodecType,&no_use);
2004 if(ret == FALSE)
2005 {
2006 return FALSE;
2007 }
2008 #endif
2009 if (!HAL_MVD_CreateTask(u8HalIdx, (HAL_VPU_StreamId)u32VpuSid))
2010 {
2011 _MVD_INIT_FAIL_RET();
2012 }
2013
2014 pMVDHalContext->bStopped[u8HalIdx] = FALSE;
2015
2016 if (!HAL_MVD_InitFW(u8HalIdx))
2017 {
2018 MVD_DEBUGERROR(printf("%s:HAL_MVD_InitFW(%x) failed\n", __FUNCTION__, u8HalIdx));
2019 if (!HAL_MVD_DeleteTask(u8HalIdx, (HAL_VPU_StreamId)u32VpuSid))
2020 {
2021 MVD_DEBUGERROR(printf("%s:HAL_MVD_DeleteTask failed\n", __FUNCTION__));
2022 }
2023
2024 _MVD_INIT_FAIL_RET();
2025 }
2026 else
2027 {
2028 MVD_DEBUGINFO(printf("%s:HAL_MVD_InitFW(%x) success\n", __FUNCTION__, u8HalIdx));
2029 }
2030
2031 HAL_MVD_SetIsUsed(u8HalIdx, TRUE);
2032
2033 return TRUE;
2034 }
2035
2036 #define _MVD_CMDRDY ((HAL_MVD_RegReadByte(MVD_STATUS) & MVD_STATUS_READY) == MVD_STATUS_READY)
2037 //------------------------------------------------------------------------------
2038 /// Check if MVD command is ready
2039 /// @return TRUE or FALSE
2040 /// - TRUE, Success to process the command
2041 /// - FALSE, Failed due to timeout
2042 //------------------------------------------------------------------------------
HAL_MVD_GetCmdRdy(void)2043 MS_BOOL HAL_MVD_GetCmdRdy(void)
2044 {
2045 MS_U32 timeoutTick = 2000;
2046
2047 while ((!_MVD_CMDRDY) && ((timeoutTick--)!=0));
2048
2049 if (0 == timeoutTick)
2050 return FALSE;
2051 else
2052 return TRUE;
2053 }
2054
HAL_MVD_CheckIdle(void)2055 MS_BOOL HAL_MVD_CheckIdle(void)
2056 {
2057 MS_BOOL bIsIdle = FALSE;
2058 MVD_CmdArg mvdcmd;
2059
2060 //issue CheckIdle command
2061 SETUP_CMDARG(mvdcmd);
2062 SET_CMD_RET_FALSE(CMD_MVD_IDLE, &mvdcmd);
2063
2064 bIsIdle = (mvdcmd.Arg0 == 1);
2065 if (HAL_MVD_GetCmdRdy())
2066 {
2067 return bIsIdle;
2068 }
2069 else
2070 {
2071 return FALSE;
2072 }
2073 }
2074
2075
_MVD_SoftRstHW(void)2076 static MS_BOOL _MVD_SoftRstHW(void)
2077 {
2078 return FALSE;
2079 }
2080
2081 //------------------------------------------------------------------------------
2082 /// Soft-reset MVD
2083 /// Ref AP note p.12 HK2MVD Reset Flow
2084 /// @return TRUE or FALSE
2085 /// - TRUE, Success to soft-reset MVD
2086 /// - FALSE, Failed. Need init MVD again.
2087 //------------------------------------------------------------------------------
HAL_MVD_SoftRstHW(void)2088 MS_BOOL HAL_MVD_SoftRstHW(void)
2089 {
2090 MS_U32 timetick = 2000;
2091
2092 if (HAL_MVD_GetCmdRdy())
2093 {
2094 //idle check
2095 while ((!HAL_MVD_CheckIdle()) && ((timetick--)!=0));
2096
2097 //either MVD is idle or timeout, do ENG/SLQ reset
2098 return _MVD_SoftRstHW(); //Reset HW engine
2099 }
2100 else
2101 {
2102 return FALSE; //here means "CPU hanging"
2103 }
2104 }
2105
2106 //------------------------------------------------------------------------------
2107 /// Clean the IRQ bit (in interrupt handler should call this function while the
2108 /// interrupt has been triggered.
2109 /// @param none
2110 /// @return none
2111 /// @internal
2112 //------------------------------------------------------------------------------
HAL_MVD_ClearIRQ(void)2113 void HAL_MVD_ClearIRQ(void)
2114 {
2115 OSAL_MVD_LockHwMutex();
2116 HAL_MVD_RegWriteBit(MVD_CTRL, 1, MVD_CTRL_CLR_INT);
2117 OSAL_MVD_UnlockHwMutex();
2118 return;
2119 }
2120
2121 //------------------------------------------------------------------------------
2122 /// Set display speed.
2123 ///FW use (# of B frames) / (# of decode frames) < Ratio this formula to adjustment.
2124 ///Once if the ratio is 1, that means, whenever (#Bframes / #decoded) < 1, then
2125 ///FW would drop the B frame.
2126 ///In other words, once AP need to back to normal mode, AP have to set the arg0 to 0.
2127 //------------------------------------------------------------------------------
HAL_MVD_SetSpeed(MS_U8 u8Idx,MVD_SpeedType eSpeedType,MS_U8 u8Multiple)2128 MS_BOOL HAL_MVD_SetSpeed(MS_U8 u8Idx, MVD_SpeedType eSpeedType, MS_U8 u8Multiple)
2129 {
2130 MVD_CmdArg mvdcmd;
2131
2132 SETUP_CMDARG(mvdcmd);
2133
2134 if (E_MVD_SPEED_FAST == eSpeedType)
2135 mvdcmd.Arg0 = 1; //fast forward
2136 else if (E_MVD_SPEED_SLOW == eSpeedType)
2137 mvdcmd.Arg0 = 2; //slow motion
2138 else
2139 mvdcmd.Arg0 = 0; //normal speed
2140
2141 if (u8Multiple == 1)
2142 {
2143 mvdcmd.Arg0 = 0;
2144 //The only way to be NORMAL speed.
2145 }
2146
2147 mvdcmd.Arg1 = u8Multiple;
2148 SET_DECNUM(mvdcmd, u8Idx);
2149 SET_CMD_RET_FALSE(CMD_DISP_SPEED_CTRL, &mvdcmd);
2150 return TRUE;
2151 }
2152
2153 //------------------------------------------------------------------------------
2154 /// Set frame buffer address to MVD
2155 /// @param -u32addr \b IN : start address
2156 //------------------------------------------------------------------------------
HAL_MVD_SetFrameBuffAddr(MS_U8 u8Idx,MS_VIRT u32addr,MS_U8 u8fbMode)2157 void HAL_MVD_SetFrameBuffAddr(MS_U8 u8Idx, MS_VIRT u32addr, MS_U8 u8fbMode)
2158 {
2159 MVD_CmdArg mvdcmd;
2160 if(pMVDHalContext->bCMAUsed)
2161 {
2162 u8fbMode = MVD_CMA_MODE;
2163 }
2164
2165 if ((u32addr>>3) > MAX_ADD_28BIT)// TODO: fixme, in 64bits system, address may be more than 28 bits
2166 {
2167 MVD_DEBUGERROR(printf("MDrv_MVD_SetFrameBuffAddr: only support 28bit add!\n"));
2168 return;
2169 }
2170
2171 MS_ASSERT((u32addr%8)==0);
2172 u32addr >>= 3;
2173
2174 SETUP_CMDARG(mvdcmd);
2175 mvdcmd.Arg0 = L_WORD(u32addr);
2176 mvdcmd.Arg1 = H_WORD(u32addr);
2177 mvdcmd.Arg2 = L_DWORD(u32addr);
2178
2179 //Frame Buffer Mode Setting
2180 mvdcmd.Arg3 = u8fbMode | ((u32addr>>24)&0x0f);
2181 mvdcmd.Arg4 = u8fbMode & 0xff;
2182 MVD_DEBUGINFO(printf("FramebufferAdd 0x%lx, FB Mode 0x%x, arg3=0x%x\n", (unsigned long)u32addr, u8fbMode, mvdcmd.Arg3));
2183 SET_DECNUM(mvdcmd, u8Idx);
2184 if (HAL_MVD_MVDCommand( CMD_FB_BASE, &mvdcmd ) == FALSE)
2185 {
2186 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_FB_BASE ) );
2187 return;
2188 }
2189
2190 return;
2191 }
2192
2193 //------------------------------------------------------------------------------
2194 /// Set header buffer address to MVD
2195 /// @param -u32addr \b IN : start address
2196 //------------------------------------------------------------------------------
HAL_MVD_SetHeaderBufferAddr(MS_U8 u8Idx,MS_VIRT u32addr)2197 void HAL_MVD_SetHeaderBufferAddr (MS_U8 u8Idx, MS_VIRT u32addr )
2198 {
2199 MVD_CmdArg mvdcmd;
2200
2201 MS_ASSERT((u32addr%8)==0);
2202 u32addr >>= 3;
2203
2204 SET_CMDARG(mvdcmd, u32addr, u8Idx);
2205 if (HAL_MVD_MVDCommand( CMD_HEADER_INFO_BUF, &mvdcmd ) == FALSE)
2206 {
2207 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_HEADER_INFO_BUF ) );
2208 }
2209 return;
2210 }
2211
2212 //------------------------------------------------------------------------------
2213 /// Set vol info buffer address to MVD
2214 /// @param -u32addr \b IN : start address
2215 //------------------------------------------------------------------------------
HAL_MVD_SetVolInfoBufferAddr(MS_U8 u8Idx,MS_VIRT u32addr)2216 void HAL_MVD_SetVolInfoBufferAddr (MS_U8 u8Idx, MS_VIRT u32addr )
2217 {
2218 MVD_CmdArg mvdcmd;
2219
2220 MS_ASSERT((u32addr%8)==0);
2221 u32addr >>= 3;
2222
2223 SET_CMDARG(mvdcmd, u32addr, u8Idx);
2224 if (HAL_MVD_MVDCommand( CMD_VOL_INFO_BUF, &mvdcmd ) == FALSE)
2225 {
2226 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_VOL_INFO_BUF ) );
2227 }
2228 return;
2229 }
2230
2231 //------------------------------------------------------------------------------
2232 /// Set frame info buffer address to MVD
2233 /// @param -u32addr \b IN : start address
2234 //------------------------------------------------------------------------------
HAL_MVD_SetFrameInfoBufferAddr(MS_U8 u8Idx,MS_VIRT u32addr)2235 void HAL_MVD_SetFrameInfoBufferAddr (MS_U8 u8Idx, MS_VIRT u32addr )
2236 {
2237 MVD_CmdArg mvdcmd;
2238
2239 MS_ASSERT((u32addr%8)==0);
2240 u32addr >>= 3;
2241
2242 SET_CMDARG(mvdcmd, u32addr, u8Idx);
2243 if (HAL_MVD_MVDCommand( CMD_FRAME_INFO_BUF, &mvdcmd ) == FALSE)
2244 {
2245 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_FRAME_INFO_BUF ) );
2246 }
2247 return;
2248 }
2249
2250 //------------------------------------------------------------------------------
2251 /// Set IAP buffer address to MVD
2252 /// @param -u32addr \b IN : start address
2253 //------------------------------------------------------------------------------
HAL_MVD_SetIAPBufferAddr(MS_U8 u8Idx,MS_VIRT u32addr)2254 void HAL_MVD_SetIAPBufferAddr (MS_U8 u8Idx, MS_VIRT u32addr )
2255 {
2256 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
2257 MVD_CmdArg mvdcmd;
2258 MS_ASSERT((u32addr%8192)==0);
2259 u32addr >>= 13;
2260
2261 SET_CMDARG(mvdcmd, u32addr, u8Idx);
2262 mvdcmd.Arg4 = pstMemCfg->u8FBMiuSel;
2263 if (HAL_MVD_MVDCommand( CMD_IAP_BUF_START, &mvdcmd ) == FALSE)
2264 {
2265 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_IAP_BUF_START ) );
2266 }
2267 return;
2268 }
2269
2270 //------------------------------------------------------------------------------
2271 /// Set Data Partition buffer address to MVD
2272 /// @param -u32addr \b IN : start address
2273 //------------------------------------------------------------------------------
HAL_MVD_SetDPBufferAddr(MS_U8 u8Idx,MS_VIRT u32addr)2274 void HAL_MVD_SetDPBufferAddr (MS_U8 u8Idx, MS_VIRT u32addr )
2275 {
2276 MVD_CmdArg mvdcmd;
2277 MS_ASSERT((u32addr%8)==0);
2278 u32addr >>= 3;
2279
2280 SET_CMDARG(mvdcmd, u32addr, u8Idx);
2281 if (HAL_MVD_MVDCommand( CMD_DP_BUF_START, &mvdcmd ) == FALSE)
2282 {
2283 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DP_BUF_START ) );
2284 }
2285 return;
2286 }
2287
2288 //------------------------------------------------------------------------------
2289 /// Set Motion Vector buffer address to MVD
2290 /// @param -u32addr \b IN : start address
2291 //------------------------------------------------------------------------------
HAL_MVD_SetMVBufferAddr(MS_U8 u8Idx,MS_VIRT u32addr)2292 void HAL_MVD_SetMVBufferAddr (MS_U8 u8Idx, MS_VIRT u32addr )
2293 {
2294 MVD_CmdArg mvdcmd;
2295 MS_ASSERT((u32addr%2048)==0);
2296 u32addr >>= 3;
2297
2298 SET_CMDARG(mvdcmd, u32addr, u8Idx);
2299 if (HAL_MVD_MVDCommand( CMD_MV_BUF_START, &mvdcmd ) == FALSE)
2300 {
2301 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_MV_BUF_START ) );
2302 }
2303 return;
2304 }
2305
_MVD_SetUserDataBufStart(MS_U8 u8Idx,MS_VIRT u32addr,MS_U8 u8arg3)2306 static void _MVD_SetUserDataBufStart(MS_U8 u8Idx, MS_VIRT u32addr, MS_U8 u8arg3)
2307 {
2308 MVD_CmdArg mvdcmd;
2309
2310 MS_ASSERT((u32addr%8)==0);
2311 u32addr >>= 3;
2312 MVD_DEBUGINFO(printf("%s add=0x%lx arg3=0x%x\n", __FUNCTION__, (unsigned long)u32addr, u8arg3));
2313
2314 SETUP_CMDARG(mvdcmd);
2315 mvdcmd.Arg0 = L_WORD(u32addr);
2316 mvdcmd.Arg1 = H_WORD(u32addr);
2317 mvdcmd.Arg2 = L_DWORD(u32addr);
2318 mvdcmd.Arg4 = H_DWORD(u32addr);
2319 mvdcmd.Arg3 = u8arg3;
2320 SET_DECNUM(mvdcmd, u8Idx);
2321 if (HAL_MVD_MVDCommand( CMD_USER_BUF_START, &mvdcmd ) == FALSE)
2322 {
2323 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_USER_BUF_START ) );
2324 return;
2325 }
2326 return;
2327 }
2328
_MVD_SetUserDataBufSize(MS_U8 u8Idx,MS_U32 u32size,MS_U8 u8arg3)2329 static void _MVD_SetUserDataBufSize(MS_U8 u8Idx, MS_U32 u32size, MS_U8 u8arg3)
2330 {
2331 MVD_CmdArg mvdcmd;
2332
2333 MS_ASSERT((u32size%8)==0);
2334 u32size >>= 3;
2335 MVD_DEBUGINFO(printf("%s add=0x%x arg3=0x%x\n", __FUNCTION__, u32size, u8arg3));
2336
2337 SETUP_CMDARG(mvdcmd);
2338 mvdcmd.Arg0 = L_WORD(u32size);
2339 mvdcmd.Arg1 = H_WORD(u32size);
2340 mvdcmd.Arg2 = L_DWORD(u32size);
2341 mvdcmd.Arg4 = H_DWORD(u32size);
2342 mvdcmd.Arg3 = u8arg3;
2343 if(mvdcmd.Arg3 <= 1) //mean 608 and 708 in MM RVU
2344 {
2345 mvdcmd.Arg2 = 7;//ntsc1+ntsc2+atsc
2346 mvdcmd.Arg4 = 0;
2347 }
2348 SET_DECNUM(mvdcmd, u8Idx);
2349 if (HAL_MVD_MVDCommand( CMD_USER_BUF_SIZE, &mvdcmd ) == FALSE)
2350 {
2351 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_USER_BUF_SIZE ) );
2352 return;
2353 }
2354 return;
2355 }
2356
2357 //------------------------------------------------------------------------------
2358 /// Set user data buffer address to MVD
2359 /// @param -u32addr \b IN : start address
2360 //------------------------------------------------------------------------------
HAL_MVD_SetUserDataBuf(MS_U8 u8Idx,MS_VIRT u32addr,MS_U32 u32size)2361 void HAL_MVD_SetUserDataBuf(MS_U8 u8Idx, MS_VIRT u32addr, MS_U32 u32size)
2362 {
2363 MS_U8 u8ccType = 0;
2364
2365 MS_ASSERT((u32addr%8)==0);
2366 MS_ASSERT((u32size%8)==0);
2367 #ifdef REDLION_LINUX_KERNEL_ENVI
2368 u8ccType = 2;
2369 #elif defined(MVD_SUPPORT_X4_CC)
2370 u8ccType = 4; //display order
2371 #else
2372 u8ccType = 2;// 2 for testing 0;
2373 #endif
2374
2375 #if defined(MVD_SUPPORT_X4_CC)
2376 //set decoding buffer address
2377 _MVD_SetUserDataBufStart(u8Idx, u32addr+u32size, 3);
2378 #endif
2379
2380 //set CC output buffer address
2381 _MVD_SetUserDataBufStart(u8Idx, u32addr, u8ccType);
2382
2383 #if defined(MVD_SUPPORT_X4_CC)
2384 //set decoding buffer size
2385 _MVD_SetUserDataBufSize(u8Idx, u32size, 3);
2386 #endif
2387
2388 //set CC output buffer size
2389 _MVD_SetUserDataBufSize(u8Idx, u32size, u8ccType);
2390
2391 return;
2392 }
2393
HAL_MVD_SetSLQTblBufStartEnd(MS_U8 u8Idx,MS_VIRT u32start,MS_VIRT u32end)2394 void HAL_MVD_SetSLQTblBufStartEnd(MS_U8 u8Idx, MS_VIRT u32start, MS_VIRT u32end)
2395 {
2396 MVD_CmdArg mvdcmd;
2397 MS_U32 u32val = u32end>>3;
2398 MVD_DEBUGINFO(printf("%s st=0x%lx end=0x%lx\n", __FUNCTION__, (unsigned long)u32start, (unsigned long)u32end));
2399
2400 SET_CMDARG(mvdcmd, u32val, u8Idx);
2401 if (HAL_MVD_MVDCommand( CMD_SLQ_TBL_BUF_END, &mvdcmd ) == FALSE)
2402 {
2403 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SLQ_TBL_BUF_END ) );
2404 return;
2405 }
2406
2407 u32val = (u32start)>>3;
2408 SET_CMDARG(mvdcmd, u32val, u8Idx);
2409 if (HAL_MVD_MVDCommand( CMD_SLQ_TBL_BUF_START, &mvdcmd ) == FALSE)
2410 {
2411 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SLQ_TBL_BUF_START ) );
2412 return;
2413 }
2414
2415 MVD_DEBUGINFO(printf("%s st=0x%lx end=0x%lx OK!!!\n", __FUNCTION__, (unsigned long)u32start, (unsigned long)u32end));
2416 return;
2417 }
2418
2419 //------------------------------------------------------------------------------
2420 /// Issue StepDisplay command.
2421 /// @return -TRUE for success; FALSE for failure.
2422 //------------------------------------------------------------------------------
HAL_MVD_StepDisp(MS_U8 u8Idx)2423 MS_BOOL HAL_MVD_StepDisp(MS_U8 u8Idx)
2424 {
2425 MVD_CmdArg mvdcmd;
2426
2427 SETUP_CMDARG(mvdcmd);
2428 SET_DECNUM(mvdcmd, u8Idx);
2429 SET_CMD_RET_FALSE(CMD_STEP_DISP_DECODE_ONE, &mvdcmd);
2430 if (HAL_MVD_Resume(u8Idx) == FALSE)
2431 {
2432 MVD_DEBUGERROR( printf( "Command: HAL_MVD_Resume fail!!\r\n" ) );
2433 return FALSE;
2434 }
2435
2436 return TRUE;
2437 }
2438
2439 //------------------------------------------------------------------------------
2440 /// Get ES read address for TS file mode.
2441 /// @return ES read address
2442 //------------------------------------------------------------------------------
HAL_MVD_GetTsFileESReadPtr(MS_U8 u8Idx)2443 MS_VIRT HAL_MVD_GetTsFileESReadPtr(MS_U8 u8Idx)
2444 {
2445 MS_VIRT u32Add = 0;
2446 MVD_CmdArg mvdcmd;
2447
2448 SETUP_CMDARG(mvdcmd);
2449 mvdcmd.Arg0 = 2; //ES diff
2450 SET_DECNUM(mvdcmd, u8Idx);
2451 if (HAL_MVD_MVDCommand( CMD_PARSER_READ_POSITION, &mvdcmd ) == TRUE)
2452 {
2453 //in order to latch the newest parser status
2454 //u32Diff = (((MS_U32)mvdcmd.Arg3) <<24) | (((MS_U32)mvdcmd.Arg2) <<16) |
2455 // (((MS_U32)mvdcmd.Arg1) << 8) | (((MS_U32)mvdcmd.Arg0));
2456 }
2457 else
2458 {
2459 MVD_DEBUGERROR( printf( "Ctrl: 0x%x fail!!\n", CMD_PARSER_READ_POSITION) );
2460 }
2461
2462 SETUP_CMDARG(mvdcmd);
2463 mvdcmd.Arg0 = 1;
2464 SET_DECNUM(mvdcmd, u8Idx);
2465 if (HAL_MVD_MVDCommand( CMD_PARSER_READ_POSITION, &mvdcmd ) == TRUE)
2466 {
2467 u32Add = (((MS_U32)mvdcmd.Arg3) <<24) |
2468 (((MS_U32)mvdcmd.Arg2) <<16) |
2469 (((MS_U32)mvdcmd.Arg1) << 8) |
2470 (((MS_U32)mvdcmd.Arg0));
2471 }
2472 else
2473 {
2474 MVD_DEBUGERROR( printf( "Ctrl: 0x%x fail!!\n", CMD_PARSER_READ_POSITION) );
2475 }
2476
2477 return (u32Add*8);
2478 }
2479
2480 //------------------------------------------------------------------------------
2481 /// Get ES write address for TS file mode.
2482 /// @return ES write address
2483 //------------------------------------------------------------------------------
HAL_MVD_GetTsFileESWritePtr(MS_U8 u8Idx)2484 MS_VIRT HAL_MVD_GetTsFileESWritePtr(MS_U8 u8Idx)
2485 {
2486 MS_VIRT u32Diff = 0;
2487 MS_VIRT u32WrPtr = 0;
2488 MVD_CmdArg mvdcmd;
2489 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
2490 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
2491
2492 SETUP_CMDARG(mvdcmd);
2493 mvdcmd.Arg0 = 2; //ES diff
2494 SET_DECNUM(mvdcmd, u8Idx);
2495 if (HAL_MVD_MVDCommand( CMD_PARSER_READ_POSITION, &mvdcmd ) == TRUE)
2496 {
2497 u32Diff = (((MS_U32)mvdcmd.Arg3) <<24) | (((MS_U32)mvdcmd.Arg2) <<16) |
2498 (((MS_U32)mvdcmd.Arg1) << 8) | (((MS_U32)mvdcmd.Arg0));
2499 }
2500 else
2501 {
2502 MVD_DEBUGERROR( printf( "Ctrl: 0x%x fail!!\n", CMD_PARSER_READ_POSITION) );
2503 }
2504
2505 u32WrPtr = u32Diff*8 + HAL_MVD_GetTsFileESReadPtr(u8Idx);
2506 if (u32WrPtr > pstSlqTblInfo->u32ESBuffEnd)
2507 {
2508 MVD_DEBUGINFO(printf("ES wrapping Wr=0x%lx ==> ", (unsigned long)u32WrPtr));
2509 u32WrPtr -= pstMemCfg->u32BSSize;
2510 MVD_DEBUGINFO(printf("0x%lx\n", (unsigned long)u32WrPtr));
2511 }
2512 return u32WrPtr;
2513 }
2514
2515 //------------------------------------------------------------------------------
2516 /// Enable/Disable firmware to show the last frame.
2517 /// @return -TRUE for success; FALSE for failure.
2518 //------------------------------------------------------------------------------
HAL_MVD_EnableLastFrameShow(MS_U8 u8Idx,MS_BOOL bEnable)2519 MS_BOOL HAL_MVD_EnableLastFrameShow(MS_U8 u8Idx, MS_BOOL bEnable)
2520 {
2521 MVD_CmdArg mvdcmd;
2522 MVD_SrcMode curSrcMode = HAL_MVD_GetSrcMode(u8Idx);
2523 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
2524 MS_VIRT* pu32FileEndPtr = &pstSlqTblInfo->u32FileEndPtr;
2525
2526 if (E_MVD_SLQ_TBL_MODE == curSrcMode)
2527 {
2528 #if SLQ_NEW_PUSH
2529 if (pstSlqTblInfo->pSlqStatus->bSlqCtrlBit)
2530 {
2531 pstSlqTblInfo->pDrvSlqTbl->u32WrPtr = pstSlqTblInfo->pSlqStatus->u32VaildWptrAddr + SLQ_ENTRY_LEN;
2532 }
2533 #endif //
2534 //save current writePtr
2535 if (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr != pstSlqTblInfo->pDrvSlqTbl->u32EndAdd)
2536 {
2537 *pu32FileEndPtr = pstSlqTblInfo->pDrvSlqTbl->u32WrPtr;
2538 }
2539 else
2540 {
2541 *pu32FileEndPtr = pstSlqTblInfo->pDrvSlqTbl->u32StAdd;
2542 }
2543 MVD_DEBUGINFO(printf("fe=%lx, rd=%lx, wr=%lx\n", (unsigned long)*pu32FileEndPtr,
2544 (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32RdPtr, (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32WrPtr));
2545 }
2546
2547 SETUP_CMDARG(mvdcmd);
2548 mvdcmd.Arg0 = bEnable;
2549 SET_DECNUM(mvdcmd, u8Idx);
2550 SET_CMD_RET_FALSE(CMD_ENABLE_LAST_FRAME_SHOW, &mvdcmd);
2551 return TRUE;
2552 }
2553
2554
HAL_MVD_SlqTblRst(MS_U8 u8Idx)2555 MS_BOOL HAL_MVD_SlqTblRst(MS_U8 u8Idx)
2556 {
2557 MVD_CmdArg mvdcmd;
2558 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
2559
2560 SETUP_CMDARG(mvdcmd);
2561 SET_DECNUM(mvdcmd, u8Idx);
2562 SET_CMD_RET_FALSE(CMD_VC1_HW_SLQ_RESET, &mvdcmd);
2563 pstSlqTblInfo->bEnSlqTblHkCtrl = FALSE;
2564 return TRUE;
2565 }
2566
HAL_MVD_SeekToPTS(MS_U8 u8Idx,MS_U32 u32Pts)2567 MS_BOOL HAL_MVD_SeekToPTS(MS_U8 u8Idx, MS_U32 u32Pts)
2568 {
2569 MVD_CmdArg mvdcmd;
2570
2571 SET_CMDARG(mvdcmd, u32Pts, u8Idx);
2572 SET_CMD_RET_FALSE(CMD_STEP_TO_PTS, &mvdcmd);
2573
2574 if (HAL_MVD_Resume(u8Idx) == FALSE)
2575 {
2576 MVD_DEBUGERROR( printf( "Command: HAL_MVD_Resume fail!!\r\n" ) );
2577 return FALSE;
2578 }
2579 return TRUE;
2580 }
2581
HAL_MVD_SkipToPTS(MS_U8 u8Idx,MS_U32 u32Pts)2582 MS_BOOL HAL_MVD_SkipToPTS(MS_U8 u8Idx, MS_U32 u32Pts)
2583 {
2584 MVD_CmdArg mvdcmd;
2585
2586 SET_CMDARG(mvdcmd, u32Pts, u8Idx);
2587 SET_CMD_RET_FALSE(CMD_SKIP_TO_PTS, &mvdcmd);
2588
2589 if (HAL_MVD_Resume(u8Idx) == FALSE)
2590 {
2591 MVD_DEBUGERROR( printf( "Command: HAL_MVD_Resume fail!!\r\n" ) );
2592 return FALSE;
2593 }
2594 return TRUE;
2595 }
2596
HAL_MVD_TrickPlay(MS_U8 u8Idx,MVD_TrickDec trickDec,MS_U8 u8DispDuration)2597 MS_BOOL HAL_MVD_TrickPlay(MS_U8 u8Idx, MVD_TrickDec trickDec, MS_U8 u8DispDuration)
2598 {
2599 MVD_CmdArg mvdcmd;
2600 MS_U8 u8DecType;
2601
2602 switch (trickDec)
2603 {
2604 case E_MVD_TRICK_DEC_ALL:
2605 u8DecType = 0;
2606 break;
2607 case E_MVD_TRICK_DEC_I:
2608 u8DecType = 1;
2609 break;
2610 case E_MVD_TRICK_DEC_IP:
2611 u8DecType = 2;
2612 break;
2613 default:
2614 return FALSE;
2615 break;
2616 }
2617
2618 SETUP_CMDARG(mvdcmd);
2619 mvdcmd.Arg0 = u8DecType;
2620 mvdcmd.Arg1 = u8DispDuration;
2621 SET_DECNUM(mvdcmd, u8Idx);
2622 SET_CMD_RET_FALSE(CMD_FAST_SLOW, &mvdcmd);
2623
2624 pMVDHalContext->stCtrlCfg[u8Idx].eTrickMode = trickDec;
2625 return TRUE;
2626 }
2627
HAL_MVD_FlushDisplayBuf(MS_U8 u8Idx)2628 MS_BOOL HAL_MVD_FlushDisplayBuf(MS_U8 u8Idx)
2629 {
2630 #define STOP_TIMEOUT 500 //ms
2631 MS_U32 u32StartTime = 0;
2632
2633 HAL_MVD_ResetHandShake(u8Idx, MVD_HANDSHAKE_FLUSHQUEUE_COMMAND);
2634 MVD_CmdArg mvdcmd;
2635 SETUP_CMDARG(mvdcmd);
2636 SET_DECNUM(mvdcmd, u8Idx);
2637 SET_CMD_RET_FALSE(CMD_FLUSH_DISP_QUEUE, &mvdcmd);
2638
2639 u32StartTime = HAL_MVD_GetTime();
2640
2641 while(!HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_FLUSHQUEUE_COMMAND))
2642 {
2643 if ((HAL_MVD_GetTime()-u32StartTime)>STOP_TIMEOUT)
2644 {
2645 MVD_DEBUGERROR( printf( "Ctrl: 0x%x fail timeout!!\r\n", CMD_FLUSH_DISP_QUEUE ) );
2646 break;
2647 }
2648 }
2649
2650 return TRUE;
2651 }
2652
2653
HAL_MVD_SetFileModeAVSync(MS_U8 u8Idx,MVD_TIMESTAMP_TYPE eSyncMode)2654 MS_BOOL HAL_MVD_SetFileModeAVSync(MS_U8 u8Idx, MVD_TIMESTAMP_TYPE eSyncMode)
2655 {
2656 MVD_CmdArg mvdcmd;
2657 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
2658
2659 pstCtrlCfg->eFileSyncMode = eSyncMode;
2660 MVD_DEBUGINFO(printf("%s eSyncMode=%d\n", __FUNCTION__, eSyncMode));
2661 SETUP_CMDARG(mvdcmd);
2662 switch (eSyncMode)
2663 {
2664 case E_MVD_TIMESTAMP_PTS:
2665 case E_MVD_TIMESTAMP_PTS_RVU:
2666 mvdcmd.Arg0 = FILE_PTS_MODE;
2667 break;
2668
2669 case E_MVD_TIMESTAMP_DTS:
2670 case E_MVD_TIMESTAMP_DTS_RVU:
2671 mvdcmd.Arg0 = FILE_DTS_MODE;
2672 break;
2673 case E_MVD_TIMESTAMP_NEW_STS:
2674 mvdcmd.Arg0 = FILE_STS_MODE;
2675 break;
2676 case E_MVD_TIMESTAMP_FREERUN:
2677 default:
2678 mvdcmd.Arg0 = NONE_FILE_MODE; //Freerun
2679 break;
2680 }
2681 SET_DECNUM(mvdcmd, u8Idx);
2682 SET_CMD_RET_FALSE(CMD_ENABLE_FILE_SYNC, &mvdcmd);
2683
2684 SETUP_CMDARG(mvdcmd);
2685 switch (eSyncMode) //for set RVU mode
2686 {
2687 case E_MVD_TIMESTAMP_PTS_RVU:
2688 mvdcmd.Arg0 = FILE_PTS_MODE;
2689 break;
2690 case E_MVD_TIMESTAMP_DTS_RVU:
2691 mvdcmd.Arg0 = FILE_DTS_MODE;
2692 break;
2693 case E_MVD_TIMESTAMP_FREERUN:
2694 default:
2695 mvdcmd.Arg0 = 0xFF;
2696 break;
2697 }
2698 SET_DECNUM(mvdcmd, u8Idx);
2699 SET_CMD_RET_FALSE(CMD_RVU_EN, &mvdcmd);
2700 return TRUE;
2701 }
2702
2703
2704
2705
2706 //------------------------------------------------------------------------------
2707 /// Set the start address of PTS table used for SLQ table link mode.
2708 /// @return -TRUE for success; FALSE for failure.
2709 //------------------------------------------------------------------------------
HAL_MVD_SetPtsTblAddr(MS_U8 u8Idx,MS_VIRT u32addr)2710 MS_BOOL HAL_MVD_SetPtsTblAddr(MS_U8 u8Idx, MS_VIRT u32addr)
2711 {
2712 MVD_CmdArg mvdcmd;
2713
2714 MS_ASSERT((u32addr%8)==0);
2715 u32addr >>= 3;
2716
2717 SET_CMDARG(mvdcmd, u32addr, u8Idx);
2718 SET_CMD_RET_FALSE(CMD_PTS_TBL_START, &mvdcmd);
2719 return TRUE;
2720 }
2721
HAL_MVD_SkipToIFrame(MS_U8 u8Idx)2722 MS_BOOL HAL_MVD_SkipToIFrame(MS_U8 u8Idx)
2723 {
2724 MVD_CmdArg mvdcmd;
2725 SETUP_CMDARG(mvdcmd);
2726 SET_DECNUM(mvdcmd, u8Idx);
2727 SET_CMD_RET_FALSE(CMD_START_DEC_STRICT, &mvdcmd);
2728 return TRUE;
2729 }
2730
2731 //Map driver FRC (Frame rate conversion) mode to firmware's.
HAL_MVD_MapFrcMode(MVD_FrcMode eFrcMode)2732 MS_U8 HAL_MVD_MapFrcMode(MVD_FrcMode eFrcMode)
2733 {
2734 MS_U8 frcMode = 0xf;
2735 switch (eFrcMode)
2736 {
2737 case E_MVD_FRC_NORMAL:
2738 frcMode = FrcNormal;
2739 break;
2740 case E_MVD_FRC_DISP_TWICE:
2741 frcMode = FrcDisplayTwice;
2742 break;
2743 case E_MVD_FRC_3_2_PULLDOWN: //film 24 -> 50i
2744 frcMode = Frc32Pulldown;
2745 break;
2746 case E_MVD_FRC_PAL_TO_NTSC:
2747 frcMode = FrcPALtoNTSC;
2748 break;
2749 case E_MVD_FRC_NTSC_TO_PAL:
2750 frcMode = FrcNTSCtoPAL;
2751 break;
2752 case E_MVD_FRC_DISP_ONEFIELD:
2753 frcMode = FrcShowOneFiled;
2754 break;
2755 default:
2756 break;
2757 }
2758 return frcMode;
2759 }
2760
HAL_MVD_DispCtrl(MS_U8 u8Idx,MS_BOOL bDecOrder,MS_BOOL bDropErr,MS_BOOL bDropDisp,MVD_FrcMode eFrcMode)2761 MS_BOOL HAL_MVD_DispCtrl(MS_U8 u8Idx, MS_BOOL bDecOrder, MS_BOOL bDropErr, MS_BOOL bDropDisp, MVD_FrcMode eFrcMode)
2762 {
2763 MVD_CmdArg mvdcmd;
2764 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
2765 MS_BOOL* pbDropErrFrm = &pstCtrlCfg->bDropErrFrm;
2766
2767 SETUP_CMDARG(mvdcmd);
2768 mvdcmd.Arg0 = (MS_U8)bDecOrder;
2769 mvdcmd.Arg1 = (MS_U8)bDropErr;
2770 mvdcmd.Arg2 = (MS_U8)bDropDisp;
2771 mvdcmd.Arg3 = HAL_MVD_MapFrcMode(eFrcMode);
2772 SET_DECNUM(mvdcmd, u8Idx);
2773 SET_CMD_RET_FALSE(CMD_DISPLAY_CTL, &mvdcmd);
2774
2775 pstCtrlCfg->eFrcMode = eFrcMode;
2776
2777 if (*pbDropErrFrm != bDropErr)
2778 {
2779 MVD_DEBUGINFO( printf("bDropErrFrm(%d) != bDropErr(%d)\n", *pbDropErrFrm, bDropErr));
2780 *pbDropErrFrm = bDropErr;
2781 }
2782 pstCtrlCfg->bDropDispfrm = bDropDisp;
2783
2784 return TRUE;
2785 }
2786
2787
HAL_MVD_SkipData(MS_U8 u8Idx)2788 MS_BOOL HAL_MVD_SkipData(MS_U8 u8Idx)
2789 {
2790 MS_U32 u32TimeCnt = 0;
2791 MVD_CmdArg mvdcmd;
2792
2793 HAL_MVD_ResetHandShake(u8Idx, MVD_HANDSHAKE_SKIP_DATA);
2794 SETUP_CMDARG(mvdcmd);
2795 SET_DECNUM(mvdcmd, u8Idx);
2796 SET_CMD_RET_FALSE(CMD_SKIP_DATA, &mvdcmd);
2797
2798 u32TimeCnt = HAL_MVD_GetTime();
2799 while ((HAL_MVD_GetTime() - u32TimeCnt) < SKIP_DATA_TIMEOUT_MS)
2800 {
2801 if (HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_SKIP_DATA))
2802 {
2803 MVD_DEBUGINFO(printf("\nSkip data finished!\n"));
2804 break;
2805 }
2806 }
2807 MVD_DEBUGINFO(printf("====> %s (t1=%u t2=%u diff=%u)\n", __FUNCTION__,
2808 u32TimeCnt, HAL_MVD_GetTime(), (HAL_MVD_GetTime() - u32TimeCnt)));
2809 if (TRUE != HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_SKIP_DATA))
2810 {
2811 MVD_DEBUGINFO(printf("\n***** TS flush timeout *****\n\n"));
2812 return FALSE;
2813 }
2814
2815 return TRUE;
2816 }
2817
HAL_MVD_DispRepeatField(MS_U8 u8Idx,MS_BOOL bEnable)2818 MS_BOOL HAL_MVD_DispRepeatField(MS_U8 u8Idx, MS_BOOL bEnable)
2819 {
2820 MVD_CmdArg mvdcmd;
2821 SETUP_CMDARG(mvdcmd);
2822 mvdcmd.Arg0 = bEnable;
2823 SET_DECNUM(mvdcmd, u8Idx);
2824 SET_CMD_RET_FALSE(CMD_REPEAT_MODE, &mvdcmd);
2825 return TRUE;
2826 }
2827
2828 //------------------------------------------------------------------------------
2829 /// Pause display.
2830 /// @return -TRUE for success; FALSE for failure
2831 //------------------------------------------------------------------------------
HAL_MVD_PauseDisp(MS_U8 u8Idx)2832 MS_BOOL HAL_MVD_PauseDisp(MS_U8 u8Idx)
2833 {
2834 MS_BOOL bRst = TRUE;
2835 MVD_CmdArg mvdcmd;
2836
2837 SETUP_CMDARG(mvdcmd);
2838 mvdcmd.Arg0 = DISPLAY_PAUSE_ON;
2839 SET_DECNUM(mvdcmd, u8Idx);
2840 if (HAL_MVD_MVDCommand(CMD_DISPLAY_PAUSE, &mvdcmd)== FALSE)
2841 {
2842 MVD_DEBUGERROR( printf( "Command: 0x%x(ON) fail!!\r\n", CMD_DISPLAY_PAUSE) );
2843 bRst = FALSE;
2844 }
2845 return bRst;
2846 }
2847
2848 //------------------------------------------------------------------------------
2849 /// Issue Pause command.
2850 /// @return -TRUE for success; FALSE for failure
2851 //------------------------------------------------------------------------------
HAL_MVD_Resume(MS_U8 u8Idx)2852 MS_BOOL HAL_MVD_Resume(MS_U8 u8Idx)
2853 {
2854 MS_BOOL bRst = TRUE;
2855 MVD_CmdArg mvdcmd;
2856
2857 SETUP_CMDARG(mvdcmd);
2858 mvdcmd.Arg0 = DISPLAY_PAUSE_OFF;
2859 SET_DECNUM(mvdcmd, u8Idx);
2860 if (HAL_MVD_MVDCommand(CMD_DISPLAY_PAUSE, &mvdcmd)== FALSE)
2861 {
2862 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DISPLAY_PAUSE) );
2863 bRst = FALSE;
2864 }
2865 return bRst;
2866 }
2867
HAL_MVD_Play(MS_U8 u8Idx)2868 MS_BOOL HAL_MVD_Play(MS_U8 u8Idx)
2869 {
2870 MVD_CmdArg mvdcmd;
2871 SETUP_CMDARG(mvdcmd);
2872 mvdcmd.Arg0 = 1;
2873 SET_DECNUM(mvdcmd, u8Idx);
2874 SET_CMD_RET_FALSE(CMD_DIU_WIDTH_ALIGN, &mvdcmd);
2875
2876 SETUP_CMDARG(mvdcmd);
2877 SET_DECNUM(mvdcmd, u8Idx);
2878 SET_CMD_RET_FALSE(CMD_PLAY, &mvdcmd);
2879
2880 if (HAL_MVD_Resume(u8Idx) == FALSE)
2881 {
2882 MVD_DEBUGERROR( printf( "Command: HAL_MVD_Resume fail!!\r\n" ) );
2883 return FALSE;
2884 }
2885
2886 MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
2887 pCtrlCfg->bDecodeIFrame = FALSE;
2888
2889 return TRUE;
2890 }
2891
2892 //------------------------------------------------------------------------------
2893 /// Set base address for ScalerInfo structure to f/w
2894 /// @param -u32addr \b IN : start address (units in byte)
2895 //------------------------------------------------------------------------------
HAL_MVD_SetScalerInfoAddr(MS_U8 u8Idx,MS_VIRT u32addr,MS_U8 u8Arg4)2896 MS_BOOL HAL_MVD_SetScalerInfoAddr(MS_U8 u8Idx, MS_VIRT u32addr,MS_U8 u8Arg4)
2897 {
2898 MVD_CmdArg mvdcmd;
2899
2900 MS_ASSERT((u32addr%8)==0);
2901 u32addr >>= 3;
2902
2903 SET_CMDARG(mvdcmd, u32addr, u8Idx);
2904 mvdcmd.Arg4 = u8Arg4;
2905 SET_CMD_RET_FALSE(CMD_SCALER_INFO_BASE, &mvdcmd);
2906 return TRUE;
2907 }
2908
2909 //------------------------------------------------------------------------------
2910 /// Set the dynamic scale base address
2911 /// @return -TRUE for success; FALSE for failure.
2912 //------------------------------------------------------------------------------
HAL_MVD_SetDynamicScaleAddr(MS_U8 u8Idx,MS_VIRT u32addr,MS_U32 u32Size)2913 MS_BOOL HAL_MVD_SetDynamicScaleAddr(MS_U8 u8Idx, MS_VIRT u32addr, MS_U32 u32Size)
2914 {
2915 MVD_CmdArg mvdcmd;
2916
2917 MS_ASSERT((u32addr%8)==0);
2918 u32addr >>= 3;
2919
2920 SET_CMDARG(mvdcmd, u32addr, u8Idx);
2921 SET_CMD_RET_FALSE(CMD_DYNAMIC_SCALE_BASE, &mvdcmd);
2922
2923 SET_CMDARG(mvdcmd, u32Size, u8Idx);
2924 SET_CMD_RET_FALSE(CMD_DYNAMIC_SCALE_SIZE, &mvdcmd);
2925
2926 return TRUE;
2927 }
2928
2929 //------------------------------------------------------------------------------
2930 /// Set virtual box width/height to F/W.
2931 /// F/W will use the same w/h as scaler to calculate scaling factor.
2932 /// @return -TRUE for success; FALSE for failure.
2933 //------------------------------------------------------------------------------
HAL_MVD_SetVirtualBox(MS_U8 u8Idx,MS_U16 u16Width,MS_U16 u16Height)2934 MS_BOOL HAL_MVD_SetVirtualBox(MS_U8 u8Idx, MS_U16 u16Width, MS_U16 u16Height)
2935 {
2936 MVD_CmdArg mvdcmd;
2937
2938 SETUP_CMDARG(mvdcmd);
2939 mvdcmd.Arg0 = L_WORD(u16Width);
2940 mvdcmd.Arg1 = H_WORD(u16Width);
2941 mvdcmd.Arg2 = L_WORD(u16Height);
2942 mvdcmd.Arg3 = H_WORD(u16Height);
2943 SET_DECNUM(mvdcmd, u8Idx);
2944 SET_CMD_RET_FALSE(CMD_DS_VIRTUAL_BOX, &mvdcmd);
2945 return TRUE;
2946 }
2947
2948 //------------------------------------------------------------------------------
2949 /// Enable VC1 dynamic scaling
2950 /// @return -TRUE for success; FALSE for failure.
2951 //------------------------------------------------------------------------------
HAL_MVD_EnableDynamicScale(MS_U8 u8Idx,MS_U8 u8NewDS)2952 MS_BOOL HAL_MVD_EnableDynamicScale(MS_U8 u8Idx,MS_U8 u8NewDS)
2953 {
2954 MVD_CmdArg mvdcmd;
2955
2956 SETUP_CMDARG(mvdcmd);
2957 mvdcmd.Arg0 = TRUE;
2958 mvdcmd.Arg1 = u8NewDS;
2959 SET_DECNUM(mvdcmd, u8Idx);
2960 SET_CMD_RET_FALSE(CMD_ENABLE_DYNAMIC_SCALE, &mvdcmd);
2961 return TRUE;
2962 }
2963
2964
2965 //------------------------------------------------------------------------------
2966 /// Set blue screen
2967 /// @return -TRUE for success; FALSE for failure.
2968 //------------------------------------------------------------------------------
HAL_MVD_SetBlueScreen(MS_U8 u8Idx,MS_BOOL bEn)2969 MS_BOOL HAL_MVD_SetBlueScreen(MS_U8 u8Idx, MS_BOOL bEn)
2970 {
2971 MVD_CmdArg mvdcmd;
2972
2973 SETUP_CMDARG(mvdcmd);
2974 mvdcmd.Arg0 = bEn; //1 -> show MVOP frame color. 0 -> normal case.
2975 SET_DECNUM(mvdcmd, u8Idx);
2976 SET_CMD_RET_FALSE(CMD_FORCE_BLUE_SCREEN, &mvdcmd);
2977 return TRUE;
2978 }
2979
2980
HAL_MVD_SetFreezeDisp(MS_U8 u8Idx,MS_BOOL bEn)2981 MS_BOOL HAL_MVD_SetFreezeDisp(MS_U8 u8Idx, MS_BOOL bEn)
2982 {
2983 MVD_CmdArg mvdcmd;
2984
2985 SETUP_CMDARG(mvdcmd);
2986 mvdcmd.Arg0 = bEn;
2987 SET_DECNUM(mvdcmd, u8Idx);
2988 SET_CMD_RET_FALSE(CMD_FREEZE_DISP, &mvdcmd);
2989 return TRUE;
2990 }
2991
2992
2993 //------------------------------------------------------------------------------
2994 /// Set base address for DecFrameInfo structure to f/w
2995 /// @param -u32addr \b IN : start address (units in byte)
2996 //------------------------------------------------------------------------------
HAL_MVD_SetDecFrmInfoAddr(MS_U8 u8Idx,MS_VIRT u32addr)2997 void HAL_MVD_SetDecFrmInfoAddr(MS_U8 u8Idx, MS_VIRT u32addr)
2998 {
2999 MVD_CmdArg mvdcmd;
3000
3001 MS_ASSERT((u32addr%8)==0);
3002 u32addr >>= 3;
3003
3004 SET_CMDARG(mvdcmd, u32addr, u8Idx);
3005 if (HAL_MVD_MVDCommand( CMD_DEC_FRAME_INFO_BUF, &mvdcmd ) == FALSE)
3006 {
3007 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DEC_FRAME_INFO_BUF ) );
3008 }
3009 return;
3010 }
3011
3012 //Check if the task has interrupt
HAL_MVD_GetHasInt(MS_U8 u8Idx)3013 MS_BOOL HAL_MVD_GetHasInt(MS_U8 u8Idx)
3014 {
3015 MS_BOOL bHasInt = FALSE;
3016 MS_U32 u32IntCnt = 0;
3017 MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
3018
3019 u32IntCnt = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_INT_CNT, sizeof(MS_U32));
3020 if (u32IntCnt != pCtrlCfg->u32IntCnt)
3021 {
3022 MVD_DEBUGINFO(printf("%s %d--> %d\n", __FUNCTION__, pCtrlCfg->u32IntCnt, u32IntCnt));
3023 bHasInt = TRUE;
3024 pCtrlCfg->u32IntCnt = u32IntCnt;
3025 }
3026 return bHasInt;
3027 }
3028
3029 #ifdef VDEC3
HAL_MVD_GetIntState(MS_U8 u8Idx)3030 MS_U32 HAL_MVD_GetIntState(MS_U8 u8Idx)
3031 {
3032 MS_U32 u32IntStat;
3033
3034 u32IntStat = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_INT_STAT, sizeof(MS_U32));
3035
3036 MVD_SetFWBuffData(u8Idx,FW_BUFF_FRMINFO,OFFSET_INT_STAT,sizeof(MS_U32),0);
3037
3038 return u32IntStat;
3039 }
3040 #else
HAL_MVD_GetIntState(MS_U8 u8Idx)3041 MS_U32 HAL_MVD_GetIntState(MS_U8 u8Idx)
3042 {
3043 MS_U32 u32IntStat = 0;
3044 MVD_CmdArg mvdcmd;
3045
3046 SETUP_CMDARG(mvdcmd);
3047 SET_DECNUM(mvdcmd, u8Idx);
3048 if (HAL_MVD_MVDCommand( CMD_GET_INT_STAT, &mvdcmd ) == TRUE)
3049 {
3050 u32IntStat = (((MS_U32)mvdcmd.Arg4) << 16) |
3051 (((MS_U32)mvdcmd.Arg3) << 8) |
3052 (((MS_U32)mvdcmd.Arg2));
3053 }
3054 else
3055 {
3056 if (FALSE == pMVDHalContext->bStopped[u8Idx])
3057 {
3058 MVD_DEBUGERROR(printf("Ctrl: 0x%x fail!!\n", CMD_GET_INT_STAT));
3059 }
3060 else
3061 {
3062 MVD_DEBUGINFO(printf("Cmd 0x%x normal timeout.\n", CMD_GET_INT_STAT));
3063 }
3064 }
3065
3066 return u32IntStat;
3067 }
3068
3069 #endif
3070
3071 ///// functions to check interrupt status /////
MVD_IntHasUsrDataDisp(MS_U32 u32IntStat)3072 MS_BOOL MVD_IntHasUsrDataDisp(MS_U32 u32IntStat)
3073 {
3074 return (((u32IntStat&INT_USER_DATA_DISP)==INT_USER_DATA_DISP) ? TRUE : FALSE);
3075 }
3076
MVD_IntHasUsrData(MS_U32 u32IntStat)3077 MS_BOOL MVD_IntHasUsrData(MS_U32 u32IntStat)
3078 {
3079 return (((u32IntStat&INT_USER_DATA)==INT_USER_DATA) ? TRUE : FALSE);
3080 }
3081
MVD_IntIsDispRdy(MS_U32 u32IntStat)3082 MS_BOOL MVD_IntIsDispRdy(MS_U32 u32IntStat)
3083 {
3084 return (((u32IntStat&INT_DISP_RDY)==INT_DISP_RDY) ? TRUE : FALSE);
3085 }
3086
MVD_IntHasSeqHdr(MS_U32 u32IntStat)3087 MS_BOOL MVD_IntHasSeqHdr(MS_U32 u32IntStat)
3088 {
3089 return (((u32IntStat&INT_SEQ_FOUND)==INT_SEQ_FOUND) ? TRUE : FALSE);
3090 }
3091
MVD_IntHasESDataInvalid(MS_U32 u32IntStat)3092 MS_BOOL MVD_IntHasESDataInvalid(MS_U32 u32IntStat)
3093 {
3094 return (((u32IntStat&INT_VES_VALID)==INT_VES_VALID) ? TRUE : FALSE);
3095 }
3096
MVD_IntHasDecodeErr(MS_U32 u32IntStat)3097 MS_BOOL MVD_IntHasDecodeErr(MS_U32 u32IntStat)
3098 {
3099 return (((u32IntStat&INT_DEC_ERR)==INT_DEC_ERR) ? TRUE : FALSE);
3100 }
3101 //INT_FIRST_FRAME means "1st frame be push to display queue & ready for display"
3102 //So, (1) in IPB or IP stream, that's I-frame
3103 // (2) in PB only stream, that's first P-frame
MVD_IntHas1stFrame(MS_U32 u32IntStat)3104 MS_BOOL MVD_IntHas1stFrame(MS_U32 u32IntStat)
3105 {
3106 return (((u32IntStat&INT_FIRST_FRAME)==INT_FIRST_FRAME) ? TRUE : FALSE);
3107 }
3108
3109 //INT_XC_LOW_DELAY
MVD_IntHasXcLowDelay(MS_U32 u32IntStat)3110 MS_BOOL MVD_IntHasXcLowDelay(MS_U32 u32IntStat)
3111 {
3112 //printf("MVD_IntHasXcLowDelay=%x \n ", u32IntStat);
3113 return (((u32IntStat&INT_XC_LOW_DELAY)==INT_XC_LOW_DELAY) ? TRUE : FALSE);
3114 }
3115
MVD_IntHasDecodeIframe(MS_U32 u32IntStat)3116 MS_BOOL MVD_IntHasDecodeIframe(MS_U32 u32IntStat)
3117 {
3118 return (((u32IntStat&INT_DEC_I)==INT_DEC_I) ? TRUE : FALSE);
3119 }
3120
MVD_IntHasAbnormalPTS(MS_U32 u32IntStat)3121 MS_BOOL MVD_IntHasAbnormalPTS(MS_U32 u32IntStat)
3122 {
3123 return (((u32IntStat&INT_PTS_DISCONTINUE)==INT_PTS_DISCONTINUE) ? TRUE : FALSE);
3124 }
3125
MVD_IntDispFinish(MS_U32 u32IntStat)3126 MS_BOOL MVD_IntDispFinish(MS_U32 u32IntStat)
3127 {
3128 return (((u32IntStat&INT_DISP_FINISH)==INT_DISP_FINISH) ? TRUE : FALSE);
3129 }
3130
MVD_IntVSyncInt(MS_U32 u32IntStat)3131 MS_BOOL MVD_IntVSyncInt(MS_U32 u32IntStat)
3132 {
3133 return (((u32IntStat&INT_DISP_VSYNC)==INT_DISP_VSYNC) ? TRUE : FALSE);
3134 }
3135
MVD_IntDecOneFrmInt(MS_U32 u32IntStat)3136 MS_BOOL MVD_IntDecOneFrmInt(MS_U32 u32IntStat)
3137 {
3138 return (((u32IntStat&INT_DEC_DONE)==INT_DEC_DONE) ? TRUE : FALSE);
3139 }
3140
3141
MVD_GetSyncStat(MS_U8 u8Idx,MS_U8 u8ArgIdx)3142 static MS_U8 MVD_GetSyncStat(MS_U8 u8Idx, MS_U8 u8ArgIdx)
3143 {
3144 MS_U8 u8Val = 0xFF;
3145 MVD_CmdArg mvdcmd;
3146 SETUP_CMDARG(mvdcmd);
3147 SET_DECNUM(mvdcmd, u8Idx);
3148 if (HAL_MVD_MVDCommand( CMD_GET_SYNC_STAT, &mvdcmd ) == FALSE)
3149 {
3150 MVD_DEBUGERROR(printf("Ctrl: 0x%x fail!!\r\n", CMD_GET_SYNC_STAT));
3151 return 0xFF;
3152 }
3153 MVD_DEBUGINFO(printf("Sync On/Off %x, Done %x, Stat %x, diff=%d\n",
3154 mvdcmd.Arg0, mvdcmd.Arg1, mvdcmd.Arg2, (int)HAL_MVD_GetPtsStcDiff(u8Idx)));
3155
3156 if (0==u8ArgIdx)
3157 {
3158 u8Val = mvdcmd.Arg0; //On/Off
3159 }
3160 else if (1==u8ArgIdx)
3161 {
3162 u8Val = mvdcmd.Arg1; //Done
3163 }
3164 else if (2==u8ArgIdx)
3165 {
3166 u8Val = mvdcmd.Arg2; //Stat
3167 }
3168 return u8Val;
3169 }
3170
3171 //------------------------------------------------------------------------------
3172 /// Report avsync status
3173 /// avsync_status=avsync_done|(avsync_skip_picture<<1)|(avsync_repeat_picture<<2),
3174 /// 0 for free run
3175 //------------------------------------------------------------------------------
HAL_MVD_GetAVSyncStatus(MS_U8 u8Idx)3176 MS_U8 HAL_MVD_GetAVSyncStatus(MS_U8 u8Idx)
3177 {
3178 return MVD_GetSyncStat(u8Idx, 2);
3179 }
3180
HAL_MVD_SlqTblLoadWrPtr(MS_U8 u8Idx,MS_VIRT u32WrPtr)3181 void HAL_MVD_SlqTblLoadWrPtr(MS_U8 u8Idx, MS_VIRT u32WrPtr)
3182 {
3183 #if 1
3184 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
3185 MVD_CmdArg mvdcmd;
3186 MS_U16 u16Val = 0;
3187
3188 if (FALSE == pstSlqTblInfo->bEnSlqTblHkCtrl)
3189 {
3190 SETUP_CMDARG(mvdcmd);
3191 mvdcmd.Arg0 = 0x10;
3192 mvdcmd.Arg1 = 0x01;
3193 SET_DECNUM(mvdcmd, u8Idx);
3194 if (HAL_MVD_MVDCommand( CMD_RD_IO, &mvdcmd ) == FALSE)
3195 {
3196 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_RD_IO ) );
3197 return;
3198 }
3199 u16Val = (((MS_U32)mvdcmd.Arg2)) | ((MS_U32)mvdcmd.Arg3 << 8);
3200
3201 SETUP_CMDARG(mvdcmd);
3202 mvdcmd.Arg0 = 0x10;
3203 mvdcmd.Arg1 = 0x01;
3204 mvdcmd.Arg2 = u16Val & 0xff;
3205 mvdcmd.Arg3 = ((u16Val>>8 ) & 0xff) | 0x80;
3206 SET_DECNUM(mvdcmd, u8Idx);
3207 if (HAL_MVD_MVDCommand(CMD_WR_IO, &mvdcmd) == FALSE)
3208 {
3209 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_WR_IO ) );
3210 return;
3211 }
3212
3213 pstSlqTblInfo->bEnSlqTblHkCtrl = TRUE;
3214 //printf("@@@ OPEN HK.SLQ.CTRL!\n");
3215 }
3216 #endif
3217 OSAL_MVD_LockHwMutex();
3218
3219 HAL_MVD_RegWriteByte(MVD_SLQ_WADR0, (u32WrPtr & 0xff));
3220 HAL_MVD_RegWriteByte(MVD_SLQ_WADR1, ((u32WrPtr>>8 ) & 0xff));
3221 HAL_MVD_RegWriteByte(MVD_SLQ_WADR2, ((u32WrPtr>>16) & 0xff));
3222 HAL_MVD_RegWriteByte(MVD_SLQ_WADR3, ((u32WrPtr>>24) & 0x01));
3223 HAL_MVD_RegWriteBit(MVD_SLQCTRL, 1, MVD_SLQCTRL_WADR_RELOAD);
3224 HAL_MVD_RegWriteBit(MVD_SLQCTRL, 0, MVD_SLQCTRL_WADR_RELOAD);
3225
3226 OSAL_MVD_UnlockHwMutex();
3227 }
3228
HAL_MVD_SlqTblProbe(MVD_HKSLQ_CMD eCmd)3229 static MS_VIRT HAL_MVD_SlqTblProbe(MVD_HKSLQ_CMD eCmd)
3230 {
3231 MS_VIRT u32Cadr = 0;
3232 OSAL_MVD_LockHwMutex();
3233
3234 switch (eCmd)
3235 {
3236 case MVD_HKSLQ_GET_READPTR:
3237 HAL_MVD_RegWriteBit(MVD_SLQCTRL, 1, MVD_SLQCTRL_RADR_PROBE);
3238 HAL_MVD_RegWriteBit(MVD_SLQCTRL, 0, MVD_SLQCTRL_RADR_PROBE);
3239 break;
3240 case MVD_HKSLQ_GET_WRITEPTR:
3241 HAL_MVD_RegWriteBit(MVD_SLQCTRL, 1, MVD_SLQCTRL_WADR_PROBE);
3242 HAL_MVD_RegWriteBit(MVD_SLQCTRL, 0, MVD_SLQCTRL_WADR_PROBE);
3243 break;
3244 default:
3245 break;
3246 }
3247 u32Cadr = HAL_MVD_RegReadByte(MVD_SLQ_CADR0) |
3248 (HAL_MVD_RegReadByte(MVD_SLQ_CADR1) << 8) |
3249 (HAL_MVD_RegReadByte(MVD_SLQ_CADR2) <<16) |
3250 ((HAL_MVD_RegReadByte(MVD_SLQ_CADR3) & 0x01) <<24);
3251
3252 OSAL_MVD_UnlockHwMutex();
3253 return u32Cadr;
3254 }
3255
HAL_MVD_SlqTblProbeWrPtr(MS_U8 u8Idx)3256 MS_VIRT HAL_MVD_SlqTblProbeWrPtr(MS_U8 u8Idx)
3257 {
3258 return HAL_MVD_SlqTblProbe(MVD_HKSLQ_GET_WRITEPTR);
3259 }
3260
HAL_MVD_SlqTblProbeRdPtr(MS_U8 u8Idx)3261 MS_VIRT HAL_MVD_SlqTblProbeRdPtr(MS_U8 u8Idx)
3262 {
3263 return HAL_MVD_SlqTblProbe(MVD_HKSLQ_GET_READPTR);
3264 }
3265
3266 //------------------------------------------------------------------------------
3267 /// Set firmware as MStreamer mode
3268 /// @return -TRUE for success; FALSE for failure.
3269 //------------------------------------------------------------------------------
HAL_MVD_SetMStreamerMode(MS_U8 u8Idx,MS_U8 u8Mode)3270 MS_BOOL HAL_MVD_SetMStreamerMode(MS_U8 u8Idx, MS_U8 u8Mode)
3271 {
3272 MVD_CmdArg mvdcmd;
3273 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
3274
3275 SETUP_CMDARG(mvdcmd);
3276 mvdcmd.Arg0 = u8Mode; //1: enable, 0:disable MStreamer mode.
3277 SET_DECNUM(mvdcmd, u8Idx);
3278 SET_CMD_RET_FALSE(CMD_SET_MST_MODE, &mvdcmd);
3279
3280 pstCtrlCfg->u8MstMode = u8Mode;
3281 return TRUE;
3282 }
3283
3284 //------------------------------------------------------------------------------
3285 /// Set firmware as MStreamer mode (IP clip mode)
3286 /// @return -TRUE for success; FALSE for failure.
3287 //------------------------------------------------------------------------------
HAL_MVD_ShowDecodeOrder(MS_U8 u8Idx,MS_U8 u8Mode)3288 MS_BOOL HAL_MVD_ShowDecodeOrder(MS_U8 u8Idx, MS_U8 u8Mode)
3289 {
3290 MVD_CmdArg mvdcmd;
3291 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
3292
3293 SETUP_CMDARG(mvdcmd);
3294 mvdcmd.Arg0 = pstCtrlCfg->u8MstMode;
3295 mvdcmd.Arg1 = u8Mode;//a u8Mode; //1: clip mode, 0:normal mode.
3296 SET_DECNUM(mvdcmd, u8Idx);
3297 SET_CMD_RET_FALSE(CMD_SET_MST_MODE, &mvdcmd);
3298 return TRUE;
3299
3300 }
3301
HAL_MVD_IsMStreamerMode(MS_U8 u8Idx)3302 MS_BOOL HAL_MVD_IsMStreamerMode(MS_U8 u8Idx)
3303 {
3304 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
3305 return (MST_MODE_TRUE == pstCtrlCfg->u8MstMode);
3306 }
3307
HAL_MVD_FrameOpt(MS_U8 u8Idx,MS_U8 u8FrmIdx,MVD_FrmOpt eOpt)3308 MS_BOOL HAL_MVD_FrameOpt(MS_U8 u8Idx, MS_U8 u8FrmIdx, MVD_FrmOpt eOpt)
3309 {
3310 MVD_CmdArg mvdcmd;
3311
3312 SETUP_CMDARG(mvdcmd);
3313 mvdcmd.Arg0 = u8FrmIdx;
3314 mvdcmd.Arg1 = eOpt; // 0 = Flip, 1 = Release.
3315 MVD_DEBUGINFO(printf("FLIP_RELEASE_FRAME: idx=0x%x, opt=0x%x\n", u8FrmIdx, eOpt));
3316 SET_DECNUM(mvdcmd, u8Idx);
3317 SET_CMD_RET_FALSE(CMD_FLIP_RELEASE_FRAME, &mvdcmd);
3318
3319 return TRUE;
3320 }
3321
3322 //------------------------------------------------------------------------------
3323 /// Set firmware dynamic allocate FrameBuffer, now support MCU mode only
3324 /// @return -TRUE for success; FALSE for failure.
3325 //------------------------------------------------------------------------------
_MVD_SetDynamicAllocateFB(MS_U8 u8Idx,MS_BOOL bEnable)3326 MS_BOOL _MVD_SetDynamicAllocateFB(MS_U8 u8Idx,MS_BOOL bEnable)
3327 {
3328 MVD_CmdArg mvdcmd;
3329
3330 SETUP_CMDARG(mvdcmd);
3331 mvdcmd.Arg0 = 1-bEnable; //Arg0 : 0(enable) , 1(disable)
3332 SET_DECNUM(mvdcmd, u8Idx);
3333 if (HAL_MVD_MVDCommand( CMD_FIXED_FRAME_BUFFER, &mvdcmd ) == FALSE)
3334 {
3335 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_FIXED_FRAME_BUFFER ) );
3336 return FALSE;
3337 }
3338
3339 return TRUE;
3340 }
3341
3342 //------------------------------------------------------------------------------
3343 /// Set firmware as MCU mode
3344 /// @return -TRUE for success; FALSE for failure.
3345 //------------------------------------------------------------------------------
HAL_MVD_SetMcuMode(MS_U8 u8Idx,MS_U8 u8Mode)3346 MS_BOOL HAL_MVD_SetMcuMode(MS_U8 u8Idx, MS_U8 u8Mode)
3347 {
3348 MVD_CmdArg mvdcmd;
3349 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
3350
3351 SETUP_CMDARG(mvdcmd);
3352 mvdcmd.Arg0 = u8Mode; //1: enable, 0:disable MCU
3353 SET_DECNUM(mvdcmd, u8Idx);
3354 SET_CMD_RET_FALSE(CMD_SET_MCU_MODE, &mvdcmd);
3355
3356 pstCtrlCfg->u8McuMode = u8Mode;
3357
3358 return TRUE;
3359 }
3360
HAL_MVD_IsMcuMode(MS_U8 u8Idx)3361 MS_BOOL HAL_MVD_IsMcuMode(MS_U8 u8Idx)
3362 {
3363 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
3364 return (TRUE == pstCtrlCfg->u8McuMode);
3365 }
3366
3367 //------------------------------------------------------------------------------
3368 /// Inform firwmare that PTS is updated.
3369 /// @return -TRUE for success; FALSE for failure.
3370 //------------------------------------------------------------------------------
HAL_MVD_UpdatePts(MS_U8 u8Idx)3371 MS_BOOL HAL_MVD_UpdatePts(MS_U8 u8Idx)
3372 {
3373 MVD_CmdArg mvdcmd;
3374
3375 SETUP_CMDARG(mvdcmd);
3376 SET_DECNUM(mvdcmd, u8Idx);
3377 SET_CMD_RET_FALSE(CMD_SEND_UNI_PTS, &mvdcmd);
3378
3379 return TRUE;
3380 }
3381
3382
HAL_MVD_FrameCapture(MS_U8 u8Idx,MS_U8 u8FrmIdx,MS_BOOL bEnable)3383 MS_BOOL HAL_MVD_FrameCapture(MS_U8 u8Idx, MS_U8 u8FrmIdx, MS_BOOL bEnable)
3384 {
3385 MVD_CmdArg mvdcmd;
3386
3387 SETUP_CMDARG(mvdcmd);
3388 mvdcmd.Arg0 = bEnable; //0 or 1 to enable/disable the freeze function
3389 mvdcmd.Arg2 = u8FrmIdx; //specify the freezed frame index
3390 MVD_DEBUGINFO(printf("CAPTURE_FRAME: idx=0x%x, enable=0x%x\n", u8FrmIdx, bEnable));
3391 SET_DECNUM(mvdcmd, u8Idx);
3392 SET_CMD_RET_FALSE(CMD_ENABLE_FREEZE_PIC, &mvdcmd);
3393
3394 return TRUE;
3395 }
3396
3397 //------------------------------------------------------------------------------
3398 /// Set HW buffers' start address to MVD FW
3399 /// Return (the end address - 1)
3400 /// @param -u32Addr \b IN : start address (MIU offset)
3401 //------------------------------------------------------------------------------
HAL_MVD_SetHWBuffer(MS_U8 u8Idx,MS_VIRT u32Add)3402 MS_VIRT HAL_MVD_SetHWBuffer(MS_U8 u8Idx, MS_VIRT u32Add)
3403 {
3404 MS_VIRT tmpAdr;
3405
3406 MVD_DEBUGINFO(printf("====> %s u32Add = 0x%lx\n", __FUNCTION__, (unsigned long)u32Add));
3407 tmpAdr = (MemAlign(u32Add, MVD_FW_IAP_BUF_ALIGN));
3408 MVD_DEBUGINFO(printf("set MVD3_FW_IAP_BUF_ADR =%lx\n",(unsigned long)tmpAdr));
3409 HAL_MVD_SetIAPBufferAddr(u8Idx, tmpAdr);
3410 tmpAdr += MVD_FW_IAP_BUF_LEN;
3411
3412 tmpAdr = (MemAlign(tmpAdr, MVD_FW_DP_BUF_ALIGN));
3413 MVD_DEBUGINFO(printf("set MVD3_FW_DP_BUF_ADR=%lx\n",(unsigned long)tmpAdr));
3414 HAL_MVD_SetDPBufferAddr(u8Idx, tmpAdr);
3415 tmpAdr += MVD_FW_DP_BUF_LEN;
3416
3417 tmpAdr = (MemAlign(tmpAdr, MVD_FW_MV_BUF_ALIGN));
3418 MVD_DEBUGINFO(printf("set MVD3_FW_MV_BUF_ADR=%lx\n",(unsigned long)tmpAdr));
3419 HAL_MVD_SetMVBufferAddr(u8Idx, tmpAdr);
3420 tmpAdr += MVD_FW_MV_BUF_LEN;
3421 MVD_DEBUGINFO(printf("====> %s End of HW buffers = 0x%lx\n", __FUNCTION__, (unsigned long)tmpAdr));
3422
3423 return tmpAdr;
3424 }
3425
3426 //------------------------------------------------------------------------------
3427 /// Set the number of framebuffer
3428 /// @param -u8FrmNum \b IN : the number of framebuffer
3429 //------------------------------------------------------------------------------
HAL_MVD_SetFrameBuffNum(MS_U8 u8Idx,MS_U8 u8FrmNum,MS_U32 u32FBUsedSize)3430 void HAL_MVD_SetFrameBuffNum(MS_U8 u8Idx, MS_U8 u8FrmNum,MS_U32 u32FBUsedSize)
3431 {
3432 #define MVD_FBNUM_DEFAULT 4
3433 #define MVD_FBNUM_MIN MVD_FBNUM_DEFAULT
3434
3435 MVD_CmdArg mvdcmd;
3436
3437 MVD_DEBUGINFO(printf("%s u8FrmNum = %d\n", __FUNCTION__, u8FrmNum));
3438 if (u8FrmNum < MVD_FBNUM_MIN)
3439 {
3440 MVD_DEBUGINFO(printf("%s set u8FrmNum as %d instead of %d!\n",
3441 __FUNCTION__, MVD_FBNUM_MIN, u8FrmNum));
3442 u8FrmNum = MVD_FBNUM_MIN;
3443 }
3444 SETUP_CMDARG(mvdcmd);
3445 mvdcmd.Arg0 = u8FrmNum;
3446 mvdcmd.Arg1 = u32FBUsedSize&0xff;
3447 mvdcmd.Arg2 = (u32FBUsedSize>>8)&0xff;
3448 mvdcmd.Arg3 = (u32FBUsedSize>>16)&0xff;
3449 mvdcmd.Arg4 = (u32FBUsedSize>>24)&0xff;
3450 SET_DECNUM(mvdcmd, u8Idx);
3451 if (HAL_MVD_MVDCommand( CMD_FB_NUM, &mvdcmd ) == FALSE)
3452 {
3453 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_FB_NUM ) );
3454 return;
3455 }
3456 return;
3457 }
3458
MVD_WriteFWBuffData(MS_U8 u8Idx,FW_BUFF_TYPE eBuffType,MS_U8 u8Offset,MS_U8 u8Size,MS_U32 u32Val)3459 static MS_BOOL MVD_WriteFWBuffData(MS_U8 u8Idx, FW_BUFF_TYPE eBuffType, MS_U8 u8Offset, MS_U8 u8Size, MS_U32 u32Val)
3460 {
3461 MS_BOOL bRet = FALSE;
3462 MS_VIRT u32BufStart = NULL;
3463 switch (eBuffType)
3464 {
3465 case FW_BUFF_VOLINFO: u32BufStart = GET_VOL_BUFFADD(u8Idx); break;
3466 case FW_BUFF_FRMINFO: u32BufStart = GET_FRMINFO_BUFFADD(u8Idx); break;
3467 case FW_BUFF_HDR: u32BufStart = GET_HDR_BUFFADD(u8Idx); break;
3468 case FW_BUFF_USRDATA: u32BufStart = GET_USRDATA_BUFFADD(u8Idx); break;
3469 case FW_BUFF_FWSLQTAB: u32BufStart = GET_SLQ_BUFFADD(u8Idx); break;
3470 case FW_BUFF_PTSTBL: u32BufStart = GET_PTSTBL_BUFFADD(u8Idx); break;
3471 case FW_BUFF_DS: u32BufStart = GET_DS_BUFFADD(u8Idx); break;
3472 case FW_BUFF_XCINFO: u32BufStart = GET_XCINFO_BUFFADD(u8Idx); break;
3473 case FW_BUFF_DECFRMINFO: u32BufStart = GET_DECFRMINFO_BUFFADD(u8Idx); break;
3474 default:
3475 break;
3476 }
3477 if (NULL == u32BufStart)
3478 {
3479 printf("%s err: u8Idx=0x%x, bufType=0x%x, offset=%d, size=%d\n",
3480 __FUNCTION__, u8Idx, eBuffType, u8Offset, u8Size);
3481 return bRet;
3482 }
3483
3484 if (u8Size == sizeof(MS_U8))
3485 {
3486 bRet = HAL_MVD_MemWriteByte(u32BufStart+u8Offset, (MS_U8)u32Val);
3487 }
3488 else if (u8Size == sizeof(MS_U32))
3489 {
3490 bRet = HAL_MVD_MemWrite4Byte(u32BufStart+u8Offset, u32Val);
3491 }
3492
3493 MVD_DEBUGINFO(printf("%s: u32Val=%d for u8Idx=0x%x, bufType=0x%x, offset=%d, size=%d\n",
3494 __FUNCTION__, u32Val, u8Idx, eBuffType, u8Offset, u8Size));
3495 return bRet;
3496 }
3497
3498 //================== Vol Info ==================//
HAL_MVD_GetBitsRate(MS_U8 u8Idx)3499 MS_U32 HAL_MVD_GetBitsRate(MS_U8 u8Idx)
3500 {
3501 //Ref 13818-2, this flag is unit of 400 bits/sec
3502 return MVD_GetFWBuffData(u8Idx, FW_BUFF_VOLINFO, OFFSET_BIT_RATE, sizeof(MS_U32))*400;
3503 }
3504
HAL_MVD_GetVideoRange(MS_U8 u8Idx)3505 MS_U8 HAL_MVD_GetVideoRange(MS_U8 u8Idx)
3506 {
3507 return (MS_U8)MVD_GetFWBuffData(u8Idx, FW_BUFF_VOLINFO, OFFSET_VIDEO_RANGE, sizeof(MS_U8));
3508 }
3509
HAL_MVD_GetLowDelayFlag(MS_U8 u8Idx)3510 MS_BOOL HAL_MVD_GetLowDelayFlag(MS_U8 u8Idx)
3511 {
3512 return (MS_BOOL)MVD_GetFWBuffData(u8Idx, FW_BUFF_VOLINFO, OFFSET_LOW_DELAY, sizeof(MS_U8));
3513 }
3514
HAL_MVD_GetIs32PullDown(MS_U8 u8Idx)3515 MS_BOOL HAL_MVD_GetIs32PullDown(MS_U8 u8Idx)
3516 {
3517 return (MS_BOOL)MVD_GetFWBuffData(u8Idx, FW_BUFF_VOLINFO, OFFSET_MPEG_FRC_MODE, sizeof(MS_U8));
3518 }
3519
HAL_MVD_GetIsDynScalingEnabled(MS_U8 u8Idx)3520 MS_BOOL HAL_MVD_GetIsDynScalingEnabled(MS_U8 u8Idx)
3521 {
3522 return (MS_BOOL)MVD_GetFWBuffData(u8Idx, FW_BUFF_VOLINFO, OFFSET_DS_ENABLE, sizeof(MS_U8));
3523 }
3524
HAL_MVD_Is1stFrmRdy(MS_U8 u8Idx)3525 MS_BOOL HAL_MVD_Is1stFrmRdy(MS_U8 u8Idx)
3526 {
3527 return (MS_BOOL)MVD_GetFWBuffData(u8Idx, FW_BUFF_VOLINFO, OFFSET_FIRST_DISPLAY, sizeof(MS_U8));
3528 }
3529
3530
3531 //================== FrameInfo ==================//
HAL_MVD_GetPicCounter(MS_U8 u8Idx)3532 MS_U32 HAL_MVD_GetPicCounter(MS_U8 u8Idx)
3533 {
3534 return MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_FRAME_COUNT, sizeof(MS_U32));
3535 }
3536
HAL_MVD_GetSkipPicCounter(MS_U8 u8Idx)3537 MS_U32 HAL_MVD_GetSkipPicCounter(MS_U8 u8Idx)
3538 {
3539 return MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SKIP_FRAME_COUNT, sizeof(MS_U32));
3540 }
3541
HAL_MVD_GetPicType(MS_U8 u8Idx)3542 MVD_PicType HAL_MVD_GetPicType(MS_U8 u8Idx)
3543 {
3544 MS_U32 picType = 0xff;
3545 MVD_PicType ret = E_MVD_PIC_UNKNOWN;
3546
3547 if (GET_FRMINFO_BUFFADD(u8Idx)==0)
3548 {
3549 MVD_DEBUGERROR(printf("%s error: pu8MVDGetFrameInfoBufStart=NULL\n", __FUNCTION__));
3550 return E_MVD_PIC_UNKNOWN;
3551 }
3552 picType = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_PICTURE_TYPE, sizeof(MS_U32));
3553 switch (picType)
3554 {
3555 case 0:
3556 ret = E_MVD_PIC_I;
3557 break;
3558 case 1:
3559 ret = E_MVD_PIC_P;
3560 break;
3561 case 2:
3562 ret = E_MVD_PIC_B;
3563 break;
3564 default:
3565 break;
3566 }
3567 return ret;
3568 }
3569
HAL_MVD_GetPtsStcDiff(MS_U8 u8Idx)3570 MS_S32 HAL_MVD_GetPtsStcDiff(MS_U8 u8Idx)
3571 {
3572 return (MS_S32)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_PTS_STC, sizeof(MS_S32));
3573 }
3574
HAL_MVD_GetDecodedFrameIdx(MS_U8 u8Idx)3575 MS_U8 HAL_MVD_GetDecodedFrameIdx(MS_U8 u8Idx)
3576 {
3577 return (MS_U8)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_FB_INDEX, sizeof(MS_U8));
3578 }
3579
HAL_MVD_GetVldErrCount(MS_U8 u8Idx)3580 MS_U32 HAL_MVD_GetVldErrCount(MS_U8 u8Idx)
3581 {
3582 return MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_VLD_ERR_COUNT, sizeof(MS_U32));
3583 }
3584
HAL_MVD_GetValidStreamFlag(MS_U8 u8Idx)3585 MS_BOOL HAL_MVD_GetValidStreamFlag(MS_U8 u8Idx)
3586 {
3587 return !(MS_BOOL)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_INVALIDSTREAM, sizeof(MS_U8));
3588 }
3589
HAL_MVD_GetIsIPicFound(MS_U8 u8Idx)3590 MS_U8 HAL_MVD_GetIsIPicFound(MS_U8 u8Idx)
3591 {
3592 return (MS_U8)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_FIRST_I_FOUND, sizeof(MS_U8));
3593 }
3594
3595 //------------------------------------------------------------------------------
3596 /// Set PTS base to MVD F/W
3597 /// @param -u32pts \b IN : pts unit in 90k counter
3598 //------------------------------------------------------------------------------
HAL_MVD_SetPTSBase(MS_U8 u8Idx,MS_U32 u32pts)3599 void HAL_MVD_SetPTSBase(MS_U8 u8Idx, MS_U32 u32pts)
3600 {
3601 MVD_CmdArg mvdcmd;
3602
3603 SET_CMDARG(mvdcmd, u32pts, u8Idx);
3604 if (HAL_MVD_MVDCommand( CMD_PTS_BASE, &mvdcmd ) == FALSE)
3605 {
3606 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_PTS_BASE ) );
3607 }
3608 return;
3609 }
3610
HAL_MVD_GetPTS(MS_U8 u8Idx)3611 MS_U32 HAL_MVD_GetPTS(MS_U8 u8Idx)
3612 {
3613 MS_U32 u32PTS = 0;
3614
3615 u32PTS = (MS_U32)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DISP_PTS, sizeof(MS_U32));
3616 u32PTS = _90K_TO_MS(u32PTS);
3617 return u32PTS;
3618 }
3619
HAL_MVD_GetU64PTS(MS_U8 u8Idx,MVD_PtsType eType)3620 MS_U64 HAL_MVD_GetU64PTS(MS_U8 u8Idx, MVD_PtsType eType)
3621 {
3622 MS_U64 u64PTS = 0;
3623 MS_U64 u32_high32_PTS = 0;
3624 MS_U64 u32_low32_PTS = 0;
3625
3626 if(eType==E_MVD_PTS_DISP)
3627 {
3628 u32_low32_PTS = (MS_U64)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DISP_PTS, sizeof(MS_U32));
3629 u32_high32_PTS = (MS_U64)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DISP_PTS_MSB, sizeof(MS_U32));
3630 }
3631 else if(eType==E_MVD_PTS_PRE_PAS)
3632 {
3633 u32_low32_PTS = (MS_U64)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_WRPTR_PTS_LOW, sizeof(MS_U32));
3634 u32_high32_PTS = (MS_U64)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_WRPTR_PTS_HIGH, sizeof(MS_U32));
3635 }
3636
3637 u64PTS = (u32_high32_PTS<<32)|u32_low32_PTS;
3638 u64PTS = _90K_TO_MS_U64(u64PTS);
3639 return u64PTS;
3640 }
3641
HAL_MVD_GetNextPTS(MS_U8 u8Idx)3642 MS_U32 HAL_MVD_GetNextPTS(MS_U8 u8Idx)
3643 {
3644 return (MS_U32)_90K_TO_MS(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_NEXT_PTS, sizeof(MS_U32)));
3645 }
3646
HAL_MVD_GetChromaFormat(MS_U8 u8Idx)3647 MS_U32 HAL_MVD_GetChromaFormat(MS_U8 u8Idx)
3648 {
3649 return MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_CHROMA_FORMAT, sizeof(MS_U8));
3650 }
3651
HAL_MVD_GetGOPCount(MS_U8 u8Idx)3652 MS_U32 HAL_MVD_GetGOPCount(MS_U8 u8Idx)
3653 {
3654 return MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_GOP_I_FCNT, sizeof(MS_U32))
3655 + MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_GOP_P_FCNT, sizeof(MS_U32))
3656 + MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_GOP_B_FCNT, sizeof(MS_U32));
3657 }
3658
HAL_MVD_GetColorFormat(MS_U8 u8Idx)3659 MS_U8 HAL_MVD_GetColorFormat(MS_U8 u8Idx)
3660 {
3661 if (GET_FRMINFO_BUFFADD(u8Idx)==0)
3662 {
3663 MVD_DEBUGERROR(printf("%s error: pu8MVDGetFrameInfoBufStart=NULL\n", __FUNCTION__));
3664 return 0xff;
3665 }
3666
3667 return (MS_U8)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_VIDEO_FORMAT, sizeof(MS_U8));
3668 }
3669
HAL_MVD_GetMatrixCoef(MS_U8 u8Idx)3670 MS_U8 HAL_MVD_GetMatrixCoef(MS_U8 u8Idx)
3671 {
3672 if (GET_FRMINFO_BUFFADD(u8Idx)==0)
3673 {
3674 MVD_DEBUGERROR(printf("%s error: pu8MVDGetFrameInfoBufStart=NULL\n", __FUNCTION__));
3675 return 0xff;
3676 }
3677
3678 return (MS_U8)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_MATRIX_COEF, sizeof(MS_U8));
3679 }
3680
HAL_MVD_StepDecode(MS_U8 u8Idx)3681 MS_BOOL HAL_MVD_StepDecode(MS_U8 u8Idx)
3682 {
3683 MVD_CmdArg mvdcmd;
3684 SETUP_CMDARG(mvdcmd);
3685 SET_DECNUM(mvdcmd, u8Idx);
3686 SET_CMD_RET_FALSE(CMD_SINGLE_STEP, &mvdcmd);
3687
3688 if (HAL_MVD_Resume(u8Idx) == FALSE)
3689 {
3690 MVD_DEBUGERROR(printf("Command: HAL_MVD_Resume fail!!\r\n"));
3691 return FALSE;
3692 }
3693
3694 MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
3695 if (pCtrlCfg)
3696 {
3697 pCtrlCfg->bStepDecode = TRUE;
3698 }
3699
3700 return TRUE;
3701 }
3702
HAL_MVD_IsStepDispDone(MS_U8 u8Idx)3703 MS_BOOL HAL_MVD_IsStepDispDone(MS_U8 u8Idx)
3704 {
3705 return (MS_BOOL)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_STEP_DISP_DONE, sizeof(MS_U8));
3706 }
3707
HAL_MVD_IsStep2PtsDone(MS_U8 u8Idx)3708 MS_BOOL HAL_MVD_IsStep2PtsDone(MS_U8 u8Idx)
3709 {
3710 return (MS_BOOL)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_STEP_TO_PTS_DONE, sizeof(MS_U8));
3711 }
3712
3713 //Only for RCV.
HAL_MVD_GetPayloadLen(MS_U8 u8Idx)3714 MS_U32 HAL_MVD_GetPayloadLen(MS_U8 u8Idx)
3715 {
3716 return MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_RCV_PAYLOAD_LENGTH, sizeof(MS_U32));
3717 }
3718
3719 //Only for RCV.
HAL_MVD_GotFileEndPattern(MS_U8 u8Idx)3720 MS_BOOL HAL_MVD_GotFileEndPattern(MS_U8 u8Idx)
3721 {
3722 return (MS_BOOL)MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_MEET_FILE_END_SC, sizeof(MS_U8));
3723 }
3724
HAL_MVD_IsCmdFinished(MS_U8 u8Idx,MVD_HANDSHAKE_CMD eCmd)3725 MS_BOOL HAL_MVD_IsCmdFinished(MS_U8 u8Idx, MVD_HANDSHAKE_CMD eCmd)
3726 {
3727 MVD_CMD_HANDSHADE_INDEX u32CmdState;
3728 MS_BOOL bCmdRdy = FALSE;
3729
3730 HAL_MVD_InvalidBuffRetFalse(GET_FRMINFO_BUFFADD(u8Idx));
3731
3732 u32CmdState.value = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_CMD_HANDSHAKE_INDEX, sizeof(MS_U32));
3733 MVD_DEBUGINFO(printf("u32CmdState.value = 0x%x\n", u32CmdState.value));
3734 switch (eCmd)
3735 {
3736 case MVD_HANDSHAKE_PAUSE:
3737 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_pause);
3738 break;
3739 case MVD_HANDSHAKE_SLQ_RST:
3740 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_slq_reset);
3741 break;
3742 case MVD_HANDSHAKE_STOP:
3743 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_stop);
3744 break;
3745 case MVD_HANDSHAKE_SKIP_DATA:
3746 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_skip_data);
3747 break;
3748 case MVD_HANDSHAKE_SINGLE_STEP:
3749 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_single_step);
3750 break;
3751 case MVD_HANDSHAKE_SCALER_INFO:
3752 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_scaler_data_ready);
3753 break;
3754 case MVD_HANDSHAKE_GET_NXTDISPFRM:
3755 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_get_nextdispfrm_ready);
3756 break;
3757 case MVD_HANDSHAKE_PARSER_RST:
3758 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_parser_rst);
3759 break;
3760 case MVD_HANDSHAKE_RST_CC608:
3761 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_cc608_rst);
3762 break;
3763 case MVD_HANDSHAKE_RST_CC708:
3764 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_cc708_rst);
3765 break;
3766 case MVD_HANDSHAKE_VIRTUAL_COMMAND:
3767 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_virtualCommand);
3768 break;
3769 case MVD_HANDSHAKE_FLUSHQUEUE_COMMAND:
3770 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_flush);
3771 break;
3772 case MVD_HANDSHAKE_VSYNC_CONTROL:
3773 bCmdRdy = (MS_BOOL)(u32CmdState.mvdcmd_handshake_vsync_control);
3774 break;
3775 default:
3776 bCmdRdy = FALSE;
3777 break;
3778 }
3779 return bCmdRdy;
3780 }
3781
HAL_MVD_ClearCmdFinished(MS_U8 u8Idx,MVD_HANDSHAKE_CMD eCmd)3782 MS_BOOL HAL_MVD_ClearCmdFinished(MS_U8 u8Idx, MVD_HANDSHAKE_CMD eCmd)
3783 {
3784 MVD_CMD_HANDSHADE_INDEX u32CmdState;
3785
3786 HAL_MVD_InvalidBuffRetFalse(GET_FRMINFO_BUFFADD(u8Idx));
3787
3788 u32CmdState.value = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_CMD_HANDSHAKE_INDEX, sizeof(MS_U32));
3789 MVD_DEBUGINFO(printf("before CLR u32CmdState.value = 0x%x\n", u32CmdState.value));
3790 switch (eCmd)
3791 {
3792 case MVD_HANDSHAKE_SCALER_INFO:
3793 u32CmdState.mvdcmd_handshake_scaler_data_ready = 0;
3794 break;
3795 default:
3796 break;
3797 }
3798
3799 //write the value back: may it overwrite the value that f/w is supposed to write?
3800 MVD_WriteFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_CMD_HANDSHAKE_INDEX, sizeof(MS_U32), u32CmdState.value);
3801 MVD_DEBUGINFO(printf("after CLR u32CmdState.value = 0x%x\n",
3802 MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_CMD_HANDSHAKE_INDEX, sizeof(MS_U32))));
3803 return TRUE;
3804 }
3805
3806
HAL_MVD_GetTimeCode(MS_U8 u8Idx,MVD_FrmInfoType eType,MVD_TimeCode * pInfo)3807 MS_BOOL HAL_MVD_GetTimeCode(MS_U8 u8Idx, MVD_FrmInfoType eType, MVD_TimeCode* pInfo)
3808 {
3809 MS_BOOL bRet = FALSE;
3810 MS_VIRT pu8MVDGetFrameInfoBufStart = GET_FRMINFO_BUFFADD(u8Idx);
3811 if (NULL == pInfo)
3812 {
3813 return FALSE;
3814 }
3815
3816 HAL_MVD_InvalidBuffRetFalse(pu8MVDGetFrameInfoBufStart);
3817
3818 if (E_MVD_FRMINFO_DECODE == eType)
3819 {
3820 pInfo->u8TimeCodeHr = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_TIME_CODE_HOURS);
3821 pInfo->u8TimeCodeMin = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_TIME_CODE_MINUTES);
3822 pInfo->u8TimeCodeSec = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_TIME_CODE_SECONDS);
3823 pInfo->u8TimeCodePic = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_TIME_CODE_PICTURES);
3824 pInfo->u8DropFrmFlag = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_DROP_FRAME_FLAG);
3825 }
3826 else if (E_MVD_FRMINFO_DISPLAY == eType)
3827 {
3828 pInfo->u8TimeCodeHr = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_TIME_CODE_HOURS_DISP);
3829 pInfo->u8TimeCodeMin = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_TIME_CODE_MINUTES_DISP);
3830 pInfo->u8TimeCodeSec = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_TIME_CODE_SECONDS_DISP);
3831 pInfo->u8TimeCodePic = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_TIME_CODE_PICTURES_DISP);
3832 pInfo->u8DropFrmFlag = HAL_MVD_MemReadByte(pu8MVDGetFrameInfoBufStart+OFFSET_DROP_FRAME_FLAG_DISP);
3833 }
3834 else
3835 {
3836 bRet = FALSE;
3837 }
3838
3839 return bRet;
3840 }
3841
HAL_MVD_GetDispCnt(MS_U8 u8Idx)3842 MS_U32 HAL_MVD_GetDispCnt(MS_U8 u8Idx)
3843 {
3844 return MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DISPLAYED_CNT, sizeof(MS_U32));
3845 }
3846
HAL_MVD_GetMinTspDataSize(MS_U8 u8HalIdx)3847 MS_U32 HAL_MVD_GetMinTspDataSize(MS_U8 u8HalIdx)
3848 {
3849 #ifdef OFFSET_CUR_MIN_TSP_DATA_SIZE
3850 return MVD_GetFWBuffData(u8HalIdx, FW_BUFF_FRMINFO, OFFSET_CUR_MIN_TSP_DATA_SIZE, sizeof(MS_U32));
3851 #else
3852 return 0x400;
3853 #endif
3854 }
3855
HAL_MVD_GetXcLowDelayIntState(MS_U8 u8Idx)3856 MS_U32 HAL_MVD_GetXcLowDelayIntState(MS_U8 u8Idx)
3857 {
3858 MS_VIRT pu8MVDGetFrameInfoBufStart = GET_FRMINFO_BUFFADD(u8Idx);
3859
3860 if(pu8MVDGetFrameInfoBufStart==0)
3861 {
3862 MVD_DEBUGERROR(printf("MDrv_MVD_GetXcLowDelayIntState error: pu8MVDGetFrameInfoBufStart=NULL\n"));
3863 return 0;
3864 }
3865
3866 MVD_DEBUGINFO(printf("MDrv_MVD_GetXcLowDelayIntState()=%x,%x,%x,%x,%x\n",
3867 (HAL_MVD_MemRead4Byte(pu8MVDGetFrameInfoBufStart+OFFSET_XC_LOW_DELAY_CNT)),
3868 (HAL_MVD_MemRead4Byte(pu8MVDGetFrameInfoBufStart+OFFSET_XC_LOW_DELAY_INT_STATE)),
3869 (HAL_MVD_MemRead4Byte(pu8MVDGetFrameInfoBufStart+OFFSET_XC_DIFF_FIELD_NO)),
3870 (HAL_MVD_MemRead4Byte(pu8MVDGetFrameInfoBufStart+OFFSET_XC_LOW_DELAY_CNT_LATCH)),
3871 (HAL_MVD_MemRead4Byte(pu8MVDGetFrameInfoBufStart+OFFSET_FRAME_COUNT))));
3872
3873 return HAL_MVD_MemRead4Byte(pu8MVDGetFrameInfoBufStart+OFFSET_XC_LOW_DELAY_INT_STATE);
3874 }
3875
3876 //Get ErrStatus when ErrCode==ErrShape
MVD_GetErrShapeStat(MS_U32 u32errStat)3877 static MVD_ErrStatus MVD_GetErrShapeStat(MS_U32 u32errStat)
3878 {
3879 MVD_ErrStatus st = E_MVD_ERR_STATUS_UNKOWN;
3880 switch (u32errStat)
3881 {
3882 case 0:
3883 st = E_MVD_ERR_SHAPE_RECTANGULAR;
3884 break;
3885 case 1:
3886 st = E_MVD_ERR_SHAPE_BINARY;
3887 break;
3888 case 2:
3889 st = E_MVD_ERR_SHAPE_BINARY_ONLY;
3890 break;
3891 case 3:
3892 st = E_MVD_ERR_SHAPE_GRAYSCALE;
3893 break;
3894 default:
3895 break;
3896 }
3897 return st;
3898 }
3899
3900 //Get ErrStatus when ErrCode==ErrSprite
MVD_GetErrSpriteStat(MS_U32 u32errStat)3901 static MVD_ErrStatus MVD_GetErrSpriteStat(MS_U32 u32errStat)
3902 {
3903 MVD_ErrStatus st = E_MVD_ERR_STATUS_UNKOWN;
3904 switch (u32errStat)
3905 {
3906 case 0:
3907 st = E_MVD_ERR_USED_SPRITE_UNUSED;
3908 break;
3909 case 1:
3910 st = E_MVD_ERR_USED_SPRITE_STATIC;
3911 break;
3912 case 2:
3913 st = E_MVD_ERR_USED_SPRITE_GMC;
3914 break;
3915 case 3:
3916 st = E_MVD_ERR_USED_SPRITE_RESERVED;
3917 break;
3918 default:
3919 break;
3920 }
3921 return st;
3922 }
3923
HAL_MVD_GetErrInfo(MS_U8 u8Idx,MVD_ErrCode * errCode,MVD_ErrStatus * errStatus)3924 void HAL_MVD_GetErrInfo(MS_U8 u8Idx, MVD_ErrCode *errCode, MVD_ErrStatus *errStatus)
3925 {
3926 MS_U32 errorCode = E_MVD_ERR_UNKNOWN;
3927 MS_U32 errorStatus = E_MVD_ERR_STATUS_UNKOWN;
3928 MS_VIRT pu8MVDGetFrameInfoBufStart = GET_FRMINFO_BUFFADD(u8Idx);
3929
3930 if(pu8MVDGetFrameInfoBufStart==0)
3931 {
3932 MVD_DEBUGERROR(printf("MDrv_MVD_GetErrInfo error!\n"));
3933 return;
3934 }
3935
3936 errorCode = HAL_MVD_MemRead4Byte(pu8MVDGetFrameInfoBufStart + OFFSET_ERROR_CODE);
3937 errorStatus = HAL_MVD_MemRead4Byte(pu8MVDGetFrameInfoBufStart + OFFSET_ERROR_STATUS);
3938
3939 switch (errorCode)
3940 {
3941 case VOL_SHAPE:
3942 *errCode = E_MVD_ERR_SHAPE;
3943 *errStatus = MVD_GetErrShapeStat(errorStatus);
3944 break;
3945 case VOL_USED_SPRITE:
3946 *errCode = E_MVD_ERR_USED_SPRITE;
3947 *errStatus = MVD_GetErrSpriteStat(errorStatus);
3948 break;
3949 case VOL_NOT_8_BIT:
3950 *errCode = E_MVD_ERR_NOT_8_BIT;
3951 *errStatus = E_MVD_ERR_STATUS_NONE;
3952 break;
3953 case VOL_NERPRED_ENABLE:
3954 *errCode = E_MVD_ERR_NERPRED_ENABLE;
3955 *errStatus = E_MVD_ERR_STATUS_NONE;
3956 break;
3957 case VOL_REDUCED_RES_ENABLE:
3958 *errCode = E_MVD_ERR_REDUCED_RES_ENABLE;
3959 *errStatus = E_MVD_ERR_STATUS_NONE;
3960 break;
3961 case VOL_SCALABILITY:
3962 *errCode = E_MVD_ERR_SCALABILITY;
3963 *errStatus = E_MVD_ERR_STATUS_NONE;
3964 break;
3965 case VOL_H263_ERROR:
3966 *errCode = E_MVD_ERR_H263_ERROR;
3967 *errStatus = E_MVD_ERR_STATUS_NONE;
3968 break;
3969 case VOL_RES_NOT_SUPPORT:
3970 *errCode = E_MVD_ERR_RES_NOT_SUPPORT;
3971 *errStatus = E_MVD_ERR_STATUS_NONE;
3972 break;
3973 case VOL_MPEG4_NOT_SUPPORT:
3974 *errCode = E_MVD_ERR_MPEG4_NOT_SUPPORT;
3975 *errStatus = E_MVD_ERR_STATUS_NONE;
3976 break;
3977 case VOL_PROFILE_NOT_SUPPORT:
3978 *errCode = E_MVD_ERR_PROFILE_NOT_SUPPORT;
3979 *errStatus = E_MVD_ERR_STATUS_NONE;
3980 break;
3981 case VOL_RCV_ERROR_OCCUR:
3982 *errCode = E_MVD_ERR_RCV_ERROR_OCCUR;
3983 *errStatus = E_MVD_ERR_STATUS_NONE;
3984 break;
3985 case VOL_OTHER:
3986 *errCode = E_MVD_ERR_OTHER;
3987 *errStatus = E_MVD_ERR_STATUS_NONE;
3988 break;
3989 default:
3990 *errCode = E_MVD_ERR_UNKNOWN;
3991 *errStatus = E_MVD_ERR_STATUS_UNKOWN;
3992 break;
3993 }
3994
3995 return;
3996 }
3997
3998 //take care MIU1 address
HAL_MVD_GetMemOffset(MS_PHY u32PhyAdd)3999 MS_PHY HAL_MVD_GetMemOffset(MS_PHY u32PhyAdd)
4000 {
4001 if (u32PhyAdd >= pMVDHalContext->stMiuCfg.u32Miu2BaseAddr)
4002 {
4003 return (u32PhyAdd - pMVDHalContext->stMiuCfg.u32Miu2BaseAddr);
4004 }
4005 else if(u32PhyAdd >= pMVDHalContext->stMiuCfg.u32Miu1BaseAddr)
4006 {
4007 return (u32PhyAdd - pMVDHalContext->stMiuCfg.u32Miu1BaseAddr);
4008 }
4009 else
4010 {
4011 return u32PhyAdd;
4012 }
4013 }
4014
4015
HAL_MVD_SLQTblSendPacket(MS_U8 u8Idx,MVD_PacketInfo * pstVideoPKT)4016 MS_BOOL HAL_MVD_SLQTblSendPacket(MS_U8 u8Idx, MVD_PacketInfo *pstVideoPKT)
4017 {
4018 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
4019 MS_VIRT u32EsLast;
4020 MS_VIRT* u32LastEntry = &pstSlqTblInfo->pDrvSlqTbl->u32WrPtr;
4021 MS_VIRT* pu32EsNew = &pstSlqTblInfo->pDrvEsTbl->u32WrPtr;
4022 MS_U32 u32EntryWord = 0;
4023 MS_U32 u32Index = 0;
4024 MS_U32 u32Pts;
4025 MS_VIRT u32MVDFWPtsTblAddr = NULL;
4026 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
4027 MS_U32 u32ESStart=0;
4028 MS_U32 u32ESEnd=0;
4029 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
4030 MS_U64 u64Pts = (((MS_U64)pstVideoPKT->u32ID_H)<<32)|((MS_U64)pstVideoPKT->u32TimeStamp);
4031 MS_U32 u32Pts_high = pstVideoPKT->u32ID_H;
4032 MS_U32 u32Pts_low = pstVideoPKT->u32TimeStamp;
4033
4034
4035 #if _SLQTBL_DUMP_PKT
4036 // static MS_U32 u32SendTimes[MAX_DEC_NUM]= {0, 0};
4037
4038 printf("Pkt[%x] st=0x%x len=0x%x pts=0x%x id_l=0x%x id_h=0x%x\n", u32SendTimes[u8Idx]++,
4039 pstVideoPKT->u32StAddr, pstVideoPKT->u32Length, pstVideoPKT->u32TimeStamp,
4040 pstVideoPKT->u32ID_L, pstVideoPKT->u32ID_H);
4041 #endif
4042
4043 if(pstCtrlCfg->u8McuMode == FALSE)
4044 {
4045 u32MVDFWPtsTblAddr = GET_PTSTBL_BUFFADD(u8Idx);
4046 MS_ASSERT(u32MVDFWPtsTblAddr != NULL);
4047 if (u32MVDFWPtsTblAddr)
4048 {
4049 MS_VIRT u32PtsTblEntryAddr = 0;
4050 //so far, this is the only place that driver will write f/w 1M area after init.
4051 u32Index = (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr - pstSlqTblInfo->pDrvSlqTbl->u32StAdd)/8;
4052 if (pstVideoPKT->u32TimeStamp != MVD_NULLPKT_PTS)
4053 {
4054 u64Pts = _MS_TO_90K(u64Pts);
4055 u32Pts_high = u64Pts>>32;
4056 u32Pts_low = u64Pts&0xffffffff;
4057 }
4058
4059 u32PtsTblEntryAddr = u32MVDFWPtsTblAddr+u32Index*MVD_FW_SLQTBL_PTS_LEN;
4060 HAL_MVD_MemWrite4Byte(u32PtsTblEntryAddr+4, pstSlqTblInfo->u32DummyPktCnt); //dummyPktCnt
4061 HAL_MVD_MemWrite4Byte(u32PtsTblEntryAddr+8, pstVideoPKT->u32ID_L); //idLow
4062 HAL_MVD_MemWrite4Byte(u32PtsTblEntryAddr+12, u32Pts_high); //idHigh
4063 HAL_MVD_MemWrite4Byte(u32PtsTblEntryAddr+16, u32Pts_low); //PTS
4064 HAL_MVD_MemWrite4Byte(u32PtsTblEntryAddr, (pstSlqTblInfo->u32SlqByteCnt)&0xffffff); //byteCnt
4065 //printf("PTS=0x%x(%x), idx=0x%x add=0x%x\n", pstVideoPKT->u32TimeStamp,
4066 // HAL_MVD_MemRead4Byte(u32PtsTblEntryAddr+16),
4067 // u32Index, u32PtsTblEntryAddr+16);
4068
4069 if ((HAL_MVD_IsMStreamerMode(u8Idx) || HAL_MVD_IsMcuMode(u8Idx))
4070 && (pstCtrlCfg->eFileSyncMode == E_MVD_TIMESTAMP_STS))
4071 {
4072 if(pMVDHalContext->bDropOnePTS[u8Idx] == FALSE)
4073 {
4074 HAL_MVD_MemWrite4Byte(u32MVDFWPtsTblAddr+MVD_FW_SLQTBL_PTS_LEN+12, pstVideoPKT->u32ID_H); //idHigh
4075 HAL_MVD_MemWrite4Byte(u32MVDFWPtsTblAddr+MVD_FW_SLQTBL_PTS_LEN+16, pstVideoPKT->u32TimeStamp); //PTS
4076
4077 MVD_DBG_STS(printf(">>> drvMVD pts,idH = %lu, %lu\n", HAL_MVD_MemRead4Byte(u32MVDFWPtsTblAddr+MVD_FW_SLQTBL_PTS_LEN+16),
4078 HAL_MVD_MemRead4Byte(u32MVDFWPtsTblAddr+MVD_FW_SLQTBL_PTS_LEN+12)));
4079 if (((MVD_NULLPKT_PTS == pstVideoPKT->u32ID_H) && (MVD_NULLPKT_PTS == pstVideoPKT->u32TimeStamp)) == FALSE)
4080 { //Only update PTS to firmware when pts field is valid.
4081 //Plz refer to MDrv_MVD_PushQueue if (u8MstMode == MST_MODE_TRUE) {}
4082 HAL_MVD_UpdatePts(u8Idx); //for uniplayer or MCU mode
4083 }
4084 }
4085
4086 pMVDHalContext->bDropOnePTS[u8Idx] = FALSE;
4087 }
4088 }
4089 #if _SLQTBL_DUMP_PTS
4090 if (u32Index == 0x177)
4091 {
4092 _SLQTbl_DumpPtsTbl(u8Idx, 0, 0x179);
4093 }
4094 #endif
4095 }
4096 pstSlqTblInfo->u32SlqByteCnt += pstVideoPKT->u32Length;
4097
4098 //update SLQ tbl entry
4099 //u32EsLast = (pstVideoPKT->u32StAddr)+pstSlqTblInfo->pDrvSlqTbl->u32StAdd;
4100 u32EsLast = (pstVideoPKT->u32StAddr)+HAL_MVD_GetMemOffset(pstMemCfg->u32BSAddr);
4101 HAL_MVD_MemWrite4Byte(*pu32EsNew, u32EsLast-HAL_MVD_GetMemOffset(pstMemCfg->u32BSAddr));
4102 u32ESStart = (u32EsLast) & SLQ_TBL_ENTRY_LEN;
4103
4104 u32EsLast += pstVideoPKT->u32Length; //update ES write pointer
4105 //Notice: This is for MVD HW, so no need to minus one.
4106 HAL_MVD_MemWrite4Byte((*pu32EsNew)+4, u32EsLast-HAL_MVD_GetMemOffset(pstMemCfg->u32BSAddr));
4107 u32ESEnd = (u32EsLast) & SLQ_TBL_ENTRY_LEN;
4108
4109 *pu32EsNew += 8;
4110 if (*pu32EsNew >= pstSlqTblInfo->pDrvEsTbl->u32EndAdd)
4111 { //wrap to the beginning of the table
4112 MVD_DEBUGINFO(printf("...ES wrapping to the beginning!\n"));
4113 *pu32EsNew = pstSlqTblInfo->pDrvEsTbl->u32StAdd;
4114 }
4115
4116 //printf("===>[%x] u32ESStart=0x%x u32ESEnd=0x%x u32EsLast=0x%x\n",
4117 // pMVDHalContext->u32SendTimes[u8Idx]++, u32ESStart, u32ESEnd, u32EsLast);
4118
4119 u32EntryWord = u32ESEnd;
4120 HAL_MVD_MemWrite4Byte(*u32LastEntry, u32EntryWord);
4121 //printf("===> u32EntryWord1 addr=0x%x\n", (*u32LastEntry));
4122 //printf("===> u32EntryWord0=0x%x\n", u32EntryWord);
4123
4124 u32EntryWord = u32ESStart;
4125 HAL_MVD_MemWrite4Byte((*u32LastEntry)+4, u32EntryWord);
4126 //printf("===> u32EntryWord1 addr=0x%x\n", (*u32LastEntry)+4);
4127 //printf("===> u32EntryWord1=0x%x\n", u32EntryWord);
4128
4129 *u32LastEntry += 8;
4130 if (*u32LastEntry >= pstSlqTblInfo->pDrvSlqTbl->u32EndAdd)
4131 { //wrap to the beginning of the table
4132 MVD_DEBUGINFO(printf("...wrapping to the beginning!\n"));
4133 *u32LastEntry = pstSlqTblInfo->pDrvSlqTbl->u32StAdd;
4134 //also wrap DivX311 pattern table
4135 pstSlqTblInfo->pDrvDivxTbl->u32WrPtr = pstSlqTblInfo->pDrvDivxTbl->u32StAdd;
4136 }
4137
4138 if (pstSlqTblInfo->pDrvSlqTbl->u32Empty)
4139 {
4140 pstSlqTblInfo->pDrvSlqTbl->u32Empty -= SLQ_ENTRY_LEN;
4141 }
4142
4143 return TRUE;
4144 }
4145
4146 //Table of frame rate code for MPEG-2
4147 #if 0
4148 #define FRM_RATE_CODE_NUM 9
4149 static const MS_U16 stFrameRateCode[FRM_RATE_CODE_NUM]=
4150 {
4151 NULL,23976,24000,25000,29976,30000,50000,59947,60000
4152 };
4153 #endif
MVD_GCD(MS_U32 u32A,MS_U32 u32B)4154 static MS_U32 MVD_GCD(MS_U32 u32A, MS_U32 u32B)
4155 {
4156 MS_S32 i;
4157 MS_U32 x[4]; /* need x[0], x[1], x[i-1] */
4158
4159 if (u32A > u32B)
4160 {
4161 x[0] = u32A; x[1] = u32B;
4162 }
4163 else
4164 {
4165 x[0] = u32B; x[1] = u32A;
4166 }
4167
4168 i = 1;
4169
4170 #define w(x) (((x)<4)?(x):(2+((x)&1)))
4171
4172 while( x[w(i)] != 0 )
4173 {
4174 x[w(i+1)] = x[w(i-1)] % x[w(i)];
4175 i++;
4176 }
4177
4178 return x[w(i-1)];
4179
4180 #undef w
4181 }
HAL_MVD_GetFrameInfo(MS_U8 u8Idx,MVD_FrameInfo * pinfo)4182 void HAL_MVD_GetFrameInfo(MS_U8 u8Idx, MVD_FrameInfo *pinfo)
4183 {
4184 FW_VOL_INFO gvolInfo;
4185 FW_DIVX_INFO* pDivxInfo = &(pMVDHalContext->gdivxInfo[u8Idx]);
4186 MS_VIRT temp = 0;
4187 MS_U32 u32DAR_Width=0,u32DAR_Height=0,u32PAR_Width=0,u32PAR_Height=0,u32GCD=0;
4188 MS_U32 u32Vertical_Size=0, u32Horizontal_Size=0;
4189 //13818-2 page 38 Table 6-3
4190 MS_U8 u8DARTable[5][2] = { {1,1}, {1,1}, {4,3}, {16,9}, {221,100} };
4191 MS_U32 pu8MVDGetVolBufStart = NULL;
4192 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
4193
4194 pu8MVDGetVolBufStart = GET_VOL_BUFFADD(u8Idx);
4195 if (pu8MVDGetVolBufStart == NULL)
4196 {
4197 MVD_DEBUGERROR(printf("MDrv_MVD_GetFrameInfo error: pu8MVDGetVolBufStart=NULL\n"));
4198 return;
4199 }
4200
4201 HAL_MVD_CPU_Sync();
4202 HAL_MVD_ReadMemory();
4203
4204 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,GET_VOL_BUFFADD(u8Idx),temp);
4205
4206 gvolInfo = (*(volatile FW_VOL_INFO*)(HAL_MVD_PA2NonCacheSeg(temp)));
4207
4208 pinfo->u16HorSize = (MS_U16) gvolInfo.width;
4209 pinfo->u16VerSize = (MS_U16) gvolInfo.height;
4210 pinfo->u16par_width = (MS_U16) gvolInfo.par_width;
4211 pinfo->u16par_height = (MS_U16) gvolInfo.par_height;
4212 pinfo->u8AspectRate = gvolInfo.aspect_ratio;
4213
4214 pinfo->u16CropBottom = gvolInfo.CropBottom;
4215 pinfo->u16CropTop = 0;
4216 pinfo->u16CropLeft = 0;
4217
4218 if (pinfo->u16HorSize & MVD_WIDTH_ALIGN_MASK)
4219 {
4220 //Notice: Firmware and driver have to be consistent for this part,
4221 // otherwise the pitch will not match and video is noisy.
4222 pinfo->u16CropRight = MVD_WIDTH_ALIGN_BYTE - (pinfo->u16HorSize & MVD_WIDTH_ALIGN_MASK);
4223 pinfo->u16HorSize = ((pinfo->u16HorSize >> MVD_WIDTH_ALIGN_BITS) + 1) << MVD_WIDTH_ALIGN_BITS;
4224 }
4225 else
4226 {
4227 pinfo->u16CropRight = 0;
4228 }
4229
4230 MVD_CodecType curCodecType = HAL_MVD_GetCodecType(u8Idx);
4231 if ((curCodecType == E_MVD_CODEC_MPEG4_SHORT_VIDEO_HEADER) ||
4232 (curCodecType == E_MVD_CODEC_DIVX311) || (curCodecType == E_MVD_CODEC_FLV))
4233 {
4234 pinfo->u8Interlace= FALSE; //divx311/flv/svh just has progressive mode
4235 MS_ASSERT(gvolInfo.progressive_sequence == 1); //FW will init it as 1
4236 }
4237 else
4238 {
4239 if (gvolInfo.progressive_sequence == 0)
4240 {
4241 pinfo->u8Interlace=1;
4242 }
4243 else
4244 {
4245 pinfo->u8Interlace=0;
4246 }
4247 }
4248
4249 ///Calculate PAR info
4250 if (pinfo->u16par_width == 0 || pinfo->u16par_height == 0)
4251 {
4252 if ((pinfo->u8AspectRate > 0) && (pinfo->u8AspectRate < 5 ))
4253 {
4254 if (pinfo->u8AspectRate == 1)
4255 { //SAR=1.0 square sample
4256 u32DAR_Width = (MS_U32)pinfo->u16HorSize;
4257 u32DAR_Height = (MS_U32)pinfo->u16VerSize;
4258 pinfo->u16par_width = 1;
4259 pinfo->u16par_height = 1;
4260 }
4261 else
4262 {
4263 u32DAR_Width = (MS_U32)u8DARTable[pinfo->u8AspectRate][0];
4264 u32DAR_Height = (MS_U32)u8DARTable[pinfo->u8AspectRate][1];
4265 u32Vertical_Size = (MS_U32)pinfo->u16VerSize;
4266 u32Horizontal_Size = (MS_U32)(pinfo->u16HorSize - pinfo->u16CropRight);
4267 u32PAR_Width = u32DAR_Width * u32Vertical_Size;
4268 u32PAR_Height = u32DAR_Height * u32Horizontal_Size;
4269 u32GCD = MVD_GCD(u32PAR_Width, u32PAR_Height);
4270 if (0 == u32GCD)
4271 {
4272 pinfo->u16HorSize = 0xFFFF;
4273 pinfo->u16VerSize = 0xFFFF;
4274
4275 return;
4276 }
4277 else
4278 {
4279 pinfo->u16par_width = (MS_U16) (u32PAR_Width / u32GCD);
4280 pinfo->u16par_height = (MS_U16) (u32PAR_Height / u32GCD);
4281 MVD_DEBUGVERBAL(printf("u32PAR_Width:%d,u32PAR_Height:%d,GCD:%d\n",u32PAR_Width,u32PAR_Height,u32GCD));
4282 }
4283 }
4284 }
4285 else
4286 {
4287 //set to 0 to indicate it's abnormal
4288 u32DAR_Width = 0;
4289 u32DAR_Height = 0;
4290 pinfo->u16par_width = 0;
4291 pinfo->u16par_height = 0;
4292 }
4293 MVD_DEBUGVERBAL(printf("u32DAR_Width:%d,u32DAR_Height%d\n",u32DAR_Width,u32DAR_Height));
4294 }
4295 MVD_DEBUGVERBAL(printf("pinfo->u16par_width:%d, pinfo->u16par_height:%d\n",pinfo->u16par_width, pinfo->u16par_height));
4296
4297 if (curCodecType == E_MVD_CODEC_MPEG2)
4298 {
4299 if (gvolInfo.frame_rate < FRM_RATE_CODE_NUM)
4300 {
4301 pinfo->u32FrameRate = stFrameRateCode[gvolInfo.frame_rate];
4302 }
4303 else
4304 {
4305 pinfo->u32FrameRate = 0;
4306 }
4307 }
4308 else if ((curCodecType == E_MVD_CODEC_VC1_ADV) || (curCodecType == E_MVD_CODEC_VC1_MAIN))
4309 {
4310 if ((gvolInfo.vc1_frame_rate != 0) && (gvolInfo.vc1_frame_rate != MVD_U32_MAX))
4311 {
4312 pinfo->u32FrameRate = gvolInfo.vc1_frame_rate;
4313 }
4314 else if(pMVDHalContext->u32DmxFrameRate[u8Idx] != 0 && pMVDHalContext->u32DmxFrameRateBase[u8Idx] != 0)
4315 {
4316 pinfo->u32FrameRate = (pMVDHalContext->u32DmxFrameRate[u8Idx]/pMVDHalContext->u32DmxFrameRateBase[u8Idx])*1000;
4317 }
4318 else
4319 {
4320 pinfo->u32FrameRate = pDivxInfo->frame_rate; //report framerate specified in MDrv_MVD_SetFrameInfo()
4321 }
4322
4323 MVD_DEBUGVERBAL(printf("MVD: vc1_frameRate=%d\n", pinfo->u32FrameRate));
4324 }
4325 else if (curCodecType == E_MVD_CODEC_MPEG4)
4326 {
4327 if (pDivxInfo->frame_rate != 0)
4328 {
4329 pinfo->u32FrameRate = pDivxInfo->frame_rate;
4330 //report framerate specified in MDrv_MVD_SetFrameInfo(), which is usually obtained from container
4331 }
4332 else if (gvolInfo.frame_rate != 0)
4333 {
4334 pinfo->u32FrameRate = gvolInfo.frame_rate; //report framerate from f/w
4335 }
4336 else if ((gvolInfo.fixed_vop_time_incr != 0) && (gvolInfo.vol_time_incr_res != 0))
4337 {
4338 pinfo->u32FrameRate = (gvolInfo.vol_time_incr_res * 1000) / gvolInfo.fixed_vop_time_incr;
4339 //calculate framerate according to vol header
4340 }
4341 else if(pMVDHalContext->u32DmxFrameRate[u8Idx] != 0 && pMVDHalContext->u32DmxFrameRateBase[u8Idx] != 0)
4342 {
4343 pinfo->u32FrameRate = (pMVDHalContext->u32DmxFrameRate[u8Idx]/pMVDHalContext->u32DmxFrameRateBase[u8Idx])*1000;
4344 }
4345 else
4346 {
4347 pinfo->u32FrameRate = 60000; //set default frame rate according to chip capability
4348 }
4349 MVD_DEBUGVERBAL(printf("MVD: vol_time_incr_res=%d, fixed_vop_time_incr=%d\n", gvolInfo.vol_time_incr_res, gvolInfo.fixed_vop_time_incr));
4350 }
4351 else
4352 {
4353 if (gvolInfo.frame_rate != 0)
4354 {
4355 pinfo->u32FrameRate = gvolInfo.frame_rate;
4356 }
4357 else
4358 {
4359 pinfo->u32FrameRate = pDivxInfo->frame_rate; //report framerate specified in MDrv_MVD_SetFrameInfo()
4360 }
4361 }
4362 MVD_DEBUGVERBAL(printf("===> MVD: frameRate=%d curCodecType=0x%x\n", pinfo->u32FrameRate, curCodecType));
4363
4364 //for MM
4365 pinfo->u8MPEG1=gvolInfo.mpeg1;
4366 pinfo->u16PTSInterval=gvolInfo.pts_incr;
4367 pinfo->u8PlayMode=gvolInfo.play_mode;
4368 pinfo->u8FrcMode=gvolInfo.mpeg_frc_mode;
4369
4370 //for dynamic scaling
4371 pinfo->bEnableMIUSel = (MS_BOOL)pMVDHalContext->stMiuCfg.u8FWMiuSel;
4372
4373 if(pMVDHalContext->stMiuCfg.u8FWMiuSel >= E_CHIP_MIU_2)
4374 {
4375 MVD_DEBUGERROR(printf("u8MiuSel is %d !!, but return type is only Boolean. Please use MDrv_HVD_EX_GetDSBufMiuSelect() to get right miu select of DS buffer!\n",pMVDHalContext->stMiuCfg.u8FWMiuSel));
4376 }
4377
4378 if (pstMemCfg->bEnableDynScale)
4379 {
4380 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,GET_DS_BUFFADD(u8Idx),pinfo->u32DynScalingAddr);
4381 pinfo->u8DynScalingDepth= gvolInfo.DS_Depth;
4382 pinfo->u32DynScalingBufSize= gvolInfo.DSbufsize;
4383 }
4384 else
4385 {
4386 pinfo->u32DynScalingAddr= NULL;
4387 pinfo->u8DynScalingDepth= 0;
4388 pinfo->u32DynScalingBufSize= 0;
4389 }
4390
4391 return;
4392 }
4393
MVD_RstFrmInfo(MS_U8 u8Idx,MVD_FrmInfoType eType)4394 E_MVD_Result MVD_RstFrmInfo(MS_U8 u8Idx, MVD_FrmInfoType eType)
4395 {
4396 E_MVD_Result eRet = E_MVD_RET_OK;
4397 MS_VIRT u32DecFrmInfoAdd = GET_DECFRMINFO_BUFFADD(u8Idx);
4398 if (NULL == u32DecFrmInfoAdd)
4399 {
4400 return E_MVD_RET_FAIL;
4401 }
4402
4403 //printf("%s u32DecFrmInfoAdd = 0x%x\n", __FUNCTION__, u32DecFrmInfoAdd);
4404 if (E_MVD_FRMINFO_DECODE == eType)
4405 {
4406 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_LUMAADDR), _INIT_ADDR);
4407 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_CHROMAADDR), _INIT_ADDR);
4408 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_TIMESTAMP), _INIT_TIMESTAMP);
4409 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_ID_L), _INIT_ID);
4410 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_ID_H), _INIT_ID);
4411 HAL_MVD_MemWrite2Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_PITCH), _INIT_LEN);
4412 HAL_MVD_MemWrite2Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_WIDTH), _INIT_LEN);
4413 HAL_MVD_MemWrite2Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_HEIGHT), _INIT_LEN);
4414 HAL_MVD_MemWrite2Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_FRAMETYPE), 0xff);
4415 }
4416 else if (E_MVD_FRMINFO_DISPLAY == eType)
4417 {
4418 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_LUMAADDR), _INIT_ADDR);
4419 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_CHROMAADDR), _INIT_ADDR);
4420 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_TIMESTAMP), _INIT_TIMESTAMP);
4421 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_ID_L), _INIT_ID);
4422 HAL_MVD_MemWrite4Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_ID_H), _INIT_ID);
4423 HAL_MVD_MemWrite2Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_PITCH), _INIT_LEN);
4424 HAL_MVD_MemWrite2Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_WIDTH), _INIT_LEN);
4425 HAL_MVD_MemWrite2Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_HEIGHT), _INIT_LEN);
4426 HAL_MVD_MemWrite2Byte((u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_FRAMETYPE), 0xff);
4427 }
4428 else
4429 {
4430 eRet = E_MVD_RET_INVALID_PARAM;
4431 }
4432
4433 return eRet;
4434 }
4435
4436 //Given the start address & the available size for the FW buffers,
4437 //Calculate the start address of each buffers.
MVD_GetFWBuffAdd(MS_VIRT u32Start,MS_U32 u32AvailLen,MVD_FWBuff * pBuff)4438 static MS_BOOL MVD_GetFWBuffAdd(MS_VIRT u32Start, MS_U32 u32AvailLen, MVD_FWBuff* pBuff)
4439 {
4440 MS_VIRT tmpAdr = u32Start;
4441
4442 if(pBuff == NULL)
4443 {
4444 MVD_DEBUGERROR(printf("%s err: NULL pBuff\n", __FUNCTION__));
4445 return FALSE;
4446 }
4447 tmpAdr += MVD_FW_CODE_LEN;
4448 GET_FW_BUFFADD_ALIGN(tmpAdr, FW_BUFF_ALIGN, MVD3_FW_VOL_INFO_BUF_LEN, pBuff->pu8MVDGetVolBufStart);
4449 GET_FW_BUFFADD_ALIGN(tmpAdr, FW_BUFF_ALIGN, MVD3_FW_FRAME_INFO_BUF_LEN, pBuff->pu8MVDGetFrameInfoBufStart);
4450 GET_FW_BUFFADD_ALIGN(tmpAdr, FW_BUFF_ALIGN, MVD3_FW_DIVX_INFO_BUF_LEN, pBuff->pu8MVDSetHeaderBufStart);
4451 GET_FW_BUFFADD_ALIGN(tmpAdr, FW_BUFF_ALIGN,
4452 (MVD3_FW_USER_DATA_BUF_LEN+MVD3_FW_USER_DATA_BUF_BACKUP_LEN), pBuff->u32UserDataBuf);
4453 //MVD3_FW_USER_DATA_BUF_BACKUP_LEN is used as CC decoding buffer for MVD_SUPPORT_X4_CC
4454
4455 GET_FW_BUFFADD_ALIGN(tmpAdr, FW_BUFF_ALIGN, MVD3_FW_SLQ_TAB_TMPBUF_LEN, pBuff->u32MVDFWSLQTABTmpbufAdr);
4456 GET_FW_BUFFADD(tmpAdr, MVD_FW_SLQTBL_PTS_BUF_LEN, pBuff->u32MVDFWPtsTblAddr);
4457 GET_FW_BUFFADD(tmpAdr, MVD_FW_DYN_SCALE_BUF_LEN, pBuff->u32DynScalingAdd);
4458 GET_FW_BUFFADD(tmpAdr, MVD_FW_SCALER_INFO_BUF_LEN, pBuff->u32ScalerInfoAdd);
4459 GET_FW_BUFFADD(tmpAdr, MVD_FW_DECFRM_INFO_BUF_LEN, pBuff->u32DecFrmInfoAdd);
4460 GET_FW_BUFFADD(tmpAdr, MVD_FW_VBBU_TABLE_LEN, pBuff->u32VBBUTableAdd);
4461
4462
4463 MVD_DEBUGINFO(printf("set pu8MVDGetVolBufStart=%lx\n", (unsigned long)pBuff->pu8MVDGetVolBufStart));
4464 MVD_DEBUGINFO(printf("set pu8MVDGetFrameInfoBufStart=%lx\n", (unsigned long)pBuff->pu8MVDGetFrameInfoBufStart));
4465 MVD_DEBUGINFO(printf("set pu8MVDSetHeaderBufStart=%lx\n", (unsigned long)pBuff->pu8MVDSetHeaderBufStart));
4466 MVD_DEBUGINFO(printf("u32UserDataBuf start=%lx\n", (unsigned long)pBuff->u32UserDataBuf));
4467 MVD_DEBUGINFO(printf("u32MVDFWSLQTABTmpbufAdr start=%lx\n", (unsigned long)pBuff->u32MVDFWSLQTABTmpbufAdr));
4468 MVD_DEBUGINFO(printf("PtsTblAddr start=%lx\n", (unsigned long)pBuff->u32MVDFWPtsTblAddr));
4469 MVD_DEBUGINFO(printf("u32DynScalingAdd start=%lx\n", (unsigned long)pBuff->u32DynScalingAdd));
4470 MVD_DEBUGINFO(printf("ScalerInfo start=%lx end=%lx\n",
4471 (unsigned long)pBuff->u32ScalerInfoAdd, (pBuff->u32ScalerInfoAdd+MVD_FW_SCALER_INFO_BUF_LEN)));
4472 MVD_DEBUGINFO(printf("DecFrmInfo start=%lx end=%lx\n",
4473 (unsigned long)pBuff->u32DecFrmInfoAdd, (pBuff->u32DecFrmInfoAdd+MVD_FW_DECFRM_INFO_BUF_LEN)));
4474
4475 MS_U32 u32ShMemBoundary = (MVD_FW_CODE_LEN==MVD_FW_CODE_LEN_V00) ? MVD_FW_MPOOL_START_OFFSET : MVD_FW_TASK_OFFSET;
4476 #if v3_temp
4477
4478 if ((pBuff->u32VBBUTableAdd+MVD_FW_VBBU_TABLE_LEN-u32Start) > u32ShMemBoundary)
4479 {
4480 //shared memory should not overlap with FW memory pool.
4481 MVD_DEBUGERROR(printf("%s err: 0x%lx out of memory boundary!\n", __FUNCTION__,
4482 (pBuff->u32VBBUTableAdd+MVD_FW_VBBU_TABLE_LEN-u32Start)));
4483 return FALSE;
4484 }
4485 #else
4486 if ((pBuff->u32DecFrmInfoAdd+MVD_FW_DECFRM_INFO_BUF_LEN-u32Start) > u32ShMemBoundary)
4487 {
4488 //shared memory should not overlap with FW memory pool.
4489 MVD_DEBUGERROR(printf("%s err: 0x%x out of memory boundary!\n", __FUNCTION__,
4490 (pBuff->u32DecFrmInfoAdd+MVD_FW_DECFRM_INFO_BUF_LEN-u32Start)));
4491 return FALSE;
4492 }
4493 #endif
4494
4495 return TRUE;
4496 }
4497
4498 //Set buffer address to f/w
4499 //Init the memory erea if necessary
MVD_SetFWBuffAdd(MS_U8 u8Idx,MVD_FWBuff * pBuff)4500 static MS_BOOL MVD_SetFWBuffAdd(MS_U8 u8Idx, MVD_FWBuff* pBuff)
4501 {
4502 MS_U32 i;
4503 MVD_SrcMode curSrcMode = E_MVD_SRC_UNKNOWN;
4504 MVD_MEMCfg* pstMemCfg = NULL;
4505 MVD_CtrlCfg* pCtrlCfg = NULL;
4506
4507 if(pBuff == NULL)
4508 {
4509 MVD_DEBUGERROR(printf("%s err: NULL pBuff\n", __FUNCTION__));
4510 return FALSE;
4511 }
4512
4513 pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
4514
4515 MVD_DEBUGINFO(printf("\nMIU is (shm,hw,fw)=(%x,%x,%x)\n",u8SHMMiuSel,pstMemCfg->u8HWMiuSel,pstMemCfg->u8FWMiuSel));
4516
4517 curSrcMode = HAL_MVD_GetSrcMode(u8Idx);
4518
4519 HAL_MVD_SetVolInfoBufferAddr(u8Idx, pBuff->pu8MVDGetVolBufStart);
4520 _MVD_Memset(pBuff->pu8MVDGetVolBufStart, 0, MVD3_FW_VOL_INFO_BUF_LEN);
4521
4522 pBuff->u32VolAdd = pBuff->pu8MVDGetVolBufStart;
4523
4524 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,pBuff->u32VolAdd,pBuff->u32VolAdd);
4525
4526 pBuff->u32VolAdd = HAL_MVD_PA2NonCacheSeg(pBuff->u32VolAdd);
4527 MVD_DEBUGINFO(printf("gvolInfo = 0x%lx, volBuf=0x%lx\n", (unsigned long)pBuff->u32VolAdd, (unsigned long)pBuff->pu8MVDGetVolBufStart));
4528
4529 HAL_MVD_SetFrameInfoBufferAddr(u8Idx, pBuff->pu8MVDGetFrameInfoBufStart);
4530 _MVD_Memset(pBuff->pu8MVDGetFrameInfoBufStart, 0, MVD3_FW_FRAME_INFO_BUF_LEN);
4531
4532 HAL_MVD_SetHeaderBufferAddr(u8Idx, pBuff->pu8MVDSetHeaderBufStart);
4533 HAL_MVD_SetUserDataBuf(u8Idx, pBuff->u32UserDataBuf, MVD3_FW_USER_DATA_BUF_LEN);
4534 pCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
4535 pCtrlCfg->u32UsrDataRd = pBuff->u32UserDataBuf;
4536
4537
4538 if((curSrcMode != E_MVD_TS_FILE_MODE)
4539 && (curSrcMode != E_MVD_TS_MODE))
4540 {
4541 _MVD_Memset(pBuff->u32MVDFWSLQTABTmpbufAdr, 0, MVD3_FW_SLQ_TAB_TMPBUF_LEN);
4542 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWSLQTABTmpbufAdr, 0xBE010000UL);
4543 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWSLQTABTmpbufAdr+4, 0x000000FAUL);
4544
4545 HAL_MVD_SetPtsTblAddr(u8Idx, pBuff->u32MVDFWPtsTblAddr);
4546 for (i=0; i<MVD_FW_SLQTBL_PTS_BUF_LEN; i+=MVD_FW_SLQTBL_PTS_LEN)
4547 {
4548 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWPtsTblAddr+i, 0); //byteCnt
4549 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWPtsTblAddr+i+4, 0); //dummyPktCnt
4550 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWPtsTblAddr+i+8, 0); //idLow
4551 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWPtsTblAddr+i+12, 0); //idHigh
4552
4553 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWPtsTblAddr+i+16, MVD_NULLPKT_PTS); //PTS
4554 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWPtsTblAddr+i+20, 0); //reserved0
4555 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWPtsTblAddr+i+24, 0); //reserved1
4556 HAL_MVD_MemWrite4Byte(pBuff->u32MVDFWPtsTblAddr+i+28, 0); //reserved2
4557 }
4558 //MS_ASSERT((u32MVDFWPtsTblAddr+MVD_FW_SLQTBL_PTS_BUF_LEN)<=(u32start+u32len));
4559 MVD_DEBUGINFO(printf("PTS tbl start=%lx end=%lx\n",
4560 (unsigned long)pBuff->u32MVDFWPtsTblAddr, (unsigned long)(pBuff->u32MVDFWPtsTblAddr+MVD_FW_SLQTBL_PTS_BUF_LEN)));
4561
4562 pBuff->u32VBBUTableAdd = VBBU_TABLE_START+u8Idx*0x100000;
4563 }
4564
4565 if (pstMemCfg->bEnableDynScale)
4566 {
4567 HAL_MVD_SetDynamicScaleAddr(u8Idx, pBuff->u32DynScalingAdd, 0);
4568 HAL_MVD_EnableDynamicScale(u8Idx,0); //default old DS style
4569 MVD_DEBUGINFO(printf("u8EnableMIUSel = 0x%x\n", pMVDHalContext->stMiuCfg.u8FWMiuSel));
4570 MVD_DEBUGINFO(printf("u32DynScalingAddr= 0x%lx\n", (unsigned long)pBuff->u32DynScalingAdd));
4571 MVD_DEBUGINFO(printf("u8DynScalingDepth= 0x%x\n", pCtrlCfg->u8DynScalingDepth));
4572 }
4573 MVD_DEBUGINFO(printf("DynScaling start=%lx end=%lx\n",
4574 (unsigned long)pBuff->u32DynScalingAdd, (unsigned long)(pBuff->u32DynScalingAdd+MVD_FW_DYN_SCALE_BUF_LEN)));
4575
4576 HAL_MVD_SetDecFrmInfoAddr(u8Idx, pBuff->u32DecFrmInfoAdd);
4577
4578 MVD_RstFrmInfo(u8Idx, E_MVD_FRMINFO_DECODE);
4579 MVD_RstFrmInfo(u8Idx, E_MVD_FRMINFO_DISPLAY);
4580 MVD_DEBUGINFO(printf("DecFrmInfo start=%lx\n", (unsigned long)pBuff->u32DecFrmInfoAdd));
4581
4582 if (curSrcMode == E_MVD_SLQ_TBL_MODE)
4583 {
4584 HAL_MVD_SLQTblInit(u8Idx);
4585 }
4586
4587 return TRUE;
4588 }
4589
4590 #ifdef VDEC3
4591 #else
MVD_IsNextDispFrmRdy(MS_U8 u8Idx)4592 static MS_BOOL MVD_IsNextDispFrmRdy(MS_U8 u8Idx)
4593 {
4594 #define NXT_DISP_TIMEOUT 20000//0x20
4595 MS_U32 u32TimeOut = 0;
4596 MVD_CmdArg mvdcmd;
4597
4598 HAL_MVD_ResetHandShake(u8Idx, MVD_HANDSHAKE_GET_NXTDISPFRM);
4599 SETUP_CMDARG(mvdcmd);
4600 SET_DECNUM(mvdcmd, u8Idx);
4601 SET_CMD_RET_FALSE(CMD_GET_NEXTDISPFRM, &mvdcmd);
4602
4603 while(!HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_GET_NXTDISPFRM) && (u32TimeOut < NXT_DISP_TIMEOUT))
4604 {
4605 u32TimeOut++;
4606 }
4607 if(u32TimeOut >= NXT_DISP_TIMEOUT)
4608 {
4609 MVD_DEBUGERROR( printf( "Ctrl: 0x%x fail!!\r\n", CMD_GET_NEXTDISPFRM ) );
4610 return FALSE;
4611 }
4612 return TRUE;
4613 }
4614 #endif
4615
HAL_MVD_GetExtDispInfo(MS_U8 u8Idx,MVD_ExtDispInfo * pInfo)4616 void HAL_MVD_GetExtDispInfo(MS_U8 u8Idx, MVD_ExtDispInfo* pInfo)
4617 {
4618 pInfo->u16VSize = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DISP_V_SIZE, sizeof(MS_U16));
4619 pInfo->u16HSize = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DISP_H_SIZE, sizeof(MS_U16));
4620 pInfo->u16VOffset = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_CENTRE_V_OFFSET, sizeof(MS_U16));
4621 pInfo->u16HOffset = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_CENTRE_H_OFFSET, sizeof(MS_U16));
4622 }
4623
HAL_MVD_GetFrmInfo(MS_U8 u8Idx,MVD_FrmInfoType eType,MVD_FrmInfo * pInfo)4624 E_MVD_Result HAL_MVD_GetFrmInfo(MS_U8 u8Idx, MVD_FrmInfoType eType, MVD_FrmInfo* pInfo)
4625 {
4626 MS_U32 u32Id = MVD_GetStreamId(u8Idx);
4627 MS_U8 u8VPUIdx = HAL_VPU_EX_GetTaskId(u32Id);
4628 E_MVD_Result eRet = E_MVD_RET_OK;
4629 MS_VIRT u32DecFrmInfoAdd = GET_DECFRMINFO_BUFFADD(u8Idx);
4630 #if v3_temp
4631 MVD_MEMCfg* pstMemCfg = NULL;
4632 pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
4633 #endif
4634 if (NULL == pInfo)
4635 {
4636 MVD_DEBUGERROR(printf("GetFrmInfo NULL pInfo!\n"));
4637 return E_MVD_RET_INVALID_PARAM;
4638 }
4639 if (NULL == u32DecFrmInfoAdd)
4640 {
4641 MVD_DEBUGERROR(printf("GetFrmInfo NULL u32DecFrmInfoAdd!\n"));
4642 return E_MVD_RET_FAIL;
4643 }
4644 //printf("%s u32DecFrmInfoAdd = 0x%x\n", __FUNCTION__, u32DecFrmInfoAdd);
4645
4646 if (E_MVD_FRMINFO_DECODE == eType)
4647 {
4648 pInfo->u32LumaAddr = HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_LUMAADDR);
4649 pInfo->u32ChromaAddr= HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_CHROMAADDR);
4650 pInfo->u32TimeStamp = _90K_TO_MS(HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_TIMESTAMP));
4651 pInfo->u32ID_L = HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_ID_L);
4652 pInfo->u32ID_H = HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_ID_H);
4653 pInfo->u16Pitch = HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_PITCH);
4654 pInfo->u16Width = HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_WIDTH);
4655 pInfo->u16Height= HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_HEIGHT);
4656 pInfo->eFrmType = (MVD_PicType)HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DEC_FRAMETYPE);
4657 }
4658 else if (E_MVD_FRMINFO_DISPLAY == eType)
4659 {
4660 pInfo->u32LumaAddr = HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_LUMAADDR);
4661 pInfo->u32ChromaAddr= HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_CHROMAADDR);
4662 pInfo->u32TimeStamp = _90K_TO_MS(HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_TIMESTAMP));
4663 pInfo->u32ID_L = HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_ID_L);
4664 pInfo->u32ID_H = HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_ID_H);
4665 pInfo->u16Pitch = HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_PITCH);
4666 pInfo->u16Width = HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_WIDTH);
4667 pInfo->u16Height= HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_HEIGHT);
4668 pInfo->eFrmType = (MVD_PicType)HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_DISP_FRAMETYPE);
4669 }
4670
4671 else if (E_MVD_FRMINFO_NEXT_DISPLAY == eType)
4672 {
4673 #if v3_temp
4674 DISPQ_IN_DRAM* pTemp = (DISPQ_IN_DRAM*)(MS_PA2KSEG1(pstMemCfg->u32FWCodeAddr+DISP_QUEUE_START+ u8VPUIdx*0x100000));
4675 if (pTemp->dispQ_rd == pTemp->dispQ_wr)
4676 {
4677 MVD_DEBUGINFO(printf("NextDispFrm not ready!\n"));
4678 return E_MVD_RET_FAIL;
4679 }
4680 pInfo->u16FrmIdx = pTemp->disp_info[pTemp->dispQ_rd].u16NextDispFrameIdx;
4681
4682 pInfo->u32LumaAddr = pTemp->disp_info[pTemp->dispQ_rd].u32NextDispLumaAddr;
4683
4684 pInfo->u32ChromaAddr= pTemp->disp_info[pTemp->dispQ_rd].u32NextDispChromaAddr;
4685 // 64BIT_PTS = (TimeStamp | (ID_H<<32)) , unit: 90K
4686 pInfo->u32TimeStamp = pTemp->disp_info[pTemp->dispQ_rd].u32NextDispTimeStamp;
4687
4688 pInfo->u32ID_H = pTemp->disp_info[pTemp->dispQ_rd].u32NextDispID_H;
4689
4690 pInfo->u16Width = pTemp->disp_info[pTemp->dispQ_rd].u16NextDispWidth;
4691
4692 if(HAL_MVD_IsMcuMode(u8Idx))
4693 {
4694 //bit[19-20] Picture format,
4695 //bit[18-17] Disp times, 1~3
4696 //bit[16] Top field first , 0-> bottom first, 1-> top first
4697 //bit[15:8] Range reduction of luma data
4698 //bit[7:0] Range reduction of chroma data
4699 pInfo->u32ID_L = (MS_U32)pTemp->disp_info[pTemp->dispQ_rd].u8NextDispRangeRed_UV
4700 | (MS_U32)(pTemp->disp_info[pTemp->dispQ_rd].u8NextDispRangeRed_Y << 8)
4701 | (MS_U32)(pTemp->disp_info[pTemp->dispQ_rd].u16ExtData << 16)
4702 | (MS_U32)(pTemp->disp_info[pTemp->dispQ_rd].u8Progressive << 19);
4703
4704 if (pInfo->u16Width & MVD_WIDTH_ALIGN_MASK)
4705 {
4706 pInfo->u16Width = ((pInfo->u16Width >> MVD_WIDTH_ALIGN_BITS) + 1) << MVD_WIDTH_ALIGN_BITS;
4707 }
4708 }
4709 else
4710 {
4711 pInfo->u32ID_L = pTemp->disp_info[pTemp->dispQ_rd].u32DispID_L;
4712 }
4713 pInfo->u16Pitch = pTemp->disp_info[pTemp->dispQ_rd].u16NextDispPitch;
4714 pInfo->u16Height= pTemp->disp_info[pTemp->dispQ_rd].u16NextDispHeight;
4715 pInfo->eFrmType = pTemp->disp_info[pTemp->dispQ_rd].u16NextDispeFrameType;
4716
4717 pTemp->bUsedByOutside[pInfo->u16FrmIdx]++;
4718
4719 pTemp->dispQ_rd = (pTemp->dispQ_rd+1)%DISPQ_SIZE;
4720 MsOS_FlushMemory();
4721 #else
4722 if (!MVD_IsNextDispFrmRdy(u8Idx))
4723 {
4724 MVD_DEBUGINFO(printf("NextDispFrm not ready!\n"));
4725 return E_MVD_RET_FAIL;
4726 }
4727 pInfo->u16FrmIdx= HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_FRAMEIDX);
4728 if (pInfo->u16FrmIdx == 0xFFFF)
4729 {
4730 MVD_DEBUGINFO(printf("GetFrmInfo no available frame!\n"));
4731 return E_MVD_RET_FAIL;
4732 }
4733 pInfo->u32LumaAddr = HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_LUMAADDR);
4734 pInfo->u32ChromaAddr= HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_CHROMAADDR);
4735 // 64BIT_PTS = (TimeStamp | (ID_H<<32)) , unit: 90K
4736 pInfo->u32TimeStamp = (HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_TIMESTAMP));
4737 pInfo->u32ID_H = HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_ID_H);
4738 pInfo->u16Width = HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_WIDTH);
4739 if(HAL_MVD_IsMcuMode(u8Idx))
4740 {
4741 //bit[18-17] Disp times, 1~3
4742 //bit[16] Top field first , 0-> bottom first, 1-> top first
4743 //bit[15:8] Range reduction of luma data
4744 //bit[7:0] Range reduction of chroma data
4745 pInfo->u32ID_L = (MS_U32)HAL_MVD_MemReadByte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_RANGERED_UV)
4746 | (MS_U32)(HAL_MVD_MemReadByte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_RANGERED_Y) << 8)
4747 | (MS_U32)(HAL_MVD_MemReadByte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_EXT_DATA) << 16);
4748 if (pInfo->u16Width & MVD_WIDTH_ALIGN_MASK)
4749 {
4750 pInfo->u16Width = ((pInfo->u16Width >> MVD_WIDTH_ALIGN_BITS) + 1) << MVD_WIDTH_ALIGN_BITS;
4751 }
4752 }
4753 else
4754 {
4755 pInfo->u32ID_L = HAL_MVD_MemRead4Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_ID_L);
4756 }
4757 pInfo->u16Pitch = HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_PITCH);
4758 pInfo->u16Height= HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_HEIGHT);
4759 pInfo->eFrmType = (MVD_PicType)HAL_MVD_MemRead2Byte(u32DecFrmInfoAdd + OFFSET_DECFRAMEINFO_NEXTDISP_FRAMETYPE);
4760 #endif
4761 #if 0
4762 printf("NxtFrm:: Idx=0x%x, ", pInfo->u16FrmIdx);
4763 printf("Type=0x%x, ", pInfo->eFrmType );
4764 printf("Luma=0x%x, ", pInfo->u32LumaAddr );
4765 printf("Chroma=0x%x, ", pInfo->u32ChromaAddr);
4766 printf("Pts=%lu, ", pInfo->u32TimeStamp );
4767 printf("ID_H=%lu, ", pInfo->u32ID_H );
4768 printf("ID_L=0x%x\n", pInfo->u32ID_L );
4769 #endif
4770 MVD_DBG_STS(printf("<<< drvMVD pts,idH = %lu, %lu\n", pInfo->u32TimeStamp, pInfo->u32ID_H));
4771 }
4772 else
4773 {
4774 eRet = E_MVD_RET_INVALID_PARAM;
4775 }
4776
4777 if ((pInfo->u32LumaAddr == _INIT_ADDR) || (pInfo->u32ChromaAddr== _INIT_ADDR) ||
4778 (pInfo->u16Pitch == _INIT_LEN) || (pInfo->u16Width == _INIT_LEN) ||
4779 (pInfo->u16Height== _INIT_LEN))
4780 {
4781 MVD_DEBUGINFO(printf("GetFrmInfo not ready!\n"));
4782 return E_MVD_RET_FAIL;
4783 }
4784
4785 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,(pInfo->u32LumaAddr * 8),pInfo->u32LumaAddr);
4786 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,(pInfo->u32ChromaAddr * 8),pInfo->u32ChromaAddr);
4787
4788 //printf("===> Luma=0x%x, Chroma=0x%x\n", pInfo->u32LumaAddr, pInfo->u32ChromaAddr);
4789 return eRet;
4790 }
4791
4792
4793
HAL_MVD_SetDynScalingParam(MS_U8 u8Idx,MS_PHY u32StAddr,MS_SIZE u32Size)4794 E_MVD_Result HAL_MVD_SetDynScalingParam(MS_U8 u8Idx, MS_PHY u32StAddr, MS_SIZE u32Size)
4795 {
4796 #define SCALER_INFO_TIMEOUT 0x1000
4797 MS_U32 u32TimeOut = 0;
4798 MS_VIRT u32SrcAdd = NULL;
4799 MS_U32 i;
4800 MS_VIRT u32ScalerInfoAdd = GET_XCINFO_BUFFADD(u8Idx);
4801 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
4802
4803 if ((u32StAddr==0) || (u32Size==0) || (u32Size>MVD_FW_SCALER_INFO_BUF_LEN))
4804 {
4805 MVD_DEBUGERROR(printf("%s invalid para u32StAddr=0x%lx, u32Size=0x%lx\n",
4806 __FUNCTION__, (unsigned long)u32StAddr, (unsigned long)u32Size));
4807 return E_MVD_RET_INVALID_PARAM;
4808 }
4809 if (TRUE != pstMemCfg->bEnableDynScale)
4810 {
4811 MVD_DEBUGERROR(printf("%s !bEnableDynScale\n", __FUNCTION__));
4812 return E_MVD_RET_FAIL;
4813 }
4814
4815 //copy data
4816 u32SrcAdd = HAL_MVD_PA2NonCacheSeg(u32StAddr);
4817 u32Size = ((u32Size+3)>>2)<<2;
4818 MVD_DEBUGINFO(printf("u32Size= 0x%lx, u32SrcAdd= 0x%lx\n", (unsigned long)u32Size, (unsigned long)u32SrcAdd));
4819 for (i=0; i<u32Size; i=i+4)
4820 {
4821 HAL_MVD_MemWrite4Byte(u32ScalerInfoAdd+i, *(volatile MS_U32*)(u32SrcAdd+i));
4822 MVD_DEBUGINFO(printf("0x%lx = 0x%x\n", (unsigned long)(u32ScalerInfoAdd+i), HAL_MVD_MemRead4Byte(u32ScalerInfoAdd+i)));
4823 }
4824
4825 //notify f/w
4826 HAL_MVD_ResetHandShake(u8Idx, MVD_HANDSHAKE_SCALER_INFO);
4827 if (TRUE!=HAL_MVD_SetScalerInfoAddr(u8Idx, u32ScalerInfoAdd,((MS_U8*)u32SrcAdd)[0])) //Set the buffer address (MIU offset) to f/w
4828 {
4829 MVD_DEBUGERROR(printf("%s fail to set ScalerInfoAdd\n", __FUNCTION__));
4830 return E_MVD_RET_FAIL;
4831 }
4832
4833 //check f/w already handle the data
4834 while((TRUE!=HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_SCALER_INFO)) && (u32TimeOut < SCALER_INFO_TIMEOUT))
4835 {
4836 u32TimeOut++;
4837 }
4838 if(u32TimeOut >= SCALER_INFO_TIMEOUT)
4839 {
4840 MVD_DEBUGERROR(printf("%s timeout!!!\n", __FUNCTION__));
4841 return E_MVD_RET_FAIL;
4842 }
4843
4844 //clear ack bit
4845 HAL_MVD_ClearCmdFinished(u8Idx, MVD_HANDSHAKE_SCALER_INFO);
4846
4847 MVD_DEBUGINFO(printf("=====> %s u32TimeOut = 0x%x\n", __FUNCTION__, u32TimeOut));
4848 return E_MVD_RET_OK;
4849 }
4850
4851 //Map driver CodecType to firmware CodecType
MVD_MapCodecType(MVD_CodecType type)4852 static MS_U8 MVD_MapCodecType(MVD_CodecType type)
4853 {
4854 MS_U8 u8type = 0xff;
4855 switch (type)
4856 {
4857 case E_MVD_CODEC_MPEG2:
4858 u8type = CODEC_MPEG2;
4859 break;
4860 case E_MVD_CODEC_MPEG4:
4861 u8type = CODEC_MPEG4;
4862 break;
4863 case E_MVD_CODEC_MPEG4_SHORT_VIDEO_HEADER:
4864 u8type = CODEC_MPEG4_SHORT_VIDEO_HEADER;
4865 break;
4866 case E_MVD_CODEC_DIVX311:
4867 u8type = CODEC_DIVX311;
4868 break;
4869
4870 case E_MVD_CODEC_FLV:
4871 u8type = 0x03;
4872 break;
4873
4874 case E_MVD_CODEC_VC1_MAIN: //RCV
4875 u8type = 0x05;
4876 break;
4877
4878 case E_MVD_CODEC_VC1_ADV: //VC1
4879 u8type = 0x04;
4880 break;
4881
4882 default:
4883 break;
4884 }
4885
4886 return u8type;
4887 }
4888
4889 //Map driver SrcType to firmware SrcType
MVD_MapSrcMode(MVD_SrcMode mode)4890 static MS_U8 MVD_MapSrcMode(MVD_SrcMode mode)
4891 {
4892 MS_U8 u8mode = 0xff;
4893 switch (mode)
4894 {
4895 case E_MVD_TS_MODE:
4896 u8mode = STREAM_MODE;
4897 break;
4898 case E_MVD_FILE_MODE:
4899 u8mode = FILE_MODE;
4900 break;
4901 case E_MVD_SLQ_MODE:
4902 u8mode = SLQ_MODE;
4903 break;
4904 case E_MVD_SLQ_TBL_MODE:
4905 u8mode = SLQ_TBL_MODE;
4906 break;
4907 case E_MVD_TS_FILE_MODE:
4908 u8mode = TS_FILE_MODE;
4909 break;
4910
4911 default:
4912 break;
4913 }
4914
4915 return u8mode;
4916 }
4917
4918
MVD_CheckFrmBuffSizeMin(MVD_FWCfg * fwCfg,MVD_MEMCfg * memCfg)4919 static MS_BOOL MVD_CheckFrmBuffSizeMin(MVD_FWCfg* fwCfg, MVD_MEMCfg* memCfg)
4920 {
4921 MS_BOOL ret = TRUE;
4922
4923 if (_IS_VC1(fwCfg->eCodecType))
4924 {
4925 MVD_DEBUGERROR(printf("Framebuffer size(0x%lx) < (0x%x+0x%lx)!\n",
4926 (unsigned long)memCfg->u32FBSize, (MVD_HD_FBSIZE*MVD_FBNUM_MIN), MVD_HW_BUF_TOTAL_LEN));
4927 ret = FALSE;
4928 }
4929 else if (memCfg->u32FBSize < (MVD4_MPEG_FBSIZE_SDMIN+MVD_HW_BUF_TOTAL_LEN))
4930 {
4931 MVD_DEBUGERROR(printf("Framebuffer size(0x%lx) < (0x%x+0x%lx)\n",
4932 (unsigned long)memCfg->u32FBSize, MVD4_MPEG_FBSIZE_SDMIN, MVD_HW_BUF_TOTAL_LEN));
4933 ret = FALSE;
4934 }
4935 return ret;
4936 }
4937
MVD_GetUsedFrmBuffSize(MS_U8 u8FBMode,MS_U8 u8FBNum)4938 MS_U32 MVD_GetUsedFrmBuffSize(MS_U8 u8FBMode, MS_U8 u8FBNum)
4939 {
4940 MS_U32 u32Size = 0;
4941 if (MVD3_DHD_MODE == u8FBMode)
4942 {
4943 u32Size = MVD_DHD_FBSIZE;
4944 if (MVD_FBNUM_MAX == u8FBNum)
4945 {
4946 u32Size *= MVD_FBNUM_MAX;
4947 }
4948 else if (MVD_FBNUM_MIN == u8FBNum)
4949 {
4950 u32Size *= MVD_FBNUM_MIN;
4951 }
4952 }
4953 else if (MVD3_HD_MODE == u8FBMode)
4954 {
4955 u32Size = MVD_HD_FBSIZE;
4956 if (MVD_FBNUM_MAX == u8FBNum)
4957 {
4958 u32Size *= MVD_FBNUM_MAX;
4959 }
4960 else if (MVD_FBNUM_MIN == u8FBNum)
4961 {
4962 u32Size *= MVD_FBNUM_MIN;
4963 }
4964 }
4965 else if (MVD3_SD_MODE == u8FBMode)
4966 {
4967 u32Size = MVD4_MPEG_FBSIZE_SDMIN;
4968 }
4969 return u32Size;
4970 }
4971
4972 //------------------------------------------------------------------------------
4973 /// Determine u8FBMode & u8FBNum according to the assigned FBSize
4974 //------------------------------------------------------------------------------
HAL_MVD_CheckFrmBuffSize(MS_U8 u8Idx,MVD_FWCfg * fwCfg,MVD_MEMCfg * memCfg)4975 MS_BOOL HAL_MVD_CheckFrmBuffSize(MS_U8 u8Idx, MVD_FWCfg* fwCfg, MVD_MEMCfg* memCfg)
4976 {
4977 MS_BOOL ret = TRUE;
4978 MS_U8* pu8FBMode = &(fwCfg->u8FBMode);
4979 MS_U8* pu8FBNum = &(fwCfg->u8FBNum);
4980 MS_U32 u32AvailFrmBuffSize = memCfg->u32FBSize - MVD_HW_BUF_TOTAL_LEN;
4981 #ifndef CONFIG_MBOOT //Add For GPL (content protection)
4982 ret = MDrv_MVD_AUTH_IPCheck(fwCfg->eCodecType,&(memCfg->bSupportSDModeOnly));
4983 if(ret == FALSE)
4984 {
4985 return FALSE;
4986 }
4987 #else
4988 memCfg->bSupportSDModeOnly = FALSE;
4989 #endif
4990 *pu8FBMode = 0xff;
4991
4992 #if defined(MVD_SUPPORT_SD_ONLY)
4993 *pu8FBMode = MVD3_SD_MODE;
4994 #else
4995 if(memCfg->bSupportSDModeOnly)
4996 {
4997 *pu8FBMode = MVD3_SD_MODE;
4998 }
4999 #endif //MVD_SUPPORT_SD_ONLY
5000
5001 //For SD only cases: defined(MVD_SUPPORT_SD_ONLY) and bSupportSDModeOnly
5002 if (MVD3_SD_MODE == *pu8FBMode)
5003 {
5004 ret = MVD_CheckFrmBuffSizeMin(fwCfg, memCfg);
5005
5006 //set frmBuffNum as 4
5007 *pu8FBNum = MVD_FBNUM_MIN;
5008 MVD_DEBUGINFO(printf("[MVD_SD_MODE] u8FBNum=%d, FBSize=0x%lx\n", *pu8FBNum, (unsigned long)memCfg->u32FBSize));
5009 goto _GET_USED_SIZE;
5010 }
5011
5012 if (u32AvailFrmBuffSize >= (MVD_DHD_FBSIZE*MVD_FBNUM_MAX))
5013 {
5014 MVD_DEBUGINFO(printf("%s(%d) DHD*5\n", __FUNCTION__, __LINE__));
5015 //Dual HD: (1920*2)*1088 or 1920*(1088*2)
5016 if (!_IS_VC1(fwCfg->eCodecType)) //mpeg2/4
5017 {
5018 *pu8FBMode = MVD3_DHD_MODE;
5019 }
5020 else
5021 {
5022 *pu8FBMode = MVD3_DHD_MODE_MIN;
5023 }
5024 *pu8FBNum = MVD_FBNUM_MAX;
5025 }
5026 else if (u32AvailFrmBuffSize >= (MVD_DHD_FBSIZE*MVD_FBNUM_MIN))
5027 {
5028 MVD_DEBUGINFO(printf("%s(%d) DHD*4\n", __FUNCTION__, __LINE__));
5029 //Dual HD: (1920*2)*1088 or 1920*(1088*2)
5030 if (!_IS_VC1(fwCfg->eCodecType)) //mpeg2/4
5031 {
5032 *pu8FBMode = MVD3_DHD_MODE;
5033 }
5034 else
5035 {
5036 *pu8FBMode = MVD3_DHD_MODE_MIN;
5037 }
5038 *pu8FBNum = MVD_FBNUM_MIN;
5039 }
5040 else if (u32AvailFrmBuffSize >= (MVD_HD_FBSIZE*MVD_FBNUM_MAX))
5041 {
5042 MVD_DEBUGINFO(printf("%s(%d) HD*5\n", __FUNCTION__, __LINE__));
5043 *pu8FBMode = MVD3_HD_MODE;
5044 *pu8FBNum = MVD_FBNUM_MAX;
5045 }
5046 else if (u32AvailFrmBuffSize >= (MVD_HD_FBSIZE*MVD_FBNUM_MIN))
5047 {
5048 MVD_DEBUGINFO(printf("%s(%d) HD*4\n", __FUNCTION__, __LINE__));
5049 *pu8FBMode = MVD3_HD_MODE;
5050 *pu8FBNum = MVD_FBNUM_MIN;
5051 }
5052 else
5053 {
5054 MVD_DEBUGINFO(printf("%s(%d) SD\n", __FUNCTION__, __LINE__));
5055 ret = MVD_CheckFrmBuffSizeMin(fwCfg, memCfg);
5056 if (TRUE == ret)
5057 {
5058 *pu8FBMode = MVD3_SD_MODE;
5059 *pu8FBNum = MVD_FBNUM_MIN;
5060 MVD_DEBUGINFO(printf("Framebuffer [SD] mode\n"));
5061 }
5062 }
5063
5064
5065 //Keep FBNum=4 for mpeg2/4, not-mstreamer/uniplayer/mcu mode.
5066 if (!_IS_VC1(fwCfg->eCodecType)) //mpeg2/4
5067 {
5068 if (*pu8FBNum != MVD_FBNUM_DEFAULT)
5069 {
5070 *pu8FBNum = MVD_FBNUM_DEFAULT;
5071 }
5072 }
5073
5074 _GET_USED_SIZE:
5075 fwCfg->u32FBUsedSize = u32AvailFrmBuffSize;
5076
5077 MVD_DEBUGINFO(printf("%s u8FBMode=0x%x, u8FBNum=%d, FBSize=0x%lx, used=0x%lx\n",
5078 __FUNCTION__, fwCfg->u8FBMode, fwCfg->u8FBNum, (unsigned long)memCfg->u32FBSize, (unsigned long)fwCfg->u32FBUsedSize));
5079 return ret;
5080 }
5081
HAL_MVD_SetCodecInfo(MS_U8 u8Idx,MVD_CodecType eCodecType,MVD_SrcMode eSrcMode,MS_U8 bDisablePESParsing)5082 MS_BOOL HAL_MVD_SetCodecInfo(MS_U8 u8Idx, MVD_CodecType eCodecType, MVD_SrcMode eSrcMode, MS_U8 bDisablePESParsing)
5083 {
5084 MVD_CmdArg stCmdArg;
5085 //printf("u8CodecType=0x%x\n", u8CodecType);
5086 //printf("eSrcMode=0x%x\n", eSrcMode);
5087 SETUP_CMDARG(stCmdArg);
5088 stCmdArg.Arg0 = MVD_MapCodecType(eCodecType);
5089 stCmdArg.Arg1 = MVD_MapSrcMode(eSrcMode);
5090 stCmdArg.Arg2 = bDisablePESParsing;
5091 //arg2 is only valid for STREAM_MODE and TS_FILE_MODE
5092 //set as 0 to enable MVD parser and parser interrupt
5093 stCmdArg.Arg3 = 0;
5094 MVD_DEBUGINFO(printf("MDrv_MVD_SetCodecInfo: Cmd: %x, Arg0: %x, Arg1: %x. Arg2: %x\n",
5095 CMD_CODEC_INFO, stCmdArg.Arg0, stCmdArg.Arg1, stCmdArg.Arg2));
5096 SET_DECNUM(stCmdArg, u8Idx);
5097 SET_CMD_RET_FALSE(CMD_CODEC_INFO, &stCmdArg);
5098
5099 HAL_MVD_SetSrcMode(u8Idx,eSrcMode);
5100
5101 //set code offset to MVD
5102 MS_VIRT u32Addr, u32Len;
5103 HAL_MVD_MemGetMap(u8Idx, E_MVD_MMAP_FW, &u32Addr, &u32Len);
5104
5105 if (u32Len==0) printf("%s err: u32Len=0!\n", __FUNCTION__);
5106 MS_U32 i=0;
5107 i = u32Addr >> 3;
5108 SET_CMDARG(stCmdArg, i, u8Idx);
5109 SET_CMD_RET_FALSE(CMD_CODE_OFFSET, &stCmdArg);
5110
5111 #define _mvdAssert(x) if(!x) printf("%s(%d) inconsistent cfg!\n", __FUNCTION__, __LINE__);
5112 MVD_FWCfg* pCurFwCfg = HAL_MVD_GetFWCfg(u8Idx);
5113 _mvdAssert(pCurFwCfg->eCodecType == eCodecType);
5114 _mvdAssert(pCurFwCfg->eSrcMode == eSrcMode);
5115 _mvdAssert(pCurFwCfg->bDisablePESParsing == bDisablePESParsing);
5116
5117 //Refer to msAPI_VDPlayer_DecodeMPEG4.c (core\kernel\api\videoplayer)
5118 if (eSrcMode == E_MVD_SLQ_TBL_MODE)
5119 {
5120 if ((eCodecType == E_MVD_CODEC_MPEG4) ||
5121 (eCodecType == E_MVD_CODEC_DIVX311) ||
5122 (eCodecType == E_MVD_CODEC_MPEG4_SHORT_VIDEO_HEADER))
5123 {
5124 // Enable PackMode
5125 SETUP_CMDARG(stCmdArg);
5126 stCmdArg.Arg0 = 3;
5127 SET_DECNUM(stCmdArg, u8Idx);
5128 if (HAL_MVD_MVDCommand( CMD_PARSE_M4V_PACKMD, &stCmdArg ) == FALSE)
5129 {
5130 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_PARSE_M4V_PACKMD ) );
5131 return FALSE;
5132 }
5133
5134 // Set DIU width of rounding mode (align to 8byte)
5135 SETUP_CMDARG(stCmdArg);
5136 stCmdArg.Arg0 = 1;
5137 SET_DECNUM(stCmdArg, u8Idx);
5138 if (HAL_MVD_MVDCommand(CMD_DIU_WIDTH_ALIGN, &stCmdArg) == FALSE)
5139 {
5140 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DIU_WIDTH_ALIGN ) );
5141 return FALSE;
5142 }
5143 }
5144 }
5145
5146 //set internal buffers after setting codecinfo for V3
5147 if (!HAL_MVD_SetInternalBuffAddr(u8Idx, u32Addr, u32Len))
5148 {
5149 MVD_DEBUGERROR(printf("MDrv_MVD_Init:_MVD_MVDSetInternalBuffAddr failed\n"));
5150 return FALSE;
5151 }
5152 else
5153 {
5154 MVD_DEBUGINFO(printf("MDrv_MVD_Init:_MVD_MVDSetInternalBuffAddr success\n"));
5155 }
5156
5157 return TRUE;
5158 }
5159
MVD_GetBDMAType(void)5160 BDMA_CpyType MVD_GetBDMAType(void)
5161 {
5162 BDMA_CpyType bdmaCpyType = E_BDMA_CPYTYPE_MAX;
5163
5164 if (pMVDHalContext->stMiuCfg.u8HWMiuSel == MIU_SEL_0)
5165 {
5166 if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_0)
5167 {
5168 bdmaCpyType = E_BDMA_SDRAM2SDRAM;
5169 }
5170 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_1)
5171 {
5172 bdmaCpyType = E_BDMA_SDRAM2SDRAM1;
5173 }
5174 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_2)
5175 {
5176 bdmaCpyType = E_BDMA_SDRAM2SDRAM2;
5177 }
5178 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_3)
5179 {
5180 bdmaCpyType = E_BDMA_SDRAM2SDRAM3;
5181 }
5182 else
5183 {
5184 MS_ASSERT(0);
5185 }
5186 }
5187 else if (pMVDHalContext->stMiuCfg.u8HWMiuSel == MIU_SEL_1)
5188 {
5189 if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_0)
5190 {
5191 bdmaCpyType = E_BDMA_SDRAM12SDRAM;
5192 }
5193 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_1)
5194 {
5195 bdmaCpyType = E_BDMA_SDRAM12SDRAM1;
5196 }
5197 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_2)
5198 {
5199 bdmaCpyType = E_BDMA_SDRAM12SDRAM2;
5200 }
5201 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_3)
5202 {
5203 bdmaCpyType = E_BDMA_SDRAM12SDRAM3;
5204 }
5205 else
5206 {
5207 MS_ASSERT(0);
5208 }
5209 }
5210 else if (pMVDHalContext->stMiuCfg.u8HWMiuSel == MIU_SEL_2)
5211 {
5212 if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_0)
5213 {
5214 bdmaCpyType = E_BDMA_SDRAM22SDRAM;
5215 }
5216 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_1)
5217 {
5218 bdmaCpyType = E_BDMA_SDRAM22SDRAM1;
5219 }
5220 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_2)
5221 {
5222 bdmaCpyType = E_BDMA_SDRAM22SDRAM2;
5223 }
5224 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_3)
5225 {
5226 bdmaCpyType = E_BDMA_SDRAM22SDRAM3;
5227 }
5228 else
5229 {
5230 MS_ASSERT(0);
5231 }
5232 }
5233 else if (pMVDHalContext->stMiuCfg.u8HWMiuSel == MIU_SEL_3)
5234 {
5235 if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_0)
5236 {
5237 bdmaCpyType = E_BDMA_SDRAM32SDRAM;
5238 }
5239 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_1)
5240 {
5241 bdmaCpyType = E_BDMA_SDRAM32SDRAM1;
5242 }
5243 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_2)
5244 {
5245 bdmaCpyType = E_BDMA_SDRAM32SDRAM2;
5246 }
5247 else if (pMVDHalContext->stMiuCfg.u8FWMiuSel == MIU_SEL_3)
5248 {
5249 bdmaCpyType = E_BDMA_SDRAM32SDRAM3;
5250 }
5251 else
5252 {
5253 MS_ASSERT(0);
5254 }
5255 }
5256 else
5257 {
5258 MS_ASSERT(0);
5259 }
5260
5261 return bdmaCpyType;
5262 }
5263
5264 //Init static variables.
5265 //Exception: stMemCfg & stMiuCfg since they are set before calling this function.
HAL_MVD_InitVar(MS_U8 u8Idx)5266 void HAL_MVD_InitVar(MS_U8 u8Idx)
5267 {
5268 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
5269 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
5270 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
5271
5272 memset(pstCtrlCfg, 0, sizeof(MVD_CtrlCfg));
5273 pstCtrlCfg->eTrickMode = E_MVD_TRICK_DEC_ALL;
5274 pstCtrlCfg->eFrcMode = E_MVD_FRC_NORMAL;
5275 pstCtrlCfg->ePreSpeedType = E_MVD_SPEED_DEFAULT;
5276 pstCtrlCfg->eFileSyncMode = E_MVD_TIMESTAMP_FREERUN;
5277
5278 //determine if we need to BDMA SLQ table from DrvProcBuff to BitstreamBuff
5279 pstCtrlCfg->bSlqTblSync = ((pstMemCfg->u32DrvBufAddr < pstMemCfg->u32BSAddr) ||
5280 ((pstMemCfg->u32DrvBufAddr+pstMemCfg->u32DrvBufSize) > (pstMemCfg->u32BSAddr+pstMemCfg->u32BSSize)));
5281 MVD_DEBUGINFO(printf("bSlqTblSync = %x\n", pstCtrlCfg->bSlqTblSync));
5282 if (pstCtrlCfg->bSlqTblSync)
5283 {
5284 const BDMA_Info* pBDMA;
5285 pBDMA = MDrv_BDMA_GetInfo();
5286 if ((pBDMA == NULL) || (pBDMA->bInit != TRUE))
5287 {
5288 if (E_BDMA_OK != MDrv_BDMA_Init(pstMemCfg->u32Miu1BaseAddr))
5289 {
5290 printf("%s fail at MDrv_BDMA_Init!!!\n", __FUNCTION__);
5291 }
5292 }
5293 pstSlqTblInfo->bdmaCpyType = MVD_GetBDMAType();
5294 }
5295
5296 memset(pstSlqTblInfo, 0, sizeof(MVD_SLQTBLInfo));
5297 pstSlqTblInfo->u32LastPts = MVD_NULLPKT_PTS;
5298 pstSlqTblInfo->u32PreEsRd = MVD_U32_MAX;
5299 pstSlqTblInfo->u32PreEsWr = 0;
5300 pstSlqTblInfo->pSlqStatus = &(pMVDHalContext->_SlqStatus[u8Idx]);
5301 pstSlqTblInfo->pDrvSlqTbl = &(pMVDHalContext->_drvSlqTbl[u8Idx]);
5302 pstSlqTblInfo->pDrvEsTbl = &(pMVDHalContext->_drvEsTbl[u8Idx]);
5303 pstSlqTblInfo->pDrvDivxTbl = &(pMVDHalContext->_drvDivxTbl[u8Idx]);
5304 #if SLQ_NEW_PUSH
5305 pstSlqTblInfo->pSlqStatus->u32SlqPatternAddr = 0;
5306 pstSlqTblInfo->pSlqStatus->u32SlqPushLength = 0;
5307 pstSlqTblInfo->pSlqStatus->bSlqPicStart = FALSE;
5308 pstSlqTblInfo->pSlqStatus->bSlqPicCollect = FALSE;
5309 pstSlqTblInfo->pSlqStatus->bSlqPicWaitNextStart = FALSE;
5310 pstSlqTblInfo->pSlqStatus->bSlqEnLastFrameShow =FALSE;
5311 pstSlqTblInfo->pSlqStatus->bSlqFireRdy = FALSE;
5312 pstSlqTblInfo->pSlqStatus->bSlqCtrlBit =FALSE;
5313 #endif
5314 pMVDHalContext->u32LastAliveTime[u8Idx] = 0;
5315 memset((void*)(&(pMVDHalContext->aliveInfo[u8Idx])), 0, sizeof(MVD_ALIVEInfo));
5316
5317 }
5318
5319 //------------------------------------------------------------------------------
5320 /// Issue Stop command.
5321 //------------------------------------------------------------------------------
HAL_MVD_Stop(MS_U8 u8Idx)5322 MS_BOOL HAL_MVD_Stop(MS_U8 u8Idx)
5323 {
5324 MVD_CmdArg mvdcmd;
5325 MS_BOOL bRet = TRUE;
5326
5327 #define STOP_TIMEOUT 500 //ms
5328 MS_U32 u32StartTime = 0;
5329 u32StartTime = HAL_MVD_GetTime();
5330
5331 SETUP_CMDARG(mvdcmd);
5332 SET_DECNUM(mvdcmd, u8Idx);
5333 HAL_MVD_ResetHandShake(u8Idx, MVD_HANDSHAKE_STOP);
5334
5335 if (HAL_MVD_MVDCommand(CMD_STOP, &mvdcmd) == FALSE)
5336 {
5337 MVD_DEBUGERROR(printf("Command: 0x%x fail!!\r\n", CMD_STOP));
5338 HAL_MVD_Delayms(1);
5339 if ( HAL_MVD_TimeOut(u8Idx) == TRUE )
5340 {
5341 MVD_DEBUGERROR(printf("*** MVD ERR: STOP TIMEOUT!!! ***\n"));
5342 }
5343 }
5344
5345 while(!HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_STOP))
5346 {
5347 if ((HAL_MVD_GetTime()-u32StartTime)>STOP_TIMEOUT)
5348 {
5349 MVD_DEBUGERROR( printf( "Ctrl: 0x%x fail timeout!!\r\n", CMD_STOP ) );
5350 break;
5351 }
5352 }
5353
5354 pMVDHalContext->bStopped[u8Idx] = TRUE;
5355 return bRet;
5356 }
5357
HAL_MVD_DeinitHW(void)5358 MS_BOOL HAL_MVD_DeinitHW(void)
5359 {
5360 //MVD HW reset
5361 if (!HAL_MVD_RstHW())
5362 {
5363 MVD_DEBUGERROR(printf("MDrv_MVD_Exit:MVD4ResetHW failed\n"));
5364 }
5365 else
5366 {
5367 MVD_DEBUGINFO(printf("MDrv_MVD_Exit:MVD4ResetHW success\n"));
5368 }
5369 HAL_MVD_PowerCtrl(DISABLE);
5370 return TRUE;
5371 }
5372
HAL_MVD_Exit(MS_U8 u8Idx)5373 MS_BOOL HAL_MVD_Exit(MS_U8 u8Idx)
5374 {
5375 MVD_DEBUGINFO(printf("MDrv_MVD_Exit:start\n"));
5376
5377 HAL_MVD_SetIsUsed(u8Idx, FALSE);
5378 pMVDHalContext->bAutoInsertDummyPattern[u8Idx] = FALSE;
5379 pMVDHalContext->bDropOnePTS[u8Idx] = FALSE;
5380 pMVDHalContext->u32DmxFrameRate[u8Idx] = 0;
5381 pMVDHalContext->u32DmxFrameRateBase[u8Idx] = 0;
5382
5383 return TRUE;
5384 }
5385
5386
5387 //------------------------------------------------------------------------------
5388 /// Set DivX311 stream info.
5389 /// @param divxInfo \b IN : DivX311 stream info.
5390 //------------------------------------------------------------------------------
MVD_WriteDivx311Data(MS_U8 u8Idx,FW_DIVX_INFO * divxInfo)5391 static void MVD_WriteDivx311Data(MS_U8 u8Idx, FW_DIVX_INFO *divxInfo)
5392 {
5393 MS_VIRT pu8MVDSetHeaderBufStart = GET_HDR_BUFFADD(u8Idx);
5394 HAL_MVD_MemWrite4Byte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_VOL_HANDLE_DONE,divxInfo->vol_handle_done);
5395 HAL_MVD_MemWrite4Byte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_WIDTH,divxInfo->width);
5396 HAL_MVD_MemWrite4Byte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_HEIGHT,divxInfo->height);
5397 HAL_MVD_MemWrite4Byte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_FRAME_COUNT,divxInfo->frame_count);
5398 HAL_MVD_MemWrite4Byte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_FRAME_TIME,divxInfo->frame_time);
5399 HAL_MVD_MemWrite2Byte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_PTS_INCR,divxInfo->pts_incr);
5400 HAL_MVD_MemWrite4Byte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_FRAME_RATE,divxInfo->frame_rate);
5401 HAL_MVD_MemWriteByte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_ASPECT_RATIO,divxInfo->aspect_ratio);
5402 HAL_MVD_MemWriteByte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_PROGRESSIVE_SEQUENCE,divxInfo->progressive_sequence);
5403 HAL_MVD_MemWriteByte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_MPEG1,divxInfo->mpeg1);
5404 HAL_MVD_MemWriteByte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_PLAY_MODE,divxInfo->play_mode);
5405 HAL_MVD_MemWriteByte(pu8MVDSetHeaderBufStart+OFFSET_DIVX_MPEG_FRC_MODE,divxInfo->mpeg_frc_mode);
5406 return;
5407 }
5408
HAL_MVD_SetFrameInfo(MS_U8 u8Idx,MVD_FrameInfo * pinfo)5409 void HAL_MVD_SetFrameInfo(MS_U8 u8Idx, MVD_FrameInfo *pinfo )
5410 {
5411 if (GET_HDR_BUFFADD(u8Idx)==0)
5412 {
5413 MVD_DEBUGERROR(printf("MDrv_MVD_SetFrameInfo error: pu8MVDSetHeaderBufStart=NULL\n"));
5414 return;
5415 }
5416
5417 FW_DIVX_INFO* pDivxInfo = &(pMVDHalContext->gdivxInfo[u8Idx]);
5418 pDivxInfo->width=pinfo->u16HorSize;
5419 pDivxInfo->height=pinfo->u16VerSize;
5420 pDivxInfo->aspect_ratio=pinfo->u8AspectRate;
5421 pDivxInfo->frame_rate = pinfo->u32FrameRate;
5422
5423 //for MM
5424 pDivxInfo->mpeg1=pinfo->u8MPEG1;
5425 pDivxInfo->pts_incr=pinfo->u16PTSInterval;
5426 pDivxInfo->play_mode=pinfo->u8PlayMode;
5427 pDivxInfo->mpeg_frc_mode=pinfo->u8FrcMode;
5428
5429 if(pinfo->u8Interlace==0)
5430 pDivxInfo->progressive_sequence=1;
5431 else
5432 pDivxInfo->progressive_sequence=0;
5433
5434 pDivxInfo->frame_count=0;
5435 pDivxInfo->frame_time=0;
5436 pDivxInfo->vol_handle_done=0;
5437 // pDivxInfo->invalidstream=0;
5438 MVD_DEBUGINFO(printf("set vol info,pts_incr=%d,\n",pDivxInfo->pts_incr));
5439 MVD_DEBUGINFO(printf("set vol info,width=%x,height=%x,frame_rate=%d,aspect_ratio=%x,\n",
5440 (unsigned int)pDivxInfo->width,(unsigned int)pDivxInfo->height,pDivxInfo->frame_rate,pDivxInfo->aspect_ratio));
5441 MVD_DEBUGINFO(printf("set vol info,progressive_sequence=%x,mpeg1=%x,play_mode=%x,\n",
5442 pDivxInfo->progressive_sequence,pDivxInfo->mpeg1,pDivxInfo->play_mode));
5443
5444 MVD_WriteDivx311Data(u8Idx, pDivxInfo);
5445 return;
5446 }
5447
5448
5449
5450 ///////////////////////////////////////////////////////////////////////////////
5451 /// Get Hardware Pointer of MVD CC Ring Buffer
5452 /// Return value:: The HW Pointer Address of MVD CC Ring Buffer
5453 /// @param u8CC608 \b IN
5454 /// - # TRUE for CC608 parser
5455 /// - # FALSE for CC708 parser
5456 ///////////////////////////////////////////////////////////////////////////////
HAL_CC_CM_GetMVDRB_HWAddr(MS_U8 u8CC608)5457 MS_VIRT HAL_CC_CM_GetMVDRB_HWAddr(MS_U8 u8CC608)
5458 {
5459 #if 1
5460 MVD_CmdArg mvdcmd;
5461 MS_VIRT u32CCWrPtr = 0;
5462
5463 SETUP_CMDARG(mvdcmd);
5464 mvdcmd.Arg3 = u8CC608;
5465 if (HAL_MVD_MVDCommand( CMD_RD_USER_WP, &mvdcmd ) == FALSE)
5466 {
5467 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_RD_USER_WP ) );
5468 return MVD_U32_MAX;
5469 }
5470 u32CCWrPtr = COMBU32(mvdcmd.Arg3, mvdcmd.Arg2, mvdcmd.Arg1, mvdcmd.Arg0) << 3;
5471 return u32CCWrPtr;
5472 #else
5473 MS_U32 u32MVDCC_Temp1 = 0;
5474 if (HAL_MVD_TimeOut(pstCmdArg->Arg5) == FALSE)
5475 {
5476 //HAL_MVD_ARGINIT();
5477 HAL_MVD_RegWriteByte(MVD_ARG5, 0);
5478 HAL_MVD_RegWriteByte(MVD_ARG4, 0);
5479 HAL_MVD_RegWriteByte(MVD_ARG3, (MS_U8)u8CC608);
5480 HAL_MVD_RegWriteByte(MVD_COMMAND, (MS_U8)(CMD_RD_USER_WP));//CMD_GET_CCBUF_HWADDR
5481
5482 if (HAL_MVD_TimeOut(pstCmdArg->Arg5) == FALSE)
5483 {
5484 u32MVDCC_Temp1 = 0;
5485 u32MVDCC_Temp1 = (((MS_U32)HAL_MVD_RegReadByte(MVD_ARG0)) & 0x000000FF);
5486 u32MVDCC_Temp1 += ((((MS_U32)HAL_MVD_RegReadByte(MVD_ARG1)) & 0x000000FF) << 8);
5487 u32MVDCC_Temp1 += ((((MS_U32)HAL_MVD_RegReadByte(MVD_ARG2)) & 0x000000FF) << 16);
5488 u32MVDCC_Temp1 = (u32MVDCC_Temp1 << 3);
5489 return (u32MVDCC_Temp1);
5490 }
5491 else
5492 {
5493 MVD_DEBUGINFO(printf("\nF:GHAV"));
5494 }
5495 }
5496 else
5497 {
5498 MVD_DEBUGINFO(printf("\nF:GHA"));
5499 }
5500
5501 return 0xffffffff;
5502 #endif
5503 }
5504
HAL_MVD_GetUsrDataIsAvailable(MS_U8 u8Idx)5505 MS_BOOL HAL_MVD_GetUsrDataIsAvailable(MS_U8 u8Idx)
5506 {
5507 volatile MVD_CtrlCfg* pCtrlCfg = (volatile MVD_CtrlCfg*)HAL_MVD_GetCtrlCfg(u8Idx);
5508 MS_VIRT u32UsrDataWr = 0;
5509 MS_BOOL bIsAvail = FALSE;
5510
5511 #if defined(MVD_SUPPORT_X4_CC)
5512 u32UsrDataWr = HAL_CC_CM_GetMVDRB_HWAddr(4)>>3;
5513 #else
5514 u32UsrDataWr = HAL_CC_CM_GetMVDRB_HWAddr(2)>>3;
5515 #endif
5516 bIsAvail = !(pCtrlCfg->u32UsrDataRd == u32UsrDataWr);
5517 MVD_DEBUGINFO(printf("IsAvail:%x rd=%lx wr=%lx\n", bIsAvail,
5518 (unsigned long)pCtrlCfg->u32UsrDataRd, (unsigned long)u32UsrDataWr));
5519 return bIsAvail;
5520 }
5521
5522 //------------------------------------------------------------------------------
5523 /// Get info of user data
5524 //------------------------------------------------------------------------------
HAL_MVD_GetUsrDataInfo(MS_U8 u8Idx,MVD_UsrDataInfo * pUsrInfo)5525 MS_BOOL HAL_MVD_GetUsrDataInfo(MS_U8 u8Idx, MVD_UsrDataInfo* pUsrInfo)
5526 {
5527 MS_VIRT u32UsrData = NULL;
5528 MS_VIRT u32UsrDataWr = 0;
5529 #if defined(MVD_SUPPORT_X4_CC)
5530 FW_USER_DATA_BUF_EXT stUsrDataExt;
5531 #else
5532 FW_USER_DATA_BUF stUsrDataInfo;
5533 #endif
5534 volatile MVD_CtrlCfg* pCtrlCfg = (volatile MVD_CtrlCfg*)HAL_MVD_GetCtrlCfg(u8Idx);
5535
5536 if ((!pUsrInfo) || (GET_FRMINFO_BUFFADD(u8Idx)==0))
5537 {
5538 MVD_DEBUGERROR(printf("%s: NULL ptr.\n", __FUNCTION__));
5539 return FALSE;
5540 }
5541
5542 //get write pointer
5543 #if defined(MVD_SUPPORT_X4_CC)
5544 u32UsrDataWr = HAL_CC_CM_GetMVDRB_HWAddr(4)>>3;
5545 #else
5546 u32UsrDataWr = HAL_CC_CM_GetMVDRB_HWAddr(2)>>3;
5547 #endif
5548 if (pCtrlCfg->u32UsrDataRd == (GET_USRDATA_BUFFADD(u8Idx)+MVD3_FW_USER_DATA_BUF_LEN))
5549 {
5550 pCtrlCfg->u32UsrDataRd = GET_USRDATA_BUFFADD(u8Idx); //wrap to BufStart
5551 }
5552 MVD_DEBUGINFO(printf("CC Rd=0x%lx Wr=0x%lx\n", (unsigned long)pCtrlCfg->u32UsrDataRd, (unsigned long)u32UsrDataWr));
5553
5554 if (pCtrlCfg->u32UsrDataRd == u32UsrDataWr)
5555 {
5556 MVD_DEBUGERROR(printf("%s: no data? Rd=0x%lx Wr=0x%lx\n", __FUNCTION__, (unsigned long)pCtrlCfg->u32UsrDataRd, (unsigned long)u32UsrDataWr));
5557 return FALSE;
5558 }
5559
5560 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,pCtrlCfg->u32UsrDataRd,u32UsrData);
5561
5562 u32UsrData = HAL_MVD_PA2NonCacheSeg(u32UsrData);
5563
5564 HAL_MVD_CPU_Sync();
5565 HAL_MVD_ReadMemory();
5566
5567 #if defined(MVD_SUPPORT_X4_CC)
5568 stUsrDataExt = *(volatile FW_USER_DATA_BUF_EXT*)u32UsrData;
5569
5570 pUsrInfo->u32Pts = stUsrDataExt.pts;
5571 pUsrInfo->u8PicStruct = stUsrDataExt.PicStruct;
5572 pUsrInfo->u8PicType = stUsrDataExt.picType;
5573 pUsrInfo->u8TopFieldFirst = stUsrDataExt.top_ff;
5574 pUsrInfo->u8RptFirstField = stUsrDataExt.rpt_ff;
5575 pUsrInfo->u16TmpRef = stUsrDataExt.tmpRef;
5576 pUsrInfo->u8ByteCnt = stUsrDataExt.userdatabytecnt;
5577 pUsrInfo->u32DataBuf = u32UsrData + MVD_FW_USER_DATA_EXT_HDR_LEN;
5578 #else
5579 stUsrDataInfo = *(volatile FW_USER_DATA_BUF*)u32UsrData;
5580
5581 pUsrInfo->u8PicType = stUsrDataInfo.picType;
5582 pUsrInfo->u8TopFieldFirst = stUsrDataInfo.top_ff;
5583 pUsrInfo->u8RptFirstField = stUsrDataInfo.rpt_ff;
5584 pUsrInfo->u16TmpRef = stUsrDataInfo.tmpRef;
5585 pUsrInfo->u8ByteCnt = stUsrDataInfo.userdatabytecnt;
5586 pUsrInfo->u32DataBuf = u32UsrData + MVD_FW_USER_DATA_HDR_LEN;
5587 #endif
5588 //update read pointer
5589 pCtrlCfg->u32UsrDataRd += MVD_FW_USER_DATA_PKT_LEN;
5590 #if 0
5591 printf("xxInfo: ");
5592 printf("%02d, ", pUsrInfo->u16TmpRef);
5593 printf("%d, ", pUsrInfo->u8PicStruct);
5594 printf("%d, ", pUsrInfo->u8TopFieldFirst);
5595 printf("0x%x, ", pUsrInfo->u32DataBuf);
5596 printf("%d, ", pUsrInfo->u8ByteCnt);
5597 printf("%ld, ", pUsrInfo->u32Pts);
5598 printf("%d\n", pUsrInfo->u8PicType);
5599 #endif
5600 return TRUE;
5601 }
5602
5603
HAL_MVD_Map2DrvSlqTbl(MS_U8 u8Idx,MS_VIRT u32HWPtr)5604 MS_VIRT HAL_MVD_Map2DrvSlqTbl(MS_U8 u8Idx, MS_VIRT u32HWPtr)
5605 {
5606 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
5607 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
5608 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
5609 MS_VIRT u32HWSt = HAL_MVD_GetMemOffset(pstMemCfg->u32BSAddr);
5610 MS_VIRT u32DrvPtr;
5611
5612 if ((u32HWPtr<u32HWSt) && (u32HWPtr!=0))
5613 {
5614 MVD_DEBUGERROR(printf("Invalid u32HWPtr=0x%lx\n", (unsigned long)u32HWPtr));
5615 return 0;
5616 }
5617 if ((pstCtrlCfg->bSlqTblSync) && (u32HWPtr!=0))
5618 {
5619 u32DrvPtr = pstSlqTblInfo->pDrvSlqTbl->u32StAdd + (u32HWPtr - u32HWSt);
5620 return u32DrvPtr;
5621 }
5622 return u32HWPtr;
5623 }
5624
5625
MVD_SLQTblGetFileEndPkt(MS_U8 u8Idx,MVD_PacketInfo * pFileEnd)5626 static void MVD_SLQTblGetFileEndPkt(MS_U8 u8Idx, MVD_PacketInfo* pFileEnd)
5627 {
5628 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
5629 MS_VIRT u32EndPattern = HAL_MVD_GetMemOffset(pstMemCfg->u32DrvBufAddr+SLQ_TBL_SIZE*3);
5630
5631 pFileEnd->u32StAddr = SLQ_TBL_SIZE*3;//u32EndPattern - HAL_MVD_GetMemOffset(pstMemCfg->u32DrvBufAddr);
5632 pFileEnd->u32Length = END_PATTERN_SIZE;
5633 pFileEnd->u32TimeStamp = MVD_NULLPKT_PTS;
5634 pFileEnd->u32ID_L = MVD_U32_MAX;
5635 pFileEnd->u32ID_H = MVD_U32_MAX;
5636 MVD_DEBUGINFO(printf("u32EndPattern(0x%lx)=0x%x 0x%x 0x%x 0x%x\n", (unsigned long)pFileEnd->u32StAddr,
5637 HAL_MVD_MemRead4Byte(u32EndPattern), HAL_MVD_MemRead4Byte(u32EndPattern+4),
5638 HAL_MVD_MemRead4Byte(u32EndPattern+8), HAL_MVD_MemRead4Byte(u32EndPattern+12)));
5639 }
5640
5641
MVD_SLQTblGetDummyPkt(MVD_PacketInfo * pDummy)5642 static void MVD_SLQTblGetDummyPkt(MVD_PacketInfo* pDummy)
5643 {
5644 //MS_U32 u32DummyES = HAL_MVD_GetMemOffset(pstMemCfg->u32DrvBufAddr+SLQ_TBL_SIZE*2);
5645
5646 pDummy->u32StAddr = SLQ_TBL_SIZE*2;//u32DummyES - HAL_MVD_GetMemOffset(pstMemCfg->u32DrvBufAddr);
5647 pDummy->u32Length = DUMMY_SIZE;
5648 pDummy->u32TimeStamp = MVD_NULLPKT_PTS;
5649 pDummy->u32ID_L = MVD_U32_MAX;
5650 pDummy->u32ID_H = MVD_U32_MAX;
5651 #if 0
5652 printf("u32DummyES(0x%x-->0x%x, size=0x%x)=0x%08lx 0x%08lx 0x%08lx 0x%08lx\n", u32DummyES,
5653 pDummy->u32StAddr, pDummy->u32Length, HAL_MVD_MemRead4Byte(u32DummyES),
5654 HAL_MVD_MemRead4Byte(u32DummyES+4),HAL_MVD_MemRead4Byte(u32DummyES+8),HAL_MVD_MemRead4Byte(u32DummyES+12));
5655 #endif
5656
5657 }
5658
5659
HAL_MVD_SLQTblInsertPattern(MS_U8 u8Idx,MVD_PatternType ePattern)5660 MS_BOOL HAL_MVD_SLQTblInsertPattern(MS_U8 u8Idx, MVD_PatternType ePattern)
5661 {
5662 MS_U32 i;
5663 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
5664
5665 if (pstSlqTblInfo->pDrvSlqTbl->u32Empty < SLQ_TBL_SAFERANGE)
5666 {
5667 MVD_DEBUGINFO(printf("SLQTbl full!(0x%lx) Cannot insert pattern any more!\n", (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32Empty));
5668 return FALSE;
5669 }
5670
5671 #if SLQ_NEW_PUSH
5672 if(pstSlqTblInfo->pSlqStatus->bSlqCtrlBit)
5673 {
5674 if(pstSlqTblInfo->pSlqStatus->bSlqPicWaitNextStart)
5675 {
5676 pstSlqTblInfo->pDrvSlqTbl->u32WrPtr = pstSlqTblInfo->pSlqStatus->u32VaildWptrAddr;
5677 }
5678 pstSlqTblInfo->pSlqStatus->bSlqCtrlBit = FALSE;
5679 }
5680 #endif // #if SLQ_NEW_PUSH
5681 for (i =0; i<2; i++)
5682 { //insert dummy pattern
5683 MVD_PacketInfo stDummyPkt;
5684
5685 if (E_MVD_PATTERN_FLUSH == ePattern)
5686 {
5687 MVD_SLQTblGetDummyPkt(&stDummyPkt);
5688 }
5689 else if (E_MVD_PATTERN_FILEEND == ePattern)
5690 {
5691 MVD_SLQTblGetFileEndPkt(u8Idx, &stDummyPkt);
5692 }
5693 else
5694 {
5695 MVD_DEBUGERROR(printf("Invalid MVD_PatternType! Won't insert pattern!\n"));
5696 return FALSE;
5697 }
5698 #if SLQ_NEW_PUSH
5699 pstSlqTblInfo->pSlqStatus->bSlqFireRdy = TRUE;
5700 #endif
5701 //printf("WrPtr 0x%x ", pstSlqTblInfo->pDrvSlqTbl->u32WrPtr);
5702 HAL_MVD_SLQTblSendPacket(u8Idx, &stDummyPkt);
5703 //printf("==> 0x%x\n", pstSlqTblInfo->pDrvSlqTbl->u32WrPtr);
5704 HAL_MVD_SetSLQWritePtr(u8Idx, FALSE);
5705 }
5706 return TRUE;
5707 }
5708
5709
5710 #define FLAG_LAST_FRM_SHOW (MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_CMD_LAST_FRAME_SHOW, sizeof(MS_U32)))
HAL_MVD_IsDispFinish(MS_U8 u8Idx)5711 E_MVD_Result HAL_MVD_IsDispFinish(MS_U8 u8Idx)
5712 {
5713 MS_U32 u32TimeCnt;
5714 MVD_SrcMode curSrcMode = HAL_MVD_GetSrcMode(u8Idx);
5715 MS_U32 u32FeByteCnt = 0;
5716 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
5717 MS_VIRT u32FileEndPtr = pstSlqTblInfo->u32FileEndPtr;
5718 MS_U32 u32Id = MVD_GetStreamId(u8Idx);
5719 MS_U8 u8VPUIdx = HAL_VPU_EX_GetTaskId(u32Id);
5720 #ifdef VDEC3
5721 MS_VIRT u32VBBUAddr = HAL_MVD_GetVBBUTableAddr(u8VPUIdx);
5722 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
5723 #endif
5724
5725 //printf("MDrv_MVD_IsDispFinish::");
5726 if (GET_FRMINFO_BUFFADD(u8Idx)==0)
5727 {
5728 MVD_DEBUGERROR(printf("%s err: pu8MVDGetFrameInfoBufStart=NULL\n", __FUNCTION__));
5729 return E_MVD_RET_FAIL;
5730 }
5731
5732 //printf("0x%x\n", FLAG_LAST_FRM_SHOW);
5733 if ((E_MVD_SLQ_TBL_MODE == curSrcMode) && (TRUE != FLAG_LAST_FRM_SHOW))
5734 {
5735 //insert pattern when each time checking IsDispFinish
5736 #ifdef VDEC3
5737 if(pstCtrlCfg->u8McuMode == TRUE)
5738 {
5739 u32TimeCnt= HAL_MVD_GetTime();
5740 while ((HAL_MVD_GetTime() - u32TimeCnt) < 20) // timeout 20 ms
5741 {
5742 if(HAL_VPU_EX_GetVBBUVacancy(u32VBBUAddr) > 0)
5743 {
5744 HAL_VPU_EX_PacketInfo stVpuPkt;
5745 MVD_PacketInfo stDummyPkt;
5746 MVD_SLQTblGetFileEndPkt(u8Idx,&stDummyPkt);
5747
5748 stVpuPkt.u32Offset = stDummyPkt.u32StAddr;
5749 stVpuPkt.u32Length = stDummyPkt.u32Length;
5750 stVpuPkt.u64TimeStamp = (MS_U64)stDummyPkt.u32TimeStamp;
5751 //If in display queue mode
5752 stVpuPkt.u64TimeStamp |= ((MS_U64)stDummyPkt.u32ID_H << 32);
5753 stVpuPkt.u32ID_H = stDummyPkt.u32ID_H;
5754 stVpuPkt.u32ID_L = stDummyPkt.u32ID_L;
5755
5756 HAL_VPU_EX_Push2VBBU(u32Id, &stVpuPkt,u32VBBUAddr);
5757 }
5758
5759 if (TRUE == FLAG_LAST_FRM_SHOW)
5760 {
5761 break;
5762 }
5763 }
5764
5765 if (TRUE != FLAG_LAST_FRM_SHOW)
5766 {
5767 MVD_DEBUGERROR(printf("MDrv_MVD_IsDispFinish TIMEOUT\n"));
5768 return E_MVD_RET_TIME_OUT;
5769 }
5770 else
5771 {
5772 return E_MVD_RET_OK;
5773 }
5774 }
5775 else
5776 #endif
5777 {
5778 //insert pattern when each time checking IsDispFinish
5779 if (HAL_MVD_SLQTblInsertPattern(u8Idx, E_MVD_PATTERN_FILEEND))
5780 {
5781 u32FeByteCnt += END_PATTERN_SIZE;
5782 }
5783
5784 if ((u32FileEndPtr == HAL_MVD_Map2DrvSlqTbl(u8Idx, HAL_MVD_GetSLQReadPtr(u8Idx))) &&
5785 (HAL_MVD_IsMcuMode(u8Idx) == FALSE) &&
5786 (HAL_MVD_IsMStreamerMode(u8Idx) == FALSE))
5787 {
5788 //insert padding pattern until timeout
5789 u32TimeCnt= HAL_MVD_GetTime();
5790 while ((HAL_MVD_GetTime() - u32TimeCnt) < CMD_TIMEOUT_MS)
5791 {
5792 if (TRUE == FLAG_LAST_FRM_SHOW)
5793 {
5794 //printf("\nDisp finished!\n");
5795 break;
5796 }
5797 //insert file-end pattern again
5798 if (HAL_MVD_SLQTblInsertPattern(u8Idx, E_MVD_PATTERN_FILEEND))
5799 {
5800 u32FeByteCnt += END_PATTERN_SIZE;
5801 }
5802 }
5803 if ((HAL_MVD_GetTime() - u32TimeCnt) >= CMD_TIMEOUT_MS)
5804 {
5805 MVD_DEBUGERROR(printf("\n***** MDrv_MVD_IsDispFinish TIMEOUT!!! *****\n\n"));
5806 if (E_MVD_CODEC_VC1_MAIN == HAL_MVD_GetCodecType(u8Idx))
5807 {
5808 if ((HAL_MVD_GetPayloadLen(u8Idx) > 0x200000)
5809 && (TRUE != HAL_MVD_GotFileEndPattern(u8Idx)))
5810 {
5811 MVD_DEBUGERROR(printf("RCV payloadLen(0x%x) invalid!\n",
5812 HAL_MVD_GetPayloadLen(u8Idx)));
5813 }
5814 }
5815 MVD_DEBUGERROR(printf("***** fe=%lx, rd=%lx(%lx,%lx), wr=%lx, empty=%lx, u32FeByteCnt=%x\n",
5816 (unsigned long)u32FileEndPtr, (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32RdPtr, (unsigned long)HAL_MVD_Map2DrvSlqTbl(u8Idx, HAL_MVD_GetSLQReadPtr(u8Idx)),
5817 (unsigned long)HAL_MVD_GetSLQReadPtr(u8Idx), (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32WrPtr, (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32Empty, u32FeByteCnt));
5818 return E_MVD_RET_TIME_OUT;
5819 }
5820 else
5821 {
5822 return E_MVD_RET_OK;
5823 }
5824 }
5825 else
5826 {
5827 //just return fail if readPtr is not closed to file-end ptr
5828 MVD_DEBUGINFO(printf("fe=%lx, rd=%lx(%lx), wr=%lx, empty=%lx\n", (unsigned long)u32FileEndPtr, (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32RdPtr,
5829 (unsigned long)HAL_MVD_Map2DrvSlqTbl(u8Idx, (unsigned long)HAL_MVD_GetSLQReadPtr(u8Idx)), (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32WrPtr, (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32Empty));
5830 return E_MVD_RET_FAIL;
5831 }
5832 }
5833 }
5834
5835 if (FLAG_LAST_FRM_SHOW)
5836 {
5837 return E_MVD_RET_OK;
5838 }
5839 else
5840 {
5841 return E_MVD_RET_FAIL;
5842 }
5843 }
5844
5845 //------------------------------------------------------------------------------
5846 /// Set MVD SLQ start & end address
5847 /// @param -u32start \b IN : start address
5848 /// @param -u32end \b IN : end address
5849 //------------------------------------------------------------------------------
HAL_MVD_SetSLQStartEnd(MS_U8 u8Idx,MS_U32 u32start,MS_U32 u32end)5850 static void HAL_MVD_SetSLQStartEnd(MS_U8 u8Idx, MS_U32 u32start, MS_U32 u32end)
5851 {
5852 MVD_CmdArg mvdcmd;
5853
5854 if ((u32start > SLQ_ADDR_LEN) || ((u32end+1) > SLQ_ADDR_LEN))
5855 {
5856 MVD_DEBUGERROR(printf("MDrv_MVD_SetSLQStartEnd: only support 27bit add!\n"));
5857 }
5858
5859 SET_CMDARG(mvdcmd, (u32end+1), u8Idx);
5860 if (HAL_MVD_MVDCommand( CMD_SLQ_END, &mvdcmd ) == FALSE)
5861 {
5862 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SLQ_END ) );
5863 return;
5864 }
5865
5866 SET_CMDARG(mvdcmd, u32start, u8Idx);
5867 if (HAL_MVD_MVDCommand( CMD_SLQ_START, &mvdcmd ) == FALSE)
5868 {
5869 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SLQ_START ) );
5870 return;
5871 }
5872
5873 return;
5874 }
5875
HAL_MVD_DecodeIFrame(MS_U8 u8Idx,MS_PHY u32FrameBufAddr,MS_PHY u32StreamBufAddr,MS_PHY u32StreamBufEndAddr)5876 MS_BOOL HAL_MVD_DecodeIFrame(MS_U8 u8Idx, MS_PHY u32FrameBufAddr, MS_PHY u32StreamBufAddr, MS_PHY u32StreamBufEndAddr )
5877 {
5878 MS_U32 u32deley = 0;
5879 MS_U32 u32time = 0;
5880 MVD_CmdArg mvdcmd;
5881 MS_VIRT u32MVDFWSLQTABTmpbufAdr = GET_SLQ_BUFFADD(u8Idx);
5882
5883 MVD_DEBUGINFO(printf("%s offset FBAdd=0x%lx streamStart=0x%lx streamEnd=0x%lx\n",
5884 __FUNCTION__, (unsigned long)u32FrameBufAddr, (unsigned long)u32StreamBufAddr, (unsigned long)u32StreamBufEndAddr));
5885
5886 HAL_MVD_SetCodecInfo(u8Idx, E_MVD_CODEC_MPEG2, E_MVD_SLQ_MODE, DISABLE_PARSER);
5887 HAL_MVD_SetFrameBuffAddr(u8Idx, u32FrameBufAddr, HAL_MVD_GetFBMode(u8Idx));
5888
5889 SETUP_CMDARG(mvdcmd);
5890 mvdcmd.Arg0 = 1;
5891 SET_DECNUM(mvdcmd, u8Idx);
5892 SET_CMD_RET_FALSE(CMD_DISPLAY_CTL, &mvdcmd);
5893
5894 if (HAL_MVD_StepDecode(u8Idx) == FALSE)
5895 {
5896 MVD_DEBUGERROR( printf( "HAL_MVD_StepDecode fail!!\r\n") );
5897 return FALSE;
5898 }
5899
5900 SETUP_CMDARG(mvdcmd);
5901 mvdcmd.Arg0 = 1;
5902 mvdcmd.Arg1 = 1;
5903 SET_DECNUM(mvdcmd, u8Idx);
5904 SET_CMD_RET_FALSE(CMD_FAST_SLOW, &mvdcmd);
5905
5906 //set data
5907 HAL_MVD_Delayms(2);
5908
5909 HAL_MVD_CPU_Sync();
5910 HAL_MVD_FlushMemory();
5911
5912 //wait vld init success or data may lost!
5913 #define WAIT_INIT_SUCCESS_TIME 100 //100ms
5914 u32deley = HAL_MVD_GetTime();
5915 while ((HAL_MVD_GetDecodeStatus(u8Idx)==DEC_STAT_IDLE) && (u32time<WAIT_INIT_SUCCESS_TIME))
5916 {
5917 u32time = HAL_MVD_GetTime()-u32deley;
5918 }
5919 if (u32time>=WAIT_INIT_SUCCESS_TIME)
5920 {
5921 MVD_DEBUGERROR(printf("%s: wait init_success timeout!!!\n", __FUNCTION__));
5922 }
5923 HAL_MVD_SetSLQStartEnd(u8Idx, u32StreamBufAddr, u32StreamBufEndAddr);
5924 MVD_DEBUGINFO(printf("set MVD3_FW_SLQ_TAB_TMPBUF_ADR=%lx\n",(unsigned long)u32MVDFWSLQTABTmpbufAdr));
5925
5926 HAL_MVD_CPU_Sync();
5927 HAL_MVD_FlushMemory();
5928 HAL_MVD_SetSLQStartEnd(u8Idx, u32MVDFWSLQTABTmpbufAdr, u32MVDFWSLQTABTmpbufAdr+MVD3_FW_SLQ_TAB_TMPBUF_LEN);
5929
5930 HAL_MVD_CPU_Sync();
5931 HAL_MVD_ReadMemory();
5932
5933 // wait decode complete
5934 #define WAIT_DECODE_DONE_TIME 33 //To decode 1 frame should take less than 33ms
5935 u32deley = HAL_MVD_GetTime();
5936 u32time = 0;
5937 while (HAL_MVD_GetPicCounter(u8Idx)<1 && (u32time<WAIT_DECODE_DONE_TIME))
5938 {
5939 u32time = HAL_MVD_GetTime()-u32deley;
5940 }
5941 if (u32time >= WAIT_DECODE_DONE_TIME)
5942 {
5943 MVD_DEBUGERROR(printf ("MDrv_MVD_DecodeIFrame time out(du=%d, st=%d, now=%d)\n", u32time, u32deley, HAL_MVD_GetTime()));
5944 MVD_DEBUGERROR(printf("frmCnt=%d state=0x%x lastCmd=0x%x\n", HAL_MVD_GetPicCounter(u8Idx), HAL_MVD_GetDecodeStatus(u8Idx), HAL_MVD_GetLastCmd(u8Idx)));
5945 return FALSE;
5946 }
5947 MVD_DEBUGINFO(printf ("MDrv_MVD_DecodeIFrame time (%d, %d)\n", u32time, u32deley));
5948 //printf("frmCnt=%ld state=0x%x lastCmd=0x%x\n", HAL_MVD_GetPicCounter(u8Idx), HAL_MVD_GetDecodeStatus(u8Idx), HAL_MVD_GetLastCmd(u8Idx));
5949
5950 MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
5951 pCtrlCfg->bDecodeIFrame = TRUE;
5952
5953 return TRUE;
5954 }
5955
5956
5957 //------------------------------------------------------------------------------
5958 /// Set bit stream buffer address to MVD
5959 /// @param -u32start \b IN : start address
5960 /// @param -u32end \b IN : end address
5961 //------------------------------------------------------------------------------
MVD_SetBitStreamAddr(MS_U8 u8Idx,MS_VIRT u32start,MS_VIRT u32end)5962 static void MVD_SetBitStreamAddr(MS_U8 u8Idx, MS_VIRT u32start, MS_VIRT u32end)
5963 {
5964 MVD_CmdArg mvdcmd;
5965 MS_ASSERT((u32start%8)==0);
5966 u32start >>= 3;
5967 SET_CMDARG(mvdcmd, u32start, u8Idx);
5968 if (HAL_MVD_MVDCommand( CMD_STREAM_BUF_START, &mvdcmd ) == FALSE)
5969 {
5970 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_STREAM_BUF_START ) );
5971 return;
5972 }
5973
5974 MS_ASSERT((u32end%8)==0);
5975 u32end >>= 3;
5976 SET_CMDARG(mvdcmd, u32end, u8Idx);
5977 if (HAL_MVD_MVDCommand( CMD_STREAM_BUF_END, &mvdcmd ) == FALSE)
5978 {
5979 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_STREAM_BUF_END ) );
5980 return;
5981 }
5982 return;
5983 }
5984
HAL_MVD_SetInternalBuffAddr(MS_U8 u8Idx,MS_VIRT u32start,MS_U32 u32len)5985 MS_BOOL HAL_MVD_SetInternalBuffAddr(MS_U8 u8Idx, MS_VIRT u32start, MS_U32 u32len)
5986 {
5987 MS_VIRT tmpAdr, tmpLen;
5988 MVD_FWCfg* pFwCfg = NULL;
5989 MVD_FWBuff* pBuff = &(pMVDHalContext->stFWBuff[u8Idx]);
5990 MVD_MEMCfg* pstMemCfg = NULL;
5991 MVD_SLQTBLInfo* pstSlqTblInfo = NULL;
5992 MS_U32 u32Id = MVD_GetStreamId(u8Idx);
5993 MS_U8 u8VPUIdx = HAL_VPU_EX_GetTaskId(u32Id);
5994 MS_VIRT u32BuffStart = u32start+(MVD_FW_TASK_OFFSET*u8VPUIdx);
5995 MS_VIRT VPUSHMAddr = HAL_VPU_EX_GetSHMAddr();
5996 MS_VIRT u32StartOffset;
5997 MS_U8 u8MiuSel;
5998
5999 if(VPUSHMAddr != 0)
6000 {
6001 _phy_to_miu_offset(u8MiuSel, u32StartOffset, VPUSHMAddr);
6002
6003 u32StartOffset -= MVD_FW_CODE_LEN;
6004
6005 if(u8Idx == 0)
6006 {
6007 u32BuffStart = u32StartOffset; // for main decoder
6008 }
6009 else if(u8Idx == 1)
6010 {
6011 u32BuffStart = u32StartOffset + 0x20000; // VPUSHMAddr+128K bytes
6012 }
6013 }
6014
6015 MVD_DEBUGINFO(printf("MVD FW shared mem start = 0x%lx\n", (unsigned long)u32BuffStart));
6016 MVD_GetFWBuffAdd(u32BuffStart, u32len, pBuff);
6017 MVD_SetFWBuffAdd(u8Idx, pBuff);
6018
6019 tmpAdr = pBuff->u32DecFrmInfoAdd + MVD_FW_DECFRM_INFO_BUF_LEN;
6020
6021 HAL_MVD_MemGetMap(u8Idx, E_MVD_MMAP_FB, &tmpAdr, &tmpLen);
6022 MVD_DEBUGINFO(printf("set MVD_FRAMEBUFFER_ADR=%lx\n",(unsigned long)tmpAdr));
6023 HAL_MVD_SetFrameBuffAddr(u8Idx, tmpAdr, HAL_MVD_GetFBMode(u8Idx));
6024 pFwCfg = HAL_MVD_GetFWCfg(u8Idx);
6025 HAL_MVD_SetFrameBuffNum(u8Idx, pFwCfg->u8FBNum,pFwCfg->u32FBUsedSize);
6026
6027 // If VD_MHEG5(CPU) and MVD HW engine are run on different MIU,
6028 // IAP, DP, and MV buffers are allocated after FB.
6029 // The reason is that these 3 buffers are used by MVD HW engine.
6030 if(pMVDHalContext->bCMAUsed == FALSE)
6031 {
6032 tmpAdr += pFwCfg->u32FBUsedSize;
6033 pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
6034 if (pstMemCfg->u32FBSize < (pFwCfg->u32FBUsedSize + MVD_HW_BUF_TOTAL_LEN))
6035 {
6036 MVD_DEBUGERROR(printf("MVD HW buffers larger than FB size!!!\n"));
6037 }
6038 MVD_DEBUGINFO(printf("MVD FB boundary =0x%lx\n",(unsigned long)tmpAdr));
6039 tmpAdr = HAL_MVD_SetHWBuffer(u8Idx, tmpAdr);
6040 }
6041
6042 HAL_MVD_MemGetMap(u8Idx, E_MVD_MMAP_BS, &tmpAdr, &tmpLen);
6043 MVD_DEBUGINFO(printf("set MVD_BITSTREAM_ADR=%lx\n",(unsigned long)tmpAdr));
6044 MVD_SetBitStreamAddr(u8Idx, tmpAdr,tmpAdr+tmpLen);
6045 pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
6046 pstSlqTblInfo->u32ESBuffEnd = tmpAdr+tmpLen;
6047
6048 if((pFwCfg->stFBReduction.LumaFBReductionMode != E_MVD_FB_REDUCTION_NONE)
6049 || (pFwCfg->stFBReduction.ChromaFBReductionMode != E_MVD_FB_REDUCTION_NONE))
6050 {
6051 //for chips not support reduction mode, just ignore related config.
6052 MVD_DEBUGERROR(printf("MVD Err: Not support FB reduction mode!!\n"));
6053 }
6054
6055 return TRUE;
6056 }
6057
6058 //------------------------------------------------------------------------------
6059 /// Issue "Decode Pause" command.
6060 //------------------------------------------------------------------------------
HAL_MVD_DecodePause(MS_U8 u8Idx)6061 void HAL_MVD_DecodePause(MS_U8 u8Idx)
6062 {
6063 MVD_CmdArg mvdcmd;
6064 SETUP_CMDARG(mvdcmd);
6065 SET_DECNUM(mvdcmd, u8Idx);
6066 if (HAL_MVD_MVDCommand(CMD_PAUSE, &mvdcmd)== FALSE)
6067 {
6068 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_PAUSE) );
6069 return;
6070 }
6071
6072 return;
6073 }
6074
6075
6076 //------------- Below functions are for MediaCodec SLQ Table --------------------
6077 #if _SLQTBL_DUMP_PTS
_SLQTbl_DumpPtsTbl(MS_U8 u8Idx,MS_U32 u32EntryStart,MS_U32 u32EntryEnd)6078 static void _SLQTbl_DumpPtsTbl(MS_U8 u8Idx, MS_U32 u32EntryStart, MS_U32 u32EntryEnd)
6079 {
6080 MS_U32 i;
6081 MS_VIRT u32EsRp, u32EsStart, u32EsEnd;
6082 MS_VIRT u32MVDFWPtsTblAddr = GET_PTSTBL_BUFFADD(u8Idx);
6083
6084 for (i=u32EntryStart; i<u32EntryEnd; i++)
6085 {
6086 u32EsRp = pstSlqTblInfo->pDrvEsTbl->u32StAdd + i*8;
6087
6088 u32EsEnd = HAL_MVD_MemRead4Byte(u32EsRp+4);
6089 u32EsStart = HAL_MVD_MemRead4Byte(u32EsRp); //report StartAdd as read_pointer
6090 printf("ES[%x] Start=0x%x End=0x%x u32EsRp=%x\n",
6091 i, u32EsStart, u32EsEnd, u32EsRp);
6092 }
6093
6094 printf("\n=======Dump PTS table========\n");
6095 printf("addr\t byte_cnt\t dummy_cnt\t id_low\t id_high\t time_stamp\n");
6096 for (i=u32EntryStart; i<u32EntryEnd; i++)
6097 {
6098 printf("0x%x\t 0x%08lx\t 0x%08lx\t 0x%08lx\t 0x%08lx\t 0x%08lx\n", u32MVDFWPtsTblAddr+i*MVD_FW_SLQTBL_PTS_LEN,
6099 HAL_MVD_MemRead4Byte(u32MVDFWPtsTblAddr+i*MVD_FW_SLQTBL_PTS_LEN), //byteCnt
6100 HAL_MVD_MemRead4Byte(u32MVDFWPtsTblAddr+i*MVD_FW_SLQTBL_PTS_LEN+4), //dummyPktCnt
6101 HAL_MVD_MemRead4Byte(u32MVDFWPtsTblAddr+i*MVD_FW_SLQTBL_PTS_LEN+8), //idLow
6102 HAL_MVD_MemRead4Byte(u32MVDFWPtsTblAddr+i*MVD_FW_SLQTBL_PTS_LEN+12),//idHigh
6103 HAL_MVD_MemRead4Byte(u32MVDFWPtsTblAddr+i*MVD_FW_SLQTBL_PTS_LEN+16) //pts
6104 );
6105 }
6106 printf("=====================================\n");
6107 }
6108 #endif
6109
6110
6111 #if SLQ_NEW_PUSH
MVD_SLQTblGetHdrPkt(MS_U8 u8Idx,MVD_PacketInfo * pDivxHdr,MVD_PacketInfo * pDivxData)6112 void MVD_SLQTblGetHdrPkt(MS_U8 u8Idx, MVD_PacketInfo* pDivxHdr, MVD_PacketInfo* pDivxData)
6113 #else
6114 static void MVD_SLQTblGetDivxHdrPkt(MS_U8 u8Idx, MVD_PacketInfo* pDivxHdr, MVD_PacketInfo* pDivxData)
6115 #endif
6116 {
6117 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
6118 MS_VIRT u32DivXPattern = pstSlqTblInfo->pDrvDivxTbl->u32WrPtr;
6119 MS_U32 u32FrmSize = pDivxData->u32Length;
6120 MVD_CodecType curCodecType = HAL_MVD_GetCodecType(u8Idx);
6121 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
6122 #ifdef VDEC3
6123 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
6124 #endif
6125 #if SLQ_NEW_PUSH
6126 if(pstSlqTblInfo->pSlqStatus->bSlqCtrlBit && pstCtrlCfg->u8McuMode == FALSE)
6127 {
6128 if(pstSlqTblInfo->pSlqStatus->bSlqPicWaitNextStart && pstSlqTblInfo->pSlqStatus->bSlqPicStart)
6129 {
6130 //printf("Show KC the SlqPushLength = 0x%x\n",pstSlqTblInfo->pSlqStatus->u32SlqPushLength);
6131 if (E_MVD_CODEC_DIVX311 == curCodecType)
6132 {
6133 HAL_MVD_MemWrite4Byte(pstSlqTblInfo->pSlqStatus->u32SlqPatternAddr +4, pstSlqTblInfo->pSlqStatus->u32SlqPushLength);
6134 HAL_MVD_MemWrite4Byte(pstSlqTblInfo->pSlqStatus->u32SlqPatternAddr , DIVX_PATTERN);
6135 }
6136 else if(E_MVD_CODEC_VC1_MAIN == curCodecType)
6137 {//rcv
6138 HAL_MVD_MemWrite4Byte(pstSlqTblInfo->pSlqStatus->u32SlqPatternAddr +4, RCV_PATTERN);
6139 HAL_MVD_MemWrite4Byte(pstSlqTblInfo->pSlqStatus->u32SlqPatternAddr , pstSlqTblInfo->pSlqStatus->u32SlqPushLength);
6140 }
6141 else if (E_MVD_CODEC_VC1_ADV == curCodecType)
6142 {
6143 HAL_MVD_MemWrite4Byte(pstSlqTblInfo->pSlqStatus->u32SlqPatternAddr , VC1_PATTERN);
6144 }
6145 pstSlqTblInfo->pSlqStatus->u32SlqPushLength = 0;
6146 pstSlqTblInfo->pSlqStatus->u32SlqPatternAddr = 0;
6147 pstSlqTblInfo->pSlqStatus->bSlqFireRdy =TRUE;
6148 pstSlqTblInfo->pSlqStatus->u32VaildWptrAddr = pstSlqTblInfo->pDrvSlqTbl->u32WrPtr;// - 16;
6149 pstSlqTblInfo->pSlqStatus->bSlqPicWaitNextStart = FALSE;
6150 pstSlqTblInfo->pSlqStatus->bSlqPicCollect = FALSE;
6151 }
6152
6153 if(pstSlqTblInfo->pSlqStatus->bSlqPicStart)
6154 {
6155 pstSlqTblInfo->pSlqStatus->u32SlqPatternAddr = u32DivXPattern;
6156 pstSlqTblInfo->pSlqStatus->u32SlqPushLength += u32FrmSize;
6157 pstSlqTblInfo->pSlqStatus->bSlqPicCollect = TRUE;
6158 pstSlqTblInfo->pSlqStatus->bSlqPicWaitNextStart =TRUE;
6159 }
6160 else if(pstSlqTblInfo->pSlqStatus->bSlqPicCollect)
6161 {
6162 pstSlqTblInfo->pSlqStatus->u32SlqPushLength += u32FrmSize;
6163 pstSlqTblInfo->pSlqStatus->bSlqPicWaitNextStart =TRUE;
6164 }
6165 }
6166 else
6167 {
6168 HAL_MVD_MemWrite4Byte(u32DivXPattern, DIVX_PATTERN);
6169 HAL_MVD_MemWrite4Byte(u32DivXPattern +4,u32FrmSize);
6170 }
6171 #else
6172 HAL_MVD_MemWrite4Byte(u32DivXPattern, DIVX_PATTERN);
6173 HAL_MVD_MemWrite4Byte(u32DivXPattern+4, u32FrmSize);
6174 #endif
6175 pDivxHdr->u32StAddr = u32DivXPattern - HAL_MVD_GetMemOffset(pstMemCfg->u32DrvBufAddr);
6176 pDivxHdr->u32TimeStamp = pDivxData->u32TimeStamp; //unit: ms
6177 pDivxHdr->u32ID_L = pDivxData->u32ID_L;
6178 pDivxHdr->u32ID_H = pDivxData->u32ID_H;
6179 //printf("u32DivXPattern(0x%x==>0x%x)=0x%x 0x%x\n", u32DivXPattern, pDivxHdr->u32StAddr,
6180 // HAL_MVD_MemRead4Byte(u32DivXPattern), HAL_MVD_MemRead4Byte(u32DivXPattern+4));
6181 if (E_MVD_CODEC_VC1_ADV == curCodecType)
6182 {
6183 pstSlqTblInfo->pDrvDivxTbl->u32WrPtr += 4;
6184 pDivxHdr->u32Length = 4;
6185 }
6186 else
6187 {
6188 pstSlqTblInfo->pDrvDivxTbl->u32WrPtr += 8;
6189 if(pstCtrlCfg->u8McuMode == TRUE)
6190 {
6191 pDivxHdr->u32Length = 64;
6192 if (pstSlqTblInfo->pDrvDivxTbl->u32WrPtr >= pstSlqTblInfo->pDrvDivxTbl->u32EndAdd)
6193 {
6194 pstSlqTblInfo->pDrvDivxTbl->u32WrPtr = pstSlqTblInfo->pDrvDivxTbl->u32StAdd;
6195 }
6196 }
6197 else
6198 {
6199 pDivxHdr->u32Length = 8;
6200 }
6201 }
6202
6203 #if SLQ_NEW_PUSH
6204 if(pstSlqTblInfo->pSlqStatus->bSlqPicStart && pstCtrlCfg->u8McuMode == FALSE)
6205 {
6206 if (E_MVD_CODEC_VC1_ADV == curCodecType)
6207 {
6208 pstSlqTblInfo->pDrvDivxTbl->u32WrPtr += 4;
6209 pDivxHdr->u32Length = 4;
6210 }
6211 else
6212 {
6213 pstSlqTblInfo->pDrvDivxTbl->u32WrPtr += 8;
6214 pDivxHdr->u32Length = 8;
6215 }
6216 }
6217 #endif
6218 }
6219
MVD_SLQTblInitFileEndPkt(MS_U8 u8Idx,MVD_CodecType eType)6220 static void MVD_SLQTblInitFileEndPkt(MS_U8 u8Idx, MVD_CodecType eType)
6221 {
6222 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
6223 MS_U32 u32EndPattern = HAL_MVD_GetMemOffset(pstMemCfg->u32DrvBufAddr+SLQ_TBL_SIZE*3);
6224 MS_U32 temp = 0;
6225 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
6226
6227 #if 0
6228 _MVD_Memset(u32EndPattern, 0xff, END_PATTERN_SIZE);
6229 #else
6230 //_miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,u32EndPattern,temp);
6231 temp = u32EndPattern+pMVDHalContext->stMiuCfg.u8FWMiuSel*HAL_MIU1_BASE;
6232 memset((void*)(MS_PA2KSEG1(temp)),0xff,END_PATTERN_SIZE);
6233 MsOS_FlushMemory();
6234 MsOS_ReadMemory();
6235 #endif
6236
6237 if ((E_MVD_CODEC_FLV == eType)||(E_MVD_CODEC_MPEG4_SHORT_VIDEO_HEADER == eType))
6238 {
6239 HAL_MVD_MemWrite4Byte(u32EndPattern, FLV_PATTERN);
6240 HAL_MVD_MemWrite4Byte(u32EndPattern+4, 0xffffffff);
6241 HAL_MVD_MemWrite4Byte(u32EndPattern+8, END_PATTERN_1); //scw
6242 HAL_MVD_MemWrite4Byte(u32EndPattern+12,END_PATTERN_2); //scw
6243 HAL_MVD_MemWrite4Byte(u32EndPattern+16,END_PATTERN_3); //scw
6244 //printf("##########FileEnd for FLV/SVH!, u32EndPattern=%x\n",u32EndPattern);
6245
6246 if(pstCtrlCfg->u8McuMode == TRUE)
6247 {
6248 HAL_MVD_MemWrite4Byte(u32EndPattern+20,FLV_PATTERN);
6249 }
6250 }
6251 else if (E_MVD_CODEC_DIVX311 == eType)
6252 {
6253 HAL_MVD_MemWrite4Byte(u32EndPattern, DIVX_PATTERN);
6254 HAL_MVD_MemWrite4Byte(u32EndPattern+4, 0xffffffff);
6255 HAL_MVD_MemWrite4Byte(u32EndPattern+8, END_PATTERN_1); //scw
6256 HAL_MVD_MemWrite4Byte(u32EndPattern+12,END_PATTERN_2); //scw
6257 HAL_MVD_MemWrite4Byte(u32EndPattern+16,END_PATTERN_3); //scw
6258 //printf("##########FileEnd for DIVX311!, u32EndPattern=%x\n",u32EndPattern);
6259
6260 if(pstCtrlCfg->u8McuMode == TRUE)
6261 {
6262 HAL_MVD_MemWrite4Byte(u32EndPattern+20,DIVX_PATTERN);
6263 }
6264 }
6265 else if ((E_MVD_CODEC_MPEG2 == eType)||(E_MVD_CODEC_MPEG4 == eType))
6266 {
6267 HAL_MVD_MemWrite4Byte(u32EndPattern, MPEG_PATTERN_0);
6268 HAL_MVD_MemWrite4Byte(u32EndPattern+4, END_PATTERN_1);
6269 HAL_MVD_MemWrite4Byte(u32EndPattern+8, END_PATTERN_2);
6270 HAL_MVD_MemWrite4Byte(u32EndPattern+12,END_PATTERN_3);
6271 //printf("##########FileEnd for MPEG2/4!, u32EndPattern=%x\n",u32EndPattern);
6272
6273 if(pstCtrlCfg->u8McuMode == TRUE)
6274 {
6275 HAL_MVD_MemWrite4Byte(u32EndPattern+16,DUMMY_PATTERN);
6276 HAL_MVD_MemWrite4Byte(u32EndPattern+20,DUMMY_PATTERN);
6277 }
6278 }
6279 else
6280 {
6281 HAL_MVD_MemWrite4Byte(u32EndPattern, END_PATTERN_0);
6282 HAL_MVD_MemWrite4Byte(u32EndPattern+4, END_PATTERN_1);
6283 HAL_MVD_MemWrite4Byte(u32EndPattern+8, END_PATTERN_2); //scw
6284 HAL_MVD_MemWrite4Byte(u32EndPattern+12,END_PATTERN_3); //scw
6285 //printf("##########FileEnd for VC1!, u32EndPattern=%x\n",u32EndPattern);
6286
6287 if(pstCtrlCfg->u8McuMode == TRUE)
6288 {
6289 if(E_MVD_CODEC_VC1_ADV == eType)
6290 {
6291 HAL_MVD_MemWrite4Byte(u32EndPattern+16,VC1_PATTERN_0);
6292 HAL_MVD_MemWrite4Byte(u32EndPattern+20,VC1_PATTERN_3);
6293 }
6294 else if(E_MVD_CODEC_VC1_MAIN == eType)
6295 {
6296 HAL_MVD_MemWrite4Byte(u32EndPattern+16,RCV_PATTERN_3);
6297 HAL_MVD_MemWrite4Byte(u32EndPattern+20,RCV_PATTERN_1);
6298 HAL_MVD_MemWrite4Byte(u32EndPattern+24,RCV_PATTERN_3);
6299 }
6300 }
6301 }
6302
6303 MVD_DEBUGINFO(printf("u32EndPattern(0x%lx)=0x%x 0x%x\n", (unsigned long)u32EndPattern,
6304 HAL_MVD_MemRead4Byte(u32EndPattern), HAL_MVD_MemRead4Byte(u32EndPattern+4)));
6305 }
6306
6307
MVD_SLQTblInitDummyPkt(MS_U8 u8Idx,MVD_CodecType eType)6308 static void MVD_SLQTblInitDummyPkt(MS_U8 u8Idx, MVD_CodecType eType)
6309 {
6310 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
6311 MS_U32 u32DummyES = HAL_MVD_GetMemOffset(pstMemCfg->u32DrvBufAddr+SLQ_TBL_SIZE*2);
6312 MS_U32 u32DummyPattern[3];
6313 MS_U32 u32PatternSize;
6314 MS_U32 i;
6315 MS_U32 temp = 0;
6316
6317 //printf("eType = 0x%x\n", eType);
6318 //initial content for dummy packet
6319 #if 0
6320 _MVD_Memset(u32DummyES, 0xff, DUMMY_SIZE);
6321 #else
6322 //_miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,u32DummyES,temp);
6323 temp = u32DummyES+pMVDHalContext->stMiuCfg.u8FWMiuSel*HAL_MIU1_BASE;
6324 memset((void*)(MS_PA2KSEG1(temp)),0xff,DUMMY_SIZE);
6325 MsOS_FlushMemory();
6326 MsOS_ReadMemory();
6327 #endif
6328
6329 switch (eType)
6330 {
6331 case E_MVD_CODEC_FLV:
6332 case E_MVD_CODEC_MPEG4_SHORT_VIDEO_HEADER:
6333 u32DummyPattern[0] = FLV_PATTERN;
6334 u32PatternSize = 1;
6335 break;
6336
6337 case E_MVD_CODEC_DIVX311:
6338 u32DummyPattern[0] = DIVX_PATTERN;
6339 u32PatternSize = 1;
6340 break;
6341
6342 case E_MVD_CODEC_VC1_ADV: //vc1
6343 u32DummyPattern[0] = VC1_PATTERN_0;
6344 u32DummyPattern[1] = VC1_PATTERN_1;
6345 u32DummyPattern[2] = VC1_PATTERN_2;
6346 u32PatternSize = 3;
6347 break;
6348
6349 case E_MVD_CODEC_VC1_MAIN: //rcv
6350 u32DummyPattern[0] = RCV_PATTERN_0;
6351 u32DummyPattern[1] = RCV_PATTERN_1;
6352 u32DummyPattern[2] = RCV_PATTERN_2;
6353 u32PatternSize = 3;
6354 break;
6355
6356 default:
6357 u32DummyPattern[0] = DUMMY_PATTERN;
6358 u32PatternSize = 1;
6359 break;
6360 }
6361 for (i=0; i<u32PatternSize; i++)
6362 {
6363 HAL_MVD_MemWrite4Byte(u32DummyES+i*4, u32DummyPattern[i]);
6364 }
6365 #if 0
6366 printf("u32DummyES(0x%x)=0x%08lx 0x%08lx 0x%08lx 0x%08lx\n", u32DummyES, HAL_MVD_MemRead4Byte(u32DummyES),
6367 HAL_MVD_MemRead4Byte(u32DummyES+4),HAL_MVD_MemRead4Byte(u32DummyES+8),HAL_MVD_MemRead4Byte(u32DummyES+12));
6368 #endif
6369
6370 }
6371
MVD_SLQTblInitDrvSlqTbl(MVD_SLQ_TBL_ST * pDrvSlqTbl,MS_U32 u32Addr)6372 static void MVD_SLQTblInitDrvSlqTbl(MVD_SLQ_TBL_ST* pDrvSlqTbl, MS_U32 u32Addr)
6373 {
6374 MS_U32 temp = 0;
6375 pDrvSlqTbl->u32StAdd = u32Addr;
6376 pDrvSlqTbl->u32EndAdd = u32Addr + SLQ_TBL_SIZE;
6377 pDrvSlqTbl->u32EntryCntMax = SLQ_ENTRY_MAX;
6378
6379 //reset SLQ table read/write pointers
6380 pDrvSlqTbl->u32RdPtr = pDrvSlqTbl->u32StAdd;
6381 pDrvSlqTbl->u32WrPtr = pDrvSlqTbl->u32StAdd;
6382 pDrvSlqTbl->pu32LastEntry = &pDrvSlqTbl->u32WrPtr;
6383
6384 #if (!MVD_TURBO_INIT)
6385 //reset SLQ table
6386 #if 0
6387 _MVD_Memset(pDrvSlqTbl->u32StAdd, 0, SLQ_TBL_SIZE);
6388 #else
6389 //_miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,pDrvSlqTbl->u32StAdd,temp);
6390 temp = pDrvSlqTbl->u32StAdd+pMVDHalContext->stMiuCfg.u8FWMiuSel*HAL_MIU1_BASE;
6391 memset((void*)(MS_PA2KSEG1(temp)),0,SLQ_TBL_SIZE);
6392 MsOS_FlushMemory();
6393 MsOS_ReadMemory();
6394 #endif
6395 #endif
6396 pDrvSlqTbl->u32Empty = SLQ_TBL_SIZE;
6397 //_SLQTbl_DumpInfo(pDrvSlqTbl);
6398 }
6399
MVD_SLQTblInitSlqStatus(MVD_SLQ_STATUS * pSlqStatus,MS_VIRT u32WrPtr)6400 static void MVD_SLQTblInitSlqStatus(MVD_SLQ_STATUS* pSlqStatus, MS_VIRT u32WrPtr)
6401 {
6402 #if SLQ_NEW_PUSH
6403 pSlqStatus->u32VaildWptrAddr = u32WrPtr ;
6404 pSlqStatus->bSlqPicWaitNextStart = FALSE;
6405 pSlqStatus->bSlqCtrlBit = FALSE;
6406 pSlqStatus->u32SlqPushLength = 0;
6407 pSlqStatus->bSlqPicStart = FALSE;
6408 pSlqStatus->bSlqPicCollect = FALSE;
6409 pSlqStatus->bSlqEnLastFrameShow =FALSE;
6410 pSlqStatus->bSlqFireRdy = FALSE;
6411 #endif
6412 }
6413
MVD_SLQTblInitDrvDivxTbl(MVD_SLQ_ES_ST * pDrvDivxTbl,MS_U32 u32StAdd,MS_U32 u32Val)6414 static void MVD_SLQTblInitDrvDivxTbl(MVD_SLQ_ES_ST* pDrvDivxTbl, MS_U32 u32StAdd, MS_U32 u32Val)
6415 {
6416 MS_U32 temp = 0;
6417 ///// init SLQ entries for DivX311
6418 pDrvDivxTbl->u32StAdd = u32StAdd;
6419 pDrvDivxTbl->u32EndAdd= pDrvDivxTbl->u32StAdd + SLQ_TBL_SIZE;
6420 pDrvDivxTbl->u32WrPtr = pDrvDivxTbl->u32StAdd;
6421 //pDrvDivxTbl->u32RdPtr = pDrvDivxTbl->u32StAdd;
6422 #if (!MVD_TURBO_INIT)
6423 //reset DivX311 pattern table
6424 #if 0
6425 _MVD_Memset(pDrvDivxTbl->u32StAdd, 0, u32Val);
6426 #else
6427 //_miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,pDrvDivxTbl->u32StAdd,temp);
6428 temp = pDrvDivxTbl->u32StAdd+pMVDHalContext->stMiuCfg.u8FWMiuSel*HAL_MIU1_BASE;
6429 memset((void*)(MS_PA2KSEG1(temp)),0,u32Val);
6430 MsOS_FlushMemory();
6431 MsOS_ReadMemory();
6432 #endif
6433 #endif
6434 }
6435
MVD_SLQTblInitDrvEsTbl(MVD_SLQ_ES_ST * pDrvEsTbl,MS_U32 u32StAdd,MS_U32 u32Val)6436 static void MVD_SLQTblInitDrvEsTbl(MVD_SLQ_ES_ST* pDrvEsTbl, MS_U32 u32StAdd, MS_U32 u32Val)
6437 {
6438 UNUSED(u32Val);
6439 MS_U32 temp = 0;
6440 ///// init ES table
6441 pDrvEsTbl->u32StAdd = u32StAdd;
6442 pDrvEsTbl->u32EndAdd= pDrvEsTbl->u32StAdd + ES_TBL_SIZE;
6443 pDrvEsTbl->u32WrPtr = pDrvEsTbl->u32StAdd;
6444 //reset ES table
6445 #if 0
6446 _MVD_Memset(pDrvEsTbl->u32StAdd, 0, ES_TBL_SIZE);
6447 #else
6448 //_miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,pDrvEsTbl->u32StAdd,temp);
6449 temp = pDrvEsTbl->u32StAdd+pMVDHalContext->stMiuCfg.u8FWMiuSel*HAL_MIU1_BASE;
6450 memset((void*)(MS_PA2KSEG1(temp)),0,ES_TBL_SIZE);
6451 MsOS_FlushMemory();
6452 MsOS_ReadMemory();
6453 #endif
6454 }
6455
6456 //------------------------------------------------------------------------------------------------------------
6457 // Layout of drvProcBuffer
6458 // -----------------
6459 // drvProcBuff | SlqTbl entries | <- pstSlqTblInfo->pDrvSlqTbl->u32StAdd
6460 // | 8K bytes |
6461 // | (1024 entries) |
6462 // | |
6463 // |-----------------|
6464 // | DivX311 | <- pstSlqTblInfo->pDrvSlqTbl->u32EndAdd <- pstSlqTblInfo->pDrvDivxTbl->u32StAdd
6465 // | 8K bytes |
6466 // | (1024 entries) |
6467 // | |
6468 // |-----------------|
6469 // | Flush Patterns |... <- pstSlqTblInfo->pDrvDivxTbl->u32EndAdd <- _drvDummy.u32StAdd
6470 // | 8K bytes |
6471 // | (1024 entries) |
6472 // | |
6473 // |-----------------|
6474 // | FileEnd Pattern |... <- _drvDummy.u32EndAdd <- _drvFileEnd.u32StAdd
6475 // | 8K bytes |
6476 // | (1024 entries) |
6477 // | |
6478 // |-----------------|
6479 // | ES table |... <- _drvFileEnd.u32EndAdd <- pstSlqTblInfo->pDrvEsTbl->u32StAdd
6480 // | 8K bytes |
6481 // | (1024 entries) |
6482 // | |
6483 // |-----------------|
6484 // | |........ End of drvProcBuff
6485 //
6486 //------------------------------------------------------------------------------------------------------------
HAL_MVD_SLQTblInit(MS_U8 u8Idx)6487 MS_BOOL HAL_MVD_SLQTblInit(MS_U8 u8Idx)
6488 {
6489 MS_VIRT u32Addr, u32Len;
6490 MVD_CodecType curCodecType = HAL_MVD_GetCodecType(u8Idx);
6491 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
6492 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
6493
6494 if(curCodecType == E_MVD_CODEC_UNKNOWN)
6495 {
6496 MVD_DEBUGERROR(printf("%s: unknow codec type!\n", __FUNCTION__));
6497 return FALSE;
6498 }
6499 pstSlqTblInfo->u32DummyPktCnt = 0;//reset dummy packet counter
6500 pstSlqTblInfo->u32SlqByteCnt = 0; //reset SLQ table byte counter
6501 pstSlqTblInfo->bSlqTblHasValidData = FALSE;
6502
6503 HAL_MVD_MemGetMap(u8Idx, E_MVD_MMAP_DRV, &u32Addr, &u32Len);
6504
6505 //init SLQ table attributes & reset SLQ table read/write pointers
6506 MVD_SLQTblInitDrvSlqTbl(pstSlqTblInfo->pDrvSlqTbl, u32Addr);
6507 pstSlqTblInfo->u32FileEndPtr = pstSlqTblInfo->pDrvSlqTbl->u32StAdd;
6508
6509 MVD_SLQTblInitSlqStatus(pstSlqTblInfo->pSlqStatus, pstSlqTblInfo->pDrvSlqTbl->u32WrPtr);
6510
6511 //set SLQ table start/end to F/W
6512 HAL_MVD_SetSLQTblBufStartEnd(u8Idx, HAL_MVD_GetMemOffset(pstMemCfg->u32BSAddr), HAL_MVD_GetMemOffset(pstMemCfg->u32BSAddr+SLQ_TBL_SIZE));
6513
6514 ///// init SLQ entries for DivX311
6515 MVD_SLQTblInitDrvDivxTbl(pstSlqTblInfo->pDrvDivxTbl, pstSlqTblInfo->pDrvSlqTbl->u32EndAdd, SLQ_TBL_SIZE);
6516
6517 ///// init flush pattern
6518 MVD_SLQTblInitDummyPkt(u8Idx, curCodecType);
6519
6520 ///// init file-end pattern
6521 MVD_SLQTblInitFileEndPkt(u8Idx, curCodecType);
6522
6523 MVD_SLQTblInitDrvEsTbl(pstSlqTblInfo->pDrvEsTbl, (pstSlqTblInfo->pDrvDivxTbl->u32EndAdd + DUMMY_SIZE*2), pstMemCfg->u32DrvBufSize);
6524
6525 pstSlqTblInfo->u32PreEsRd = MVD_U32_MAX; //reset ES read pointer
6526 pstSlqTblInfo->u32PreEsWr = 0; //reset ES write pointer
6527
6528 return TRUE;
6529 }
6530
6531
6532 #if 0
6533 static void _SLQTbl_DumpInfo(MVD_SLQ_TBL_ST* pInfo)
6534 {
6535 printf("str=0x%x\n", pInfo->u32StAdd);
6536 printf("end=0x%x\n", pInfo->u32EndAdd);
6537 printf("cnt=0x%x\n", pInfo->u32EntryCntMax);
6538 printf("rd =0x%x\n", pInfo->u32RdPtr);
6539 printf("wr =0x%x\n", pInfo->u32WrPtr);
6540 return;
6541 }
6542 #endif
6543
6544
HAL_MVD_GetQueueVacancy(MS_U8 u8Idx,MS_BOOL bCached)6545 MS_U32 HAL_MVD_GetQueueVacancy(MS_U8 u8Idx, MS_BOOL bCached)
6546 {
6547 MS_U32 u32Empty;
6548 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
6549
6550 #if 0
6551 if (MDrv_MVD_GetVldErrCount()!=0)
6552 {
6553 printf("QQQ wPtr= 0x%x(0x%x) rPtr=0x%x(0x%x) vldErr=0x%x\n", writePtrLast[u8Idx], pstSlqTblInfo->pDrvSlqTbl->u32WrPtr,
6554 HAL_MVD_GetSLQReadPtr(u8Idx), pstSlqTblInfo->pDrvSlqTbl->u32RdPtr, MDrv_MVD_GetVldErrCount(u8Idx));
6555 printf("Previous EsRead=0x%x EsWrite=0x%x\n", pstSlqTblInfo->u32PreEsRd, pstSlqTblInfo->u32PreEsWr);
6556 _SLQTbl_DumpPtsTbl(u8Idx, 0x0, 0x620);
6557 while(1);
6558 }
6559 #endif
6560
6561 u32Empty = pstSlqTblInfo->pDrvSlqTbl->u32Empty;
6562 if ((TRUE == bCached) && (u32Empty > SLQTBL_CHECKVACANCY_WATERLEVEL))
6563 {
6564 //To have better performance, we only query F/W read pointer
6565 //when queue_vacancy is lower than water_level
6566 if (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr > pstSlqTblInfo->pDrvSlqTbl->u32RdPtr)
6567 {
6568 u32Empty = SLQ_TBL_SIZE - (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr - pstSlqTblInfo->pDrvSlqTbl->u32RdPtr);
6569 }
6570 else
6571 {
6572 u32Empty = pstSlqTblInfo->pDrvSlqTbl->u32RdPtr - pstSlqTblInfo->pDrvSlqTbl->u32WrPtr;
6573 }
6574
6575 if (u32Empty == 0)// && (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr == pstSlqTblInfo->pDrvSlqTbl->u32StAdd))
6576 {
6577 u32Empty = SLQ_TBL_SIZE;
6578 }
6579 u32Empty -= SLQ_TBL_SAFERANGE;
6580 return (u32Empty / SLQ_ENTRY_LEN);
6581 }
6582
6583 pstSlqTblInfo->pDrvSlqTbl->u32RdPtr = HAL_MVD_Map2DrvSlqTbl(u8Idx, HAL_MVD_GetSLQReadPtr(u8Idx));
6584 //printf("QV=0x%x rd=0x%x==>", u32Empty, pstSlqTblInfo->pDrvSlqTbl->u32RdPtr);
6585 if (pstSlqTblInfo->pDrvSlqTbl->u32RdPtr >= (pstSlqTblInfo->pDrvSlqTbl->u32StAdd+SLQ_ENTRY_LEN))
6586 {
6587 if (pstSlqTblInfo->pDrvSlqTbl->u32RdPtr >= pstSlqTblInfo->pDrvSlqTbl->u32EndAdd)
6588 {
6589 MVD_DEBUGERROR(printf("%s: readPtr 0x%lx out of range: too large!\n",
6590 __FUNCTION__, (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32RdPtr));
6591 }
6592 pstSlqTblInfo->pDrvSlqTbl->u32RdPtr -= SLQ_ENTRY_LEN;
6593 }
6594 else if (pstSlqTblInfo->pDrvSlqTbl->u32RdPtr == pstSlqTblInfo->pDrvSlqTbl->u32StAdd)
6595 {
6596 pstSlqTblInfo->pDrvSlqTbl->u32RdPtr = pstSlqTblInfo->pDrvSlqTbl->u32EndAdd - SLQ_ENTRY_LEN;
6597 }
6598 else
6599 {
6600 MVD_DEBUGERROR(printf("%s: readPtr 0x%lx out of range: too small!\n",
6601 __FUNCTION__, (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32RdPtr));
6602 pstSlqTblInfo->pDrvSlqTbl->u32RdPtr = pstSlqTblInfo->pDrvSlqTbl->u32StAdd;
6603 }
6604 //printf("0x%x\n", pstSlqTblInfo->pDrvSlqTbl->u32RdPtr);
6605
6606 if (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr > pstSlqTblInfo->pDrvSlqTbl->u32RdPtr)
6607 {
6608 u32Empty = SLQ_TBL_SIZE - (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr - pstSlqTblInfo->pDrvSlqTbl->u32RdPtr);
6609 }
6610 else
6611 {
6612 u32Empty = pstSlqTblInfo->pDrvSlqTbl->u32RdPtr - pstSlqTblInfo->pDrvSlqTbl->u32WrPtr;
6613 }
6614
6615 if (u32Empty == 0)// && (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr == pstSlqTblInfo->pDrvSlqTbl->u32StAdd))
6616 {
6617 u32Empty = SLQ_TBL_SIZE;
6618 }
6619
6620 pstSlqTblInfo->pDrvSlqTbl->u32Empty = u32Empty;
6621
6622 if (u32Empty < SLQ_TBL_SAFERANGE)
6623 {//to avoid write_pointer catch up to read_pointer
6624 u32Empty= 0;
6625 }
6626 else
6627 {
6628 u32Empty -= SLQ_TBL_SAFERANGE;
6629 }
6630
6631 //printf("%s r=0x%x w=0x%x u32Empty=0x%x\n", __FUNCTION__,
6632 // pstSlqTblInfo->pDrvSlqTbl->u32RdPtr, pstSlqTblInfo->pDrvSlqTbl->u32WrPtr, u32Empty);
6633 return (u32Empty / SLQ_ENTRY_LEN);
6634 }
6635
HAL_MVD_PushQueue(MS_U8 u8Idx,MVD_PacketInfo * pInfo)6636 E_MVD_Result HAL_MVD_PushQueue(MS_U8 u8Idx, MVD_PacketInfo* pInfo)
6637 {
6638 E_MVD_Result eRet=E_MVD_RET_INVALID_PARAM;
6639 MVD_CodecType curCodecType = HAL_MVD_GetCodecType(u8Idx);
6640 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
6641 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
6642 MS_U32 u32Id = MVD_GetStreamId(u8Idx);
6643 MS_U8 u8VPUIdx = HAL_VPU_EX_GetTaskId(u32Id);
6644 #ifdef VDEC3
6645 MS_VIRT u32VBBUAddr = HAL_MVD_GetVBBUTableAddr(u8VPUIdx);
6646 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
6647 #endif
6648 if (pInfo == NULL)
6649 {
6650 MVD_DEBUGERROR(printf("PushQueue NULL pInfo\n"));
6651 return E_MVD_RET_INVALID_PARAM;
6652 }
6653
6654 #ifndef VDEC3
6655 if(pMVDHalContext->bAutoInsertDummyPattern[u8Idx] == TRUE)
6656 #else
6657 if(pstCtrlCfg->u8McuMode == TRUE)
6658 #endif
6659 {
6660 MS_U8* temp = (MS_U8*)(MS_PA2KSEG1( pInfo->u32StAddr+pstMemCfg->u32BSAddr));
6661 MS_U32 i;
6662 MS_U32 u32DummyPattern[3];
6663 MS_U32 u32PatternSize;
6664
6665 switch (curCodecType)
6666 {
6667 case E_MVD_CODEC_FLV:
6668 case E_MVD_CODEC_MPEG4_SHORT_VIDEO_HEADER:
6669 u32DummyPattern[0] = FLV_PATTERN;
6670 u32PatternSize = 1;
6671 break;
6672
6673 case E_MVD_CODEC_DIVX311:
6674 u32DummyPattern[0] = DIVX_PATTERN;
6675 u32PatternSize = 1;
6676 break;
6677
6678 case E_MVD_CODEC_VC1_ADV: //vc1
6679 u32DummyPattern[0] = VC1_PATTERN_0;
6680 u32DummyPattern[1] = VC1_PATTERN_3;
6681 u32PatternSize = 2;
6682 break;
6683 case E_MVD_CODEC_VC1_MAIN: //rcv
6684 u32DummyPattern[0] = RCV_PATTERN_3;
6685 u32DummyPattern[1] = RCV_PATTERN_1;
6686 u32DummyPattern[2] = RCV_PATTERN_3;
6687 u32PatternSize = 3;
6688 break;
6689
6690 default:
6691 u32DummyPattern[0] = DUMMY_PATTERN;
6692 u32DummyPattern[1] = DUMMY_PATTERN;
6693 u32PatternSize = 2;
6694 break;
6695 }
6696
6697
6698 for (i=0; i<u32PatternSize; i++)
6699 {
6700 temp[4*i+pInfo->u32Length] = ((u32DummyPattern[i])&0xff);
6701 temp[4*i+pInfo->u32Length+1] = ((u32DummyPattern[i]>>8)&0xff);
6702 temp[4*i+pInfo->u32Length+2] = ((u32DummyPattern[i]>>16)&0xff);
6703 temp[4*i+pInfo->u32Length+3] = ((u32DummyPattern[i]>>24)&0xff);
6704 }
6705
6706 for(i=u32PatternSize*4;i<256;i++)
6707 {
6708 temp[pInfo->u32Length+i] = 0xFF;
6709 }
6710
6711 pInfo->u32Length += 256;
6712 }
6713
6714
6715 #if _SLQTBL_DUMP_PUSHQ
6716 {
6717 //static MS_U32 u32pqTimes[MAX_DEC_NUM]= {0, 0};
6718
6719 printf("Push[%x] st=0x%x len=0x%x pts=0x%x\n", pMVDHalContext->u32pqTimes[u8Idx]++,
6720 pInfo->u32StAddr, pInfo->u32Length, pInfo->u32TimeStamp);
6721 }
6722 #endif
6723
6724 #if SLQ_NEW_PUSH
6725 if((pInfo->u32StAddr & SLQ_PIC_START_FLAG) == SLQ_PIC_START_FLAG)
6726 {
6727 pInfo->u32StAddr = pInfo->u32StAddr&~SLQ_PIC_START_FLAG;
6728 pstSlqTblInfo->pSlqStatus->bSlqPicStart =TRUE;
6729 pstSlqTblInfo->pSlqStatus->bSlqCtrlBit = TRUE;
6730 }
6731 else
6732 {
6733 pstSlqTblInfo->pSlqStatus->bSlqPicStart = FALSE;
6734 }
6735 #endif
6736 //check input parameters
6737 if (pInfo->u32StAddr >= pstMemCfg->u32BSSize)
6738 {
6739 //since u32StAddr is offset, it shouldn't be larger than size.
6740 MVD_DEBUGERROR(printf("PushQueue invalid u32StAddr=0x%lx, bsSize=0x%lx\n", (unsigned long)pInfo->u32StAddr, (unsigned long)pstMemCfg->u32BSSize));
6741 return E_MVD_RET_INVALID_PARAM;
6742 }
6743 else if ((pInfo->u32TimeStamp == MVD_NULLPKT_PTS) && (pInfo->u32Length==0))
6744 {
6745 // AVI NULL packet.
6746 pstSlqTblInfo->u32DummyPktCnt++;
6747 //printf("Pos:0x%x%08x; PTS:%08d; NullPKT:%d\n", pInfo->u32ID_H, pInfo->u32ID_L, pInfo->u32TimeStamp, pstSlqTblInfo->u32DummyPktCnt);
6748 return E_MVD_RET_OK;
6749 }
6750
6751 if (FALSE == (HAL_MVD_IsMStreamerMode(u8Idx) ||HAL_MVD_IsMcuMode(u8Idx)))
6752 { //Check repeat PTS for non-MStreamer/Mcu mode.
6753 //printf(".Pos:0x%x%08x; PTS:%08d; NullPKT:%d\n", pInfo->u32ID_H, pInfo->u32ID_L, pInfo->u32TimeStamp, pstSlqTblInfo->u32DummyPktCnt);
6754 if (pInfo->u32TimeStamp == pstSlqTblInfo->u32LastPts)
6755 {
6756 //printf("Repeat PTS!\n");
6757 if (pInfo->u32TimeStamp != MVD_NULLPKT_PTS)
6758 pInfo->u32TimeStamp = MVD_NULLPKT_PTS; //repeat PTS
6759 }
6760 else
6761 {
6762 pstSlqTblInfo->u32LastPts = pInfo->u32TimeStamp;
6763 }
6764 }
6765
6766 //check queue vacancy
6767 if (pstSlqTblInfo->pDrvSlqTbl->u32Empty >= SLQ_TBL_SAFERANGE)
6768 { //put packets
6769 #if SLQ_NEW_PUSH
6770 if (E_MVD_CODEC_DIVX311 == curCodecType
6771 ||E_MVD_CODEC_VC1_MAIN == curCodecType //rcv
6772 ||E_MVD_CODEC_VC1_ADV == curCodecType)
6773 {
6774 MVD_PacketInfo stHdr;
6775 if((pstSlqTblInfo->pSlqStatus->bSlqCtrlBit) || (E_MVD_CODEC_DIVX311 == curCodecType))
6776 {
6777 MVD_SLQTblGetHdrPkt(u8Idx, &stHdr, pInfo);
6778
6779 if(pstSlqTblInfo->pSlqStatus->bSlqPicStart||(!pstSlqTblInfo->pSlqStatus->bSlqCtrlBit))
6780 {
6781 if (HAL_MVD_IsMStreamerMode(u8Idx) || HAL_MVD_IsMcuMode(u8Idx))
6782 { //to mark this packet's pts as unused.
6783 stHdr.u32TimeStamp = MVD_NULLPKT_PTS;
6784 stHdr.u32ID_H = MVD_NULLPKT_PTS;
6785 }
6786 #ifdef VDEC3
6787 if(pstCtrlCfg->u8McuMode == TRUE)
6788 {
6789 if(HAL_VPU_EX_GetVBBUVacancy(u32VBBUAddr) > 1)
6790 {
6791 HAL_VPU_EX_PacketInfo stVpuPkt;
6792
6793 stVpuPkt.u32Offset = stHdr.u32StAddr;
6794 stVpuPkt.u32Length = stHdr.u32Length;
6795 stVpuPkt.u64TimeStamp = (MS_U64)stHdr.u32TimeStamp;
6796 //If in display queue mode
6797 stVpuPkt.u64TimeStamp |= ((MS_U64)stHdr.u32ID_H << 32);
6798 stVpuPkt.u32ID_H = stHdr.u32ID_H;
6799 stVpuPkt.u32ID_L = stHdr.u32ID_L;
6800
6801 pstSlqTblInfo->bSlqTblHasValidData = TRUE;
6802 eRet = (E_MVD_Result)HAL_VPU_EX_Push2VBBU(u32Id, &stVpuPkt, u32VBBUAddr);
6803 }
6804 else
6805 {
6806 return E_MVD_RET_FAIL;
6807 }
6808 }
6809 else
6810 #endif
6811 {
6812 HAL_MVD_SLQTblSendPacket(u8Idx, &stHdr);
6813 }
6814 }
6815 }
6816 }
6817 #else
6818 if (E_MVD_CODEC_DIVX311 == curCodecType)
6819 {
6820 MVD_PacketInfo stDivxHdr;
6821 MVD_SLQTblGetDivxHdrPkt(u8Idx, &stDivxHdr, pInfo);
6822 if (HAL_MVD_IsMStreamerMode(u8Idx) || HAL_MVD_IsMcuMode(u8Idx))
6823 { //to mark this packet's pts as unused.
6824 stDivxHdr.u32TimeStamp = MVD_NULLPKT_PTS;
6825 stDivxHdr.u32ID_H = MVD_NULLPKT_PTS;
6826 }
6827 HAL_MVD_SLQTblSendPacket(u8Idx, &stDivxHdr);
6828 }
6829 #endif
6830
6831 #ifdef VDEC3
6832 if(pstCtrlCfg->u8McuMode == TRUE)
6833 {
6834 if(HAL_VPU_EX_GetVBBUVacancy(u32VBBUAddr) > 0)
6835 {
6836 HAL_VPU_EX_PacketInfo stVpuPkt;
6837
6838 stVpuPkt.u32Offset = pInfo->u32StAddr;
6839 stVpuPkt.u32Length = pInfo->u32Length;
6840 stVpuPkt.u64TimeStamp = (MS_U64)pInfo->u32TimeStamp;
6841 //If in display queue mode
6842 stVpuPkt.u64TimeStamp |= ((MS_U64)pInfo->u32ID_H << 32);
6843 stVpuPkt.u32ID_H = pInfo->u32ID_H;
6844 stVpuPkt.u32ID_L = pInfo->u32ID_L;
6845
6846 pstSlqTblInfo->bSlqTblHasValidData = TRUE;
6847 eRet = (E_MVD_Result)HAL_VPU_EX_Push2VBBU(u32Id, &stVpuPkt, u32VBBUAddr);
6848 //VPRINTF("[%d]%s[%d],ret=%d,u32StAddr %x,u32Length %d,u32TimeStamp %d\n",u8Idx,__FUNCTION__,__LINE__,eRet,(unsigned int)pInfo->u32StAddr,(unsigned int)pInfo->u32Length,(unsigned int)pInfo->u32TimeStamp);
6849 return eRet;
6850 }
6851 else
6852 {
6853 return E_MVD_RET_FAIL;
6854 }
6855 }
6856 else
6857 #endif
6858 {
6859 HAL_MVD_SLQTblSendPacket(u8Idx, pInfo);
6860 eRet=E_MVD_RET_OK;
6861 pstSlqTblInfo->bSlqTblHasValidData = TRUE;
6862 }
6863 }
6864 else
6865 {
6866 MS_ASSERT(0); //shouldn't be here!
6867 MVD_DEBUGERROR(printf("PushQueue FULL!!! empty=0x%lx\n", (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32Empty));
6868 //Player will only push queue when queue vacancy != 0
6869 eRet=E_MVD_RET_QUEUE_FULL;
6870 }
6871
6872 if (E_MVD_RET_OK != eRet)
6873 {
6874 MVD_DEBUGERROR(printf("%s ret = %d\n", __FUNCTION__, eRet));
6875 }
6876 return eRet;
6877 }
6878
6879
MVD_FlushTSQueue(MS_U8 u8Idx)6880 static E_MVD_Result MVD_FlushTSQueue(MS_U8 u8Idx)
6881 {
6882 if (HAL_MVD_GetLastCmd(u8Idx)!=CMD_PAUSE)
6883 {
6884 HAL_MVD_PauseDisp(u8Idx);
6885 HAL_MVD_DecodePause(u8Idx);
6886 HAL_MVD_FlushDisplayBuf(u8Idx);
6887 }
6888
6889 if(HAL_MVD_SkipData(u8Idx) == FALSE)
6890 {
6891 return E_MVD_RET_FAIL;
6892 }
6893 else
6894 {
6895 return E_MVD_RET_OK;
6896 }
6897 }
6898
6899
MVD_PatternLenIsValid(MS_U8 u8Idx,MS_U32 u32Len)6900 static MS_BOOL MVD_PatternLenIsValid(MS_U8 u8Idx, MS_U32 u32Len)
6901 {
6902 MS_U32 u32ValidLen = 0;
6903 MVD_CodecType curCodecType = HAL_MVD_GetCodecType(u8Idx);
6904 #define MAX_VALIDLEN 0x200000 //2M
6905
6906 if (E_MVD_CODEC_VC1_MAIN != curCodecType)
6907 {
6908 return TRUE;
6909 }
6910 else
6911 {
6912 //only RCV has to check this
6913 u32ValidLen = HAL_MVD_GetPayloadLen(u8Idx);
6914 if (u32ValidLen > MAX_VALIDLEN)
6915 { //avoid the extreme large value due to error bitstream
6916 u32ValidLen = MAX_VALIDLEN;
6917 }
6918 MVD_DEBUGINFO(printf("(%x) ValidLen=0x%x CurLen=0x%x\n",
6919 (u32Len > u32ValidLen), u32ValidLen, u32Len));
6920 return (u32Len > u32ValidLen);
6921 }
6922 }
6923
MVD_FlushSlqTblQueue(MS_U8 u8Idx)6924 static E_MVD_Result MVD_FlushSlqTblQueue(MS_U8 u8Idx)
6925 {
6926 MS_U32 u32TimeCnt;
6927 MS_U32 u32PatternByteCnt = 0;
6928 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
6929 MS_U32 u32Id = MVD_GetStreamId(u8Idx);
6930 MS_U8 u8VPUIdx = HAL_VPU_EX_GetTaskId(u32Id);
6931 #ifdef VDEC3
6932 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
6933 MS_VIRT u32VBBUAddr = HAL_MVD_GetVBBUTableAddr(u8VPUIdx);
6934 #endif
6935 HAL_MVD_ResetHandShake(u8Idx,MVD_HANDSHAKE_PAUSE);
6936 HAL_MVD_PauseDisp(u8Idx);
6937 HAL_MVD_DecodePause(u8Idx);
6938 HAL_MVD_FlushDisplayBuf(u8Idx);
6939
6940 u32TimeCnt = HAL_MVD_GetTime();
6941 while (((HAL_MVD_GetTime() - u32TimeCnt) < CMD_TIMEOUT_MS) ||
6942 (TRUE != MVD_PatternLenIsValid(u8Idx, u32PatternByteCnt)))
6943 {
6944 if (HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_PAUSE))
6945 {
6946 MVD_DEBUGINFO(printf("\nPause finished!\n"));
6947 break;
6948 }
6949
6950 #ifdef VDEC3
6951 if(pstCtrlCfg->u8McuMode == TRUE)
6952 {
6953 if(HAL_VPU_EX_GetVBBUVacancy(u32VBBUAddr) > 0)
6954 {
6955 HAL_VPU_EX_PacketInfo stVpuPkt;
6956 MVD_PacketInfo stDummyPkt;
6957 MVD_SLQTblGetDummyPkt(&stDummyPkt);
6958
6959 stVpuPkt.u32Offset = stDummyPkt.u32StAddr;
6960 stVpuPkt.u32Length = stDummyPkt.u32Length;
6961 stVpuPkt.u64TimeStamp = (MS_U64)stDummyPkt.u32TimeStamp;
6962 //If in display queue mode
6963 stVpuPkt.u64TimeStamp |= ((MS_U64)stDummyPkt.u32ID_H << 32);
6964 stVpuPkt.u32ID_H = stDummyPkt.u32ID_H;
6965 stVpuPkt.u32ID_L = stDummyPkt.u32ID_L;
6966
6967 HAL_VPU_EX_Push2VBBU(u32Id, &stVpuPkt,u32VBBUAddr);
6968 }
6969 }
6970 else
6971 #endif
6972 {
6973 if (pstSlqTblInfo->pDrvSlqTbl->u32Empty < SLQ_TBL_SAFERANGE)
6974 {
6975 HAL_MVD_GetQueueVacancy(u8Idx, FALSE); //update pstSlqTblInfo->pDrvSlqTbl->u32Empty
6976 HAL_MVD_Delayms(1); //avoid busy query
6977 }
6978 //insert dummy pattern
6979 if (TRUE == HAL_MVD_SLQTblInsertPattern(u8Idx, E_MVD_PATTERN_FLUSH))
6980 {
6981 u32PatternByteCnt += DUMMY_SIZE*2; //2 dummy were inserted
6982 }
6983 }
6984
6985
6986 //Timeout for RCV
6987 if ((HAL_MVD_GetTime() - u32TimeCnt) > (CMD_TIMEOUT_MS*10))
6988 {
6989 MVD_DEBUGERROR(printf("RCV timeout!!! pl=%d, pbc=%d, emp=%ld\n",
6990 HAL_MVD_GetPayloadLen(u8Idx), u32PatternByteCnt,
6991 (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32Empty));
6992 break;
6993 }
6994 }
6995 MVD_DEBUGINFO(printf("====> %s (t1=%u t2=%u diff=%u)\n", __FUNCTION__,
6996 u32TimeCnt, HAL_MVD_GetTime(), (HAL_MVD_GetTime() - u32TimeCnt)));
6997 //if ((HAL_MVD_GetTime() - u32TimeCnt) >= CMD_TIMEOUT_MS)
6998 if (TRUE != HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_PAUSE))
6999 {
7000 MVD_DEBUGERROR(printf("\n***** MDrv_MVD_FlushQueue PAUSE TIMEOUT!!! *****\n\n"));
7001 MVD_DEBUGERROR(printf("ValidLen=0x%x CurPatternLen=0x%x\n",
7002 HAL_MVD_GetPayloadLen(u8Idx), u32PatternByteCnt));
7003
7004 return E_MVD_RET_FAIL;
7005 }
7006
7007 //flush ES buffer & reset SLQ tbl
7008 HAL_MVD_ResetHandShake(u8Idx, MVD_HANDSHAKE_SLQ_RST);
7009 if (HAL_MVD_SlqTblRst(u8Idx) == TRUE)
7010 {
7011 //return E_MVD_RET_OK;
7012 }
7013
7014 u32TimeCnt = HAL_MVD_GetTime();
7015 while (((HAL_MVD_GetTime() - u32TimeCnt) < CMD_TIMEOUT_MS))
7016 {
7017 if (HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_SLQ_RST))
7018 {
7019 MVD_DEBUGINFO(printf("\nSlqRst finished!\n"));
7020 break;
7021 }
7022 }
7023 MVD_DEBUGINFO(printf("====> %s (t1=%u t2=%u diff=%u)\n", __FUNCTION__,
7024 u32TimeCnt, HAL_MVD_GetTime(), (HAL_MVD_GetTime() - u32TimeCnt)));
7025 if (TRUE != HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_SLQ_RST))
7026 {
7027 MVD_DEBUGERROR(printf("\n***** MDrv_MVD_FlushQueue SlqRst TIMEOUT!!! *****\n\n"));
7028 return E_MVD_RET_FAIL;
7029 }
7030
7031 HAL_MVD_SLQTblInit(u8Idx); //reset related buffers
7032
7033 return E_MVD_RET_OK;
7034 }
7035
HAL_MVD_FlushQueue(MS_U8 u8Idx)7036 E_MVD_Result HAL_MVD_FlushQueue(MS_U8 u8Idx)
7037 {
7038 E_MVD_Result eRet = E_MVD_RET_OK;
7039 MVD_SrcMode curSrcMode = HAL_MVD_GetSrcMode(u8Idx);
7040
7041 if (HAL_MVD_GetDecodeStatus(u8Idx) == E_MVD_STAT_IDLE)
7042 {
7043 return eRet;
7044 }
7045
7046 //flush ES buffer (and cmd queue if used)
7047 if (E_MVD_SLQ_TBL_MODE == curSrcMode)
7048 {
7049 eRet = MVD_FlushSlqTblQueue(u8Idx);
7050 }
7051 else if (E_MVD_TS_FILE_MODE == curSrcMode)
7052 {
7053 eRet = MVD_FlushTSQueue(u8Idx);
7054 }
7055 if (E_MVD_RET_OK != eRet)
7056 {
7057 return eRet;
7058 }
7059
7060 MVD_RstFrmInfo(u8Idx, E_MVD_FRMINFO_DECODE);
7061 //flush display buffer
7062
7063 if (HAL_MVD_FlushDisplayBuf(u8Idx) != TRUE)
7064 {
7065 return E_MVD_RET_FAIL;
7066 }
7067
7068 if (TRUE == HAL_MVD_SkipToIFrame(u8Idx))
7069 {
7070 return E_MVD_RET_OK;
7071 }
7072 else
7073 {
7074 return E_MVD_RET_FAIL;
7075 }
7076 }
7077
HAL_MVD_IsAllBufferEmpty(MS_U8 u8Idx)7078 MS_BOOL HAL_MVD_IsAllBufferEmpty(MS_U8 u8Idx)
7079 {
7080 return HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_SKIP_DATA);
7081 }
7082
HAL_MVD_EnableInt(MS_U8 u8Idx,MS_U32 bEn)7083 MS_BOOL HAL_MVD_EnableInt(MS_U8 u8Idx, MS_U32 bEn)
7084 {
7085 MVD_CmdArg mvdcmd;
7086 MS_U32 u32IntFlag = 0;
7087
7088 u32IntFlag = (((bEn & E_MVD_EVENT_USER_DATA) == E_MVD_EVENT_USER_DATA) ? INT_USER_DATA : 0) |
7089 (((bEn & E_MVD_EVENT_USER_DATA_DISP) == E_MVD_EVENT_USER_DATA_DISP) ? INT_USER_DATA_DISP : 0) |
7090 (((bEn & E_MVD_EVENT_PIC_FOUND) == E_MVD_EVENT_PIC_FOUND) ? INT_PIC_FOUND : 0) |
7091 (((bEn & E_MVD_EVENT_FIRST_FRAME) == E_MVD_EVENT_FIRST_FRAME) ? INT_FIRST_FRAME : 0) |
7092 (((bEn & E_MVD_EVENT_DISP_RDY) == E_MVD_EVENT_DISP_RDY) ? INT_DISP_RDY : 0) |
7093 (((bEn & E_MVD_EVENT_SEQ_FOUND) == E_MVD_EVENT_SEQ_FOUND) ? INT_SEQ_FOUND : 0)|
7094 (((bEn & E_MVD_EVENT_DEC_ONE_FRAME) == E_MVD_EVENT_DEC_ONE_FRAME) ? INT_DEC_DONE : 0)|
7095 (((bEn & E_MVD_EVENT_DEC_ERR) == E_MVD_EVENT_DEC_ERR) ? INT_DEC_ERR : 0)|
7096 (((bEn & E_MVD_EVENT_DEC_DATA_ERR) == E_MVD_EVENT_DEC_DATA_ERR) ? INT_VES_INVALID : 0)|
7097 (((bEn & E_MVD_EVENT_XC_LOW_DEALY) == E_MVD_EVENT_XC_LOW_DEALY) ? INT_XC_LOW_DELAY : 0)|
7098 (((bEn & E_MVD_EVENT_DEC_I) == E_MVD_EVENT_DEC_I) ? INT_DEC_I : 0)|
7099 (((bEn & E_MVD_EVENT_DISP_FINISH) == E_MVD_EVENT_DISP_FINISH) ? INT_DISP_FINISH: 0)|
7100 (((bEn & E_MVD_EVENT_PTS_DISCONTINUE) == E_MVD_EVENT_PTS_DISCONTINUE) ? INT_PTS_DISCONTINUE : 0);
7101 if (((bEn & E_MVD_EVENT_DISP_VSYNC) == E_MVD_EVENT_DISP_VSYNC) ||
7102 ((bEn & E_MVD_EVENT_UNMUTE) == E_MVD_EVENT_UNMUTE))
7103 {
7104 u32IntFlag |= INT_DISP_VSYNC;
7105 }
7106
7107 MVD_DEBUGINFO(printf("u32IntFlag = 0x%x\n", u32IntFlag));
7108 SETUP_CMDARG(mvdcmd);
7109 mvdcmd.Arg0 = u32IntFlag & 0xff;
7110 mvdcmd.Arg1 = (u32IntFlag>>8) & 0xff;
7111 mvdcmd.Arg2 = (u32IntFlag>>16) & 0xff;
7112 SET_DECNUM(mvdcmd, u8Idx);
7113 SET_CMD_RET_FALSE(CMD_ENABLE_INT_STAT, &mvdcmd);
7114
7115 return TRUE;
7116 }
7117
HAL_MVD_EnablePTSDetector(MS_U8 u8Idx,MS_BOOL bEn)7118 E_MVD_Result HAL_MVD_EnablePTSDetector(MS_U8 u8Idx, MS_BOOL bEn)
7119 {
7120 MVD_CmdArg stCmdArg;
7121
7122 SETUP_CMDARG(stCmdArg);
7123 if(TRUE == bEn)
7124 {
7125 stCmdArg.Arg0 = 1;
7126 }
7127 SET_DECNUM(stCmdArg, u8Idx);
7128 if (HAL_MVD_MVDCommand(CMD_PTS_DETECTOR_EN, &stCmdArg) == FALSE)
7129 {
7130 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_PTS_DETECTOR_EN ) );
7131 return E_MVD_RET_FAIL;
7132 }
7133 return E_MVD_RET_OK;
7134 }
7135
HAL_MVD_DisablePBFrameMode(MS_U8 u8Idx,MS_BOOL bEn)7136 E_MVD_Result HAL_MVD_DisablePBFrameMode(MS_U8 u8Idx, MS_BOOL bEn)
7137 {
7138 MVD_CmdArg stCmdArg;
7139
7140 SETUP_CMDARG(stCmdArg);
7141 if(TRUE == bEn)
7142 {
7143 stCmdArg.Arg0 = 1;
7144 }
7145 SET_DECNUM(stCmdArg, u8Idx);
7146 if (HAL_MVD_MVDCommand(CMD_DISABLE_PATCH_PBFRAME, &stCmdArg) == FALSE)
7147 {
7148 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_PTS_DETECTOR_EN ) );
7149 return E_MVD_RET_FAIL;
7150 }
7151 return E_MVD_RET_OK;
7152 }
7153
HAL_MVD_EnableDispOneField(MS_U8 u8Idx,MS_BOOL bEn)7154 E_MVD_Result HAL_MVD_EnableDispOneField(MS_U8 u8Idx, MS_BOOL bEn)
7155 {
7156 MVD_CmdArg stCmdArg;
7157
7158 SETUP_CMDARG(stCmdArg);
7159 if(TRUE == bEn)
7160 {
7161 stCmdArg.Arg0 = 1;
7162 }
7163 SET_DECNUM(stCmdArg, u8Idx);
7164 if (HAL_MVD_MVDCommand(CMD_SHOW_ONE_FIELD, &stCmdArg) == FALSE)
7165 {
7166 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SHOW_ONE_FIELD ) );
7167 return E_MVD_RET_FAIL;
7168 }
7169 return E_MVD_RET_OK;
7170 }
7171
HAL_MVD_SetFdMaskDelayCount(MS_U8 u8Idx,MS_U16 u16Cnt)7172 E_MVD_Result HAL_MVD_SetFdMaskDelayCount(MS_U8 u8Idx, MS_U16 u16Cnt)
7173 {
7174 MVD_CmdArg stCmdArg;
7175
7176 SETUP_CMDARG(stCmdArg);
7177 //16bits and unit in vsync for mute the fd_mask
7178 stCmdArg.Arg0 = u16Cnt & 0xff;
7179 stCmdArg.Arg1 = (u16Cnt>>8) & 0xff;
7180 SET_DECNUM(stCmdArg, u8Idx);
7181 if (HAL_MVD_MVDCommand(CMD_FD_MASK_DELAY_CNT, &stCmdArg) == FALSE)
7182 {
7183 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_FD_MASK_DELAY_CNT ) );
7184 return E_MVD_RET_FAIL;
7185 }
7186 return E_MVD_RET_OK;
7187 }
7188
HAL_MVD_SetOutputFRCMode(MS_U8 u8Idx,MS_U8 u8FrameRate,MS_U8 u8Interlace)7189 E_MVD_Result HAL_MVD_SetOutputFRCMode(MS_U8 u8Idx, MS_U8 u8FrameRate, MS_U8 u8Interlace)
7190 {
7191 MVD_CmdArg stCmdArg;
7192 if((u8Interlace != 0) && (u8Interlace != 1))
7193 {
7194 return E_MVD_RET_FAIL;
7195 }
7196 SETUP_CMDARG(stCmdArg);
7197 stCmdArg.Arg0 = u8FrameRate;
7198 stCmdArg.Arg1 = u8Interlace;
7199 SET_DECNUM(stCmdArg, u8Idx);
7200 if (HAL_MVD_MVDCommand(CMD_FRC_OUPUT, &stCmdArg) == FALSE)
7201 {
7202 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_FRC_OUPUT ) );
7203 return E_MVD_RET_FAIL;
7204 }
7205 return E_MVD_RET_OK;
7206 }
7207
7208
HAL_MVD_SetFRCDropType(MS_U8 u8Idx,MS_U8 u8DropType)7209 E_MVD_Result HAL_MVD_SetFRCDropType(MS_U8 u8Idx, MS_U8 u8DropType)
7210 {
7211 MVD_CmdArg stCmdArg;
7212
7213 if((u8DropType != FRC_DROP_FRAME)
7214 && (u8DropType != FRC_DROP_FIELD))
7215 {
7216 return E_MVD_RET_FAIL;
7217 }
7218
7219 SETUP_CMDARG(stCmdArg);
7220 stCmdArg.Arg0 = u8DropType;
7221 SET_DECNUM(stCmdArg, u8Idx);
7222 if (HAL_MVD_MVDCommand(CMD_FRC_DROP_BEHAVIOR, &stCmdArg) == FALSE)
7223 {
7224 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_FRC_DROP_BEHAVIOR ) );
7225 return E_MVD_RET_FAIL;
7226 }
7227 return E_MVD_RET_OK;
7228 }
7229
HAL_MVD_SetDisableSeqChange(MS_U8 u8Idx,MS_BOOL bEnable)7230 E_MVD_Result HAL_MVD_SetDisableSeqChange(MS_U8 u8Idx, MS_BOOL bEnable)
7231 {
7232 MVD_CmdArg stCmdArg;
7233
7234 SETUP_CMDARG(stCmdArg);
7235 stCmdArg.Arg0 = bEnable;
7236 SET_DECNUM(stCmdArg, u8Idx);
7237 if (HAL_MVD_MVDCommand(CMD_FORBID_RESOLUTION_CHANGE, &stCmdArg) == FALSE)
7238 {
7239 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_FORBID_RESOLUTION_CHANGE ) );
7240 return E_MVD_RET_FAIL;
7241 }
7242 MVD_DEBUGINFO(printf("MVD CMD_FORBID_RESOLUTION_CHANGE(0x%x) OK\n", bEnable));
7243
7244 return E_MVD_RET_OK;
7245 }
7246
HAL_MVD_DbgGetData(MS_VIRT u32Addr,MS_U32 * u32Data)7247 E_MVD_Result HAL_MVD_DbgGetData(MS_VIRT u32Addr, MS_U32* u32Data)
7248 {
7249 MVD_CmdArg mvdcmd;
7250 MS_U32 u32Val;
7251
7252 if (!u32Data)
7253 {
7254 return E_MVD_RET_INVALID_PARAM;
7255 }
7256
7257 SET_CMDARG(mvdcmd, u32Addr, 0); //FIXME
7258 if (HAL_MVD_MVDCommand( CMD_RD_IO, &mvdcmd ) == FALSE)
7259 {
7260 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_RD_IO ) );
7261 return E_MVD_RET_FAIL;
7262 }
7263
7264 u32Val = (((MS_U32)mvdcmd.Arg2)) | ((MS_U32)mvdcmd.Arg3 << 8) |
7265 (((MS_U32)mvdcmd.Arg4) << 16) | (((MS_U32)mvdcmd.Arg5) << 24);
7266 *u32Data = u32Val;
7267
7268 return E_MVD_RET_OK;
7269 }
7270
7271
HAL_MVD_DbgDumpBits(MS_U8 u8Idx,MS_PHY u32base,MS_U32 u32size)7272 void HAL_MVD_DbgDumpBits(MS_U8 u8Idx, MS_PHY u32base, MS_U32 u32size)
7273 {
7274 MVD_CmdArg mvdcmd;
7275
7276 u32base = HAL_MVD_GetMemOffset(u32base);
7277 printf("%s base=0x%lx size=0x%x\n", __FUNCTION__, (unsigned long)u32base, u32size);
7278 MS_ASSERT((u32base%8)==0);
7279 u32base >>= 3;
7280 SET_CMDARG(mvdcmd, u32base, u8Idx);
7281 if (HAL_MVD_MVDCommand( CMD_DUMP_BITSTREAM_BASE, &mvdcmd ) == FALSE)
7282 {
7283 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\n", CMD_DUMP_BITSTREAM_BASE ) );
7284 return;
7285 }
7286
7287 MS_ASSERT((u32size%8)==0);
7288 u32size >>= 3;
7289 SET_CMDARG(mvdcmd, u32size, u8Idx);
7290 if (HAL_MVD_MVDCommand( CMD_DUMP_BITSTREAM_LENGTH, &mvdcmd ) == FALSE)
7291 {
7292 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\n", CMD_DUMP_BITSTREAM_LENGTH ) );
7293 return;
7294 }
7295 return;
7296 }
7297
7298
HAL_MVD_GetActiveFormat(MS_U8 u8Idx)7299 MS_U8 HAL_MVD_GetActiveFormat(MS_U8 u8Idx)
7300 {
7301 MVD_CmdArg mvdcmd;
7302 MS_U8 u8Afd = 0;
7303
7304 SETUP_CMDARG(mvdcmd);
7305 SET_DECNUM(mvdcmd, u8Idx);
7306 if (HAL_MVD_MVDCommand( CMD_GET_AFD, &mvdcmd ) == FALSE)
7307 {
7308 MVD_DEBUGERROR( printf( "Ctrl: 0x%x fail!!\r\n", CMD_GET_AFD ) );
7309 return 0xff;
7310 }
7311 u8Afd = mvdcmd.Arg0;
7312 return u8Afd;
7313 }
7314
HAL_MVD_EnableAVSync(MS_U8 u8Idx,MS_BOOL bEnable)7315 MS_BOOL HAL_MVD_EnableAVSync(MS_U8 u8Idx, MS_BOOL bEnable)
7316 {
7317 MVD_CmdArg mvdcmd;
7318 SETUP_CMDARG(mvdcmd);
7319 mvdcmd.Arg0 = bEnable;
7320 SET_DECNUM(mvdcmd, u8Idx);
7321 SET_CMD_RET_FALSE(CMD_SYNC_ON, &mvdcmd);
7322
7323 MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
7324 pCtrlCfg->bAVSyncOn = bEnable;
7325
7326 return TRUE;
7327 }
7328
HAL_MVD_SetAVSyncDelay(MS_U8 u8Idx,MS_U32 u32Delay)7329 MS_BOOL HAL_MVD_SetAVSyncDelay(MS_U8 u8Idx, MS_U32 u32Delay)
7330 {
7331 MVD_CmdArg mvdcmd;
7332 SET_CMDARG(mvdcmd, _MS_TO_90K(u32Delay), u8Idx); //u32Delay ms ==> 90k counter
7333 SET_CMD_RET_FALSE(CMD_SYNC_OFFSET, &mvdcmd);
7334 return TRUE;
7335 }
7336
HAL_MVD_SetAVSyncThreshold(MS_U8 u8Idx,MS_U32 u32Th)7337 MS_BOOL HAL_MVD_SetAVSyncThreshold(MS_U8 u8Idx, MS_U32 u32Th)
7338 {
7339 MVD_CmdArg mvdcmd;
7340
7341 if (u32Th == 0x00)
7342 {
7343 return FALSE; //invalid parameter, do nothing
7344 }
7345 if (u32Th > 0xff)
7346 {
7347 u32Th = 0xff; //set to maximum
7348 }
7349
7350 SETUP_CMDARG(mvdcmd);
7351 mvdcmd.Arg3 = u32Th;
7352 SET_DECNUM(mvdcmd, u8Idx);
7353 SET_CMD_RET_FALSE(CMD_SYN_THRESHOLD, &mvdcmd);
7354 return TRUE;
7355 }
7356
HAL_MVD_SetAVSyncFreerunThreshold(MS_U8 u8Idx,MS_U32 u32Th)7357 MS_BOOL HAL_MVD_SetAVSyncFreerunThreshold(MS_U8 u8Idx, MS_U32 u32Th)
7358 {
7359 MVD_CmdArg mvdcmd;
7360 SET_CMDARG(mvdcmd, u32Th, u8Idx);
7361 SET_CMD_RET_FALSE(CMD_AVSYNC_FREERUN_THRESHOLD, &mvdcmd);
7362 return TRUE;
7363 }
7364
HAL_MVD_ChangeAVsync(MS_U8 u8Idx,MS_BOOL bEnable,MS_U16 u16PTS)7365 MS_BOOL HAL_MVD_ChangeAVsync(MS_U8 u8Idx, MS_BOOL bEnable, MS_U16 u16PTS)
7366 {
7367 MVD_CmdArg mvdcmd;
7368
7369 u16PTS = _MS_TO_90K(u16PTS); //u16PTS ms ==> 90k counter
7370 SETUP_CMDARG(mvdcmd);
7371 mvdcmd.Arg0 = (MS_U8)bEnable;
7372 mvdcmd.Arg1 = 0;
7373 mvdcmd.Arg2 = (MS_U8)(u16PTS&0xff);
7374 mvdcmd.Arg3 = (MS_U8)((u16PTS&0xff00)>>8);
7375 SET_DECNUM(mvdcmd, u8Idx);
7376 SET_CMD_RET_FALSE(CMD_MVD_FAST_INT, &mvdcmd);
7377 return TRUE;
7378 }
7379
HAL_MVD_GetIsSyncRep(MS_U8 u8Idx)7380 MS_BOOL HAL_MVD_GetIsSyncRep(MS_U8 u8Idx)
7381 {
7382 MS_U32 u32IntStat = 0;
7383 MS_BOOL bRet = FALSE;
7384
7385 u32IntStat = HAL_MVD_GetIntState(u8Idx);
7386 if (u32IntStat != 0)
7387 {
7388 bRet = ((u32IntStat&INT_SYN_REP)==INT_SYN_REP) ? TRUE : FALSE;
7389 }
7390 return bRet;
7391 }
7392
HAL_MVD_GetIsSyncSkip(MS_U8 u8Idx)7393 MS_BOOL HAL_MVD_GetIsSyncSkip(MS_U8 u8Idx)
7394 {
7395 MS_U32 u32IntStat = 0;
7396 MS_BOOL bRet = FALSE;
7397
7398 u32IntStat = HAL_MVD_GetIntState(u8Idx);
7399 if (u32IntStat != 0)
7400 {
7401 bRet = ((u32IntStat&INT_SYN_SKIP)==INT_SYN_SKIP) ? TRUE : FALSE;
7402 }
7403
7404 return bRet;
7405 }
7406
HAL_MVD_GetIsSyncReach(MS_U8 u8Idx)7407 MS_U8 HAL_MVD_GetIsSyncReach(MS_U8 u8Idx)
7408 {
7409 #define MVD_SYNC_DONE 1
7410 if(MVD_GetSyncStat(u8Idx, 1) == MVD_SYNC_DONE)
7411 return 1;
7412 else
7413 return 0xFF;
7414 }
7415
HAL_MVD_GetDispRdy(MS_U8 u8Idx)7416 MS_U8 HAL_MVD_GetDispRdy(MS_U8 u8Idx)
7417 {
7418 if (HAL_MVD_GetPicCounter(u8Idx) > 0)
7419 {
7420 return 1;
7421 }
7422 else
7423 {
7424 return 0;
7425 }
7426 }
7427
HAL_MVD_GetDecodeStatus(MS_U8 u8Idx)7428 MVD_DecStat HAL_MVD_GetDecodeStatus(MS_U8 u8Idx)
7429 {
7430 MVD_CmdArg mvdcmd;
7431 MVD_DecStat stat = E_MVD_STAT_UNKNOWN;
7432
7433 SETUP_CMDARG(mvdcmd);
7434 SET_DECNUM(mvdcmd, u8Idx);
7435 if (HAL_MVD_MVDCommand(CMD_DECODE_STATUS, &mvdcmd) == FALSE)
7436 {
7437 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DECODE_STATUS ) );
7438 return E_MVD_STAT_UNKNOWN;
7439 }
7440
7441 switch(mvdcmd.Arg1)
7442 {
7443 case DEC_STAT_IDLE:
7444 stat = E_MVD_STAT_IDLE;
7445 break;
7446 case DEC_STAT_FIND_SC:
7447 stat = E_MVD_STAT_FIND_STARTCODE;
7448 break;
7449 case DEC_STAT_FIND_SPE_SC:
7450 stat = E_MVD_STAT_FIND_SPECIALCODE;
7451 break;
7452 case DEC_STAT_FIND_FRAMEBUFFER:
7453 stat = E_MVD_STAT_FIND_FRAMEBUFFER;
7454 break;
7455 case DEC_STAT_WAIT_DECODE_DONE:
7456 stat = E_MVD_STAT_WAIT_DECODEDONE;
7457 break;
7458 case DEC_STAT_DECODE_DONE:
7459 stat = E_MVD_STAT_DECODE_DONE;
7460 break;
7461 case DEC_STAT_WAIT_VDFIFO:
7462 stat = E_MVD_STAT_WAIT_VDFIFO;
7463 break;
7464 case DEC_STAT_INIT_SUCCESS:
7465 stat = E_MVD_STAT_INIT_SUCCESS;
7466 break;
7467 default:
7468 break;
7469 }
7470
7471 return stat;
7472 }
7473
HAL_MVD_GetLastCmd(MS_U8 u8Idx)7474 MS_U8 HAL_MVD_GetLastCmd(MS_U8 u8Idx)
7475 {
7476 MVD_CmdArg mvdcmd;
7477 SETUP_CMDARG(mvdcmd);
7478 SET_DECNUM(mvdcmd, u8Idx);
7479 if (HAL_MVD_MVDCommand( CMD_DECODE_STATUS, &mvdcmd ) == FALSE)
7480 {
7481 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DECODE_STATUS ) );
7482 return 0xff;
7483 }
7484
7485 return (mvdcmd.Arg0);
7486 }
7487
HAL_MVD_GetParserByteCnt(MS_U8 u8Idx)7488 MS_U32 HAL_MVD_GetParserByteCnt(MS_U8 u8Idx)
7489 {
7490 MVD_CmdArg mvdcmd;
7491 MS_U32 u32Cnt = 0;
7492
7493 SETUP_CMDARG(mvdcmd);
7494
7495 //To be accurate, it's "VLD byte count", instead of "parser byte count".
7496 mvdcmd.Arg0 = 0x34;
7497 mvdcmd.Arg1 = 0x2;
7498 SET_DECNUM(mvdcmd, u8Idx);
7499 if (HAL_MVD_MVDCommand( CMD_RD_IO, &mvdcmd ) == FALSE)
7500 {
7501 MVD_DEBUGERROR( printf( "Ctrl: 0x%x fail!!\r\n", CMD_RD_IO ) );
7502 return 0;
7503 }
7504 u32Cnt = (((MS_U32)mvdcmd.Arg2)) | ((MS_U32)mvdcmd.Arg3 << 8) |
7505 (((MS_U32)mvdcmd.Arg4) << 16) | (((MS_U32)mvdcmd.Arg5) << 24);
7506
7507 //printf(" parser byte count = %lu byte \n", u32Cnt);
7508 return u32Cnt;
7509 }
7510
HAL_MVD_DropErrorFrame(MS_U8 u8Idx,MS_BOOL bDrop)7511 MS_BOOL HAL_MVD_DropErrorFrame(MS_U8 u8Idx, MS_BOOL bDrop)
7512 {
7513 MVD_CmdArg mvdcmd;
7514 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
7515
7516 SETUP_CMDARG(mvdcmd);
7517 mvdcmd.Arg1 = (MS_U8)bDrop;
7518 mvdcmd.Arg2 = (MS_U8)pstCtrlCfg->bDropDispfrm;
7519 mvdcmd.Arg3 = (MS_U8)pstCtrlCfg->eFrcMode;
7520 SET_DECNUM(mvdcmd, u8Idx);
7521 SET_CMD_RET_FALSE(CMD_DISPLAY_CTL, &mvdcmd);
7522 return TRUE;
7523 }
7524
HAL_MVD_SetDivXCfg(MS_U8 u8Idx,MS_U8 u8MvAdjust,MS_U8 u8IdctSel)7525 void HAL_MVD_SetDivXCfg(MS_U8 u8Idx, MS_U8 u8MvAdjust, MS_U8 u8IdctSel)
7526 {
7527 MVD_CmdArg stCmdArg;
7528
7529 SETUP_CMDARG(stCmdArg);
7530 stCmdArg.Arg0 = u8MvAdjust;
7531 SET_DECNUM(stCmdArg, u8Idx);
7532 if (HAL_MVD_MVDCommand(CMD_DIVX_PATCH, &stCmdArg) == FALSE)
7533 {
7534 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DIVX_PATCH ) );
7535 return;
7536 }
7537
7538 SETUP_CMDARG(stCmdArg);
7539 stCmdArg.Arg0 = u8IdctSel;
7540 SET_DECNUM(stCmdArg, u8Idx);
7541 if (HAL_MVD_MVDCommand(CMD_IDCT_SEL, &stCmdArg) == FALSE)
7542 {
7543 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_IDCT_SEL ) );
7544 return;
7545 }
7546
7547 return;
7548 }
7549
7550 #define _IsNotInStreamBuff(x) \
7551 (((x) < pstMemCfg->u32DrvBufSize) || \
7552 ((x) > pstMemCfg->u32BSSize) )
7553
7554 //------------------------------------------------------------------------------
7555 /// Get read pointer in ElementaryStream buffer for SLQ table mode
7556 /// @return -the read pointer
7557 //------------------------------------------------------------------------------
MVD_GetSlqTblESReadPtr(MS_U8 u8Idx)7558 MS_VIRT MVD_GetSlqTblESReadPtr(MS_U8 u8Idx)
7559 {
7560 MS_U32 u32Idx;
7561 MS_U32 u32SlqRp = 0, u32SlqRp1 = 0;
7562 MS_VIRT u32EsRp;
7563 MS_VIRT u32EsStart;
7564 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
7565 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
7566 MVD_CodecType curCodecType = HAL_MVD_GetCodecType(u8Idx);
7567
7568 u32SlqRp1 = HAL_MVD_GetSLQReadPtr(u8Idx);
7569
7570 if (u32SlqRp1 == 0)
7571 {
7572 return MVD_U32_MAX;
7573 }
7574 else
7575 {
7576 u32SlqRp = HAL_MVD_Map2DrvSlqTbl(u8Idx, u32SlqRp1);
7577 }
7578
7579 pstSlqTblInfo->pDrvSlqTbl->u32RdPtr = u32SlqRp; //update pstSlqTblInfo->pDrvSlqTbl->u32RdPtr
7580
7581 //report (readPtr-1) for HW may still use (readPtr)
7582 if (u32SlqRp > (pstSlqTblInfo->pDrvSlqTbl->u32StAdd))
7583 {
7584 u32Idx = ((u32SlqRp - pstSlqTblInfo->pDrvSlqTbl->u32StAdd)/SLQ_ENTRY_LEN) - 1;
7585 }
7586 else
7587 {
7588 u32Idx = SLQ_ENTRY_MAX - 1;
7589 }
7590 u32EsRp = pstSlqTblInfo->pDrvEsTbl->u32StAdd + u32Idx*8;
7591
7592 u32EsStart = HAL_MVD_MemRead4Byte(u32EsRp); //report StartAdd as read_pointer
7593 #if 0
7594 MS_U32 u32EsEnd;
7595 u32EsEnd = HAL_MVD_MemRead4Byte(u32EsRp+4);
7596 printf("GetESReadPtr ES[%x] Start=0x%x End=0x%x u32EsRp=%x u32SlqRp=%x\n",
7597 u32Idx, HAL_MVD_MemRead4Byte(u32EsRp), u32EsEnd, u32EsRp, u32SlqRp);
7598 #endif
7599
7600 if ((_IsNotInStreamBuff(u32EsStart)) && (u32EsStart != 0))
7601 { //ESRead is not in BS buffer, so this entry is a divx or dummy pattern.
7602 //Report the last ESRead, instead of this one.
7603 if(curCodecType == E_MVD_CODEC_DIVX311)
7604 {
7605 //update last slq index es end address
7606 if(u32Idx == 0)
7607 {
7608 u32Idx = SLQ_ENTRY_MAX-1;
7609 }
7610 else
7611 {
7612 u32Idx = u32Idx-1;
7613 }
7614 u32EsRp = pstSlqTblInfo->pDrvEsTbl->u32StAdd + u32Idx*8;
7615 u32EsStart = HAL_MVD_MemRead4Byte(u32EsRp); //report StartAdd as read_pointer
7616 if(_IsNotInStreamBuff(u32EsStart))
7617 {
7618 return (pstSlqTblInfo->u32PreEsRd);
7619 }
7620 }
7621 else
7622 {
7623 MVD_DEBUGINFO(printf("0x%lx Not in BS, report u32PreEsRd=0x%lx\n", (unsigned long)u32EsStart, (unsigned long)pstSlqTblInfo->u32PreEsRd));
7624 return (pstSlqTblInfo->u32PreEsRd);
7625 }
7626 }
7627 pstSlqTblInfo->u32PreEsRd = u32EsStart;
7628
7629 return u32EsStart;
7630 }
7631
7632 //------------------------------------------------------------------------------
7633 /// Get write pointer in ElementaryStream buffer for SLQ table mode
7634 /// @return -the read pointer
7635 //------------------------------------------------------------------------------
MVD_GetSlqTblESWritePtr(MS_U8 u8Idx)7636 MS_VIRT MVD_GetSlqTblESWritePtr(MS_U8 u8Idx)
7637 {
7638 MS_VIRT u32EsWp;
7639 MS_VIRT u32EsEnd;
7640 MS_U32 u32Idx;
7641 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
7642 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
7643
7644 if (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr > (pstSlqTblInfo->pDrvSlqTbl->u32StAdd))
7645 {
7646 u32Idx = ((pstSlqTblInfo->pDrvSlqTbl->u32WrPtr - pstSlqTblInfo->pDrvSlqTbl->u32StAdd)/SLQ_ENTRY_LEN) - 1;
7647 }
7648 else
7649 {
7650 u32Idx = SLQ_ENTRY_MAX - 1;
7651 }
7652 u32EsWp = pstSlqTblInfo->pDrvEsTbl->u32StAdd + u32Idx*8;
7653
7654 u32EsEnd = HAL_MVD_MemRead4Byte(u32EsWp+4);
7655 #if 0
7656 printf("GetESWritePtr[%x] ES Start=0x%x End=0x%x u32EsWp=%x\n",
7657 (u32EsWp - pstSlqTblInfo->pDrvEsTbl->u32StAdd)/8,
7658 HAL_MVD_MemRead4Byte(u32EsWp), u32EsEnd, u32EsWp);
7659 #endif
7660
7661 if ((_IsNotInStreamBuff(u32EsEnd)) && (u32EsEnd != 0))
7662 { //ESRead is not in BS buffer, so this entry is a divx pattern.
7663 //Report the last ESRead, instead of this one.
7664 MVD_DEBUGINFO(printf("0x%lx Not in BS, report u32PreEsWr=0x%lx\n", (unsigned long)u32EsEnd, (unsigned long)pstSlqTblInfo->u32PreEsWr));
7665 return (pstSlqTblInfo->u32PreEsWr);
7666 }
7667 pstSlqTblInfo->u32PreEsWr = u32EsEnd;
7668
7669 return u32EsEnd;
7670 }
7671
7672
HAL_MVD_GetSLQReadPtr(MS_U8 u8Idx)7673 MS_VIRT HAL_MVD_GetSLQReadPtr(MS_U8 u8Idx)
7674 {
7675 MS_VIRT u32RdPtr = 0;
7676
7677 if (!(pMVDHalContext->bSlqTblHKCtrl[u8Idx]))
7678 {
7679 #ifndef VDEC3
7680 MVD_CmdArg mvdcmd;
7681 SETUP_CMDARG(mvdcmd);
7682 SET_DECNUM(mvdcmd, u8Idx);
7683 if (HAL_MVD_MVDCommand( CMD_SLQ_GET_TBL_RPTR, &mvdcmd ) == FALSE)
7684 {
7685 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SLQ_GET_TBL_RPTR ) );
7686 return 0;
7687 }
7688 u32RdPtr = mvdcmd.Arg0 | (mvdcmd.Arg1<<8) | (mvdcmd.Arg2<<16) | (mvdcmd.Arg3<<24);
7689 #else
7690 u32RdPtr = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SLQ_TBL_RPTR, sizeof(MS_U32));
7691 #endif
7692 }
7693 else
7694 {
7695 u32RdPtr = HAL_MVD_SlqTblProbeRdPtr(u8Idx);
7696 }
7697
7698 //printf("##### HAL_MVD_GetSLQReadPtr 0x%x\n", readPtr);
7699
7700 if(u32RdPtr == 0)//not start decode yet,MVD return 0
7701 {
7702 u32RdPtr = 0;
7703 }
7704 else
7705 {
7706 u32RdPtr = u32RdPtr << 3;
7707 }
7708
7709 return u32RdPtr;
7710 }
7711
7712
HAL_MVD_SetSLQWritePtr(MS_U8 u8Idx,MS_BOOL bCheckData)7713 MS_BOOL HAL_MVD_SetSLQWritePtr(MS_U8 u8Idx, MS_BOOL bCheckData)
7714 {
7715 MVD_CmdArg mvdcmd;
7716 MS_VIRT u32WrPtr;
7717 MVD_MEMCfg* pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
7718 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
7719 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
7720
7721 if (FALSE == pstSlqTblInfo->bRdyToFireCmd)
7722 {
7723 //check FW is init success and thus ready to update write pointer
7724 MS_U32 u32TimeCnt;
7725
7726 u32TimeCnt = HAL_MVD_GetTime();
7727 while ((HAL_MVD_GetTime() - u32TimeCnt) < CMD_TIMEOUT_MS)
7728 {
7729 if (HAL_MVD_GetDecodeStatus(u8Idx) != E_MVD_STAT_IDLE)
7730 {
7731 pstSlqTblInfo->bRdyToFireCmd = TRUE;
7732 MVD_DEBUGVERBAL(printf("time=0x%x ms, ", (HAL_MVD_GetTime() - u32TimeCnt)));
7733 break;
7734 }
7735 }
7736 if (FALSE == pstSlqTblInfo->bRdyToFireCmd)
7737 {
7738 MVD_DEBUGERROR(printf("%s: err timeout(%d)! stat=0x%x\n", __FUNCTION__,
7739 HAL_MVD_GetTime() - u32TimeCnt, HAL_MVD_GetDecodeStatus(u8Idx)));
7740 return FALSE;
7741 }
7742 else
7743 {
7744 MVD_DEBUGVERBAL(printf("%s: ready to update WrPtr.\n", __FUNCTION__));
7745 }
7746 }
7747
7748
7749 MS_ASSERT(pstSlqTblInfo->pDrvSlqTbl->u32WrPtr < pstSlqTblInfo->pDrvSlqTbl->u32EndAdd);
7750 MS_ASSERT(pstSlqTblInfo->pDrvSlqTbl->u32WrPtr >= pstSlqTblInfo->pDrvSlqTbl->u32StAdd);
7751 #if SLQ_NEW_PUSH
7752 if((!pstSlqTblInfo->pSlqStatus->bSlqFireRdy)&&pstSlqTblInfo->pSlqStatus->bSlqCtrlBit)
7753 {
7754 MVD_DEBUGINFO(printf("**** pstSlqTblInfo->pSlqStatus->bSlqFireRdy is not Ready ** \n"));
7755 return FALSE;
7756 }
7757 pstSlqTblInfo->pSlqStatus->bSlqFireRdy = FALSE;
7758 #endif
7759 if ((bCheckData==TRUE) && (FALSE==pstSlqTblInfo->bSlqTblHasValidData))
7760 {
7761 MVD_DEBUGINFO(printf("**** SlqWrPtr(0x%lx) is not update!(%x, %x) ****\n",
7762 (unsigned long)pstSlqTblInfo->pDrvSlqTbl->u32WrPtr, bCheckData, pstSlqTblInfo->bSlqTblHasValidData));
7763 return FALSE;
7764 }
7765 pstSlqTblInfo->bSlqTblHasValidData = FALSE;
7766
7767 if (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr != pstSlqTblInfo->pDrvSlqTbl->u32EndAdd)
7768 {
7769 u32WrPtr = pstSlqTblInfo->pDrvSlqTbl->u32WrPtr;
7770 }
7771 else
7772 {
7773 u32WrPtr = pstSlqTblInfo->pDrvSlqTbl->u32StAdd;
7774 }
7775
7776 if (pstCtrlCfg->bSlqTblSync)
7777 {
7778 //Update SLQ table, DivX311 patterns, and dummy patterns to bitstream buffer
7779 MS_VIRT u32SrcOffset = pstSlqTblInfo->pDrvSlqTbl->u32StAdd;
7780 MS_VIRT u32SrcAdd = u32SrcOffset;
7781 MS_VIRT u32DstAdd = pstMemCfg->u32BSAddr;
7782 MS_VIRT u32DstOffset = HAL_MVD_GetMemOffset(pstMemCfg->u32BSAddr);
7783 MS_VIRT u32TblWr;
7784
7785 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,u32SrcOffset,u32SrcAdd);
7786
7787
7788 HAL_MVD_CPU_Sync();
7789
7790 BDMA_Result bdmaRlt;
7791
7792 bdmaRlt = MDrv_BDMA_CopyHnd(u32SrcAdd, u32DstAdd, pstMemCfg->u32DrvBufSize, pstSlqTblInfo->bdmaCpyType, BDMA_OPCFG_DEF);
7793
7794 if (E_BDMA_OK != bdmaRlt)
7795 {
7796 MVD_DEBUGERROR(printf("%s MDrv_BDMA_MemCopy fail ret=%x!\n", __FUNCTION__, bdmaRlt));
7797 }
7798 MVD_DEBUGINFO(printf("SlqWrPtr_BDMA src=0x%lx dst=0x%lx size=0x%lx cpyType=0x%x\n",
7799 (unsigned long)u32SrcAdd, (unsigned long)u32DstAdd, (unsigned long)pstMemCfg->u32DrvBufSize, pstSlqTblInfo->bdmaCpyType));
7800
7801 u32TblWr = u32DstOffset + (u32WrPtr - pstSlqTblInfo->pDrvSlqTbl->u32StAdd);
7802
7803 u32WrPtr = u32TblWr;
7804 }
7805 //printf("wPtr= 0x%x(0x%x) rPtr=0x%x(0x%x)\n", writePtr, pstSlqTblInfo->pDrvSlqTbl->u32WrPtr,
7806 // HAL_MVD_GetSLQReadPtr(u8Idx), pstSlqTblInfo->pDrvSlqTbl->u32RdPtr);
7807
7808
7809 //writePtrLast[u8Idx] = u32WrPtr;
7810 #if SLQ_NEW_PUSH
7811 if(!pstSlqTblInfo->pSlqStatus->bSlqEnLastFrameShow && pstSlqTblInfo->pSlqStatus->bSlqCtrlBit)
7812 {
7813 u32WrPtr = pstSlqTblInfo->pSlqStatus->u32VaildWptrAddr;
7814 }
7815 #endif
7816 MS_ASSERT((u32WrPtr%8)==0);
7817 u32WrPtr >>= 3;
7818
7819 if (!(pMVDHalContext->bSlqTblHKCtrl[u8Idx]))
7820 {
7821 SET_CMDARG(mvdcmd, u32WrPtr, u8Idx);
7822 HAL_MVD_CPU_Sync();
7823 SET_CMD_RET_FALSE(CMD_SLQ_UPDATE_TBL_WPTR, &mvdcmd);
7824 }
7825 else
7826 {
7827 HAL_MVD_SlqTblLoadWrPtr(u8Idx, u32WrPtr);
7828 if (HAL_MVD_SlqTblProbeWrPtr(u8Idx) != u32WrPtr)
7829 {
7830 MVD_DEBUGERROR(printf("Ooops! SlqWrPtr update fail!!! 0x%lx != 0x%lx\n", (unsigned long)HAL_MVD_SlqTblProbeWrPtr(u8Idx), (unsigned long)u32WrPtr));
7831 return FALSE;
7832 }
7833 }
7834
7835 return TRUE;
7836 }
7837
HAL_MVD_SetOverflowTH(MS_U8 u8Idx,MS_U32 u32Threshold)7838 void HAL_MVD_SetOverflowTH(MS_U8 u8Idx, MS_U32 u32Threshold)
7839 {
7840 MVD_CmdArg mvdcmd;
7841
7842 MS_ASSERT((u32Threshold%8)==0);
7843 u32Threshold >>= 3;
7844 SET_CMDARG(mvdcmd, u32Threshold, u8Idx);
7845 if (HAL_MVD_MVDCommand( CMD_DMA_OVFTH, &mvdcmd ) == FALSE)
7846 {
7847 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DMA_OVFTH ) );
7848 return;
7849 }
7850 return;
7851 }
7852
7853 //------------------------------------------------------------------------------
7854 /// Set bitstream buffer underflow threshold
7855 /// @return -none
7856 //------------------------------------------------------------------------------
HAL_MVD_SetUnderflowTH(MS_U8 u8Idx,MS_U32 u32Threshold)7857 void HAL_MVD_SetUnderflowTH(MS_U8 u8Idx, MS_U32 u32Threshold)
7858 {
7859 MVD_CmdArg mvdcmd;
7860
7861 MS_ASSERT((u32Threshold%8)==0);
7862 u32Threshold >>= 3;
7863 SET_CMDARG(mvdcmd, u32Threshold, u8Idx);
7864 if (HAL_MVD_MVDCommand( CMD_DMA_UNFTH, &mvdcmd ) == FALSE)
7865 {
7866 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DMA_UNFTH ) );
7867 return;
7868 }
7869 return;
7870 }
7871
HAL_MVD_GenPattern(MS_U8 u8Idx,MVD_PatternType ePattern,MS_PHY u32PAddr,MS_U32 * pu32Size)7872 MS_BOOL HAL_MVD_GenPattern(MS_U8 u8Idx, MVD_PatternType ePattern, MS_PHY u32PAddr, MS_U32* pu32Size)
7873 {
7874 MS_U8* pu8DummyData = NULL;
7875 MVD_CodecType curCodecType = HAL_MVD_GetCodecType(u8Idx);
7876
7877 if ((!pu32Size) || (*pu32Size < SKIP_PATTERN_SIZE))
7878 {
7879 return FALSE;
7880 }
7881
7882 pu8DummyData = (MS_U8*) HAL_MVD_PA2NonCacheSeg(u32PAddr);
7883
7884 if(pu8DummyData == NULL)
7885 {
7886 printf("%s %d NULL Address\n",__FILE__,__LINE__);
7887 return FALSE;
7888 }
7889
7890 switch (ePattern)
7891 {
7892 case E_MVD_PATTERN_FLUSH:
7893 #if 0
7894 *pu8DummyData = SKIP_PATTERN_0;
7895 pu8DummyData++;
7896 *pu8DummyData = SKIP_PATTERN_1;
7897 *pu32Size = SKIP_PATTERN_SIZE;
7898 #else
7899 pu8DummyData[0] = SKIP_PATTERN_0&0xff;
7900 pu8DummyData[1] = (SKIP_PATTERN_0>>8)&0xff;
7901 pu8DummyData[2] = (SKIP_PATTERN_0>>16)&0xff;
7902 pu8DummyData[3] = (SKIP_PATTERN_0>>24)&0xff;
7903
7904 pu8DummyData[4] = SKIP_PATTERN_1&0xff;
7905 pu8DummyData[5] = (SKIP_PATTERN_1>>8)&0xff;
7906 pu8DummyData[6] = (SKIP_PATTERN_1>>16)&0xff;
7907 pu8DummyData[7] = (SKIP_PATTERN_1>>24)&0xff;
7908
7909 *pu32Size = SKIP_PATTERN_SIZE;
7910 #endif
7911 break;
7912 case E_MVD_PATTERN_FILEEND:
7913 if ((E_MVD_CODEC_FLV == curCodecType)||(E_MVD_CODEC_MPEG4_SHORT_VIDEO_HEADER == curCodecType))
7914 {
7915 #if 0
7916 *pu8DummyData = FLV_PATTERN;
7917 pu8DummyData++;
7918 *pu8DummyData = 0xffffffff;
7919 pu8DummyData++;
7920 *pu8DummyData = END_PATTERN_1;
7921 pu8DummyData++;
7922 *pu8DummyData = END_PATTERN_2;
7923 pu8DummyData++;
7924 *pu8DummyData = END_PATTERN_3;
7925 #else
7926 pu8DummyData[0] = FLV_PATTERN&0xff;
7927 pu8DummyData[1] = (FLV_PATTERN>>8)&0xff;
7928 pu8DummyData[2] = (FLV_PATTERN>>16)&0xff;
7929 pu8DummyData[3] = (FLV_PATTERN>>24)&0xff;
7930
7931 pu8DummyData[4] = 0xffffffff&0xff;
7932 pu8DummyData[5] = (0xffffffff>>8)&0xff;
7933 pu8DummyData[6] = (0xffffffff>>16)&0xff;
7934 pu8DummyData[7] = (0xffffffff>>24)&0xff;
7935
7936 pu8DummyData[8] = END_PATTERN_1&0xff;
7937 pu8DummyData[9] = (END_PATTERN_1>>8)&0xff;
7938 pu8DummyData[10] = (END_PATTERN_1>>16)&0xff;
7939 pu8DummyData[11] = (END_PATTERN_1>>24)&0xff;
7940
7941 pu8DummyData[12] = END_PATTERN_2&0xff;
7942 pu8DummyData[13] = (END_PATTERN_2>>8)&0xff;
7943 pu8DummyData[14] = (END_PATTERN_2>>16)&0xff;
7944 pu8DummyData[15] = (END_PATTERN_2>>24)&0xff;
7945
7946 pu8DummyData[16] = END_PATTERN_3&0xff;
7947 pu8DummyData[17] = (END_PATTERN_3>>8)&0xff;
7948 pu8DummyData[18] = (END_PATTERN_3>>16)&0xff;
7949 pu8DummyData[19] = (END_PATTERN_3>>24)&0xff;
7950
7951 #endif
7952
7953 }
7954 else if (E_MVD_CODEC_DIVX311 == curCodecType)
7955 {
7956 #if 0
7957 *pu8DummyData = DIVX_PATTERN;
7958 pu8DummyData++;
7959 *pu8DummyData = 0xffffffff;
7960 pu8DummyData++;
7961 *pu8DummyData = END_PATTERN_1;
7962 pu8DummyData++;
7963 *pu8DummyData = END_PATTERN_2;
7964 pu8DummyData++;
7965 *pu8DummyData = END_PATTERN_3;
7966 #else
7967 pu8DummyData[0] = DIVX_PATTERN&0xff;
7968 pu8DummyData[1] = (DIVX_PATTERN>>8)&0xff;
7969 pu8DummyData[2] = (DIVX_PATTERN>>16)&0xff;
7970 pu8DummyData[3] = (DIVX_PATTERN>>24)&0xff;
7971
7972 pu8DummyData[4] = 0xffffffff&0xff;
7973 pu8DummyData[5] = (0xffffffff>>8)&0xff;
7974 pu8DummyData[6] = (0xffffffff>>16)&0xff;
7975 pu8DummyData[7] = (0xffffffff>>24)&0xff;
7976
7977 pu8DummyData[8] = END_PATTERN_1&0xff;
7978 pu8DummyData[9] = (END_PATTERN_1>>8)&0xff;
7979 pu8DummyData[10] = (END_PATTERN_1>>16)&0xff;
7980 pu8DummyData[11] = (END_PATTERN_1>>24)&0xff;
7981
7982 pu8DummyData[12] = END_PATTERN_2&0xff;
7983 pu8DummyData[13] = (END_PATTERN_2>>8)&0xff;
7984 pu8DummyData[14] = (END_PATTERN_2>>16)&0xff;
7985 pu8DummyData[15] = (END_PATTERN_2>>24)&0xff;
7986
7987 pu8DummyData[16] = END_PATTERN_3&0xff;
7988 pu8DummyData[17] = (END_PATTERN_3>>8)&0xff;
7989 pu8DummyData[18] = (END_PATTERN_3>>16)&0xff;
7990 pu8DummyData[19] = (END_PATTERN_3>>24)&0xff;
7991 #endif
7992 }
7993 else if ((E_MVD_CODEC_MPEG2 == curCodecType)||(E_MVD_CODEC_MPEG4 == curCodecType))
7994 {
7995 #if 0
7996 *pu8DummyData = MPEG_PATTERN_0;
7997 pu8DummyData++;
7998 *pu8DummyData = END_PATTERN_1;
7999 pu8DummyData++;
8000 *pu8DummyData = END_PATTERN_2;
8001 pu8DummyData++;
8002 *pu8DummyData = END_PATTERN_3;
8003 #else
8004 pu8DummyData[0] = MPEG_PATTERN_0&0xff;
8005 pu8DummyData[1] = (MPEG_PATTERN_0>>8)&0xff;
8006 pu8DummyData[2] = (MPEG_PATTERN_0>>16)&0xff;
8007 pu8DummyData[3] = (MPEG_PATTERN_0>>24)&0xff;
8008
8009 pu8DummyData[4] = END_PATTERN_1&0xff;
8010 pu8DummyData[5] = (END_PATTERN_1>>8)&0xff;
8011 pu8DummyData[6] = (END_PATTERN_1>>16)&0xff;
8012 pu8DummyData[7] = (END_PATTERN_1>>24)&0xff;
8013
8014 pu8DummyData[8] = END_PATTERN_2&0xff;
8015 pu8DummyData[9] = (END_PATTERN_2>>8)&0xff;
8016 pu8DummyData[10] = (END_PATTERN_2>>16)&0xff;
8017 pu8DummyData[11] = (END_PATTERN_2>>24)&0xff;
8018
8019 pu8DummyData[12] = END_PATTERN_3&0xff;
8020 pu8DummyData[13] = (END_PATTERN_3>>8)&0xff;
8021 pu8DummyData[14] = (END_PATTERN_3>>16)&0xff;
8022 pu8DummyData[15] = (END_PATTERN_3>>24)&0xff;
8023 #endif
8024 }
8025 else
8026 {
8027 #if 0
8028 *pu8DummyData = END_PATTERN_0;
8029 pu8DummyData++;
8030 *pu8DummyData = END_PATTERN_1;
8031 pu8DummyData++;
8032 *pu8DummyData = END_PATTERN_2;
8033 pu8DummyData++;
8034 *pu8DummyData = END_PATTERN_3;
8035 #else
8036 pu8DummyData[0] = END_PATTERN_0&0xff;
8037 pu8DummyData[1] = (END_PATTERN_0>>8)&0xff;
8038 pu8DummyData[2] = (END_PATTERN_0>>16)&0xff;
8039 pu8DummyData[3] = (END_PATTERN_0>>24)&0xff;
8040
8041 pu8DummyData[4] = END_PATTERN_1&0xff;
8042 pu8DummyData[5] = (END_PATTERN_1>>8)&0xff;
8043 pu8DummyData[6] = (END_PATTERN_1>>16)&0xff;
8044 pu8DummyData[7] = (END_PATTERN_1>>24)&0xff;
8045
8046 pu8DummyData[8] = END_PATTERN_2&0xff;
8047 pu8DummyData[9] = (END_PATTERN_2>>8)&0xff;
8048 pu8DummyData[10] = (END_PATTERN_2>>16)&0xff;
8049 pu8DummyData[11] = (END_PATTERN_2>>24)&0xff;
8050
8051 pu8DummyData[12] = END_PATTERN_3&0xff;
8052 pu8DummyData[13] = (END_PATTERN_3>>8)&0xff;
8053 pu8DummyData[14] = (END_PATTERN_3>>16)&0xff;
8054 pu8DummyData[15] = (END_PATTERN_3>>24)&0xff;
8055 #endif
8056 }
8057 *pu32Size = 16;
8058 break;
8059 default:
8060 break;
8061 }
8062
8063 return TRUE;
8064 }
8065
8066
8067
HAL_MVD_DbgDump(MS_U8 u8Idx)8068 void HAL_MVD_DbgDump(MS_U8 u8Idx)
8069 {
8070 MS_U32 u32VdCnt=0;
8071 //static MS_U32 u32PreVdCnt[MAX_DEC_NUM]= {0, 0};
8072 MS_U32 u32ErrCnt=0;
8073 //static MS_U32 u32PreErrCnt[MAX_DEC_NUM]= {0, 0};
8074 //static MS_BOOL b1stDump[MAX_DEC_NUM]= {TRUE, TRUE};
8075 MVD_FrmInfo stFrm = {_INIT_ADDR, _INIT_ADDR, _INIT_TIMESTAMP, _INIT_ID,
8076 _INIT_ID, _INIT_LEN, _INIT_LEN, _INIT_LEN, 0xff, E_MVD_PIC_UNKNOWN};
8077 MVD_SrcMode curSrcMode = HAL_MVD_GetSrcMode(u8Idx);
8078 #ifndef VDEC3
8079 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
8080 #endif
8081 if (pMVDHalContext->b1stDump[u8Idx])
8082 {
8083 MVD_FWCfg* pFwCfg = NULL;
8084 pFwCfg = HAL_MVD_GetFWCfg(u8Idx);
8085 printf("curDisablePESParsing = %d\n", pFwCfg->bDisablePESParsing);
8086 pMVDHalContext->b1stDump[u8Idx] = FALSE;
8087 }
8088
8089 u32VdCnt = HAL_MVD_GetParserByteCnt(u8Idx);
8090 u32ErrCnt= HAL_MVD_GetVldErrCount(u8Idx);
8091 printf("input: vfifo=%d(full=%d,empty=%d), vdCnt=%d(%d), vldErr=%d(%d); ",
8092 HAL_MVD_RegReadByte(0x1564)>>6, HAL_MVD_RegReadByte(0x1564)&0x20,
8093 HAL_MVD_RegReadByte(0x1564)&0x10, u32VdCnt, (u32VdCnt-pMVDHalContext->u32PreVdCnt[u8Idx]),
8094 u32ErrCnt, (u32ErrCnt-pMVDHalContext->u32PreErrCnt[u8Idx]));
8095 pMVDHalContext->u32PreVdCnt[u8Idx] = u32VdCnt;
8096 pMVDHalContext->u32PreErrCnt[u8Idx] = u32ErrCnt;
8097
8098 printf("state: fw=0x%x, lastCmd=0x%x, pc=0x%x\n",
8099 HAL_MVD_GetDecodeStatus(u8Idx), HAL_MVD_GetLastCmd(u8Idx), HAL_VPU_EX_GetProgCnt());
8100 printf("cnt: dec=%d, skip=%d, drop=%ld\n", HAL_MVD_GetPicCounter(u8Idx), HAL_MVD_GetSkipPicCounter(u8Idx), 0x0UL);
8101 HAL_MVD_GetFrmInfo(u8Idx, E_MVD_FRMINFO_DECODE, &stFrm);
8102 printf("frm Dec Y=%lx UV=%lx Pitch=%x; ", (unsigned long)stFrm.u32LumaAddr, (unsigned long)stFrm.u32ChromaAddr, stFrm.u16Pitch);
8103 HAL_MVD_GetFrmInfo(u8Idx, E_MVD_FRMINFO_DISPLAY, &stFrm);
8104 printf("Disp Y=%lx UV=%lx Pitch=%x\n", (unsigned long)stFrm.u32LumaAddr, (unsigned long)stFrm.u32ChromaAddr, stFrm.u16Pitch);
8105 if (curSrcMode == E_MVD_SLQ_TBL_MODE)
8106 {
8107 #ifndef VDEC3
8108 printf("fe=%x, rd=%x(%x), wr=%x, empty=%x; ", pstSlqTblInfo->u32FileEndPtr, pstSlqTblInfo->pDrvSlqTbl->u32RdPtr,
8109 HAL_MVD_Map2DrvSlqTbl(u8Idx, HAL_MVD_GetSLQReadPtr(u8Idx)), pstSlqTblInfo->pDrvSlqTbl->u32WrPtr, pstSlqTblInfo->pDrvSlqTbl->u32Empty);
8110
8111 printf("es rd=0x%lx, wr=0x%lx\n", (unsigned long)MVD_GetSlqTblESReadPtr(u8Idx), (unsigned long)MVD_GetSlqTblESWritePtr(u8Idx));
8112 #endif
8113 }
8114 else if (curSrcMode == E_MVD_TS_FILE_MODE)
8115 {
8116 printf("es rd=0x%lx, wr=0x%lx\n", (unsigned long)HAL_MVD_GetTsFileESReadPtr(u8Idx), (unsigned long)HAL_MVD_GetTsFileESWritePtr(u8Idx));
8117 }
8118 }
8119
8120 #ifdef MS_DEBUG
8121 #define _STRINGIFY_HAL_SID(x) \
8122 (x==E_HAL_MVD_MAIN_STREAM0)?"E_HAL_MVD_MAIN_STREAM0": \
8123 ((x==E_HAL_MVD_SUB_STREAM0)?"E_HAL_MVD_SUB_STREAM0":"E_HAL_MVD_STREAM_NONE")
MVD_DumpMVDStream(void)8124 void MVD_DumpMVDStream(void)
8125 {
8126 //if (_u8HalDbgLevel == 0) return;
8127 MS_U8 i = 0;
8128 for (i=0; i< MAX_DEC_NUM; i++)
8129 {
8130 MVD_DEBUGINFO(printf("[%d] eStreamId=0x%x(%s) bUsed=0x%x\n", i, pMVDHalContext->_stMVDStream[i].eStreamId,
8131 _STRINGIFY_HAL_SID(pMVDHalContext->_stMVDStream[i].eStreamId), pMVDHalContext->_stMVDStream[i].bUsed));
8132 }
8133 }
8134 #endif
HAL_MVD_Init_Share_Mem(void)8135 MS_BOOL HAL_MVD_Init_Share_Mem(void)
8136 {
8137 #if (defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_ECOS))
8138 #if !defined(SUPPORT_X_MODEL_FEATURE)
8139 MS_U32 u32ShmId;
8140 MS_VIRT u32Addr;
8141 MS_U32 u32BufSize;
8142
8143
8144 if (FALSE == MsOS_SHM_GetId( (MS_U8*)"Linux MVD HAL",
8145 sizeof(MVD_Hal_CTX),
8146 &u32ShmId,
8147 &u32Addr,
8148 &u32BufSize,
8149 MSOS_SHM_QUERY))
8150 {
8151 if (FALSE == MsOS_SHM_GetId((MS_U8*)"Linux MVD HAL",
8152 sizeof(MVD_Hal_CTX),
8153 &u32ShmId,
8154 &u32Addr,
8155 &u32BufSize,
8156 MSOS_SHM_CREATE))
8157 {
8158 printf("[%s]SHM allocation failed!!! use global structure instead!!!\n",__FUNCTION__);
8159 if(pMVDHalContext == NULL)
8160 {
8161 pMVDHalContext = &gMVDHalContext;
8162 memset(pMVDHalContext,0,sizeof(MVD_Hal_CTX));
8163 HAL_MVD_Context_Init();
8164 printf("[%s]Global structure init Success!!!\n",__FUNCTION__);
8165 }
8166 else
8167 {
8168 printf("[%s]Global structure exists!!!\n",__FUNCTION__);
8169 }
8170 //return FALSE;
8171 }
8172 else
8173 {
8174 memset((MS_U8*)u32Addr,0,sizeof(MVD_Hal_CTX));
8175 pMVDHalContext = (MVD_Hal_CTX*)u32Addr; // for one process
8176 HAL_MVD_Context_Init();
8177 }
8178 }
8179 else
8180 {
8181 pMVDHalContext = (MVD_Hal_CTX*)u32Addr; // for another process
8182 }
8183 #else
8184 if(pMVDHalContext == NULL)
8185 {
8186 pMVDHalContext = &gMVDHalContext;
8187 memset(pMVDHalContext,0,sizeof(MVD_Hal_CTX));
8188 HAL_MVD_Context_Init();
8189 }
8190 #endif
8191 OSAL_MVD_MutexInit();
8192 #else
8193 if(pMVDHalContext == NULL)
8194 {
8195 pMVDHalContext = &gMVDHalContext;
8196 memset(pMVDHalContext,0,sizeof(MVD_Hal_CTX));
8197 HAL_MVD_Context_Init();
8198 }
8199 #endif
8200
8201
8202 return TRUE;
8203
8204 }
8205
8206 //------------------------------------------------------------------------------
HAL_MVD_GetFreeStream(HAL_MVD_StreamType eStreamType)8207 HAL_MVD_StreamId HAL_MVD_GetFreeStream(HAL_MVD_StreamType eStreamType)
8208 {
8209 MS_U32 i = 0;
8210
8211 #ifdef MS_DEBUG
8212 MVD_DumpMVDStream();
8213 #endif
8214 if (eStreamType == E_HAL_MVD_MAIN_STREAM)
8215 {
8216 for (i = 0;
8217 i <
8218 ((E_HAL_MVD_MAIN_STREAM_MAX - E_HAL_MVD_MAIN_STREAM_BASE) +
8219 (E_HAL_MVD_SUB_STREAM_MAX - E_HAL_MVD_SUB_STREAM_BASE)); i++)
8220 {
8221 if ((E_HAL_MVD_MAIN_STREAM_BASE & pMVDHalContext->_stMVDStream[i].eStreamId) && (FALSE == pMVDHalContext->_stMVDStream[i].bUsed))
8222 {
8223 return pMVDHalContext->_stMVDStream[i].eStreamId;
8224 }
8225 }
8226 }
8227 else if (eStreamType == E_HAL_MVD_SUB_STREAM)
8228 {
8229 for (i = 0;
8230 i <
8231 ((E_HAL_MVD_MAIN_STREAM_MAX - E_HAL_MVD_MAIN_STREAM_BASE) +
8232 (E_HAL_MVD_SUB_STREAM_MAX - E_HAL_MVD_SUB_STREAM_BASE)); i++)
8233 {
8234 if ((E_HAL_MVD_SUB_STREAM_BASE & pMVDHalContext->_stMVDStream[i].eStreamId) && (FALSE == pMVDHalContext->_stMVDStream[i].bUsed))
8235 {
8236 return pMVDHalContext->_stMVDStream[i].eStreamId;
8237 }
8238 }
8239 }
8240 #ifdef VDEC3
8241 else if ((eStreamType >= E_HAL_MVD_N_STREAM) && (eStreamType < E_HAL_MVD_N_STREAM + MAX_DEC_NUM))
8242 {
8243 i = eStreamType - E_HAL_MVD_N_STREAM;
8244 if (!pMVDHalContext->_stMVDStream[i].bUsed)
8245 {
8246 return pMVDHalContext->_stMVDStream[i].eStreamId;
8247 }
8248 }
8249 #endif
8250
8251 return E_HAL_MVD_STREAM_NONE;
8252 }
8253
HAL_MVD_SidToIdx(HAL_MVD_StreamId eSID)8254 MS_U8 HAL_MVD_SidToIdx(HAL_MVD_StreamId eSID)
8255 {
8256 #ifdef VDEC3
8257 return eSID - E_HAL_MVD_N_STREAM_BASE;
8258 #else
8259 MS_U8 u8Idx = 0;
8260 switch (eSID)
8261 {
8262 case E_HAL_MVD_MAIN_STREAM0:
8263 u8Idx = 0;
8264 break;
8265 case E_HAL_MVD_SUB_STREAM0:
8266 u8Idx = 1;
8267 break;
8268 #if 0
8269 case E_HAL_MVD_SUB_STREAM1:
8270 u8Idx = 2;
8271 break;
8272 #endif
8273 default:
8274 u8Idx = 0;
8275 break;
8276 }
8277 return u8Idx;
8278 #endif
8279 }
8280
HAL_MVD_ReleaseFdMask(MS_U8 u8Idx,MS_BOOL bRls)8281 MS_BOOL HAL_MVD_ReleaseFdMask(MS_U8 u8Idx, MS_BOOL bRls)
8282 {
8283 MVD_CmdArg mvdcmd;
8284
8285 SETUP_CMDARG(mvdcmd);
8286 mvdcmd.Arg0 = bRls; //1 to release the fd mask
8287 MVD_DEBUGINFO(printf("%s: release=0x%x\n", __FUNCTION__, bRls));
8288 SET_DECNUM(mvdcmd, u8Idx);
8289 SET_CMD_RET_FALSE(CMD_UPDATE_FRAME, &mvdcmd);
8290
8291 return TRUE;
8292 }
8293
HAL_MVD_ParserRstDone(MS_U8 u8Idx,MS_BOOL bEnable)8294 MS_BOOL HAL_MVD_ParserRstDone(MS_U8 u8Idx, MS_BOOL bEnable)
8295 {
8296 #define PARSER_RST_TIMEOUT 0x40000
8297 MS_U32 u32TimeOut = 0;
8298 MVD_CmdArg mvdcmd;
8299
8300 HAL_MVD_ResetHandShake(u8Idx, MVD_HANDSHAKE_PARSER_RST);
8301 SETUP_CMDARG(mvdcmd);
8302 mvdcmd.Arg1 = bEnable;
8303 SET_DECNUM(mvdcmd, u8Idx);
8304 SET_CMD_RET_FALSE(CMD_PTS_TBL_RESET, &mvdcmd);
8305
8306 while ((TRUE != HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_PARSER_RST)) && (u32TimeOut < PARSER_RST_TIMEOUT))
8307 {
8308 u32TimeOut++;
8309 }
8310 if (u32TimeOut >= PARSER_RST_TIMEOUT)
8311 {
8312 MVD_DEBUGERROR( printf( "Ctrl: 0x%x fail timeout!!\r\n", CMD_PTS_TBL_RESET ) );
8313 return FALSE;
8314 }
8315 return TRUE;
8316 }
8317
HAL_MVD_FlushPTSBuf(MS_U8 u8Idx,MS_BOOL bEnable)8318 MS_BOOL HAL_MVD_FlushPTSBuf(MS_U8 u8Idx, MS_BOOL bEnable)
8319 {
8320 #ifdef VDEC3
8321 MVD_CtrlCfg* pstCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
8322
8323 if(pstCtrlCfg->u8McuMode == FALSE)
8324 #endif
8325 {
8326 MVD_CmdArg mvdcmd;
8327 SETUP_CMDARG(mvdcmd);
8328 mvdcmd.Arg0 = bEnable;
8329 if (HAL_MVD_MVDCommand( CMD_SEND_UNI_PTS, &mvdcmd ) == FALSE)
8330 {
8331 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SEND_UNI_PTS ) );
8332 return FALSE;
8333 }
8334 }
8335 return TRUE;
8336 }
8337
8338
HAL_MVD_GetSLQNum(MS_U8 u8Idx)8339 MS_U32 HAL_MVD_GetSLQNum(MS_U8 u8Idx)
8340 {
8341 MVD_SLQTBLInfo* pstSlqTblInfo = HAL_MVD_GetSlqTblInfo(u8Idx);
8342 MS_VIRT u32RdPtr = HAL_MVD_GetSLQReadPtr(u8Idx);
8343 MS_VIRT u32Diff = 0;
8344
8345 if (pstSlqTblInfo->pDrvSlqTbl->u32WrPtr >= u32RdPtr)
8346 {
8347 u32Diff = pstSlqTblInfo->pDrvSlqTbl->u32WrPtr - u32RdPtr;
8348 }
8349 else
8350 {
8351 u32Diff = SLQ_TBL_SIZE - (u32RdPtr - pstSlqTblInfo->pDrvSlqTbl->u32WrPtr);
8352 }
8353
8354 // printf("slq wptr = 0x%x, rptr = 0x%x\n", pstSlqTblInfo->pDrvSlqTbl->u32WrPtr, u32RdPtr);
8355
8356 return (u32Diff/SLQ_ENTRY_LEN);
8357 }
8358
8359
HAL_MVD_GetDispQNum(MS_U8 u8Idx)8360 MS_U32 HAL_MVD_GetDispQNum(MS_U8 u8Idx)
8361 {
8362 return MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DISPQ_NUM, sizeof(MS_U8));
8363 }
HAL_MVD_SetAutoMute(MS_U8 u8Idx,MS_BOOL bEn)8364 MS_BOOL HAL_MVD_SetAutoMute(MS_U8 u8Idx, MS_BOOL bEn)
8365 {
8366 MVD_CmdArg mvdcmd;
8367
8368 SETUP_CMDARG(mvdcmd);
8369 mvdcmd.Arg0 = bEn; //1 to enable
8370 MVD_DEBUGINFO(printf("%s: bEn=%x\n", __FUNCTION__, bEn));
8371 SET_DECNUM(mvdcmd, u8Idx);
8372 SET_CMD_RET_FALSE(CMD_ENABLE_AUTO_MUTE, &mvdcmd);
8373
8374 return TRUE;
8375 }
8376
HAL_MVD_SetVSizeAlign(MS_U8 u8Idx,MS_BOOL bEn)8377 MS_BOOL HAL_MVD_SetVSizeAlign(MS_U8 u8Idx, MS_BOOL bEn)
8378 {
8379 MVD_CmdArg mvdcmd;
8380
8381 SETUP_CMDARG(mvdcmd);
8382 mvdcmd.Arg0 = bEn; //1 to enable VSize alignment to 4x
8383 MVD_DEBUGINFO(printf("%s: bEn=%x\n", __FUNCTION__, bEn));
8384 SET_DECNUM(mvdcmd, u8Idx);
8385 SET_CMD_RET_FALSE(CMD_FORCE_ALIGN_VSIZE, &mvdcmd);
8386
8387 return TRUE;
8388 }
8389
HAL_MVD_GetFrmRateIsSupported(MS_U16 u16HSize,MS_U16 u16VSize,MS_U32 u32FrmRate)8390 MS_BOOL HAL_MVD_GetFrmRateIsSupported(MS_U16 u16HSize, MS_U16 u16VSize, MS_U32 u32FrmRate)
8391 {
8392 MVD_DEBUGINFO(printf("%s w:%d, h:%d, fr:%d, MAX:%lld\n", __FUNCTION__, u16HSize, u16VSize, u32FrmRate, MVD_HW_MAX_PIXEL));
8393 return (((MS_U64)u16HSize*(MS_U64)u16VSize*(MS_U64)u32FrmRate) <= MVD_HW_MAX_PIXEL);
8394 }
8395
8396 //------------------------------------------------------------------------------
8397 /// Wait MVD generate CRC done or timeout
8398 /// @return -MVD generate CRC done or timeout
8399 //------------------------------------------------------------------------------
_HAL_MVD_CrcTimeOut(MS_U8 u8Idx)8400 MS_BOOL _HAL_MVD_CrcTimeOut(MS_U8 u8Idx)
8401 {
8402 MS_U32 i;
8403 MS_U32 u32StartTime = MsOS_GetSystemTime();
8404
8405 for ( i = 0; i < MVD_PollingTimes; i++ )
8406 {
8407 ///- wait until MVD generate CRC done or timeout
8408 if ( ( HAL_MVD_RegReadByte(MVD_CRC_CTL) & MVD_CRC_CTL_DONE ) == MVD_CRC_CTL_DONE )
8409 {
8410 return FALSE;
8411 }
8412
8413 if ((TRUE == pMVDHalContext->bStopped[u8Idx]) || ((MsOS_GetSystemTime()-u32StartTime)>1300))
8414 {
8415 MVD_DEBUGINFO(printf("%s: bStopped(%x) or timeout(%d)\n", __FUNCTION__, pMVDHalContext->bStopped[u8Idx], MsOS_GetSystemTime()-u32StartTime));
8416 return TRUE;
8417 }
8418
8419 }
8420 MVD_DEBUGERROR( printf("_HAL_MVD_CrcTimeOut=%x\n", i) );
8421 return TRUE;
8422 }
8423
HAL_MVD_GetCrcValue(MS_U8 u8Idx,MVD_CrcIn * pCrcIn,MVD_CrcOut * pCrcOut)8424 E_MVD_Result HAL_MVD_GetCrcValue(MS_U8 u8Idx, MVD_CrcIn *pCrcIn, MVD_CrcOut *pCrcOut)
8425 {
8426 E_MVD_Result eRet = E_MVD_RET_OK;
8427 MS_U32 u32tmp = 0;
8428
8429 OSAL_MVD_LockHwMutex();
8430
8431 MVD_DEBUGINFO(printf("%s width=0x%x, height=0x%x, pitch=0x%x, luma=0x%lx, chroma=0x%lx\n",
8432 __FUNCTION__, pCrcIn->u32HSize, pCrcIn->u32VSize, pCrcIn->u32Strip, (unsigned long)pCrcIn->u32YStartAddr, (unsigned long)pCrcIn->u32UVStartAddr));
8433
8434 //Set generate CRC value
8435 u32tmp = ((pCrcIn->u32HSize + MVD_WIDTH_ALIGN_MASK) >> MVD_WIDTH_ALIGN_BITS) << MVD_WIDTH_ALIGN_BITS;
8436 HAL_MVD_RegWriteByte(MVD_CRC_HSIZE, u32tmp & 0xf0);
8437 HAL_MVD_RegWriteByte(MVD_CRC_HSIZE+1, (u32tmp >> 8) & 0x3f);
8438
8439 u32tmp = ((pCrcIn->u32VSize + MVD_WIDTH_ALIGN_MASK) >> MVD_WIDTH_ALIGN_BITS) << MVD_WIDTH_ALIGN_BITS;
8440 HAL_MVD_RegWriteByte(MVD_CRC_VSIZE, u32tmp & 0xff);
8441 HAL_MVD_RegWriteByte(MVD_CRC_VSIZE+1, (u32tmp >> 8) & 0xff);
8442
8443 u32tmp = (pCrcIn->u32Strip) >> 3;
8444 HAL_MVD_RegWriteByte(MVD_CRC_STRIP, u32tmp & 0xff);
8445 HAL_MVD_RegWriteByte((MVD_CRC_STRIP+1), (u32tmp >> 8) & 0xff);
8446
8447 u32tmp = (pCrcIn->u32YStartAddr) >> 3;
8448 HAL_MVD_RegWrite4Byte(MVD_CRC_Y_START, u32tmp & MVD_CRC_Y_START_LEN);
8449
8450 u32tmp = (pCrcIn->u32UVStartAddr) >> 3;
8451 HAL_MVD_RegWrite4Byte(MVD_CRC_UV_START, u32tmp & MVD_CRC_UV_START_LEN);
8452
8453 //Fire
8454 HAL_MVD_RegWriteBit(MVD_CRC_CTL, 1, MVD_CRC_CTL_FIRE);
8455
8456 //Check CRC done
8457 if ( _HAL_MVD_CrcTimeOut(u8Idx) == TRUE )
8458 {
8459 eRet = E_MVD_RET_TIME_OUT;
8460 goto _CRC_DONE;
8461 }
8462
8463 //Get CRC value
8464 pCrcOut->u32YCrc = HAL_MVD_RegReadByte(MVD_CRC_Y_L) |
8465 (HAL_MVD_RegReadByte(MVD_CRC_Y_L+1) << 8) |
8466 (HAL_MVD_RegReadByte(MVD_CRC_Y_H) <<16) |
8467 (HAL_MVD_RegReadByte(MVD_CRC_Y_H+1) <<24);
8468
8469 pCrcOut->u32UVCrc = HAL_MVD_RegReadByte(MVD_CRC_UV_L) |
8470 (HAL_MVD_RegReadByte(MVD_CRC_UV_L+1) << 8) |
8471 (HAL_MVD_RegReadByte(MVD_CRC_UV_H) <<16) |
8472 (HAL_MVD_RegReadByte(MVD_CRC_UV_H+1) <<24);
8473
8474 MVD_DEBUGINFO(printf("%s Y=0x%x, UV=0x%x\n", __FUNCTION__, pCrcOut->u32YCrc, pCrcOut->u32UVCrc));
8475
8476 _CRC_DONE:
8477 OSAL_MVD_UnlockHwMutex();
8478 return eRet;
8479 }
8480
8481
HAL_MVD_SuspendDynamicScale(MS_U8 u8Idx,MS_BOOL bEn)8482 MS_BOOL HAL_MVD_SuspendDynamicScale(MS_U8 u8Idx, MS_BOOL bEn)
8483 {
8484 MVD_CmdArg mvdcmd;
8485
8486 SETUP_CMDARG(mvdcmd);
8487 mvdcmd.Arg0 = bEn;
8488 MVD_DEBUGINFO(printf("%s: bEn=%x\n", __FUNCTION__, bEn));
8489 SET_DECNUM(mvdcmd, u8Idx);
8490 SET_CMD_RET_FALSE(CMD_SUSPEND_DS, &mvdcmd);
8491
8492 return TRUE;
8493 }
8494
HAL_MVD_GetSuspendDynamicScale(MS_U8 u8Idx)8495 MS_U8 HAL_MVD_GetSuspendDynamicScale(MS_U8 u8Idx)
8496 {
8497 return (MS_U8)MVD_GetFWBuffData(u8Idx, FW_BUFF_VOLINFO, OFFSET_SUSPEND_DS, sizeof(MS_U8));
8498 }
8499
HAL_MVD_GetStereoType(MS_U8 u8Idx)8500 MS_U8 HAL_MVD_GetStereoType(MS_U8 u8Idx)
8501 {
8502 return (MS_U8)MVD_GetFWBuffData(u8Idx, FW_BUFF_VOLINFO, OFFSET_STEREO_TYPE, sizeof(MS_U8));
8503 }
8504
HAL_MVD_GetDivxVer(MS_U8 u8Idx)8505 MS_U32 HAL_MVD_GetDivxVer(MS_U8 u8Idx)
8506 {
8507 return MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DIVX_VER_5X, sizeof(MS_U32));
8508 }
8509
HAL_MVD_SetIdctMode(MS_U8 u8Idx,MS_U8 u8Mode)8510 MS_BOOL HAL_MVD_SetIdctMode(MS_U8 u8Idx, MS_U8 u8Mode)
8511 {
8512 MVD_CmdArg mvdcmd;
8513
8514 SETUP_CMDARG(mvdcmd);
8515 mvdcmd.Arg0 = u8Mode;
8516 SET_DECNUM(mvdcmd, u8Idx);
8517
8518 MVD_DEBUGINFO(printf("%s CMD_IDCT_SEL arg0=%x)\n", __FUNCTION__, u8Mode));
8519 SET_CMD_RET_FALSE(CMD_IDCT_SEL, &mvdcmd);
8520
8521 return TRUE;
8522 }
8523
HAL_MVD_EX_SetClockSpeed(HAL_MVD_EX_ClockSpeed eClockSpeed)8524 E_MVD_Result HAL_MVD_EX_SetClockSpeed(HAL_MVD_EX_ClockSpeed eClockSpeed)
8525 {
8526 UNUSED(eClockSpeed);
8527 printf("This chip does not support mvd clock presetting~\n");
8528 return E_MVD_RET_FAIL;
8529 }
8530
HAL_MVD_GetIsAVSyncOn(MS_U8 u8Idx)8531 MS_BOOL HAL_MVD_GetIsAVSyncOn(MS_U8 u8Idx)
8532 {
8533 MS_BOOL bAVSyncOn = FALSE;
8534 MVD_CtrlCfg* pCtrlCfg = HAL_MVD_GetCtrlCfg(u8Idx);
8535 if (pCtrlCfg)
8536 {
8537 bAVSyncOn = pCtrlCfg->bAVSyncOn;
8538 }
8539
8540 return bAVSyncOn;
8541 }
8542
HAL_MVD_SetExternalDSBuff(MS_U8 u8Idx,MS_VIRT u32VPUAddr,MS_VIRT u32DrvAddr,MS_U32 u32DSBufSize)8543 MS_BOOL HAL_MVD_SetExternalDSBuff(MS_U8 u8Idx, MS_VIRT u32VPUAddr, MS_VIRT u32DrvAddr, MS_U32 u32DSBufSize)
8544 {
8545 #define SIZE_DSBUF 0x100000
8546 #define SIZE_DSINFOBUF 0x100
8547
8548 MS_BOOL bRet = TRUE;
8549 MVD_FWBuff* pBuff = &(pMVDHalContext->stFWBuff[u8Idx]);
8550
8551 pBuff->u32DynScalingAdd = u32VPUAddr;
8552 pBuff->u32ScalerInfoAdd = u32DrvAddr + SIZE_DSBUF - SIZE_DSINFOBUF; //FIX ME
8553
8554 bRet = HAL_MVD_SetDynamicScaleAddr(u8Idx, u32VPUAddr, u32DSBufSize);
8555 return bRet;
8556 }
8557
HAL_MVD_ShowFirstFrameDirect(MS_U8 u8Idx,MS_U8 bEnable)8558 MS_BOOL HAL_MVD_ShowFirstFrameDirect(MS_U8 u8Idx, MS_U8 bEnable)
8559 {
8560 MVD_CmdArg mvdcmd;
8561
8562 SETUP_CMDARG(mvdcmd);
8563 mvdcmd.Arg0 = bEnable;
8564 SET_DECNUM(mvdcmd, u8Idx);
8565
8566 MVD_DEBUGINFO(printf("%s CMD_PUSH_FIRST_FRAME_DISP arg0=%x)\n", __FUNCTION__, bEnable));
8567 SET_CMD_RET_FALSE(CMD_PUSH_FIRST_FRAME_DISP, &mvdcmd);
8568
8569 return TRUE;
8570 }
8571
HAL_MVD_SetXCLowDelayPara(MS_U8 u8Idx,MS_U32 u32Para)8572 E_MVD_Result HAL_MVD_SetXCLowDelayPara(MS_U8 u8Idx,MS_U32 u32Para)
8573 {
8574 MVD_CmdArg mvdcmd;
8575
8576 SETUP_CMDARG(mvdcmd);
8577 mvdcmd.Arg0 = L_WORD(u32Para); // for set the XC diff_field_number
8578 mvdcmd.Arg1 = H_WORD(u32Para); // for set XC UCNR diff field no
8579 SET_DECNUM(mvdcmd, u8Idx);
8580
8581 SET_CMD_RET_FALSE(CMD_XC_LOW_DELAY_PARA, &mvdcmd);
8582
8583 return TRUE;
8584 }
8585
HAL_MVD_GetESBufferStatus(MS_U8 u8Idx)8586 MS_U8 HAL_MVD_GetESBufferStatus(MS_U8 u8Idx)
8587 {
8588 return (MS_U8)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_CURRENT_ES_BUFFER_STATUS, sizeof(MS_U8)));
8589 }
8590
HAL_MVD_Field_Polarity_Display_One_field(MS_U8 u8Idx,MS_BOOL bEn,MS_U8 top_bottom)8591 MS_BOOL HAL_MVD_Field_Polarity_Display_One_field(MS_U8 u8Idx, MS_BOOL bEn,MS_U8 top_bottom)
8592 {
8593 MVD_CmdArg mvdcmd;
8594
8595 SETUP_CMDARG(mvdcmd);
8596 mvdcmd.Arg2 = bEn;
8597 mvdcmd.Arg3 = top_bottom;
8598 MVD_DEBUGINFO(printf("%s: bEn=%x,top_bottom=%x\n", __FUNCTION__, bEn,top_bottom));
8599 SET_DECNUM(mvdcmd, u8Idx);
8600 SET_CMD_RET_FALSE(CMD_FP_FILTER, &mvdcmd);
8601
8602 return TRUE;
8603 }
8604
8605
HAL_MVD_SetShareMemoryBase(MS_U8 u8Idx,MS_VIRT u32base,MS_U8 u8sel)8606 MS_BOOL HAL_MVD_SetShareMemoryBase(MS_U8 u8Idx, MS_VIRT u32base, MS_U8 u8sel)
8607 {
8608 u8SHMMiuSel = u8sel;
8609 u32SharememoryBase[u8Idx] = u32base - MVD_FW_CODE_LEN;
8610 return TRUE;
8611 }
8612
HAL_MVD_GetShareMemoryOffset(MS_U8 u8Idx,MS_VIRT * u32base)8613 MS_BOOL HAL_MVD_GetShareMemoryOffset(MS_U8 u8Idx, MS_VIRT *u32base)
8614 {
8615 *u32base=u32SharememoryBase[u8Idx];
8616 return TRUE;
8617 }
8618
HAL_MVD_Support2ndMVOPInterface(void)8619 MS_BOOL HAL_MVD_Support2ndMVOPInterface(void)
8620 {
8621 return TRUE;
8622 }
8623
HAL_MVD_SetExternal_CC_Buffer(MS_U8 u8Idx,MS_VIRT u32base,MS_U8 u8size,MS_U8 cc_type)8624 MS_BOOL HAL_MVD_SetExternal_CC_Buffer(MS_U8 u8Idx, MS_VIRT u32base, MS_U8 u8size, MS_U8 cc_type)
8625 {
8626 MVD_CmdArg mvdcmd;
8627 MS_U32 u32cc_size=0;
8628 MS_VIRT u32StartOffset;
8629 MS_U8 u8MiuSel;
8630
8631 SETUP_CMDARG(mvdcmd);
8632 if (u8size !=0)
8633 {
8634 mvdcmd.Arg0 = TRUE; //enable
8635 }
8636 else
8637 {
8638 mvdcmd.Arg0 = FALSE; //disable
8639 }
8640 mvdcmd.Arg1 = cc_type; //608->1,708->0
8641
8642 SET_DECNUM(mvdcmd, u8Idx);
8643 SET_CMD_RET_FALSE(CMD_CC_ENABLE_EXTERNAL_BUFFER, &mvdcmd);
8644
8645 if (u8size ==0)
8646 {
8647 SET_CMD_RET_FALSE(CMD_CLOSE_CC, &mvdcmd);
8648 return E_MVD_RET_OK;
8649 }
8650
8651 u32base *= (1<<10); //unit is bytes
8652 u32cc_size = u8size * (1<<10); //unit is bytes
8653
8654
8655 MS_VIRT *u32ReadPtr = (MS_VIRT *)(HAL_MVD_PA2NonCacheSeg(u32base));
8656 MS_VIRT *u32WritePtr = (MS_VIRT *)(HAL_MVD_PA2NonCacheSeg(u32base+sizeof(MS_VIRT)));
8657 MS_VIRT *u32LatchOverflow = (MS_VIRT *)(HAL_MVD_PA2NonCacheSeg(u32base+sizeof(MS_VIRT)*2));
8658 MS_VIRT *u32CpuBaseAddr = (MS_VIRT *)(HAL_MVD_PA2NonCacheSeg(u32base+sizeof(MS_VIRT)*3));
8659
8660 //rptr,wptr,overflow,latch 16 bytes
8661 if(cc_type==1)
8662 {
8663 u32base+=(4*sizeof(MS_VIRT));
8664 u32cc_size -= (4*sizeof(MS_VIRT));
8665 }
8666
8667 if(cc_type==0) // 708: start from 128 bytes
8668 {
8669 u32base+=128;
8670 u32cc_size -=128;
8671 }
8672
8673 *u32ReadPtr = *u32WritePtr = u32base;
8674 *u32LatchOverflow = 0;
8675 *u32CpuBaseAddr = HAL_MVD_GetMEMCfg(u8Idx)->u32FWBinAddr;
8676
8677 _phy_to_miu_offset(u8MiuSel, u32StartOffset, u32base);
8678 _MVD_SetUserDataBufStart(u8Idx,u32StartOffset,cc_type);
8679 _MVD_SetUserDataBufSize(u8Idx,u32cc_size,cc_type);
8680 //MVD_DEBUGINFO(printf("%s: u32base=%x,u32size=%x,cc_type=%x\n", __FUNCTION__,u32base,u32cc_size,cc_type));
8681
8682 return E_MVD_RET_OK;
8683 }
8684
HAL_MVD_HWBuffer_ReMappingMode(MS_U8 u8Idx,MS_BOOL bEnable)8685 E_MVD_Result HAL_MVD_HWBuffer_ReMappingMode(MS_U8 u8Idx,MS_BOOL bEnable)
8686 {
8687 pMVDHalContext->gMVDPreCtrl[u8Idx].bHWBufferReMapping = bEnable;
8688 return E_MVD_RET_OK;
8689 }
8690
HAL_MVD_SetPrebufferSize(MS_U8 u8Idx,MS_U32 size)8691 MS_BOOL HAL_MVD_SetPrebufferSize(MS_U8 u8Idx, MS_U32 size)
8692 {
8693 MVD_CmdArg mvdcmd;
8694
8695 SETUP_CMDARG(mvdcmd);
8696 mvdcmd.Arg0 = size&0xff;
8697 mvdcmd.Arg1 = (size>>8)&0xff;
8698 mvdcmd.Arg2 = (size>>16)&0xff;
8699 mvdcmd.Arg3 = (size>>24)&0xff;
8700 SET_DECNUM(mvdcmd, u8Idx);
8701 if (HAL_MVD_MVDCommand( CMD_PREBUFFER_SIZE, &mvdcmd ) == FALSE)
8702 {
8703 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_PREBUFFER_SIZE ) );
8704 return FALSE;
8705 }
8706 return TRUE;
8707 }
8708
HAL_MVD_VariableFrameRate(MS_U8 u8Idx)8709 MS_BOOL HAL_MVD_VariableFrameRate(MS_U8 u8Idx)
8710 {
8711 MVD_CmdArg mvdcmd;
8712 SETUP_CMDARG(mvdcmd);
8713 mvdcmd.Arg0 = 1;
8714 SET_DECNUM(mvdcmd, u8Idx);
8715 if (HAL_MVD_MVDCommand(CMD_VARIABLE_FRAMERATE, &mvdcmd)== FALSE)
8716 {
8717 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_VARIABLE_FRAMERATE) );
8718 return FALSE;
8719 }
8720 return TRUE;
8721 }
8722
HAL_MVD_GetVsyncAddrOffset(void)8723 MS_VIRT HAL_MVD_GetVsyncAddrOffset(void)
8724 {
8725 MS_VIRT VPUSHMAddr = HAL_VPU_EX_GetSHMAddr();
8726 MS_VIRT VsyncBridgeOffset = 0;
8727
8728 if(VPUSHMAddr != 0) // TEE project
8729 {
8730 VsyncBridgeOffset = VSYNC_BRIDGE_OFFSET;
8731 }
8732 else // normal project
8733 {
8734 VsyncBridgeOffset = COMMON_AREA_START + VSYNC_BRIDGE_OFFSET;
8735 }
8736
8737 return VsyncBridgeOffset;
8738 }
8739
HAL_MVD_GetVsyncExtAddrOffset(void)8740 MS_VIRT HAL_MVD_GetVsyncExtAddrOffset(void)
8741 {
8742 MS_VIRT VsyncBridgeExtOffset = 0;
8743
8744 MS_VIRT VPUSHMAddr = HAL_VPU_EX_GetSHMAddr();
8745 if(VPUSHMAddr != 0) // TEE project
8746 {
8747 VsyncBridgeExtOffset = VSYNC_BRIDGE_EXT_OFFSET;
8748 }
8749 else // normal project
8750 {
8751 VsyncBridgeExtOffset = COMMON_AREA_START + VSYNC_BRIDGE_EXT_OFFSET;
8752 }
8753 return VsyncBridgeExtOffset;
8754 }
8755
HAL_MVD_SetTimeIncPredictParam(MS_U8 u8Idx,MS_U32 u32time)8756 E_MVD_Result HAL_MVD_SetTimeIncPredictParam(MS_U8 u8Idx, MS_U32 u32time)
8757 {
8758 MVD_CmdArg mvdcmd;
8759 SETUP_CMDARG(mvdcmd);
8760
8761 mvdcmd.Arg0 = L_WORD(u32time); // Arg0(enable), 1 for enable, default is 0...
8762 mvdcmd.Arg1 = H_WORD(u32time); // Arg1(vop_time_incr_predict_count), 1 for predict once, 2 for twice...0xff for always guess the vop_time_incr even with the vol_header, default is 0...
8763 mvdcmd.Arg2 = L_DWORD(u32time);// Arg2(vop_time_incr_follow_vol_header), // 0 for follow vol_header...1 for bypass vol_header, default is 0...
8764 mvdcmd.Arg3 = H_DWORD(u32time);// Arg3, reserve...
8765 MVD_DEBUGINFO(printf("CMD_TIME_INCR_PREDICT=%x\n",u32time));
8766 if (HAL_MVD_MVDCommand(CMD_TIME_INCR_PREDICT, &mvdcmd) == FALSE)
8767 {
8768 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_TIME_INCR_PREDICT ) );
8769 return E_MVD_RET_FAIL;
8770 }
8771 return E_MVD_RET_OK;
8772
8773 }
8774
HAL_MVD_SetDecodeTimeoutParam(MS_U8 u8Idx,MS_BOOL enable,MS_U32 u32timeout)8775 MS_BOOL HAL_MVD_SetDecodeTimeoutParam(MS_U8 u8Idx, MS_BOOL enable,MS_U32 u32timeout)
8776 {
8777 MVD_CmdArg mvdcmd;
8778
8779 SETUP_CMDARG(mvdcmd);
8780
8781 if(enable == TRUE)
8782 {
8783 mvdcmd.Arg0 = 2; //0:disable, 2: enable decode timeout
8784 mvdcmd.Arg1 = u32timeout&0xff;
8785 mvdcmd.Arg2 = (u32timeout>>8)&0xff;
8786 mvdcmd.Arg3 = (u32timeout>>16)&0xff;
8787 }
8788 else
8789 {
8790 mvdcmd.Arg0 = 0; //0:disable, 2: enable decode timeout
8791 }
8792
8793 SET_DECNUM(mvdcmd, u8Idx);
8794
8795 if (HAL_MVD_MVDCommand( CMD_ENABLE_VLD_TIMEOUT, &mvdcmd ) == FALSE)
8796 {
8797 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_ENABLE_VLD_TIMEOUT ) );
8798 return FALSE;
8799 }
8800
8801 return TRUE;
8802 }
8803
HAL_MVD_Set_Smooth_Rewind(MS_U8 u8Idx,MS_U8 btype)8804 E_MVD_Result HAL_MVD_Set_Smooth_Rewind(MS_U8 u8Idx, MS_U8 btype)
8805 {
8806 MVD_CmdArg mvdcmd;
8807 SETUP_CMDARG(mvdcmd);
8808 mvdcmd.Arg0 = btype;
8809 MVD_DEBUGINFO(printf("%s: btype=%x\n", __FUNCTION__, btype));
8810 SET_DECNUM(mvdcmd, u8Idx);
8811 if (HAL_MVD_MVDCommand(CMD_SMOOTH_REWIND, &mvdcmd) == FALSE)
8812 {
8813 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SMOOTH_REWIND ) );
8814 return E_MVD_RET_FAIL;
8815 }
8816 return E_MVD_RET_OK;
8817 }
8818
HAL_MVD_IsAlive(MS_U8 u8Idx)8819 E_MVD_Result HAL_MVD_IsAlive(MS_U8 u8Idx)
8820 {
8821 MVD_ALIVEInfo* pAliveInfo = &(pMVDHalContext->aliveInfo[u8Idx]);
8822 MVD_SrcMode curSrcMode = HAL_MVD_GetSrcMode(u8Idx);
8823
8824 if(pMVDHalContext->u32LastAliveTime[u8Idx] == 0)
8825 {
8826 pMVDHalContext->u32LastAliveTime[u8Idx] = MsOS_GetSystemTime();
8827 return E_MVD_RET_OK;
8828 }
8829
8830 if((MsOS_GetSystemTime()-pMVDHalContext->u32LastAliveTime[u8Idx]) < 500)
8831 {
8832 return E_MVD_RET_OK;
8833 }
8834
8835 #if 0
8836 printf("[%s]%d,%d,%d,%d,%d,%d,%d,%d,%d\n",__FUNCTION__,
8837 (MS_U32)MsOS_GetSystemTime(),
8838 (MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DECODEDONE_COUNT, sizeof(MS_U32))),
8839 (MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SEARCHBUF_COUNT, sizeof(MS_U32))),
8840 (MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SEARCHCODE_COUNT, sizeof(MS_U32))),
8841 (MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_PREBUF_COUNT, sizeof(MS_U32))),
8842 (MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_VFIFOBUF_COUNT, sizeof(MS_U32))),
8843 (MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SEARCHHEADER_COUNT, sizeof(MS_U32))),
8844 (MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_FLASHPATTERN_COUNT, sizeof(MS_U32))),
8845 (MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_IDLE_COUNT, sizeof(MS_U32))));
8846 #endif
8847
8848 //check count to vertify alive
8849 if((pAliveInfo->u32decode_count!=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DECODEDONE_COUNT, sizeof(MS_U32))))||
8850 (pAliveInfo->u32searchbuf_count!=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SEARCHBUF_COUNT, sizeof(MS_U32))))||
8851 (pAliveInfo->u32searchcode_count!=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SEARCHCODE_COUNT, sizeof(MS_U32))))||
8852 (pAliveInfo->u32prebuf_count!=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_PREBUF_COUNT, sizeof(MS_U32))))||
8853 (pAliveInfo->u32vfifobuf_count!=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_VFIFOBUF_COUNT, sizeof(MS_U32))))||
8854 (pAliveInfo->u32searchheader_count!=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SEARCHHEADER_COUNT, sizeof(MS_U32))))||
8855 (pAliveInfo->u32flashpattern_count!=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_FLASHPATTERN_COUNT, sizeof(MS_U32)))) ||
8856 (pAliveInfo->u32IdleCount!=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_IDLE_COUNT, sizeof(MS_U32)))))
8857 {
8858 pAliveInfo->u32decode_count=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_DECODEDONE_COUNT, sizeof(MS_U32)));
8859 pAliveInfo->u32searchbuf_count=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SEARCHBUF_COUNT, sizeof(MS_U32)));
8860 pAliveInfo->u32searchcode_count=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SEARCHCODE_COUNT, sizeof(MS_U32)));
8861 pAliveInfo->u32prebuf_count=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_PREBUF_COUNT, sizeof(MS_U32)));
8862 pAliveInfo->u32vfifobuf_count=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_VFIFOBUF_COUNT, sizeof(MS_U32)));
8863 pAliveInfo->u32searchheader_count=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_SEARCHHEADER_COUNT, sizeof(MS_U32)));
8864 pAliveInfo->u32flashpattern_count=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_FLASHPATTERN_COUNT, sizeof(MS_U32)));
8865 pAliveInfo->u32IdleCount=(MS_U32)(MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_IDLE_COUNT, sizeof(MS_U32)));
8866 pMVDHalContext->u32LastAliveTime[u8Idx] = MsOS_GetSystemTime();
8867 return E_MVD_RET_OK;
8868 }
8869 else
8870 {
8871 pMVDHalContext->u32LastAliveTime[u8Idx] = MsOS_GetSystemTime();
8872 return E_MVD_RET_FAIL;
8873 }
8874
8875 }
8876
8877
HAL_MVD_Set_Err_Tolerance(MS_U8 u8Idx,MS_U16 u16Para)8878 E_MVD_Result HAL_MVD_Set_Err_Tolerance(MS_U8 u8Idx, MS_U16 u16Para)
8879 {
8880 MVD_CmdArg mvdcmd;
8881 SETUP_CMDARG(mvdcmd);
8882 mvdcmd.Arg0 = u16Para & 0xFF; //enable or disable
8883 mvdcmd.Arg1 = u16Para >> 8; // err rate 0~100%
8884 if(mvdcmd.Arg1 >= 100)
8885 mvdcmd.Arg1 = 100;
8886
8887 SET_DECNUM(mvdcmd, u8Idx);
8888 if (HAL_MVD_MVDCommand(CMD_DECODE_ERROR_TOLERANCE, &mvdcmd) == FALSE)
8889 {
8890 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DECODE_ERROR_TOLERANCE ) );
8891 return E_MVD_RET_FAIL;
8892 }
8893 return E_MVD_RET_OK;
8894
8895 }
8896
HAL_MVD_EnableAutoInsertDummyPattern(MS_U8 u8Idx,MS_BOOL bEnable)8897 void HAL_MVD_EnableAutoInsertDummyPattern(MS_U8 u8Idx, MS_BOOL bEnable)
8898 {
8899 pMVDHalContext->bAutoInsertDummyPattern[u8Idx] = bEnable;
8900 }
8901
HAL_MVD_Drop_One_PTS(MS_U8 u8Idx)8902 void HAL_MVD_Drop_One_PTS(MS_U8 u8Idx)
8903 {
8904 pMVDHalContext->bDropOnePTS[u8Idx] = TRUE;
8905 }
8906
HAL_MVD_PVR_Seamless_mode(MS_U8 u8Idx,MS_U8 u8Arg)8907 E_MVD_Result HAL_MVD_PVR_Seamless_mode(MS_U8 u8Idx, MS_U8 u8Arg)
8908 {
8909 #define STOP_TIMEOUT 500 //ms
8910 MVD_CmdArg mvdcmd;
8911 E_MVD_Result ret = E_MVD_RET_OK;
8912 MS_U32 u32StartTime;
8913 MS_U32 u32SeamlessStatus = 0;
8914 MS_U32 u32BufStart = 0;
8915 MS_U32* temp = 0;
8916
8917 if(u8Arg != 2)
8918 {
8919 // clear handshake dram
8920 u32BufStart = GET_FRMINFO_BUFFADD(u8Idx);
8921 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,u32BufStart,u32BufStart);
8922 temp = (MS_U32*)MsOS_PA2KSEG1(u32BufStart+OFFSET_PVR_SEAMLESS_STATUS);
8923 *temp = 0;
8924 MsOS_FlushMemory();
8925 }
8926
8927 SETUP_CMDARG(mvdcmd);
8928 mvdcmd.Arg0 = u8Arg;
8929 MVD_DEBUGINFO(printf("%s: arg=%d\n", __FUNCTION__, (unsigned int)u8Arg));
8930 SET_DECNUM(mvdcmd, u8Idx);
8931
8932 if (HAL_MVD_MVDCommand(CMD_PVR_SEAMLESS_MODE, &mvdcmd) == FALSE)
8933 {
8934 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_PVR_SEAMLESS_MODE ) );
8935 return E_MVD_RET_FAIL;
8936 }
8937
8938
8939 u32StartTime = HAL_MVD_GetTime();
8940
8941 if(u8Arg == 1)
8942 {
8943 pMVDHalContext->stFwCfg[u8Idx].eSrcMode = E_MVD_TS_FILE_MODE;
8944 while(1)
8945 {
8946 u32SeamlessStatus = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_PVR_SEAMLESS_STATUS, sizeof(MS_U32));
8947 if(u32SeamlessStatus&1) // bit0 , pause done
8948 {
8949 break;
8950 }
8951
8952 if((HAL_MVD_GetTime()-u32StartTime)>STOP_TIMEOUT)
8953 {
8954 MVD_DEBUGERROR(printf("PVR seamless pause timeout\n" ) );
8955 ret = E_MVD_RET_FAIL;
8956 break;
8957 }
8958 }
8959 }
8960 else if(u8Arg == 2)
8961 {
8962 while(1)
8963 {
8964 u32SeamlessStatus = MVD_GetFWBuffData(u8Idx, FW_BUFF_FRMINFO, OFFSET_PVR_SEAMLESS_STATUS, sizeof(MS_U32));
8965 if(u32SeamlessStatus&4) // bit2, hw reset done
8966 {
8967 break;
8968 }
8969
8970 if((HAL_MVD_GetTime()-u32StartTime)>STOP_TIMEOUT)
8971 {
8972 MVD_DEBUGERROR(printf("PVR seamless hw reset timeout\n" ) );
8973 ret = E_MVD_RET_FAIL;
8974 break;
8975 }
8976 }
8977 }
8978
8979 return ret;
8980 }
8981
HAL_MVD_SetDisplayFinishMode(MS_U8 u8Idx,MS_U8 u8Mode)8982 E_MVD_Result HAL_MVD_SetDisplayFinishMode(MS_U8 u8Idx, MS_U8 u8Mode)
8983 {
8984 MVD_CmdArg mvdcmd;
8985
8986 SETUP_CMDARG(mvdcmd);
8987 mvdcmd.Arg0 = u8Mode;
8988
8989 SET_DECNUM(mvdcmd, u8Idx);
8990
8991 MVD_DEBUGINFO(printf("%s CMD_ENABLE_LAST_FRAME_QUALIFIER arg0=%x\n", __FUNCTION__, u8Mode));
8992 if (HAL_MVD_MVDCommand(CMD_ENABLE_LAST_FRAME_QUALIFIER, &mvdcmd)== FALSE)
8993 {
8994 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_ENABLE_LAST_FRAME_QUALIFIER) );
8995 return E_MVD_RET_FAIL;
8996 }
8997
8998 return E_MVD_RET_OK;
8999 }
9000
HAL_MVD_GetVBBUTableAddr(MS_U8 u8Idx)9001 MS_VIRT HAL_MVD_GetVBBUTableAddr(MS_U8 u8Idx)
9002 {
9003 return pMVDHalContext->stFWBuff[(u8Idx)].u32VBBUTableAdd;
9004 }
9005
HAL_MVD_SetDmxFrameRate(MS_U8 u8HalIdx,MS_U32 u32Value)9006 void HAL_MVD_SetDmxFrameRate(MS_U8 u8HalIdx,MS_U32 u32Value)
9007 {
9008 pMVDHalContext->u32DmxFrameRate[u8HalIdx] = u32Value;
9009 }
9010
HAL_MVD_SetDmxFrameRateBase(MS_U8 u8HalIdx,MS_U32 u32Value)9011 void HAL_MVD_SetDmxFrameRateBase(MS_U8 u8HalIdx,MS_U32 u32Value)
9012 {
9013 pMVDHalContext->u32DmxFrameRateBase[u8HalIdx] = u32Value;
9014 }
9015
HAL_MVD_SetAVSyncDispAutoDrop(MS_U8 u8Idx,MS_BOOL bEnable)9016 MS_BOOL HAL_MVD_SetAVSyncDispAutoDrop(MS_U8 u8Idx, MS_BOOL bEnable)
9017 {
9018 MVD_CmdArg mvdcmd;
9019
9020 SETUP_CMDARG(mvdcmd);
9021 mvdcmd.Arg0 = bEnable;
9022
9023 SET_DECNUM(mvdcmd, u8Idx);
9024
9025 MVD_DEBUGINFO(printf("%s CMD_AUTO_DROP_FRAME_IN_DECODE arg0=%x\n", __FUNCTION__, bEnable));
9026 if (HAL_MVD_MVDCommand(CMD_AUTO_DROP_FRAME_IN_DECODE, &mvdcmd)== FALSE)
9027 {
9028 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_AUTO_DROP_FRAME_IN_DECODE) );
9029 return FALSE;
9030 }
9031
9032 return TRUE;
9033 }
9034
HAL_MVD_SetDynmcDispPath(MS_U8 u8Idx,MS_BOOL bConnect,MVD_DISPLAY_PATH eValue,MS_BOOL bPreSet)9035 MS_BOOL HAL_MVD_SetDynmcDispPath(MS_U8 u8Idx,MS_BOOL bConnect,MVD_DISPLAY_PATH eValue,MS_BOOL bPreSet)
9036 {
9037 MS_U32 u32TimeCnt = 0;
9038 MVD_CmdArg mvdcmd;
9039
9040 HAL_MVD_ResetHandShake(u8Idx, MVD_HANDSHAKE_VSYNC_CONTROL);
9041
9042 SETUP_CMDARG(mvdcmd);
9043 mvdcmd.Arg0 = bConnect;
9044 mvdcmd.Arg1 = eValue;
9045 mvdcmd.Arg2 = bPreSet;
9046
9047 SET_DECNUM(mvdcmd, u8Idx);
9048
9049 MVD_DEBUGINFO(printf("%s CMD_DYNAMIC_MVOP_CONNECT arg0=%x, arg1=%x\n", __FUNCTION__, bConnect,eValue));
9050 if (HAL_MVD_MVDCommand(CMD_DYNAMIC_MVOP_CONNECT, &mvdcmd)== FALSE)
9051 {
9052 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_DYNAMIC_MVOP_CONNECT) );
9053 return FALSE;
9054 }
9055
9056 if(bConnect == FALSE) // disconnect, need to do handshake with fw
9057 {
9058 u32TimeCnt = HAL_MVD_GetTime();
9059 while ((HAL_MVD_GetTime() - u32TimeCnt) < CMD_TIMEOUT_MS)
9060 {
9061 if (HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_VSYNC_CONTROL))
9062 {
9063 MVD_DEBUGINFO(printf("\n vsync control finished!\n"));
9064 break;
9065 }
9066 }
9067
9068 MVD_DEBUGINFO(printf("====> %s (t1=%lu t2=%lu diff=%lu)\n", __FUNCTION__,u32TimeCnt, HAL_MVD_GetTime(), (HAL_MVD_GetTime() - u32TimeCnt)));
9069
9070 if (TRUE != HAL_MVD_IsCmdFinished(u8Idx, MVD_HANDSHAKE_VSYNC_CONTROL))
9071 {
9072 MVD_DEBUGINFO(printf("\n***** vsync control timeout *****\n\n"));
9073 return FALSE;
9074 }
9075 }
9076 return TRUE;
9077 }
9078
HAL_MVD_SetCMAInformation(void * cmaInitParam)9079 void HAL_MVD_SetCMAInformation(void* cmaInitParam)
9080 {
9081 pMVDHalContext->bCMAUsed = TRUE;
9082 memcpy((void*)(&pMVDHalContext->cmaInitParam),cmaInitParam,sizeof(struct CMA_Pool_Init_Param));
9083 }
9084
HAL_MVD_Set_SlowSyncParam(MS_U8 u8Idx,MS_U8 u8RepeatPeriod,MS_U8 u8DropPeriod)9085 E_MVD_Result HAL_MVD_Set_SlowSyncParam(MS_U8 u8Idx, MS_U8 u8RepeatPeriod,MS_U8 u8DropPeriod)
9086 {
9087 MVD_CmdArg mvdcmd;
9088 SETUP_CMDARG(mvdcmd);
9089
9090 mvdcmd.Arg0 = u8RepeatPeriod;
9091
9092 SET_DECNUM(mvdcmd, u8Idx);
9093 if (HAL_MVD_MVDCommand(CMD_SLOW_SYNC_REPEAT, &mvdcmd) == FALSE)
9094 {
9095 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SLOW_SYNC_REPEAT ) );
9096 return E_MVD_RET_FAIL;
9097 }
9098
9099
9100 mvdcmd.Arg0 = u8DropPeriod;
9101
9102 SET_DECNUM(mvdcmd, u8Idx);
9103 if (HAL_MVD_MVDCommand(CMD_SLOW_SYNC_SKIP, &mvdcmd) == FALSE)
9104 {
9105 MVD_DEBUGERROR( printf( "Command: 0x%x fail!!\r\n", CMD_SLOW_SYNC_SKIP ) );
9106 return E_MVD_RET_FAIL;
9107 }
9108
9109
9110 return E_MVD_RET_OK;
9111 }
9112
HAL_MVD_IsDispQueueEmpty(MS_U8 u8Idx)9113 E_MVD_DISP_QUEUE HAL_MVD_IsDispQueueEmpty(MS_U8 u8Idx)
9114 {
9115 MS_U32 u32Id = MVD_GetStreamId(u8Idx);
9116 MS_U8 u8VPUIdx = HAL_VPU_EX_GetTaskId(u32Id);
9117
9118 MVD_MEMCfg* pstMemCfg = NULL;
9119 pstMemCfg = HAL_MVD_GetMEMCfg(u8Idx);
9120 DISPQ_IN_DRAM* pTemp = (DISPQ_IN_DRAM*)(MS_PA2KSEG1(pstMemCfg->u32FWCodeAddr+DISP_QUEUE_START+ u8VPUIdx*0x100000));
9121
9122 //printf("dispQ_rd: %u,dispQ_wr: %u\n",pTemp->dispQ_rd,pTemp->dispQ_wr);
9123 if(pTemp)
9124 {
9125 if (pTemp->dispQ_rd == pTemp->dispQ_wr)
9126 return MVD_DISP_QUEUE_EMPTY;
9127 else
9128 return MVD_DISP_QUEUE_NOT_EMPTY;
9129 }
9130 else
9131 return MVD_DISP_QUEUE_INVALID_ADDR;
9132 }
9133
9134
HAL_MVD_GetCMAInformation(MS_U8 u8HalIdx,MS_U64 * u64Addr,MS_SIZE * u64Size,MS_BOOL * bAllocDone)9135 void HAL_MVD_GetCMAInformation(MS_U8 u8HalIdx,MS_U64* u64Addr,MS_SIZE* u64Size,MS_BOOL* bAllocDone)
9136 {
9137 FW_VOL_INFO gvolInfo;
9138 MS_U32 u32VolAddr;
9139
9140 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,GET_VOL_BUFFADD(u8HalIdx),u32VolAddr);
9141
9142 gvolInfo = (*(volatile FW_VOL_INFO*)(MsOS_PA2KSEG1(u32VolAddr)));
9143
9144 *u64Addr = (MS_U64)gvolInfo.CMA_FB_Address;
9145 *u64Size = (MS_SIZE)gvolInfo.CMA_FB_Size;
9146 *bAllocDone = gvolInfo.CMA_AllocDone;
9147
9148 MsOS_ReadMemory();
9149 MsOS_FlushMemory();
9150 }
9151
HAL_MVD_SetCMAAllocateDone(MS_U8 u8HalIdx)9152 void HAL_MVD_SetCMAAllocateDone(MS_U8 u8HalIdx)
9153 {
9154 MS_U8* temp;
9155 MS_VIRT u32VolAddr;
9156
9157 _miu_offset_to_phy(pMVDHalContext->stMiuCfg.u8FWMiuSel,GET_VOL_BUFFADD(u8HalIdx),u32VolAddr);
9158
9159 temp = (MS_U8*)(MsOS_PA2KSEG1(u32VolAddr+OFFSET_CMA_ALLOCDONE));
9160
9161 *temp = 1;
9162
9163 MsOS_ReadMemory();
9164 MsOS_FlushMemory();
9165 }
9166
HAL_MVD_SetFrameBufferMiu(MS_U8 u8HalIdx,MS_U8 u8MiuIdx)9167 void HAL_MVD_SetFrameBufferMiu(MS_U8 u8HalIdx,MS_U8 u8MiuIdx)
9168 {
9169 //to do....
9170 }
9171
9172
9173 #ifdef VDEC3
HAL_MVD_IsDisplayCommand(MS_U8 u8Cmd)9174 MS_BOOL HAL_MVD_IsDisplayCommand(MS_U8 u8Cmd)
9175 {
9176
9177 #if 1 // to do.
9178 UNUSED(u8Cmd);
9179 return TRUE;
9180 #else
9181 MS_BOOL ret;
9182 switch(u8Cmd)
9183 {
9184 case CMD_PLAY:
9185 case CMD_STOP:
9186 case CMD_DISPLAY_PAUSE:
9187 case CMD_PAUSE:
9188 case CMD_FLUSH_DISP_QUEUE:
9189 case CMD_VC1_HW_SLQ_RESET:
9190 case CMD_FAST_SLOW:
9191 case CMD_FLIP_RELEASE_FRAME:
9192 case CMD_FD_MASK_DELAY_CNT:
9193 case CMD_PVR_SEAMLESS_MODE:
9194 case CMD_SW_RESET:
9195 case CMD_CODEC_INFO:
9196 case CMD_CODE_OFFSET:
9197 case CMD_VOL_INFO_BUF:
9198 case CMD_FRAME_INFO_BUF:
9199 case CMD_HEADER_INFO_BUF:
9200 case CMD_USER_BUF_START:
9201 case CMD_USER_BUF_SIZE:
9202 case CMD_PTS_TBL_START:
9203 case CMD_DEC_FRAME_INFO_BUF:
9204 case CMD_SLQ_TBL_BUF_END:
9205 case CMD_SLQ_TBL_BUF_START:
9206 case CMD_STREAM_BUF_START:
9207 case CMD_STREAM_BUF_END:
9208 case CMD_FB_BASE:
9209 case CMD_IAP_BUF_START:
9210 case CMD_DP_BUF_START:
9211 case CMD_MV_BUF_START:
9212 case CMD_FB_NUM:
9213 case CMD_DISPLAY_CTL:
9214 case CMD_REPEAT_MODE:
9215 case CMD_DS_VIRTUAL_BOX:
9216 case CMD_ENABLE_FILE_SYNC:
9217 case CMD_RVU_EN:
9218 case CMD_START_DEC_STRICT:
9219 case CMD_SYNC_ON:
9220 case CMD_SET_MST_MODE:
9221 case CMD_SET_MCU_MODE:
9222 ret = TRUE;
9223 break;
9224 default:
9225 ret = FALSE;
9226 break;
9227 }
9228
9229 return ret;
9230 #endif
9231 }
9232
HAL_MVD_IsNormalCommand(MS_U8 u8Cmd)9233 MS_BOOL HAL_MVD_IsNormalCommand(MS_U8 u8Cmd)
9234 {
9235 MS_BOOL ret;
9236
9237 switch(u8Cmd)
9238 {
9239
9240 case CMD_DISP_SPEED_CTRL:
9241 case CMD_STEP_DISP_DECODE_ONE:
9242 case CMD_ENABLE_LAST_FRAME_SHOW:
9243 case CMD_STEP_TO_PTS:
9244 case CMD_SKIP_DATA:
9245 case CMD_DIU_WIDTH_ALIGN:
9246 case CMD_SCALER_INFO_BASE:
9247 case CMD_DYNAMIC_SCALE_BASE:
9248 case CMD_ENABLE_DYNAMIC_SCALE:
9249 case CMD_FORCE_BLUE_SCREEN:
9250 case CMD_FREEZE_DISP:
9251 case CMD_FIXED_FRAME_BUFFER:
9252 case CMD_SEND_UNI_PTS:
9253 case CMD_ENABLE_FREEZE_PIC:
9254 case CMD_PTS_BASE:
9255 case CMD_SINGLE_STEP:
9256 case CMD_PARSE_M4V_PACKMD:
9257 case CMD_SLQ_END:
9258 case CMD_SLQ_START:
9259 case CMD_ENABLE_INT_STAT:
9260 case CMD_SHOW_ONE_FIELD:
9261 case CMD_FRC_OUPUT:
9262 case CMD_FRC_DROP_BEHAVIOR:
9263 case CMD_FORBID_RESOLUTION_CHANGE:
9264 case CMD_DUMP_BITSTREAM_BASE:
9265 case CMD_DUMP_BITSTREAM_LENGTH:
9266 case CMD_SYNC_OFFSET:
9267 case CMD_SYN_THRESHOLD:
9268 case CMD_AVSYNC_FREERUN_THRESHOLD:
9269 case CMD_MVD_FAST_INT:
9270 case CMD_DIVX_PATCH:
9271 case CMD_IDCT_SEL:
9272 case CMD_SLQ_UPDATE_TBL_WPTR:
9273 case CMD_DMA_OVFTH:
9274 case CMD_DMA_UNFTH:
9275 case CMD_UPDATE_FRAME:
9276 case CMD_PTS_TBL_RESET:
9277 case CMD_ENABLE_AUTO_MUTE:
9278 case CMD_FORCE_ALIGN_VSIZE:
9279 case CMD_SUSPEND_DS:
9280 case CMD_PUSH_FIRST_FRAME_DISP:
9281 case CMD_XC_LOW_DELAY_PARA:
9282 case CMD_FP_FILTER:
9283 case CMD_CC_ENABLE_EXTERNAL_BUFFER:
9284 case CMD_CLOSE_CC:
9285 case CMD_PREBUFFER_SIZE:
9286 case CMD_TIME_INCR_PREDICT:
9287 case CMD_ENABLE_VLD_TIMEOUT:
9288 case CMD_SMOOTH_REWIND:
9289 case CMD_DECODE_ERROR_TOLERANCE:
9290 case CMD_MVD_IDLE:
9291 case CMD_PARSER_READ_POSITION:
9292 case CMD_SLQ_GET_TBL_RPTR:
9293 case CMD_DECODE_STATUS:
9294 case CMD_GET_AFD:
9295 case CMD_GET_SYNC_STAT:
9296 case CMD_RD_USER_WP:
9297 case CMD_ENABLE_LAST_FRAME_QUALIFIER:
9298 //case CMD_RD_IO: // no need in V3
9299 //case CMD_WR_IO: // no need in V3
9300 ret = TRUE;
9301 break;
9302 default:
9303 ret = FALSE;
9304 break;
9305 }
9306
9307 return ret;
9308 }
9309
HAL_MVD_IsNeedResponseCommand(MS_U8 u8Cmd)9310 MS_BOOL HAL_MVD_IsNeedResponseCommand(MS_U8 u8Cmd)
9311 {
9312 MS_BOOL ret;
9313
9314 switch(u8Cmd)
9315 {
9316 case CMD_GET_AFD:
9317 case CMD_GET_SYNC_STAT:
9318 case CMD_RD_USER_WP:
9319 case CMD_DECODE_STATUS:
9320 case CMD_PARSER_READ_POSITION:
9321 case CMD_MVD_IDLE:
9322 ret = TRUE;
9323 break;
9324 default:
9325 ret = FALSE;
9326 break;
9327 }
9328
9329 return ret;
9330 }
9331 #endif
9332 #endif
9333