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, ®);
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, ®);
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