xref: /utopia/UTPA2-700.0.x/modules/demodulator/drv/demod/drvDMD_DTMB.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 //    Software and any modification/derivatives thereof.
18 //    No right, ownership, or interest to MStar Software and any
19 //    modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 //    supplied together with third party`s software and the use of MStar
23 //    Software may require additional licenses from third parties.
24 //    Therefore, you hereby agree it is your sole responsibility to separately
25 //    obtain any and all third party right and license necessary for your use of
26 //    such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 //    MStar`s confidential information and you agree to keep MStar`s
30 //    confidential information in strictest confidence and not disclose to any
31 //    third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35 //    without limitation, any warranties of merchantability, non-infringement of
36 //    intellectual property rights, fitness for a particular purpose, error free
37 //    and in conformity with any international standard.  You agree to waive any
38 //    claim against MStar for any loss, damage, cost or expense that you may
39 //    incur related to your use of MStar Software.
40 //    In no event shall MStar be liable for any direct, indirect, incidental or
41 //    consequential damages, including without limitation, lost of profit or
42 //    revenues, lost or damage of data, and unauthorized system use.
43 //    You agree that this Section 4 shall still apply without being affected
44 //    even if MStar Software has been modified by MStar in accordance with your
45 //    request or instruction for your use, except otherwise agreed by both
46 //    parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 //    services in relation with MStar Software to you for your use of
50 //    MStar Software in conjunction with your or your customer`s product
51 //    ("Services").
52 //    You understand and agree that, except otherwise agreed by both parties in
53 //    writing, Services are provided on an "AS IS" basis and the warranty
54 //    disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 //    or otherwise:
58 //    (a) conferring any license or right to use MStar name, trademark, service
59 //        mark, symbol or any other identification;
60 //    (b) obligating MStar or any of its affiliates to furnish any person,
61 //        including without limitation, you and yor any information; or
62 //    (c) conferring any license or right under any intellectual property right.
63 //
64 // 7. These terms shall be governed by and construed in accordance with the laws
65 //    of Taiwan, R.O.C., excluding its conflict of law rules.
66 //    Any and all dispute arising out hereof or related hereto shall be finally
67 //    settled by arbitration referred to the Chinese Arbitration Association,
68 //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
69 //    Rules of the Association by three (3) arbitrators appointed in accordance
70 //    with the said Rules.
71 //    The place of arbitra��cordance
72 //    with the said Rules.
73 //    The place of arbitration shall be in Taipei, Taiwan and the language shall
74 //    be English.
75 //    The arbitration award shall be final and binding to both parties.
76 //
77 //******************************************************************************
78 //<MStar Software>
79 ////////////////////////////////////////////////////////////////////////////////
80 //
81 // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
82 // All rights reserved.
83 //
84 // Unless otherwise stipulated in writing, any and all information contained
85 // herein regardless in any format shall remain the sole proprietary of
86 // MStar Semiconductor Inc. and be kept in strict confidence
87 // ("MStar Confidential Information") by the recipient.
88 // Any unauthorized act including without limitation unauthorized disclosure,
89 // copying, use, reproduction, sale, distribution, modification, disassembling,
90 // reverse engineering and compiling of the contents of MStar Confidential
91 // Information is unlawful and strictly prohibited. MStar hereby reserves the
92 // rights to any and all damages, losses, costs and expenses resulting therefrom.
93 //
94 ////////////////////////////////////////////////////////////////////////////////
95 
96 ///////////////////////////////////////////////////////////////////////////////////////////////////
97 ///
98 /// file    drvDMD_DTMB.c
99 /// @brief  DMD DTMB Driver Interface
100 /// @author MStar Semiconductor Inc.
101 ///////////////////////////////////////////////////////////////////////////////////////////////////
102 
103 //-------------------------------------------------------------------------------------------------
104 //  Driver Compiler Options
105 //-------------------------------------------------------------------------------------------------
106 
107 #ifdef UTPA2
108 #undef DONT_USE_CMA
109 #define DONT_USE_CMA
110 #endif
111 
112 //-------------------------------------------------------------------------------------------------
113 //  Include Files
114 //-------------------------------------------------------------------------------------------------
115 
116 #ifdef MSOS_TYPE_LINUX_KERNEL
117 #include <linux/string.h>
118 #else
119 #include <string.h>
120 #include <stdio.h>
121 #include <math.h>
122 #endif
123 
124 #include "drvDMD_DTMB.h"
125 #ifdef UTPA2
126 #include "drvDMD_DTMB_v2.h"
127 #endif
128 
129 #if DMD_DTMB_UTOPIA_EN || DMD_DTMB_UTOPIA2_EN
130 #include "MsOS.h"
131 #include "drvMMIO.h"
132 #endif
133 
134 #ifndef DONT_USE_CMA
135 #ifdef MSOS_TYPE_LINUX_KERNEL
136 #include "drvCMAPool_v2.h"
137 #else
138 #include "drvCMAPool.h"
139 #endif //#ifdef MSOS_TYPE_LINUX_KERNEL
140 #include "halCHIP.h"
141 #endif //#ifndef DONT_USE_CMA
142 
143 #if DMD_DTMB_UTOPIA_EN || DMD_DTMB_UTOPIA2_EN
_DEFAULT_IOCTL_CMD(DMD_DTMB_HAL_COMMAND eCmd,void * pArgs)144 static MS_BOOL _DEFAULT_IOCTL_CMD(DMD_DTMB_HAL_COMMAND eCmd, void *pArgs)
145 {
146     #ifdef REMOVE_HAL_INTERN_DTMB
147     printf("LINK ERROR: REMOVE_HAL_INTERN_DTMB \n");
148     #else
149     printf("LINK ERROR: Please link ext demod library \n");
150     #endif
151 
152     return TRUE;
153 }
154 
155 #ifdef REMOVE_HAL_INTERN_DTMB
156 MS_BOOL HAL_INTERN_DTMB_IOCTL_CMD(DMD_DTMB_HAL_COMMAND eCmd, void *pArgs)  __attribute__((weak, alias ("_DEFAULT_IOCTL_CMD")));
157 #else
158 MS_BOOL HAL_INTERN_DTMB_IOCTL_CMD(DMD_DTMB_HAL_COMMAND eCmd, void *pArgs);
159 #endif
160 MS_BOOL HAL_EXTERN_DTMB_IOCTL_CMD(DMD_DTMB_HAL_COMMAND eCmd, void *pArgs)  __attribute__((weak, alias ("_DEFAULT_IOCTL_CMD")));
161 #else
162 MS_BOOL HAL_EXTERN_DTMB_IOCTL_CMD(DMD_DTMB_HAL_COMMAND eCmd, void *pArgs);
163 #endif
164 
165 //-------------------------------------------------------------------------------------------------
166 //  Local Defines
167 //-------------------------------------------------------------------------------------------------
168 
169 #if DMD_DTMB_UTOPIA_EN && !DMD_DTMB_UTOPIA2_EN
170  #define DMD_LOCK()      \
171      do {                         \
172         MS_ASSERT(MsOS_In_Interrupt() == FALSE); \
173         if (_s32DMD_DTMB_Mutex == -1) return FALSE; \
174         if (_u8DMD_DTMB_DbgLevel == DMD_DTMB_DBGLV_DEBUG) printf("%s lock mutex\n", __FUNCTION__);\
175         MsOS_ObtainMutex(_s32DMD_DTMB_Mutex, MSOS_WAIT_FOREVER);\
176         } while(0)
177 
178  #define DMD_UNLOCK()      \
179      do {                         \
180         MsOS_ReleaseMutex(_s32DMD_DTMB_Mutex);\
181         if (_u8DMD_DTMB_DbgLevel == DMD_DTMB_DBGLV_DEBUG) printf("%s unlock mutex\n", __FUNCTION__); \
182         } while(0)
183 #elif (!DMD_DTMB_UTOPIA_EN && !DMD_DTMB_UTOPIA2_EN && DMD_DTMB_MULTI_THREAD_SAFE)
184  #define DMD_LOCK()    do { pRes->sDMD_DTMB_InitData.LockDMD(TRUE); } while(0)
185  #define DMD_UNLOCK()  do { pRes->sDMD_DTMB_InitData.LockDMD(FALSE); } while(0)
186 #else
187  #define DMD_LOCK()
188  #define DMD_UNLOCK()
189 #endif
190 
191 #ifdef MS_DEBUG
192 #define DMD_DBG(x)          (x)
193 #else
194 #define DMD_DBG(x)          // (x)
195 #endif
196 
197 //-------------------------------------------------------------------------------------------------
198 //  Local Structurs
199 //-------------------------------------------------------------------------------------------------
200 
201 
202 //-------------------------------------------------------------------------------------------------
203 //  Global Variables
204 //-------------------------------------------------------------------------------------------------
205 
206 MS_U8 u8DMD_DTMB_DMD_ID = 0;
207 
208 #if !DMD_DTMB_UTOPIA2_EN
209 DMD_DTMB_ResData sDMD_DTMB_ResData[DMD_DTMB_MAX_DEMOD_NUM] = { { {0} , {0} , {0} } };
210 
211 DMD_DTMB_ResData *psDMD_DTMB_ResData = sDMD_DTMB_ResData;
212 #else
213 DMD_DTMB_ResData *psDMD_DTMB_ResData;
214 #endif
215 
216 #ifdef UTPA2
217 static void* _ppDTMBInstant = NULL;
218 #endif
219 
220 //-------------------------------------------------------------------------------------------------
221 //  Local Variables
222 //-------------------------------------------------------------------------------------------------
223 
224 #if DMD_DTMB_UTOPIA_EN || DMD_DTMB_UTOPIA2_EN
225 static MSIF_Version _drv_dmd_dtmb_version;/* = {
226     .MW = { DMD_DTMB_VER, },
227 };*/
228 #endif
229 
230 #if DMD_DTMB_UTOPIA_EN && !DMD_DTMB_UTOPIA2_EN
231 static MS_S32 _s32DMD_DTMB_Mutex = -1;
232 #endif
233 
234 #ifndef DONT_USE_CMA
235 static struct CMA_Pool_Init_Param  _DTMB_CMA_Pool_Init_PARAM; // for MApi_CMA_Pool_Init
236 static struct CMA_Pool_Alloc_Param _DTMB_CMA_Alloc_PARAM;     // for MApi_CMA_Pool_GetMem
237 static struct CMA_Pool_Free_Param  _DTMB_CMA_Free_PARAM;      // for MApi_CMA_Pool_PutMem
238 #endif
239 
240 #ifdef UTPA2
241 static MS_U32 _u32DTMBopen = 0;
242 #endif
243 
244 static DMD_DTMB_DbgLv _u8DMD_DTMB_DbgLevel = DMD_DTMB_DBGLV_NONE;
245 
246 //-------------------------------------------------------------------------------------------------
247 //  Debug Functions
248 //-------------------------------------------------------------------------------------------------
249 
250 
251 
252 //-------------------------------------------------------------------------------------------------
253 //  Local Functions
254 //-------------------------------------------------------------------------------------------------
_DTMB_CheckLock(void)255 static DMD_DTMB_LOCK_STATUS _DTMB_CheckLock(void)
256 {
257     MS_BOOL (*ioctl)(DMD_DTMB_HAL_COMMAND eCmd, void *pPara);
258 
259     DMD_DTMB_ResData  *pRes  = psDMD_DTMB_ResData + u8DMD_DTMB_DMD_ID;
260     DMD_DTMB_InitData *pInit = &(pRes->sDMD_DTMB_InitData);
261     DMD_DTMB_Info     *pInfo = &(pRes->sDMD_DTMB_Info);
262 
263     ioctl = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD;
264 
265     if (ioctl(DMD_DTMB_HAL_CMD_DTMB_FEC_Lock, NULL))
266     {
267         pInfo->u32DTMBLockStatus |= DMD_DTMB_LOCK_DTMB_FEC_LOCK;
268         #if DMD_DTMB_UTOPIA_EN || DMD_DTMB_UTOPIA2_EN
269         pInfo->u32DTMBFECLockTime = MsOS_GetSystemTime();
270         #else
271         pInfo->u32DTMBFECLockTime = pInit->GetSystemTimeMS();
272         #endif
273         return DMD_DTMB_LOCK;
274     }
275     else
276     {
277         #if DMD_DTMB_UTOPIA_EN || DMD_DTMB_UTOPIA2_EN
278         if ((pInfo->u32DTMBLockStatus & DMD_DTMB_LOCK_DTMB_FEC_LOCK) && ((MsOS_GetSystemTime()-pInfo->u32DTMBFECLockTime) < 500))
279         #else
280         if ((pInfo->u32DTMBLockStatus & DMD_DTMB_LOCK_DTMB_FEC_LOCK) && ((pInit->GetSystemTimeMS()-pInfo->u32DTMBFECLockTime) < 500))
281         #endif
282         {
283             return DMD_DTMB_LOCK;
284         }
285         else
286         {
287             pInfo->u32DTMBLockStatus &= (~DMD_DTMB_LOCK_DTMB_FEC_LOCK);
288         }
289 
290         if (pInfo->u32DTMBLockStatus & DMD_DTMB_LOCK_DTMB_PNP_LOCK)//STEP 3
291         {
292             #if DMD_DTMB_UTOPIA_EN || DMD_DTMB_UTOPIA2_EN
293             if ((MsOS_GetSystemTime()-pInfo->u32DTMBScanTimeStart) < pInit->u16DTMBFECLockCheckTime)
294             #else
295             if ((pInit->GetSystemTimeMS()-pInfo->u32DTMBScanTimeStart) < pInit->u16DTMBFECLockCheckTime)
296             #endif
297             {
298                 return DMD_DTMB_CHECKING;
299             }
300         }
301         else //STEP 1,2
302         {
303             if (ioctl(DMD_DTMB_HAL_CMD_DTMB_PNP_Lock, NULL))
304             {
305                 pInfo->u32DTMBLockStatus |= DMD_DTMB_LOCK_DTMB_PNP_LOCK;
306                 #ifdef MS_DEBUG
307                 if (_u8DMD_DTMB_DbgLevel >= DMD_DTMB_DBGLV_DEBUG)
308                 {
309                     printf("DMD_DTMB_LOCK_DTMB_PNP_LOCK\n");
310                 }
311                 #endif
312                 return DMD_DTMB_CHECKING;
313             }
314             else
315             {
316                 #if DMD_DTMB_UTOPIA_EN || DMD_DTMB_UTOPIA2_EN
317                 if ((MsOS_GetSystemTime()-pInfo->u32DTMBScanTimeStart) < pInit->u16DTMBPNMLockCheckTime)
318                 #else
319                 if ((pInit->GetSystemTimeMS()-pInfo->u32DTMBScanTimeStart) < pInit->u16DTMBPNMLockCheckTime)
320                 #endif
321                 {
322                     return DMD_DTMB_CHECKING;
323                 }
324             }
325         }
326         return DMD_DTMB_UNLOCK;
327     }
328 }
329 
_DVBC_CheckLock(void)330 static DMD_DTMB_LOCK_STATUS _DVBC_CheckLock(void)
331 {
332     MS_BOOL (*ioctl)(DMD_DTMB_HAL_COMMAND eCmd, void *pPara);
333 
334     DMD_DTMB_ResData  *pRes  = psDMD_DTMB_ResData + u8DMD_DTMB_DMD_ID;
335     DMD_DTMB_InitData *pInit = &(pRes->sDMD_DTMB_InitData);
336     DMD_DTMB_Info     *pInfo = &(pRes->sDMD_DTMB_Info);
337 
338     ioctl = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD;
339 
340     if (ioctl(DMD_DTMB_HAL_CMD_DVBC_Main_Lock, NULL))
341     {
342         pInfo->u32DTMBLockStatus |= DMD_DTMB_LOCK_DVBC_MAIN_LOCK;
343         #if DMD_DTMB_UTOPIA_EN || DMD_DTMB_UTOPIA2_EN
344         pInfo->u32DTMBFECLockTime = MsOS_GetSystemTime();
345         #else
346         pInfo->u32DTMBFECLockTime = pInit->GetSystemTimeMS();
347         #endif
348         return DMD_DTMB_LOCK;
349     }
350     else
351     {
352         #if DMD_DTMB_UTOPIA_EN || DMD_DTMB_UTOPIA2_EN
353         if ((pInfo->u32DTMBLockStatus & DMD_DTMB_LOCK_DVBC_MAIN_LOCK) && ((MsOS_GetSystemTime()-pInfo->u32DTMBFECLockTime) < 100))
354         #else
355         if ((pInfo->u32DTMBLockStatus & DMD_DTMB_LOCK_DVBC_MAIN_LOCK) && ((pInit->GetSystemTimeMS()-pInfo->u32DTMBFECLockTime) < 100))
356         #endif
357         {
358             return DMD_DTMB_LOCK;
359         }
360         else
361         {
362             pInfo->u32DTMBLockStatus &= (~DMD_DTMB_LOCK_DVBC_MAIN_LOCK);
363         }
364 
365         if (pInfo->u32DTMBLockStatus & DMD_DTMB_LOCK_DVBC_PRE_LOCK)//STEP 3
366         {
367             #if DMD_DTMB_UTOPIA_EN || DMD_DTMB_UTOPIA2_EN
368             if ((MsOS_GetSystemTime()-pInfo->u32DTMBScanTimeStart) < pInit->u16QAMMainLockCheckTime)
369             #else
370             if ((pInit->GetSystemTimeMS()-pInfo->u32DTMBScanTimeStart) < pInit->u16QAMMainLockCheckTime)
371             #endif
372             {
373                 return DMD_DTMB_CHECKING;
374             }
375         }
376         else //STEP 1,2
377         {
378             if (ioctl(DMD_DTMB_HAL_CMD_DVBC_PreLock, NULL))
379             {
380                 pInfo->u32DTMBLockStatus |= DMD_DTMB_LOCK_DVBC_PRE_LOCK;
381                 #ifdef MS_DEBUG
382                 if (_u8DMD_DTMB_DbgLevel >= DMD_DTMB_DBGLV_DEBUG)
383                 {
384                     printf("DMD_DTMB_LOCK_DVBC_PRE_LOCK\n");
385                 }
386                 #endif
387                 return DMD_DTMB_CHECKING;
388             }
389             else
390             {
391                 #if DMD_DTMB_UTOPIA_EN || DMD_DTMB_UTOPIA2_EN
392                 if ((MsOS_GetSystemTime()-pInfo->u32DTMBScanTimeStart) < pInit->u16QAMPreLockCheckTime)
393                 #else
394                 if ((pInit->GetSystemTimeMS()-pInfo->u32DTMBScanTimeStart) < pInit->u16QAMPreLockCheckTime)
395                 #endif
396                 {
397                     return DMD_DTMB_CHECKING;
398                 }
399             }
400         }
401         return DMD_DTMB_UNLOCK;
402     }
403 }
404 
405 //-------------------------------------------------------------------------------------------------
406 //  Global Functions
407 //-------------------------------------------------------------------------------------------------
408 
409 #ifdef UTPA2
_MDrv_DMD_DTMB_SetDbgLevel(DMD_DTMB_DbgLv u8DbgLevel)410 MS_BOOL _MDrv_DMD_DTMB_SetDbgLevel(DMD_DTMB_DbgLv u8DbgLevel)
411 #else
412 MS_BOOL MDrv_DMD_DTMB_SetDbgLevel(DMD_DTMB_DbgLv u8DbgLevel)
413 #endif
414 {
415     _u8DMD_DTMB_DbgLevel = u8DbgLevel;
416 
417     return TRUE;
418 }
419 
420 #ifdef UTPA2
_MDrv_DMD_DTMB_GetInfo(void)421 DMD_DTMB_Info* _MDrv_DMD_DTMB_GetInfo(void)
422 #else
423 DMD_DTMB_Info* MDrv_DMD_DTMB_GetInfo(void)
424 #endif
425 {
426     psDMD_DTMB_ResData->sDMD_DTMB_Info.u8Version = 0;
427 
428     return &(psDMD_DTMB_ResData->sDMD_DTMB_Info);
429 }
430 
431 #ifdef UTPA2
_MDrv_DMD_DTMB_GetLibVer(const MSIF_Version ** ppVersion)432 MS_BOOL _MDrv_DMD_DTMB_GetLibVer(const MSIF_Version **ppVersion)
433 #else
434 MS_BOOL MDrv_DMD_DTMB_GetLibVer(const MSIF_Version **ppVersion)
435 #endif
436 {
437     if (!ppVersion) return FALSE;
438 
439     #if DMD_DTMB_UTOPIA_EN || DMD_DTMB_UTOPIA2_EN
440     *ppVersion = &_drv_dmd_dtmb_version;
441     #else
442     *ppVersion = NULL;
443     #endif
444 
445     return TRUE;
446 }
447 
448 ////////////////////////////////////////////////////////////////////////////////
449 ///                            SINGLE DEMOD API                              ///
450 ////////////////////////////////////////////////////////////////////////////////
451 
452 #ifndef MSOS_TYPE_LINUX_KERNEL
MDrv_DMD_DTMB_Init(DMD_DTMB_InitData * pDMD_DTMB_InitData,MS_U32 u32InitDataLen)453 MS_BOOL MDrv_DMD_DTMB_Init(DMD_DTMB_InitData *pDMD_DTMB_InitData, MS_U32 u32InitDataLen)
454 {
455     return MDrv_DMD_DTMB_MD_Init(0, pDMD_DTMB_InitData, u32InitDataLen);
456 }
457 
MDrv_DMD_DTMB_Exit(void)458 MS_BOOL MDrv_DMD_DTMB_Exit(void)
459 {
460     return MDrv_DMD_DTMB_MD_Exit(0);
461 }
462 
MDrv_DMD_DTMB_GetConfig(DMD_DTMB_InitData * psDMD_DTMB_InitData)463 MS_U32 MDrv_DMD_DTMB_GetConfig(DMD_DTMB_InitData *psDMD_DTMB_InitData)
464 {
465     return MDrv_DMD_DTMB_MD_GetConfig(0, psDMD_DTMB_InitData);
466 }
467 
MDrv_DMD_DTMB_SetConfig(DMD_DTMB_DEMOD_TYPE eType,MS_BOOL bEnable)468 MS_BOOL MDrv_DMD_DTMB_SetConfig(DMD_DTMB_DEMOD_TYPE eType, MS_BOOL bEnable)
469 {
470     return MDrv_DMD_DTMB_MD_SetConfig(0, eType, bEnable);
471 }
472 
MDrv_DMD_DTMB_SetReset(void)473 MS_BOOL MDrv_DMD_DTMB_SetReset(void)
474 {
475     return MDrv_DMD_DTMB_MD_SetReset(0);
476 }
477 
MDrv_DMD_DTMB_Set_QAM_SR(DMD_DTMB_DEMOD_TYPE eType,MS_U16 symbol_rate)478 MS_BOOL MDrv_DMD_DTMB_Set_QAM_SR(DMD_DTMB_DEMOD_TYPE eType, MS_U16 symbol_rate)
479 {
480     return MDrv_DMD_DTMB_MD_Set_QAM_SR(0, eType, symbol_rate);
481 }
482 
MDrv_DMD_DTMB_SetActive(MS_BOOL bEnable)483 MS_BOOL MDrv_DMD_DTMB_SetActive(MS_BOOL bEnable)
484 {
485     return MDrv_DMD_DTMB_MD_SetActive(0, bEnable);
486 }
487 
488 #if DMD_DTMB_STR_EN
MDrv_DMD_DTMB_SetPowerState(EN_POWER_MODE u16PowerState)489 MS_U32 MDrv_DMD_DTMB_SetPowerState(EN_POWER_MODE u16PowerState)
490 {
491     return MDrv_DMD_DTMB_MD_SetPowerState(0, u16PowerState);
492 }
493 #endif
494 
MDrv_DMD_DTMB_GetLock(DMD_DTMB_GETLOCK_TYPE eType)495 DMD_DTMB_LOCK_STATUS MDrv_DMD_DTMB_GetLock(DMD_DTMB_GETLOCK_TYPE eType)
496 {
497     return MDrv_DMD_DTMB_MD_GetLock(0, eType);
498 }
499 
MDrv_DMD_DTMB_GetModulationMode(DMD_DTMB_MODULATION_INFO * sDtmbModulationMode)500 MS_BOOL MDrv_DMD_DTMB_GetModulationMode(DMD_DTMB_MODULATION_INFO *sDtmbModulationMode)
501 {
502     return MDrv_DMD_DTMB_MD_GetModulationMode(0, sDtmbModulationMode);
503 }
504 
MDrv_DMD_DTMB_GetSignalStrength(MS_U16 * u16Strength)505 MS_BOOL MDrv_DMD_DTMB_GetSignalStrength(MS_U16 *u16Strength)
506 {
507     return MDrv_DMD_DTMB_MD_GetSignalStrength(0, u16Strength);
508 }
509 
MDrv_DMD_DTMB_ReadFrequencyOffset(MS_S16 * cfo)510 MS_BOOL MDrv_DMD_DTMB_ReadFrequencyOffset(MS_S16 *cfo)
511 {
512     return MDrv_DMD_DTMB_MD_ReadFrequencyOffset(0, cfo);
513 }
514 
MDrv_DMD_DTMB_GetSignalQuality(void)515 MS_U8 MDrv_DMD_DTMB_GetSignalQuality(void)
516 {
517     return MDrv_DMD_DTMB_MD_GetSignalQuality(0);
518 }
519 
MDrv_DMD_DTMB_GetPreLdpcBer(float * pber)520 MS_BOOL MDrv_DMD_DTMB_GetPreLdpcBer(float *pber)
521 {
522     return MDrv_DMD_DTMB_MD_GetPreLdpcBer(0, pber);
523 }
524 
MDrv_DMD_DTMB_GetPreViterbiBer(float * ber)525 MS_BOOL MDrv_DMD_DTMB_GetPreViterbiBer(float *ber)
526 {
527     return MDrv_DMD_DTMB_MD_GetPreViterbiBer(0, ber);
528 }
529 
MDrv_DMD_DTMB_GetPostViterbiBer(float * ber)530 MS_BOOL MDrv_DMD_DTMB_GetPostViterbiBer(float *ber)
531 {
532     return MDrv_DMD_DTMB_MD_GetPostViterbiBer(0, ber);
533 }
534 
MDrv_DMD_DTMB_GetSNR(float * snr)535 MS_BOOL MDrv_DMD_DTMB_GetSNR(float *snr)
536 {
537     return MDrv_DMD_DTMB_MD_GetSNR(0, snr);
538 }
539 
MDrv_DMD_DTMB_SetSerialControl(MS_U8 u8TsConfigData)540 MS_BOOL MDrv_DMD_DTMB_SetSerialControl(MS_U8 u8TsConfigData)
541 {
542     return MDrv_DMD_DTMB_MD_SetSerialControl(0, u8TsConfigData);
543 }
544 
MDrv_DMD_DTMB_IIC_BYPASS_MODE(MS_BOOL bEnable)545 MS_BOOL MDrv_DMD_DTMB_IIC_BYPASS_MODE(MS_BOOL bEnable)
546 {
547     return MDrv_DMD_DTMB_MD_IIC_BYPASS_MODE(0, bEnable);
548 }
549 
MDrv_DMD_DTMB_SWITCH_SSPI_GPIO(MS_BOOL bEnable)550 MS_BOOL MDrv_DMD_DTMB_SWITCH_SSPI_GPIO(MS_BOOL bEnable)
551 {
552     return MDrv_DMD_DTMB_MD_SWITCH_SSPI_GPIO(0, bEnable);
553 }
554 
MDrv_DMD_DTMB_GPIO_GET_LEVEL(MS_U8 u8Pin,MS_BOOL * bLevel)555 MS_BOOL MDrv_DMD_DTMB_GPIO_GET_LEVEL(MS_U8 u8Pin, MS_BOOL *bLevel)
556 {
557     return MDrv_DMD_DTMB_MD_GPIO_GET_LEVEL(0, u8Pin, bLevel);
558 }
559 
MDrv_DMD_DTMB_GPIO_SET_LEVEL(MS_U8 u8Pin,MS_BOOL bLevel)560 MS_BOOL MDrv_DMD_DTMB_GPIO_SET_LEVEL(MS_U8 u8Pin, MS_BOOL bLevel)
561 {
562     return MDrv_DMD_DTMB_MD_GPIO_SET_LEVEL(0, u8Pin, bLevel);
563 }
564 
MDrv_DMD_DTMB_GPIO_OUT_ENABLE(MS_U8 u8Pin,MS_BOOL bEnableOut)565 MS_BOOL MDrv_DMD_DTMB_GPIO_OUT_ENABLE(MS_U8 u8Pin, MS_BOOL bEnableOut)
566 {
567     return MDrv_DMD_DTMB_MD_GPIO_OUT_ENABLE(0, u8Pin, bEnableOut);
568 }
569 
MDrv_DMD_DTMB_DoIQSwap(MS_BOOL bIsQPad)570 MS_BOOL MDrv_DMD_DTMB_DoIQSwap(MS_BOOL bIsQPad)
571 {
572     return MDrv_DMD_DTMB_MD_DoIQSwap(0, bIsQPad);
573 }
574 
MDrv_DMD_DTMB_GetReg(MS_U16 u16Addr,MS_U8 * pu8Data)575 MS_BOOL MDrv_DMD_DTMB_GetReg(MS_U16 u16Addr, MS_U8 *pu8Data)
576 {
577     return MDrv_DMD_DTMB_MD_GetReg(0, u16Addr, pu8Data);
578 }
579 
MDrv_DMD_DTMB_SetReg(MS_U16 u16Addr,MS_U8 u8Data)580 MS_BOOL MDrv_DMD_DTMB_SetReg(MS_U16 u16Addr, MS_U8 u8Data)
581 {
582     return MDrv_DMD_DTMB_MD_SetReg(0, u16Addr, u8Data);
583 }
584 #endif // #ifndef MSOS_TYPE_LINUX_KERNEL
585 
586 ////////////////////////////////////////////////////////////////////////////////
587 ///                            MULTI DEMOD API                               ///
588 ////////////////////////////////////////////////////////////////////////////////
589 
590 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_Init(MS_U8 id,DMD_DTMB_InitData * pDMD_DTMB_InitData,MS_U32 u32InitDataLen)591 MS_BOOL _MDrv_DMD_DTMB_MD_Init(MS_U8 id, DMD_DTMB_InitData *pDMD_DTMB_InitData, MS_U32 u32InitDataLen)
592 #else
593 MS_BOOL MDrv_DMD_DTMB_MD_Init(MS_U8 id, DMD_DTMB_InitData *pDMD_DTMB_InitData, MS_U32 u32InitDataLen)
594 #endif
595 {
596     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
597     MS_BOOL bRFAGCTristateEnable = 0;
598     MS_VIRT virtNonPMBank;
599     MS_PHY phyNonPMBankSize;
600     #ifndef DONT_USE_CMA
601     MS_U32  u32PhysicalAddr_FromVA = 0, u32HeapStartPAAddress = 0;
602     #endif
603 
604     #if DMD_DTMB_UTOPIA_EN && !DMD_DTMB_UTOPIA2_EN
605     if (_s32DMD_DTMB_Mutex == -1)
606     {
607         if ((_s32DMD_DTMB_Mutex = MsOS_CreateMutex(E_MSOS_FIFO, "Mutex DMD DTMB", MSOS_PROCESS_SHARED)) == -1)
608         {
609             DMD_DBG(printf("MDrv_DMD_DTMB_Init Create Mutex Fail\n"));
610             return FALSE;
611         }
612     }
613     #elif (!DMD_DTMB_UTOPIA_EN && !DMD_DTMB_UTOPIA2_EN && DMD_DTMB_MULTI_THREAD_SAFE)
614     if (!pRes->sDMD_DTMB_InitData.CreateMutex(TRUE))
615     {
616         DMD_DBG(printf("MDrv_DMD_DTMB_Init Create Mutex Fail\n"));
617         return FALSE;
618     }
619     #endif
620 
621     DMD_LOCK();
622     if (pRes->sDMD_DTMB_PriData.bInit)
623     {
624         DMD_DBG(printf("MDrv_DMD_DTMB_Init more than once\n"));
625         return FALSE;
626     }
627 
628     #ifdef MS_DEBUG
629     if (_u8DMD_DTMB_DbgLevel >= DMD_DTMB_DBGLV_INFO)
630     {
631         printf("MDrv_DMD_DTMB_Init\n");
632     }
633     #endif
634 
635     if (!MDrv_MMIO_GetBASE(&virtNonPMBank, &phyNonPMBankSize, MS_MODULE_PM))
636     {
637         DMD_DBG(printf("MDrv_DMD_DTMB_Init Get MS_MODULE_PM Fail\n"));
638         return FALSE;
639     }
640 
641     pRes->sDMD_DTMB_PriData.virtDMDBaseAddr = virtNonPMBank;
642 
643     #ifndef MSOS_TYPE_LINUX_KERNEL
644     if (sizeof(DMD_DTMB_InitData) == u32InitDataLen)
645     {
646         memcpy(&(pRes->sDMD_DTMB_InitData), pDMD_DTMB_InitData, u32InitDataLen);
647     }
648     else
649     {
650         DMD_DBG(printf("MDrv_DMD_DTMB_Init input data structure incorrect\n"));
651         return FALSE;
652     }
653     #else
654     memcpy(&(pRes->sDMD_DTMB_InitData), pDMD_DTMB_InitData, sizeof(DMD_DTMB_InitData));
655     #endif
656 
657     pRes->sDMD_DTMB_PriData.bInit = TRUE;
658 
659     #ifndef DONT_USE_CMA
660     _DTMB_CMA_Pool_Init_PARAM.heap_id = 26;
661     _DTMB_CMA_Pool_Init_PARAM.flags = CMA_FLAG_MAP_VMA;
662 
663     if (MApi_CMA_Pool_Init(&_DTMB_CMA_Pool_Init_PARAM) == FALSE)
664     {
665         DMD_DBG(printf("\033[35mFunction = %s, Line = %d, get MApi_CMA_Pool_Init ERROR!!!\n", __PRETTY_FUNCTION__, __LINE__));
666     }
667     else
668     {
669         DMD_DBG(printf("\033[35mFunction = %s, Line = %d, get pool_handle_id is %u\033[m\n", __PRETTY_FUNCTION__, __LINE__, _DTMB_CMA_Pool_Init_PARAM.pool_handle_id));
670         DMD_DBG(printf("\033[35mFunction = %s, Line = %d, get miu is %u\033[m\n", __PRETTY_FUNCTION__, __LINE__, _DTMB_CMA_Pool_Init_PARAM.miu));
671         DMD_DBG(printf("\033[35mFunction = %s, Line = %d, get heap_miu_start_offset is 0x%llX\033[m\n", __PRETTY_FUNCTION__, __LINE__, _DTMB_CMA_Pool_Init_PARAM.heap_miu_start_offset));
672         DMD_DBG(printf("\033[35mFunction = %s, Line = %d, get heap_length is 0x%X\033[m\n", __PRETTY_FUNCTION__, __LINE__, _DTMB_CMA_Pool_Init_PARAM.heap_length));
673     }
674 
675     _miu_offset_to_phy(_DTMB_CMA_Pool_Init_PARAM.miu, _DTMB_CMA_Pool_Init_PARAM.heap_miu_start_offset, u32HeapStartPAAddress);
676 
677 	_DTMB_CMA_Alloc_PARAM.pool_handle_id = _DTMB_CMA_Pool_Init_PARAM.pool_handle_id;
678     _DTMB_CMA_Alloc_PARAM.offset_in_pool = (pRes->sDMD_DTMB_InitData.u32TdiStartAddr * 16) - u32HeapStartPAAddress;	// offset_in_pool means the start_ask_addr with respect to the pool_start_addr(BA) => this will specify the start_ask_ba_addr
679     _DTMB_CMA_Alloc_PARAM.length = 0x500000UL;
680     _DTMB_CMA_Alloc_PARAM.flags = CMA_FLAG_VIRT_ADDR;										// we will get a start_va with respect to the start_ask_ba_addr if using CMA_FLAG_VIRT_ADDR flag
681 
682     if(MApi_CMA_Pool_GetMem(&_DTMB_CMA_Alloc_PARAM) == FALSE)
683 	{
684         DMD_DBG(printf("\033[35mFunction = %s, Line = %d, CMA_Pool_GetMem ERROR!!\033[m\n", __PRETTY_FUNCTION__, __LINE__));
685 	}
686 	else
687     {
688         DMD_DBG(printf("\033[35mFunction = %s, Line = %d, get from heap_id %d\033[m\n", __PRETTY_FUNCTION__, __LINE__, _DTMB_CMA_Alloc_PARAM.pool_handle_id));
689         DMD_DBG(printf("\033[35mFunction = %s, Line = %d, ask offset 0x%llX\033[m\n", __PRETTY_FUNCTION__, __LINE__, _DTMB_CMA_Alloc_PARAM.offset_in_pool));
690         DMD_DBG(printf("\033[35mFunction = %s, Line = %d, ask length 0x%X\033[m\n", __PRETTY_FUNCTION__, __LINE__, _DTMB_CMA_Alloc_PARAM.length));
691         DMD_DBG(printf("\033[37mFunction = %s, Line = %d, return va is 0x%X\033[m\n", __PRETTY_FUNCTION__, __LINE__, _DTMB_CMA_Alloc_PARAM.virt_addr));
692   	}
693 
694     u32PhysicalAddr_FromVA = MsOS_MPool_VA2PA(_DTMB_CMA_Alloc_PARAM.virt_addr);
695 
696     DMD_DBG(printf("#######u32PhysicalAddr_FromVA1 = [0x%x]\n", u32PhysicalAddr_FromVA));
697 
698     _miu_offset_to_phy(_DTMB_CMA_Pool_Init_PARAM.miu,
699                        _DTMB_CMA_Pool_Init_PARAM.heap_miu_start_offset + _DTMB_CMA_Alloc_PARAM.offset_in_pool,
700                        u32PhysicalAddr_FromVA);
701 
702     DMD_DBG(printf("#######u32PhysicalAddr_FromVA2 = [0x%x]\n", u32PhysicalAddr_FromVA));
703 
704     DMD_DBG(printf("#######pRes->sDMD_DTMB_InitData.u32TdiStartAddr = [0x%x]\n", (pRes->sDMD_DTMB_InitData.u32TdiStartAddr * 16)));
705     #endif // #ifndef DONT_USE_CMA
706 
707     #if DMD_DTMB_STR_EN
708     pRes->sDMD_DTMB_PriData.eLastState = E_POWER_RESUME;
709     #endif
710 
711     pRes->sDMD_DTMB_PriData.eLastType  = DMD_DTMB_DEMOD_DTMB;
712     pRes->sDMD_DTMB_PriData.u16SymRate = 7560;
713 
714     #if DMD_DTMB_UTOPIA_EN || DMD_DTMB_UTOPIA2_EN
715     if (pRes->sDMD_DTMB_InitData.bIsExtDemod)
716         pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD = HAL_EXTERN_DTMB_IOCTL_CMD;
717     else pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD = HAL_INTERN_DTMB_IOCTL_CMD;
718     #else
719     pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD = HAL_EXTERN_DTMB_IOCTL_CMD;
720     #endif
721 
722     u8DMD_DTMB_DMD_ID = id;
723 
724     pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_InitClk, &bRFAGCTristateEnable);
725 
726     pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_Download, NULL);
727 
728     pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_TS_INTERFACE_CONFIG, NULL);
729 
730     pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_FWVERSION, NULL);
731     DMD_UNLOCK();
732 
733     return TRUE;
734 }
735 
736 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_Exit(MS_U8 id)737 MS_BOOL _MDrv_DMD_DTMB_MD_Exit(MS_U8 id)
738 #else
739 MS_BOOL MDrv_DMD_DTMB_MD_Exit(MS_U8 id)
740 #endif
741 {
742     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
743     MS_BOOL bRet = TRUE;
744 
745     DMD_LOCK();
746     u8DMD_DTMB_DMD_ID = id;
747 
748     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_Exit, NULL);
749 
750     pRes->sDMD_DTMB_PriData.bInit = FALSE;
751 
752     #ifndef DONT_USE_CMA
753     _DTMB_CMA_Free_PARAM.pool_handle_id = _DTMB_CMA_Pool_Init_PARAM.pool_handle_id;
754     _DTMB_CMA_Free_PARAM.offset_in_pool = _DTMB_CMA_Alloc_PARAM.offset_in_pool;
755     _DTMB_CMA_Free_PARAM.length = 0x500000UL;;
756 
757     if(MApi_CMA_Pool_PutMem(&_DTMB_CMA_Free_PARAM) == FALSE)
758     {
759       	 DMD_DBG(printf("\033[35mFunction = %s, Line = %d, MsOS_CMA_Pool_Release ERROR!!\033[m\n", __PRETTY_FUNCTION__, __LINE__));
760     }
761     else
762     {
763       	 DMD_DBG(printf("\033[35mFunction = %s, Line = %d, get from heap_id %d\033[m\n", __PRETTY_FUNCTION__, __LINE__, _DTMB_CMA_Free_PARAM.pool_handle_id));
764       	 DMD_DBG(printf("\033[35mFunction = %s, Line = %d, ask offset 0x%llX\033[m\n", __PRETTY_FUNCTION__, __LINE__, _DTMB_CMA_Free_PARAM.offset_in_pool));
765          DMD_DBG(printf("\033[35mFunction = %s, Line = %d, ask length 0x%X\033[m\n", __PRETTY_FUNCTION__, __LINE__, _DTMB_CMA_Free_PARAM.length));
766     }
767     #endif
768 
769     DMD_UNLOCK();
770 
771     #if DMD_DTMB_UTOPIA_EN && !DMD_DTMB_UTOPIA2_EN
772     MsOS_DeleteMutex(_s32DMD_DTMB_Mutex);
773 
774     _s32DMD_DTMB_Mutex = -1;
775     #elif (!DMD_DTMB_UTOPIA_EN && !DMD_DTMB_UTOPIA2_EN && DMD_DTMB_MULTI_THREAD_SAFE)
776     pRes->sDMD_DTMB_InitData.CreateMutex(FALSE);
777     #endif
778 
779     return bRet;
780 }
781 
782 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_GetConfig(MS_U8 id,DMD_DTMB_InitData * psDMD_DTMB_InitData)783 MS_U32 _MDrv_DMD_DTMB_MD_GetConfig(MS_U8 id, DMD_DTMB_InitData *psDMD_DTMB_InitData)
784 #else
785 MS_U32 MDrv_DMD_DTMB_MD_GetConfig(MS_U8 id, DMD_DTMB_InitData *psDMD_DTMB_InitData)
786 #endif
787 {
788     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
789 
790     DMD_LOCK();
791     memcpy (psDMD_DTMB_InitData, &(pRes->sDMD_DTMB_InitData), sizeof(DMD_DTMB_InitData));
792     DMD_UNLOCK();
793 
794     return UTOPIA_STATUS_SUCCESS;
795 }
796 
797 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_SetConfig(MS_U8 id,DMD_DTMB_DEMOD_TYPE eType,MS_BOOL bEnable)798 MS_BOOL _MDrv_DMD_DTMB_MD_SetConfig(MS_U8 id, DMD_DTMB_DEMOD_TYPE eType, MS_BOOL bEnable)
799 #else
800 MS_BOOL MDrv_DMD_DTMB_MD_SetConfig(MS_U8 id, DMD_DTMB_DEMOD_TYPE eType, MS_BOOL bEnable)
801 #endif
802 {
803     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
804     MS_BOOL bRet = TRUE;
805 
806     DMD_LOCK();
807     u8DMD_DTMB_DMD_ID = id;
808 
809     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_SoftReset, NULL);
810 
811     if (bEnable)
812     {
813         switch (eType)
814         {
815             case DMD_DTMB_DEMOD_DTMB:
816             case DMD_DTMB_DEMOD_DTMB_7M:
817             case DMD_DTMB_DEMOD_DTMB_5M:
818                 if (eType != pRes->sDMD_DTMB_PriData.eLastType)
819                 {
820                     pRes->sDMD_DTMB_PriData.bDownloaded = FALSE;
821                     pRes->sDMD_DTMB_PriData.eLastType = DMD_DTMB_DEMOD_DTMB;
822                     pRes->sDMD_DTMB_PriData.u16SymRate = 7560;
823                     pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_Download, NULL);
824                     pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_DoIQSwap, &(pRes->sDMD_DTMB_PriData.bIsQPad));
825                     //pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_SetACICoef, NULL);
826                 }
827                 bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_SetDTMBMode, NULL);
828                 break;
829             case DMD_DTMB_DEMOD_DTMB_6M:
830                 if (eType != pRes->sDMD_DTMB_PriData.eLastType)
831                 {
832                     pRes->sDMD_DTMB_PriData.bDownloaded = FALSE;
833                     pRes->sDMD_DTMB_PriData.eLastType = DMD_DTMB_DEMOD_DTMB_6M;
834                     pRes->sDMD_DTMB_PriData.u16SymRate = 5670;
835                     pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_Download, NULL);
836                     pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_DoIQSwap, &(pRes->sDMD_DTMB_PriData.bIsQPad));
837                     //pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_SetACICoef, NULL);
838                 }
839                 bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_SetDTMBMode, NULL);
840                 break;
841             default:
842                 pRes->sDMD_DTMB_PriData.eLastType = DMD_DTMB_DEMOD_NULL;
843                 pRes->sDMD_DTMB_PriData.u16SymRate = 0;
844                 bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_SetModeClean, NULL);
845                 break;
846         }
847     }
848 
849     #if DMD_DTMB_UTOPIA_EN || DMD_DTMB_UTOPIA2_EN
850     pRes->sDMD_DTMB_Info.u32DTMBScanTimeStart = MsOS_GetSystemTime();
851     #else
852     pRes->sDMD_DTMB_Info.u32DTMBScanTimeStart = psDMD_DTMB_ResData->sDMD_DTMB_InitData.GetSystemTimeMS();
853     #endif
854     pRes->sDMD_DTMB_Info.u32DTMBLockStatus    = 0;
855     DMD_UNLOCK();
856 
857     return bRet;
858 }
859 
860 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_SetReset(MS_U8 id)861 MS_BOOL _MDrv_DMD_DTMB_MD_SetReset(MS_U8 id)
862 #else
863 MS_BOOL MDrv_DMD_DTMB_MD_SetReset(MS_U8 id)
864 #endif
865 {
866     return TRUE;
867 }
868 
869 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_Set_QAM_SR(MS_U8 id,DMD_DTMB_DEMOD_TYPE eType,MS_U16 symbol_rate)870 MS_BOOL _MDrv_DMD_DTMB_MD_Set_QAM_SR(MS_U8 id, DMD_DTMB_DEMOD_TYPE eType, MS_U16 symbol_rate)
871 #else
872 MS_BOOL MDrv_DMD_DTMB_MD_Set_QAM_SR(MS_U8 id, DMD_DTMB_DEMOD_TYPE eType, MS_U16 symbol_rate)
873 #endif
874 {
875     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
876     MS_BOOL bRet = TRUE;
877 
878     DMD_LOCK();
879     pRes->sDMD_DTMB_PriData.eLastType  = eType;
880     pRes->sDMD_DTMB_PriData.u16SymRate = symbol_rate;
881 
882     u8DMD_DTMB_DMD_ID = id;
883 
884     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_Set_QAM_SR, NULL);
885     DMD_UNLOCK();
886 
887     return bRet;
888 }
889 
890 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_SetActive(MS_U8 id,MS_BOOL bEnable)891 MS_BOOL _MDrv_DMD_DTMB_MD_SetActive(MS_U8 id, MS_BOOL bEnable)
892 #else
893 MS_BOOL MDrv_DMD_DTMB_MD_SetActive(MS_U8 id, MS_BOOL bEnable)
894 #endif
895 {
896     return TRUE;
897 }
898 
899 #if DMD_DTMB_STR_EN
900 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_SetPowerState(MS_U8 id,EN_POWER_MODE u16PowerState)901 MS_U32 _MDrv_DMD_DTMB_MD_SetPowerState(MS_U8 id, EN_POWER_MODE u16PowerState)
902 #else
903 MS_U32 MDrv_DMD_DTMB_MD_SetPowerState(MS_U8 id, EN_POWER_MODE u16PowerState)
904 #endif
905 {
906     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
907     MS_U32 u32Return = UTOPIA_STATUS_FAIL;
908 
909     if (u16PowerState == E_POWER_SUSPEND)
910     {
911         pRes->sDMD_DTMB_PriData.bDownloaded = FALSE;
912         pRes->sDMD_DTMB_PriData.bIsDTV      = pRes->sDMD_DTMB_PriData.bInit;
913         pRes->sDMD_DTMB_PriData.eLastState  = u16PowerState;
914 
915         if (pRes->sDMD_DTMB_PriData.bInit)
916         {
917             #ifdef UTPA2
918             _MDrv_DMD_DTMB_MD_Exit(id);
919             #else
920             MDrv_DMD_DTMB_MD_Exit(id);
921             #endif
922         }
923 
924         u32Return = UTOPIA_STATUS_SUCCESS;
925     }
926     else if (u16PowerState == E_POWER_RESUME)
927     {
928         if (pRes->sDMD_DTMB_PriData.eLastState == E_POWER_SUSPEND)
929         {
930         	printf("\nVT: (Check Mode In DRV:) DTV Mode=%d\n", pRes->sDMD_DTMB_PriData.bIsDTV);
931 
932             if (pRes->sDMD_DTMB_PriData.bIsDTV)
933             {
934                 #ifdef UTPA2
935                 _MDrv_DMD_DTMB_MD_Init(id, &(pRes->sDMD_DTMB_InitData), sizeof(DMD_DTMB_InitData));
936                 _MDrv_DMD_DTMB_MD_DoIQSwap(id, pRes->sDMD_DTMB_PriData.bIsQPad);
937                 #else
938                 MDrv_DMD_DTMB_MD_Init(id, &(pRes->sDMD_DTMB_InitData), sizeof(DMD_DTMB_InitData));
939                 MDrv_DMD_DTMB_MD_DoIQSwap(id, pRes->sDMD_DTMB_PriData.bIsQPad);
940                 #endif
941 
942                 if (pRes->sDMD_DTMB_PriData.eLastType != DMD_DTMB_DEMOD_DTMB &&
943                     pRes->sDMD_DTMB_PriData.eLastType != DMD_DTMB_DEMOD_DTMB_7M &&
944                     pRes->sDMD_DTMB_PriData.eLastType != DMD_DTMB_DEMOD_DTMB_6M &&
945                     pRes->sDMD_DTMB_PriData.eLastType != DMD_DTMB_DEMOD_DTMB_5M)
946                 {
947                     #ifdef UTPA2
948                     _MDrv_DMD_DTMB_MD_Set_QAM_SR(id, pRes->sDMD_DTMB_PriData.eLastType,pRes->sDMD_DTMB_PriData.u16SymRate);
949                     #else
950                     MDrv_DMD_DTMB_MD_Set_QAM_SR(id, pRes->sDMD_DTMB_PriData.eLastType,pRes->sDMD_DTMB_PriData.u16SymRate);
951                     #endif
952                 }
953                 else
954                 {
955                     #ifdef UTPA2
956                     _MDrv_DMD_DTMB_MD_SetConfig(id, pRes->sDMD_DTMB_PriData.eLastType, TRUE);
957                     #else
958                     MDrv_DMD_DTMB_MD_SetConfig(id, pRes->sDMD_DTMB_PriData.eLastType, TRUE);
959                     #endif
960                 }
961             }
962 
963             pRes->sDMD_DTMB_PriData.eLastState = u16PowerState;
964 
965             u32Return = UTOPIA_STATUS_SUCCESS;
966         }
967         else
968         {
969             printf("[%s,%5d]It is not suspended yet. We shouldn't resume\n",__FUNCTION__,__LINE__);
970 
971             u32Return = UTOPIA_STATUS_FAIL;
972 	    }
973     }
974     else
975     {
976         printf("[%s,%5d]Do Nothing: %d\n",__FUNCTION__,__LINE__, u16PowerState);
977 
978     	u32Return = UTOPIA_STATUS_FAIL;
979     }
980 
981     return u32Return;
982 }
983 #endif
984 
985 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_GetLock(MS_U8 id,DMD_DTMB_GETLOCK_TYPE eType)986 DMD_DTMB_LOCK_STATUS _MDrv_DMD_DTMB_MD_GetLock(MS_U8 id, DMD_DTMB_GETLOCK_TYPE eType)
987 #else
988 DMD_DTMB_LOCK_STATUS MDrv_DMD_DTMB_MD_GetLock(MS_U8 id, DMD_DTMB_GETLOCK_TYPE eType)
989 #endif
990 {
991     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
992     DMD_DTMB_LOCK_STATUS status  = DMD_DTMB_UNLOCK;
993 
994     DMD_LOCK();
995     u8DMD_DTMB_DMD_ID = id;
996 
997     switch (eType)
998     {
999         case DMD_DTMB_GETLOCK:
1000             switch (pRes->sDMD_DTMB_PriData.eLastType)
1001             {
1002                 case DMD_DTMB_DEMOD_DTMB:
1003                 case DMD_DTMB_DEMOD_DTMB_7M:
1004                 case DMD_DTMB_DEMOD_DTMB_6M:
1005                 case DMD_DTMB_DEMOD_DTMB_5M:
1006                     status = _DTMB_CheckLock();
1007                     break;
1008                 case DMD_DTMB_DEMOD_DVBC_16QAM:
1009                 case DMD_DTMB_DEMOD_DVBC_32QAM:
1010                 case DMD_DTMB_DEMOD_DVBC_64QAM:
1011                 case DMD_DTMB_DEMOD_DVBC_128QAM:
1012                 case DMD_DTMB_DEMOD_DVBC_256QAM:
1013                     status = _DVBC_CheckLock();
1014                     break;
1015                 default:
1016                     status = DMD_DTMB_UNLOCK;
1017                     break;
1018             }
1019             break;
1020         case DMD_DTMB_GETLOCK_DTMB_AGCLOCK:
1021             status = (pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_AGCLock, NULL)) ? DMD_DTMB_LOCK : DMD_DTMB_UNLOCK;
1022             break;
1023         case DMD_DTMB_GETLOCK_DTMB_PNPLOCK:
1024             status = (pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_DTMB_PNP_Lock, NULL)) ? DMD_DTMB_LOCK : DMD_DTMB_UNLOCK;
1025             break;
1026         case DMD_DTMB_GETLOCK_DTMB_FECLOCK:
1027             status = (pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_DTMB_FEC_Lock, NULL)) ? DMD_DTMB_LOCK : DMD_DTMB_UNLOCK;
1028         	break;
1029         case DMD_DTMB_GETLOCK_DVBC_AGCLOCK:
1030             status = (pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_AGCLock, NULL)) ? DMD_DTMB_LOCK : DMD_DTMB_UNLOCK;
1031             break;
1032         case DMD_DTMB_GETLOCK_DVBC_PRELOCK:
1033             status = (pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_DVBC_PreLock, NULL)) ? DMD_DTMB_LOCK : DMD_DTMB_UNLOCK;
1034             break;
1035         case DMD_DTMB_GETLOCK_DVBC_MAINLOCK:
1036             status = (pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_DVBC_Main_Lock, NULL)) ? DMD_DTMB_LOCK : DMD_DTMB_UNLOCK;
1037             break;
1038         default:
1039             status = DMD_DTMB_UNLOCK;
1040             break;
1041     }
1042     DMD_UNLOCK();
1043 
1044     return status;
1045 }
1046 
1047 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_GetModulationMode(MS_U8 id,DMD_DTMB_MODULATION_INFO * sDtmbModulationMode)1048 MS_BOOL _MDrv_DMD_DTMB_MD_GetModulationMode(MS_U8 id, DMD_DTMB_MODULATION_INFO *sDtmbModulationMode)
1049 #else
1050 MS_BOOL MDrv_DMD_DTMB_MD_GetModulationMode(MS_U8 id, DMD_DTMB_MODULATION_INFO *sDtmbModulationMode)
1051 #endif
1052 {
1053     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
1054     MS_BOOL bRet = TRUE;
1055 
1056     DMD_LOCK();
1057     u8DMD_DTMB_DMD_ID = id;
1058 
1059     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_GetModulation, sDtmbModulationMode);
1060     DMD_UNLOCK();
1061 
1062     return bRet;
1063 }
1064 
1065 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_GetSignalStrength(MS_U8 id,MS_U16 * u16Strength)1066 MS_BOOL _MDrv_DMD_DTMB_MD_GetSignalStrength(MS_U8 id, MS_U16 *u16Strength)
1067 #else
1068 MS_BOOL MDrv_DMD_DTMB_MD_GetSignalStrength(MS_U8 id, MS_U16 *u16Strength)
1069 #endif
1070 {
1071     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
1072     MS_BOOL bRet = TRUE;
1073 
1074     DMD_LOCK();
1075     u8DMD_DTMB_DMD_ID = id;
1076 
1077     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_ReadIFAGC, u16Strength);
1078     DMD_UNLOCK();
1079 
1080     return bRet;
1081 }
1082 
1083 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_ReadFrequencyOffset(MS_U8 id,DMD_DTMB_CFO_DATA * cfo)1084 MS_BOOL _MDrv_DMD_DTMB_MD_ReadFrequencyOffset(MS_U8 id, DMD_DTMB_CFO_DATA *cfo)
1085 #else
1086 MS_BOOL MDrv_DMD_DTMB_MD_ReadFrequencyOffset(MS_U8 id, MS_S16 *cfo)
1087 #endif
1088 {
1089     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
1090     MS_BOOL bRet = TRUE;
1091 
1092     DMD_LOCK();
1093     u8DMD_DTMB_DMD_ID = id;
1094 
1095     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_ReadFrequencyOffset, cfo);
1096     DMD_UNLOCK();
1097 
1098     return bRet;
1099 }
1100 
1101 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_GetSignalQuality(MS_U8 id)1102 MS_U8 _MDrv_DMD_DTMB_MD_GetSignalQuality(MS_U8 id)
1103 #else
1104 MS_U8 MDrv_DMD_DTMB_MD_GetSignalQuality(MS_U8 id)
1105 #endif
1106 {
1107     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
1108     MS_U8 percentage = 0;
1109 
1110     DMD_LOCK();
1111     u8DMD_DTMB_DMD_ID = id;
1112 
1113     pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_ReadSNRPercentage, &percentage);
1114     DMD_UNLOCK();
1115 
1116     return percentage;
1117 }
1118 
1119 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_GetPreLdpcBer(MS_U8 id,DMD_DTMB_BER_DATA * pber)1120 MS_BOOL _MDrv_DMD_DTMB_MD_GetPreLdpcBer(MS_U8 id, DMD_DTMB_BER_DATA *pber)
1121 #else
1122 MS_BOOL MDrv_DMD_DTMB_MD_GetPreLdpcBer(MS_U8 id, float *pber)
1123 #endif
1124 {
1125     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
1126     MS_BOOL bRet = TRUE;
1127 
1128     DMD_LOCK();
1129     u8DMD_DTMB_DMD_ID = id;
1130 
1131     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_GetPreLdpcBer, pber);
1132     DMD_UNLOCK();
1133 
1134     return bRet;
1135 }
1136 
1137 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_GetPreViterbiBer(MS_U8 id,DMD_DTMB_BER_DATA * ber)1138 MS_BOOL _MDrv_DMD_DTMB_MD_GetPreViterbiBer(MS_U8 id, DMD_DTMB_BER_DATA *ber)
1139 #else
1140 MS_BOOL MDrv_DMD_DTMB_MD_GetPreViterbiBer(MS_U8 id, float *ber)
1141 #endif
1142 {
1143     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
1144     MS_BOOL bRet = TRUE;
1145 
1146     DMD_LOCK();
1147     u8DMD_DTMB_DMD_ID = id;
1148 
1149     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_GetPreViterbiBer, ber);
1150     DMD_UNLOCK();
1151 
1152     return bRet;
1153 }
1154 
1155 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_GetPostViterbiBer(MS_U8 id,DMD_DTMB_BER_DATA * ber)1156 MS_BOOL _MDrv_DMD_DTMB_MD_GetPostViterbiBer(MS_U8 id, DMD_DTMB_BER_DATA *ber)
1157 #else
1158 MS_BOOL MDrv_DMD_DTMB_MD_GetPostViterbiBer(MS_U8 id, float *ber)
1159 #endif
1160 {
1161     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
1162     MS_BOOL bRet = TRUE;
1163 
1164     DMD_LOCK();
1165     u8DMD_DTMB_DMD_ID = id;
1166 
1167     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_GetPostViterbiBer, ber);
1168     DMD_UNLOCK();
1169 
1170     return bRet;
1171 }
1172 
1173 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_GetSNR(MS_U8 id,DMD_DTMB_SNR_DATA * snr)1174 MS_BOOL _MDrv_DMD_DTMB_MD_GetSNR(MS_U8 id, DMD_DTMB_SNR_DATA *snr)
1175 #else
1176 MS_BOOL MDrv_DMD_DTMB_MD_GetSNR(MS_U8 id, float *snr)
1177 #endif
1178 {
1179     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
1180     MS_BOOL bRet = TRUE;
1181 
1182     DMD_LOCK();
1183     u8DMD_DTMB_DMD_ID = id;
1184 
1185     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_GetSNR, snr);
1186     DMD_UNLOCK();
1187 
1188     return bRet;
1189 }
1190 
1191 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_SetSerialControl(MS_U8 id,MS_U8 u8TsConfigData)1192 MS_BOOL _MDrv_DMD_DTMB_MD_SetSerialControl(MS_U8 id, MS_U8 u8TsConfigData)
1193 #else
1194 MS_BOOL MDrv_DMD_DTMB_MD_SetSerialControl(MS_U8 id, MS_U8 u8TsConfigData)
1195 #endif
1196 {
1197     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
1198     MS_BOOL bRet = TRUE;
1199 
1200     DMD_LOCK();
1201     pRes->sDMD_DTMB_InitData.u1TsConfigByte_SerialMode = u8TsConfigData;
1202     pRes->sDMD_DTMB_InitData.u1TsConfigByte_DataSwap   = u8TsConfigData >> 1;
1203     pRes->sDMD_DTMB_InitData.u1TsConfigByte_ClockInv   = u8TsConfigData >> 2;
1204     pRes->sDMD_DTMB_InitData.u5TsConfigByte_DivNum     = u8TsConfigData >> 3;
1205 
1206     u8DMD_DTMB_DMD_ID = id;
1207 
1208     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_TS_INTERFACE_CONFIG, NULL);
1209     DMD_UNLOCK();
1210 
1211     return bRet;
1212 }
1213 
1214 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_IIC_BYPASS_MODE(MS_U8 id,MS_BOOL bEnable)1215 MS_BOOL _MDrv_DMD_DTMB_MD_IIC_BYPASS_MODE(MS_U8 id, MS_BOOL bEnable)
1216 #else
1217 MS_BOOL MDrv_DMD_DTMB_MD_IIC_BYPASS_MODE(MS_U8 id, MS_BOOL bEnable)
1218 #endif
1219 {
1220     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
1221     MS_BOOL bRet = TRUE;
1222 
1223     DMD_LOCK();
1224     u8DMD_DTMB_DMD_ID = id;
1225 
1226     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_IIC_Bypass_Mode, &bEnable);
1227     DMD_UNLOCK();
1228 
1229     return bRet;
1230 }
1231 
1232 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_SWITCH_SSPI_GPIO(MS_U8 id,MS_BOOL bEnable)1233 MS_BOOL _MDrv_DMD_DTMB_MD_SWITCH_SSPI_GPIO(MS_U8 id, MS_BOOL bEnable)
1234 #else
1235 MS_BOOL MDrv_DMD_DTMB_MD_SWITCH_SSPI_GPIO(MS_U8 id, MS_BOOL bEnable)
1236 #endif
1237 {
1238     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
1239     MS_BOOL bRet = TRUE;
1240 
1241     DMD_LOCK();
1242     u8DMD_DTMB_DMD_ID = id;
1243 
1244     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_SSPI_TO_GPIO, &bEnable);
1245     DMD_UNLOCK();
1246 
1247     return bRet;
1248 }
1249 
1250 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_GPIO_GET_LEVEL(MS_U8 id,MS_U8 u8Pin,MS_BOOL * bLevel)1251 MS_BOOL _MDrv_DMD_DTMB_MD_GPIO_GET_LEVEL(MS_U8 id, MS_U8 u8Pin, MS_BOOL *bLevel)
1252 #else
1253 MS_BOOL MDrv_DMD_DTMB_MD_GPIO_GET_LEVEL(MS_U8 id, MS_U8 u8Pin, MS_BOOL *bLevel)
1254 #endif
1255 {
1256     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
1257     DMD_DTMB_GPIO_PIN_DATA sPin;
1258     MS_BOOL bRet = TRUE;
1259 
1260     sPin.u8Pin = u8Pin;
1261 
1262     DMD_LOCK();
1263     u8DMD_DTMB_DMD_ID = id;
1264 
1265     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_GPIO_GET_LEVEL, &sPin);
1266     DMD_UNLOCK();
1267 
1268     *bLevel = sPin.bLevel;
1269 
1270     return bRet;
1271 }
1272 
1273 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_GPIO_SET_LEVEL(MS_U8 id,MS_U8 u8Pin,MS_BOOL bLevel)1274 MS_BOOL _MDrv_DMD_DTMB_MD_GPIO_SET_LEVEL(MS_U8 id, MS_U8 u8Pin, MS_BOOL bLevel)
1275 #else
1276 MS_BOOL MDrv_DMD_DTMB_MD_GPIO_SET_LEVEL(MS_U8 id, MS_U8 u8Pin, MS_BOOL bLevel)
1277 #endif
1278 {
1279     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
1280     DMD_DTMB_GPIO_PIN_DATA sPin;
1281     MS_BOOL bRet = TRUE;
1282 
1283     sPin.u8Pin  = u8Pin;
1284     sPin.bLevel = bLevel;
1285 
1286     DMD_LOCK();
1287     u8DMD_DTMB_DMD_ID = id;
1288 
1289     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_GPIO_SET_LEVEL, &sPin);
1290     DMD_UNLOCK();
1291 
1292     return bRet;
1293 }
1294 
1295 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_GPIO_OUT_ENABLE(MS_U8 id,MS_U8 u8Pin,MS_BOOL bEnableOut)1296 MS_BOOL _MDrv_DMD_DTMB_MD_GPIO_OUT_ENABLE(MS_U8 id, MS_U8 u8Pin, MS_BOOL bEnableOut)
1297 #else
1298 MS_BOOL MDrv_DMD_DTMB_MD_GPIO_OUT_ENABLE(MS_U8 id, MS_U8 u8Pin, MS_BOOL bEnableOut)
1299 #endif
1300 {
1301     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
1302     DMD_DTMB_GPIO_PIN_DATA sPin;
1303     MS_BOOL bRet = TRUE;
1304 
1305     sPin.u8Pin  = u8Pin;
1306     sPin.bIsOut = bEnableOut;
1307 
1308     DMD_LOCK();
1309     u8DMD_DTMB_DMD_ID = id;
1310 
1311     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_GPIO_OUT_ENABLE, &sPin);
1312     DMD_UNLOCK();
1313 
1314     return bRet;
1315 }
1316 
1317 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_DoIQSwap(MS_U8 id,MS_BOOL bIsQPad)1318 MS_BOOL _MDrv_DMD_DTMB_MD_DoIQSwap(MS_U8 id, MS_BOOL bIsQPad)
1319 #else
1320 MS_BOOL MDrv_DMD_DTMB_MD_DoIQSwap(MS_U8 id, MS_BOOL bIsQPad)
1321 #endif
1322 {
1323     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
1324     MS_BOOL bRet = TRUE;
1325 
1326     DMD_LOCK();
1327     u8DMD_DTMB_DMD_ID = id;
1328 
1329     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_DoIQSwap, &bIsQPad);
1330     DMD_UNLOCK();
1331 
1332     return bRet;
1333 }
1334 
1335 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_GetReg(MS_U8 id,MS_U16 u16Addr,MS_U8 * pu8Data)1336 MS_BOOL _MDrv_DMD_DTMB_MD_GetReg(MS_U8 id, MS_U16 u16Addr, MS_U8 *pu8Data)
1337 #else
1338 MS_BOOL MDrv_DMD_DTMB_MD_GetReg(MS_U8 id, MS_U16 u16Addr, MS_U8 *pu8Data)
1339 #endif
1340 {
1341     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
1342     DMD_DTMB_REG_DATA reg;
1343     MS_BOOL bRet = TRUE;
1344 
1345     reg.u16Addr = u16Addr;
1346 
1347     DMD_LOCK();
1348     u8DMD_DTMB_DMD_ID = id;
1349 
1350     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_GET_REG, &reg);
1351     DMD_UNLOCK();
1352 
1353     *pu8Data = reg.u8Data;
1354 
1355     return bRet;
1356 }
1357 
1358 #ifdef UTPA2
_MDrv_DMD_DTMB_MD_SetReg(MS_U8 id,MS_U16 u16Addr,MS_U8 u8Data)1359 MS_BOOL _MDrv_DMD_DTMB_MD_SetReg(MS_U8 id, MS_U16 u16Addr, MS_U8 u8Data)
1360 #else
1361 MS_BOOL MDrv_DMD_DTMB_MD_SetReg(MS_U8 id, MS_U16 u16Addr, MS_U8 u8Data)
1362 #endif
1363 {
1364     DMD_DTMB_ResData *pRes = psDMD_DTMB_ResData + id;
1365     DMD_DTMB_REG_DATA reg;
1366     MS_BOOL bRet = TRUE;
1367 
1368     reg.u16Addr = u16Addr;
1369     reg.u8Data  = u8Data;
1370 
1371     DMD_LOCK();
1372     u8DMD_DTMB_DMD_ID = id;
1373 
1374     bRet = pRes->sDMD_DTMB_PriData.HAL_DMD_DTMB_IOCTL_CMD(DMD_DTMB_HAL_CMD_SET_REG, &reg);
1375     DMD_UNLOCK();
1376 
1377     return bRet;
1378 }
1379 
1380 #ifdef UTPA2
1381 
1382 ////////////////////////////////////////////////////////////////////////////////
1383 ///                              UTOPIA 2K API                               ///
1384 ////////////////////////////////////////////////////////////////////////////////
1385 
1386 #ifndef MSOS_TYPE_LINUX_KERNEL
1387 
1388 #ifndef MSOS_TYPE_LINUX
1389 static const float _LogApproxTableX[80] =
1390 { 1.00, 1.30, 1.69, 2.20, 2.86, 3.71, 4.83, 6.27, 8.16, 10.60, 13.79,
1391   17.92, 23.30, 30.29, 39.37, 51.19, 66.54, 86.50, 112.46, 146.19,
1392   190.05, 247.06, 321.18, 417.54, 542.80, 705.64, 917.33, 1192.53,
1393   1550.29, 2015.38, 2620.00, 3405.99, 4427.79, 5756.13, 7482.97,
1394   9727.86, 12646.22, 16440.08, 21372.11, 27783.74, 36118.86,
1395   46954.52, 61040.88, 79353.15, 103159.09, 134106.82, 174338.86,
1396   226640.52, 294632.68, 383022.48, 497929.22, 647307.99, 841500.39, 1093950.50,
1397   1422135.65, 1848776.35, 2403409.25, 3124432.03, 4061761.64, 5280290.13,
1398   6864377.17, 8923690.32, 11600797.42, 15081036.65, 19605347.64, 25486951.94,
1399   33133037.52, 43072948.77, 55994833.40, 72793283.42, 94631268.45,
1400   123020648.99, 159926843.68, 207904896.79, 270276365.82, 351359275.57,
1401   456767058.24, 593797175.72, 771936328.43, 1003517226.96
1402 };
1403 
1404 static const float _LogApproxTableY[80] =
1405 { 0.00, 0.11, 0.23, 0.34, 0.46, 0.57, 0.68, 0.80, 0.91, 1.03, 1.14, 1.25,
1406   1.37, 1.48, 1.60, 1.71, 1.82, 1.94, 2.05, 2.16, 2.28, 2.39, 2.51, 2.62,
1407   2.73, 2.85, 2.96, 3.08, 3.19, 3.30, 3.42, 3.53, 3.65, 3.76, 3.87, 3.99,
1408   4.10, 4.22, 4.33, 4.44, 4.56, 4.67, 4.79, 4.90, 5.01, 5.13, 5.24, 5.36,
1409   5.47, 5.58, 5.70, 5.81, 5.93, 6.04, 6.15, 6.27, 6.04, 6.15, 6.27, 6.38,
1410   6.49, 6.61, 6.72, 6.84, 6.95, 7.06, 7.18, 7.29, 7.41, 7.52, 7.63, 7.75,
1411   7.86, 7.98, 8.09, 8.20, 8.32, 8.43, 8.55, 8.66
1412 };
1413 
Log10Approx(float flt_x)1414 static float Log10Approx(float flt_x)
1415 {
1416     MS_U8  indx = 0;
1417 
1418     do {
1419         if (flt_x < _LogApproxTableX[indx])
1420             break;
1421         indx++;
1422     }while (indx < 79);   //stop at indx = 80
1423 
1424     return _LogApproxTableY[indx];
1425 }
1426 #endif
1427 
MDrv_DMD_DTMB_SetDbgLevel(DMD_DTMB_DbgLv u8DbgLevel)1428 MS_BOOL MDrv_DMD_DTMB_SetDbgLevel(DMD_DTMB_DbgLv u8DbgLevel)
1429 {
1430     DTMB_DBG_LEVEL_PARAM DbgLevelParam = {0};
1431 
1432     if (!_u32DTMBopen) return FALSE;
1433 
1434     DbgLevelParam.u8DbgLevel = u8DbgLevel;
1435 
1436     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_SetDbgLevel, &DbgLevelParam) == UTOPIA_STATUS_SUCCESS)
1437     {
1438         return TRUE;
1439     }
1440     else
1441     {
1442         return FALSE;
1443     }
1444 }
1445 
MDrv_DMD_DTMB_GetInfo(void)1446 DMD_DTMB_Info* MDrv_DMD_DTMB_GetInfo(void)
1447 {
1448     DTMB_GET_INFO_PARAM GetInfoParam = {0};
1449 
1450     if (!_u32DTMBopen) return NULL;
1451 
1452     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_GetInfo, &GetInfoParam) == UTOPIA_STATUS_SUCCESS)
1453     {
1454         return GetInfoParam.pInfo;
1455     }
1456     else
1457     {
1458         return NULL;
1459     }
1460 }
1461 
MDrv_DMD_DTMB_GetLibVer(const MSIF_Version ** ppVersion)1462 MS_BOOL MDrv_DMD_DTMB_GetLibVer(const MSIF_Version **ppVersion)
1463 {
1464     DTMB_GET_LIB_VER_PARAM GetLibVerParam = {0};
1465 
1466     if (!_u32DTMBopen) return FALSE;
1467 
1468     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_GetLibVer, &GetLibVerParam) == UTOPIA_STATUS_SUCCESS)
1469     {
1470         //*ppVersion = *(GetLibVerParam.ppVersion);
1471 
1472         return TRUE;
1473     }
1474     else
1475     {
1476         return FALSE;
1477     }
1478 }
1479 
MDrv_DMD_DTMB_MD_Init(MS_U8 id,DMD_DTMB_InitData * pDMD_DTMB_InitData,MS_U32 u32InitDataLen)1480 MS_BOOL MDrv_DMD_DTMB_MD_Init(MS_U8 id, DMD_DTMB_InitData *pDMD_DTMB_InitData, MS_U32 u32InitDataLen)
1481 {
1482     void* pAttribte = NULL;
1483     DTMB_INIT_PARAM InitParam = {0};
1484 
1485     if (_u32DTMBopen == 0)
1486     {
1487         if (UtopiaOpen(MODULE_DTMB, &_ppDTMBInstant, 0, pAttribte) == UTOPIA_STATUS_SUCCESS)
1488             _u32DTMBopen = 1;
1489         else
1490         {
1491             return FALSE;
1492         }
1493     }
1494 
1495     if (!_u32DTMBopen) return FALSE;
1496 
1497     InitParam.id = id;
1498     InitParam.pDMD_DTMB_InitData = pDMD_DTMB_InitData;
1499     InitParam.u32InitDataLen = u32InitDataLen;
1500 
1501     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_Init, &InitParam) == UTOPIA_STATUS_SUCCESS)
1502     {
1503         return TRUE;
1504     }
1505     else
1506     {
1507         return FALSE;
1508     }
1509 }
1510 
MDrv_DMD_DTMB_MD_Exit(MS_U8 id)1511 MS_BOOL MDrv_DMD_DTMB_MD_Exit(MS_U8 id)
1512 {
1513     DTMB_ID_PARAM IdParam = {0};
1514 
1515     if (!_u32DTMBopen) return FALSE;
1516 
1517     IdParam.id = id;
1518 
1519     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_Exit, &IdParam) == UTOPIA_STATUS_SUCCESS)
1520     {
1521 
1522         return TRUE;
1523     }
1524     else
1525     {
1526         return FALSE;
1527     }
1528 }
1529 
MDrv_DMD_DTMB_MD_GetConfig(MS_U8 id,DMD_DTMB_InitData * psDMD_DTMB_InitData)1530 MS_U32 MDrv_DMD_DTMB_MD_GetConfig(MS_U8 id, DMD_DTMB_InitData *psDMD_DTMB_InitData)
1531 {
1532     DTMB_INIT_PARAM InitParam = {0};
1533 
1534 	if (!_u32DTMBopen) return FALSE;
1535 
1536 	InitParam.id = id;
1537     InitParam.pDMD_DTMB_InitData = psDMD_DTMB_InitData;
1538 
1539 	if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_GetConfig, &InitParam) == UTOPIA_STATUS_SUCCESS)
1540 	{
1541   	    return UTOPIA_STATUS_SUCCESS;
1542   	}
1543   	else
1544   	{
1545   	    return UTOPIA_STATUS_ERR_NOT_AVAIL;
1546   	}
1547 }
1548 
MDrv_DMD_DTMB_MD_SetConfig(MS_U8 id,DMD_DTMB_DEMOD_TYPE eType,MS_BOOL bEnable)1549 MS_BOOL MDrv_DMD_DTMB_MD_SetConfig(MS_U8 id, DMD_DTMB_DEMOD_TYPE eType, MS_BOOL bEnable)
1550 {
1551     DTMB_SET_CONFIG_PARAM SetConfigParam = {0};
1552 
1553     if (!_u32DTMBopen) return FALSE;
1554 
1555     SetConfigParam.id = id;
1556     SetConfigParam.eType = eType;
1557     SetConfigParam.bEnable = bEnable;
1558 
1559     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_SetConfig, &SetConfigParam) == UTOPIA_STATUS_SUCCESS)
1560     {
1561         return TRUE;
1562     }
1563     else
1564     {
1565         return FALSE;
1566     }
1567 }
1568 
MDrv_DMD_DTMB_MD_SetReset(MS_U8 id)1569 MS_BOOL MDrv_DMD_DTMB_MD_SetReset(MS_U8 id)
1570 {
1571     DTMB_ID_PARAM IdParam = {0};
1572 
1573     if (!_u32DTMBopen) return FALSE;
1574 
1575     IdParam.id = id;
1576 
1577     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_SetReset, &IdParam) == UTOPIA_STATUS_SUCCESS)
1578     {
1579         return TRUE;
1580     }
1581     else
1582     {
1583         return FALSE;
1584     }
1585 }
1586 
MDrv_DMD_DTMB_MD_Set_QAM_SR(MS_U8 id,DMD_DTMB_DEMOD_TYPE eType,MS_U16 symbol_rate)1587 MS_BOOL MDrv_DMD_DTMB_MD_Set_QAM_SR(MS_U8 id, DMD_DTMB_DEMOD_TYPE eType, MS_U16 symbol_rate)
1588 {
1589     DTMB_SET_QAM_SR_PARAM SetQamSrParam = {0};
1590 
1591     if (!_u32DTMBopen) return FALSE;
1592 
1593     SetQamSrParam.id = id;
1594     SetQamSrParam.eType = eType;
1595     SetQamSrParam.symbol_rate = symbol_rate;
1596 
1597     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_Set_QAM_SR, &SetQamSrParam) == UTOPIA_STATUS_SUCCESS)
1598     {
1599         return TRUE;
1600     }
1601     else
1602     {
1603         return FALSE;
1604     }
1605 }
1606 
MDrv_DMD_DTMB_MD_SetActive(MS_U8 id,MS_BOOL bEnable)1607 MS_BOOL MDrv_DMD_DTMB_MD_SetActive(MS_U8 id, MS_BOOL bEnable)
1608 {
1609     DTMB_SET_ACTIVE_PARAM SetActiveParam = {0};
1610 
1611     if (!_u32DTMBopen) return FALSE;
1612 
1613     SetActiveParam.id = id;
1614     SetActiveParam.bEnable = bEnable;
1615 
1616     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_SetActive, &SetActiveParam) == UTOPIA_STATUS_SUCCESS)
1617     {
1618         return TRUE;
1619     }
1620     else
1621     {
1622         return FALSE;
1623     }
1624 }
1625 
1626 #if DMD_DTMB_STR_EN
MDrv_DMD_DTMB_MD_SetPowerState(MS_U8 id,EN_POWER_MODE u16PowerState)1627 MS_U32 MDrv_DMD_DTMB_MD_SetPowerState(MS_U8 id, EN_POWER_MODE u16PowerState)
1628 {
1629     DTMB_SET_POWER_STATE_PARAM SetPowerStateParam = {0};
1630 
1631     if (!_u32DTMBopen) return FALSE;
1632 
1633     SetPowerStateParam.id = id;
1634     SetPowerStateParam.u16PowerState = u16PowerState;
1635 
1636     return UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_SetPowerState, &SetPowerStateParam);
1637 }
1638 #endif
1639 
MDrv_DMD_DTMB_MD_GetLock(MS_U8 id,DMD_DTMB_GETLOCK_TYPE eType)1640 DMD_DTMB_LOCK_STATUS MDrv_DMD_DTMB_MD_GetLock(MS_U8 id, DMD_DTMB_GETLOCK_TYPE eType)
1641 {
1642     DTMB_GET_LOCK_PARAM GetLockParam = {0};
1643 
1644     if (!_u32DTMBopen) return DMD_DTMB_NULL;
1645 
1646     GetLockParam.id = id;
1647     GetLockParam.eType = eType;
1648 
1649     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_GetLock, &GetLockParam) == UTOPIA_STATUS_SUCCESS)
1650     {
1651         return GetLockParam.status;
1652     }
1653     else
1654     {
1655         return DMD_DTMB_NULL;
1656     }
1657 }
1658 
MDrv_DMD_DTMB_MD_GetModulationMode(MS_U8 id,DMD_DTMB_MODULATION_INFO * sDtmbModulationMode)1659 MS_BOOL MDrv_DMD_DTMB_MD_GetModulationMode(MS_U8 id, DMD_DTMB_MODULATION_INFO *sDtmbModulationMode)
1660 {
1661     DTMB_GET_MODULATION_MODE_PARAM GetModulationModeParam = {0};
1662 
1663     if (!_u32DTMBopen) return FALSE;
1664 
1665     GetModulationModeParam.id = id;
1666 
1667     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_GetModulationMode, &GetModulationModeParam) == UTOPIA_STATUS_SUCCESS)
1668     {
1669         *sDtmbModulationMode = GetModulationModeParam.info;
1670 
1671         return TRUE;
1672     }
1673     else
1674     {
1675         return FALSE;
1676     }
1677 }
1678 
MDrv_DMD_DTMB_MD_GetSignalStrength(MS_U8 id,MS_U16 * u16Strength)1679 MS_BOOL MDrv_DMD_DTMB_MD_GetSignalStrength(MS_U8 id, MS_U16 *u16Strength)
1680 {
1681     DTMB_GET_SIGNAL_STRENGTH_PARAM GetSignalStrengthParam = {0};
1682 
1683     if (!_u32DTMBopen) return FALSE;
1684 
1685     GetSignalStrengthParam.id = id;
1686 
1687     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_GetSignalStrength, &GetSignalStrengthParam) == UTOPIA_STATUS_SUCCESS)
1688     {
1689         *u16Strength = GetSignalStrengthParam.u16Strength;
1690 
1691         return TRUE;
1692     }
1693     else
1694     {
1695         return FALSE;
1696     }
1697 }
1698 
MDrv_DMD_DTMB_MD_ReadFrequencyOffset(MS_U8 id,MS_S16 * cfo)1699 MS_BOOL MDrv_DMD_DTMB_MD_ReadFrequencyOffset(MS_U8 id, MS_S16 *cfo)
1700 {
1701     DTMB_READ_FREQ_OFFSET_PARAM ReadFreqOffsetParam = {0};
1702 
1703     if (!_u32DTMBopen) return FALSE;
1704 
1705     ReadFreqOffsetParam.id = id;
1706 
1707     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_ReadFrequencyOffset, &ReadFreqOffsetParam) == UTOPIA_STATUS_SUCCESS)
1708     {
1709         *cfo = (MS_S16)((((double)(ReadFreqOffsetParam.cfo.fftfirstCfo)/0x10000+(double)(ReadFreqOffsetParam.cfo.fftSecondCfo)/0x20000))*(double)(ReadFreqOffsetParam.cfo.sr));
1710 
1711         return TRUE;
1712     }
1713     else
1714     {
1715         *cfo = 0;
1716 
1717         return FALSE;
1718     }
1719 }
1720 
MDrv_DMD_DTMB_MD_GetSignalQuality(MS_U8 id)1721 MS_U8 MDrv_DMD_DTMB_MD_GetSignalQuality(MS_U8 id)
1722 {
1723     DTMB_GET_SIGNAL_QUALITY_PARAM GetSignalQualityParam = {0};
1724 
1725     if (!_u32DTMBopen) return FALSE;
1726 
1727     GetSignalQualityParam.id = id;
1728 
1729     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_GetSignalQuality, &GetSignalQualityParam) == UTOPIA_STATUS_SUCCESS)
1730     {
1731         return GetSignalQualityParam.u8Percentage;
1732     }
1733     else
1734     {
1735         return 0;
1736     }
1737 }
1738 
MDrv_DMD_DTMB_MD_GetPreLdpcBer(MS_U8 id,float * pber)1739 MS_BOOL MDrv_DMD_DTMB_MD_GetPreLdpcBer(MS_U8 id, float *pber)
1740 {
1741     DTMB_GET_BER_PARAM GetBerParam = {0};
1742 
1743     if (!_u32DTMBopen) return FALSE;
1744 
1745     GetBerParam.id = id;
1746 
1747     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_GetPreLdpcBer, &GetBerParam) == UTOPIA_STATUS_SUCCESS)
1748     {
1749         *pber = (float)(GetBerParam.ber.BitErr)/7488.0/(float)(GetBerParam.ber.Error_window);
1750 
1751         return TRUE;
1752     }
1753     else
1754     {
1755         *pber = 0;
1756 
1757         return FALSE;
1758     }
1759 }
1760 
MDrv_DMD_DTMB_MD_GetPreViterbiBer(MS_U8 id,float * ber)1761 MS_BOOL MDrv_DMD_DTMB_MD_GetPreViterbiBer(MS_U8 id, float *ber)
1762 {
1763     DTMB_GET_BER_PARAM GetBerParam = {0};
1764 
1765     if (!_u32DTMBopen) return FALSE;
1766 
1767     GetBerParam.id = id;
1768 
1769     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_GetPreViterbiBer, &GetBerParam) == UTOPIA_STATUS_SUCCESS)
1770     {
1771         *ber = 0;
1772 
1773         return TRUE;
1774     }
1775     else
1776     {
1777         *ber = 0;
1778 
1779         return FALSE;
1780     }
1781 }
1782 
MDrv_DMD_DTMB_MD_GetPostViterbiBer(MS_U8 id,float * ber)1783 MS_BOOL MDrv_DMD_DTMB_MD_GetPostViterbiBer(MS_U8 id, float *ber)
1784 {
1785     DTMB_GET_BER_PARAM GetBerParam = {0};
1786 
1787     if (!_u32DTMBopen) return FALSE;
1788 
1789     GetBerParam.id = id;
1790 
1791     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_GetPostViterbiBer, &GetBerParam) == UTOPIA_STATUS_SUCCESS)
1792     {
1793         *ber = 0;
1794 
1795         return TRUE;
1796     }
1797     else
1798     {
1799         *ber = 0;
1800 
1801         return FALSE;
1802     }
1803 }
1804 
MDrv_DMD_DTMB_MD_GetSNR(MS_U8 id,float * snr)1805 MS_BOOL MDrv_DMD_DTMB_MD_GetSNR(MS_U8 id, float *snr)
1806 {
1807     DTMB_GET_SNR_PARAM GetSnrParam = {0};
1808 
1809     if (!_u32DTMBopen) return FALSE;
1810 
1811     GetSnrParam.id = id;
1812 
1813     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_GetSNR, &GetSnrParam) == UTOPIA_STATUS_SUCCESS)
1814     {
1815         #ifdef MSOS_TYPE_LINUX
1816         *snr = 10.0f*log10f((float)(GetSnrParam.snr.snr)/((float)GetSnrParam.snr.sym_num));
1817         #else
1818         *snr = 10.0f*Log10Approx((float)(GetSnrParam.snr.snr)/((float)GetSnrParam.snr.sym_num));
1819         #endif
1820 
1821         return TRUE;
1822     }
1823     else
1824     {
1825         *snr = 0;
1826 
1827         return FALSE;
1828     }
1829 }
1830 
MDrv_DMD_DTMB_MD_SetSerialControl(MS_U8 id,MS_U8 u8TsConfigData)1831 MS_BOOL MDrv_DMD_DTMB_MD_SetSerialControl(MS_U8 id, MS_U8 u8TsConfigData)
1832 {
1833     DTMB_SET_SERIAL_CONTROL_PARAM SetSerialControlParam = {0};
1834 
1835     if (!_u32DTMBopen) return FALSE;
1836 
1837     SetSerialControlParam.id = id;
1838     SetSerialControlParam.u8TsConfigData = u8TsConfigData;
1839 
1840     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_SetSerialControl, &SetSerialControlParam) == UTOPIA_STATUS_SUCCESS)
1841     {
1842         return TRUE;
1843     }
1844     else
1845     {
1846         return FALSE;
1847     }
1848 }
1849 
MDrv_DMD_DTMB_MD_IIC_BYPASS_MODE(MS_U8 id,MS_BOOL bEnable)1850 MS_BOOL MDrv_DMD_DTMB_MD_IIC_BYPASS_MODE(MS_U8 id, MS_BOOL bEnable)
1851 {
1852     DTMB_IIC_BYPASS_MODE_PARAM IicBypassModeParam = {0};
1853 
1854     if (!_u32DTMBopen) return FALSE;
1855 
1856     IicBypassModeParam.id = id;
1857     IicBypassModeParam.bEnable = bEnable;
1858 
1859     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_IIC_BYPASS_MODE, &IicBypassModeParam) == UTOPIA_STATUS_SUCCESS)
1860     {
1861         return TRUE;
1862     }
1863     else
1864     {
1865         return FALSE;
1866     }
1867 }
1868 
MDrv_DMD_DTMB_MD_SWITCH_SSPI_GPIO(MS_U8 id,MS_BOOL bEnable)1869 MS_BOOL MDrv_DMD_DTMB_MD_SWITCH_SSPI_GPIO(MS_U8 id, MS_BOOL bEnable)
1870 {
1871     DTMB_SWITCH_SSPI_GPIO_PARAM SwitchSspiGpioParam = {0};
1872 
1873     if (!_u32DTMBopen) return FALSE;
1874 
1875     SwitchSspiGpioParam.id = id;
1876     SwitchSspiGpioParam.bEnable = bEnable;
1877 
1878     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_SWITCH_SSPI_GPIO, &SwitchSspiGpioParam) == UTOPIA_STATUS_SUCCESS)
1879     {
1880         return TRUE;
1881     }
1882     else
1883     {
1884         return FALSE;
1885     }
1886 }
1887 
MDrv_DMD_DTMB_MD_GPIO_GET_LEVEL(MS_U8 id,MS_U8 u8Pin,MS_BOOL * bLevel)1888 MS_BOOL MDrv_DMD_DTMB_MD_GPIO_GET_LEVEL(MS_U8 id, MS_U8 u8Pin, MS_BOOL *bLevel)
1889 {
1890     DTMB_GPIO_LEVEL_PARAM GpioLevelParam = {0};
1891 
1892     if (!_u32DTMBopen) return FALSE;
1893 
1894     GpioLevelParam.id = id;
1895     GpioLevelParam.u8Pin = u8Pin;
1896 
1897     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_GPIO_GET_LEVEL, &GpioLevelParam) == UTOPIA_STATUS_SUCCESS)
1898     {
1899         *bLevel = GpioLevelParam.bLevel;
1900 
1901         return TRUE;
1902     }
1903     else
1904     {
1905         return FALSE;
1906     }
1907 }
1908 
MDrv_DMD_DTMB_MD_GPIO_SET_LEVEL(MS_U8 id,MS_U8 u8Pin,MS_BOOL bLevel)1909 MS_BOOL MDrv_DMD_DTMB_MD_GPIO_SET_LEVEL(MS_U8 id, MS_U8 u8Pin, MS_BOOL bLevel)
1910 {
1911     DTMB_GPIO_LEVEL_PARAM GpioLevelParam = {0};
1912 
1913     if (!_u32DTMBopen) return FALSE;
1914 
1915     GpioLevelParam.id = id;
1916     GpioLevelParam.u8Pin = u8Pin;
1917     GpioLevelParam.bLevel = bLevel;
1918 
1919     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_GPIO_SET_LEVEL, &GpioLevelParam) == UTOPIA_STATUS_SUCCESS)
1920     {
1921         return TRUE;
1922     }
1923     else
1924     {
1925         return FALSE;
1926     }
1927 }
1928 
MDrv_DMD_DTMB_MD_GPIO_OUT_ENABLE(MS_U8 id,MS_U8 u8Pin,MS_BOOL bEnableOut)1929 MS_BOOL MDrv_DMD_DTMB_MD_GPIO_OUT_ENABLE(MS_U8 id, MS_U8 u8Pin, MS_BOOL bEnableOut)
1930 {
1931     DTMB_GPIO_OUT_ENABLE_PARAM GpioOutEnableParam = {0};
1932 
1933     if (!_u32DTMBopen) return FALSE;
1934 
1935     GpioOutEnableParam.id = id;
1936     GpioOutEnableParam.u8Pin = u8Pin;
1937     GpioOutEnableParam.bEnableOut = bEnableOut;
1938 
1939     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_GPIO_OUT_ENABLE, &GpioOutEnableParam) == UTOPIA_STATUS_SUCCESS)
1940     {
1941         return TRUE;
1942     }
1943     else
1944     {
1945         return FALSE;
1946     }
1947 }
1948 
MDrv_DMD_DTMB_MD_DoIQSwap(MS_U8 id,MS_BOOL bIsQPad)1949 MS_BOOL MDrv_DMD_DTMB_MD_DoIQSwap(MS_U8 id, MS_BOOL bIsQPad)
1950 {
1951     DTMB_DO_IQ_SWAP_PARAM DoIQSwapParam = {0};
1952 
1953     if (!_u32DTMBopen) return FALSE;
1954 
1955     DoIQSwapParam.id = id;
1956     DoIQSwapParam.bIsQPad = bIsQPad;
1957 
1958     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_DoIQSwap, &DoIQSwapParam) == UTOPIA_STATUS_SUCCESS)
1959     {
1960         return TRUE;
1961     }
1962     else
1963     {
1964         return FALSE;
1965     }
1966 }
1967 
MDrv_DMD_DTMB_MD_GetReg(MS_U8 id,MS_U16 u16Addr,MS_U8 * pu8Data)1968 MS_BOOL MDrv_DMD_DTMB_MD_GetReg(MS_U8 id, MS_U16 u16Addr, MS_U8 *pu8Data)
1969 {
1970     DTMB_REG_PARAM RegParam = {0};
1971 
1972     if (!_u32DTMBopen) return FALSE;
1973 
1974     RegParam.id = id;
1975     RegParam.u16Addr = u16Addr;
1976 
1977     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_GetReg, &RegParam) == UTOPIA_STATUS_SUCCESS)
1978     {
1979         *pu8Data = RegParam.u8Data;
1980 
1981         return TRUE;
1982     }
1983     else
1984     {
1985         return FALSE;
1986     }
1987 }
1988 
MDrv_DMD_DTMB_MD_SetReg(MS_U8 id,MS_U16 u16Addr,MS_U8 u8Data)1989 MS_BOOL MDrv_DMD_DTMB_MD_SetReg(MS_U8 id, MS_U16 u16Addr, MS_U8 u8Data)
1990 {
1991     DTMB_REG_PARAM RegParam = {0};
1992 
1993     if (!_u32DTMBopen) return FALSE;
1994 
1995     RegParam.id = id;
1996     RegParam.u16Addr = u16Addr;
1997     RegParam.u8Data = u8Data;
1998 
1999     if (UtopiaIoctl(_ppDTMBInstant, DMD_DTMB_DRV_CMD_MD_SetReg, &RegParam) == UTOPIA_STATUS_SUCCESS)
2000     {
2001         return TRUE;
2002     }
2003     else
2004     {
2005         return FALSE;
2006     }
2007 }
2008 
2009 #endif // #ifndef MSOS_TYPE_LINUX_KERNEL
2010 
2011 #endif // #ifdef UTPA2
2012