xref: /utopia/UTPA2-700.0.x/modules/demodulator/drv/demod/drvDMD_ATSC.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_ATSC.c
99 /// @brief  DMD ATSC Driver Interface
100 /// @author MStar Semiconductor Inc.
101 ///////////////////////////////////////////////////////////////////////////////////////////////////
102 
103 //-------------------------------------------------------------------------------------------------
104 //  Driver Compiler Options
105 //-------------------------------------------------------------------------------------------------
106 
107 
108 
109 //-------------------------------------------------------------------------------------------------
110 //  Include Files
111 //-------------------------------------------------------------------------------------------------
112 
113 #ifdef MSOS_TYPE_LINUX_KERNEL
114 #include <linux/string.h>
115 #else
116 #include <string.h>
117 #include <stdio.h>
118 #include <math.h>
119 #endif
120 
121 #include "drvDMD_ATSC.h"
122 #ifdef UTPA2
123 #include "drvDMD_ATSC_v2.h"
124 #endif
125 
126 #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
127 #include "MsOS.h"
128 
129 #include "drvMMIO.h"
130 #endif
131 
132 #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
_DEFAULT_IOCTL_CMD(DMD_ATSC_HAL_COMMAND eCmd,void * pArgs)133 static MS_BOOL _DEFAULT_IOCTL_CMD(DMD_ATSC_HAL_COMMAND eCmd, void *pArgs)
134 {
135     #ifdef REMOVE_HAL_INTERN_ATSC
136     printf("LINK ERROR: REMOVE_HAL_INTERN_ATSC \n");
137     #else
138     printf("LINK ERROR: Please link ext demod library \n");
139     #endif
140 
141     return TRUE;
142 }
143 
144 #ifdef REMOVE_HAL_INTERN_ATSC
145 MS_BOOL HAL_INTERN_ATSC_IOCTL_CMD(DMD_ATSC_HAL_COMMAND eCmd, void *pArgs)  __attribute__((weak, alias ("_DEFAULT_IOCTL_CMD")));
146 #else
147 MS_BOOL HAL_INTERN_ATSC_IOCTL_CMD(DMD_ATSC_HAL_COMMAND eCmd, void *pArgs);
148 #endif
149 MS_BOOL HAL_EXTERN_ATSC_IOCTL_CMD(DMD_ATSC_HAL_COMMAND eCmd, void *pArgs)  __attribute__((weak, alias ("_DEFAULT_IOCTL_CMD")));
150 #else
151 MS_BOOL HAL_EXTERN_ATSC_IOCTL_CMD(DMD_ATSC_HAL_COMMAND eCmd, void *pArgs);
152 #endif
153 
154 //-------------------------------------------------------------------------------------------------
155 //  Local Defines
156 //-------------------------------------------------------------------------------------------------
157 
158 #if DMD_ATSC_UTOPIA_EN && !DMD_ATSC_UTOPIA2_EN
159  #define DMD_LOCK()      \
160      do {                         \
161         MS_ASSERT(MsOS_In_Interrupt() == FALSE); \
162         if (_s32DMD_ATSC_Mutex == -1) return FALSE; \
163         if (_u8DMD_ATSC_DbgLevel == DMD_ATSC_DBGLV_DEBUG) printf("%s lock mutex\n", __FUNCTION__);\
164         MsOS_ObtainMutex(_s32DMD_ATSC_Mutex, MSOS_WAIT_FOREVER);\
165         } while(0)
166 
167  #define DMD_UNLOCK()      \
168      do {                         \
169         MsOS_ReleaseMutex(_s32DMD_ATSC_Mutex);\
170         if (_u8DMD_ATSC_DbgLevel == DMD_ATSC_DBGLV_DEBUG) printf("%s unlock mutex\n", __FUNCTION__); \
171         } while(0)
172 #elif (!DMD_ATSC_UTOPIA_EN && !DMD_ATSC_UTOPIA2_EN && DMD_ATSC_MULTI_THREAD_SAFE)
173  #define DMD_LOCK()    do { pRes->sDMD_ATSC_InitData.LockDMD(TRUE); } while(0)
174  #define DMD_UNLOCK()  do { pRes->sDMD_ATSC_InitData.LockDMD(FALSE); } while(0)
175 #else
176  #define DMD_LOCK()
177  #define DMD_UNLOCK()
178 #endif
179 
180 #ifdef MS_DEBUG
181 #define DMD_DBG(x)          (x)
182 #else
183 #define DMD_DBG(x)          //(x)
184 #endif
185 
186 //-------------------------------------------------------------------------------------------------
187 //  Local Structurs
188 //-------------------------------------------------------------------------------------------------
189 
190 
191 //-------------------------------------------------------------------------------------------------
192 //  Global Variables
193 //-------------------------------------------------------------------------------------------------
194 
195 MS_U8 u8DMD_ATSC_DMD_ID = 0;
196 
197 #if !DMD_ATSC_UTOPIA2_EN
198 DMD_ATSC_ResData sDMD_ATSC_ResData[DMD_ATSC_MAX_DEMOD_NUM] = { { {0} , {0} , {0} } };
199 
200 DMD_ATSC_ResData *psDMD_ATSC_ResData = sDMD_ATSC_ResData;
201 #else
202 DMD_ATSC_ResData *psDMD_ATSC_ResData;
203 #endif
204 
205 #ifdef UTPA2
206 static void* _ppATSCInstant = NULL;
207 #endif
208 
209 //-------------------------------------------------------------------------------------------------
210 //  Local Variables
211 //-------------------------------------------------------------------------------------------------
212 
213 #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
214 static MSIF_Version _drv_dmd_atsc_version;/* = {
215     .MW = { DMD_ATSC_VER, },
216 };*/
217 #endif
218 
219 #if DMD_ATSC_UTOPIA_EN && !DMD_ATSC_UTOPIA2_EN
220 static MS_S32 _s32DMD_ATSC_Mutex = -1;
221 #endif
222 
223 #ifdef UTPA2
224 static MS_U32 _u32ATSCopen = 0;
225 #endif
226 
227 static DMD_ATSC_DbgLv _u8DMD_ATSC_DbgLevel = DMD_ATSC_DBGLV_NONE;
228 
229 //-------------------------------------------------------------------------------------------------
230 //  Debug Functions
231 //-------------------------------------------------------------------------------------------------
232 
233 
234 
235 //-------------------------------------------------------------------------------------------------
236 //  Local Functions
237 //-------------------------------------------------------------------------------------------------
_VSB_CheckLock(void)238 static DMD_ATSC_LOCK_STATUS _VSB_CheckLock(void)
239 {
240     MS_BOOL (*ioctl)(DMD_ATSC_HAL_COMMAND eCmd, void *pPara);
241 
242     DMD_ATSC_ResData  *pRes  = psDMD_ATSC_ResData + u8DMD_ATSC_DMD_ID;
243     DMD_ATSC_InitData *pInit = &(pRes->sDMD_ATSC_InitData);
244     DMD_ATSC_Info     *pInfo = &(pRes->sDMD_ATSC_Info);
245 
246     ioctl = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD;
247 
248     if (ioctl(DMD_ATSC_HAL_CMD_Vsb_FEC_Lock, NULL))
249     {
250         pInfo->u32ATSCLockStatus |= DMD_ATSC_LOCK_VSB_FEC_LOCK;
251         #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
252         pInfo->u32ATSCFECLockTime = MsOS_GetSystemTime();
253         #else
254         pInfo->u32ATSCFECLockTime = pInit->GetSystemTimeMS();
255         #endif
256         return DMD_ATSC_LOCK;
257     }
258     else //FEC UNLOCK
259     {
260         #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
261         if ((pInfo->u32ATSCLockStatus & DMD_ATSC_LOCK_VSB_FEC_LOCK) && ((MsOS_GetSystemTime()-pInfo->u32ATSCFECLockTime) < 100))
262         #else
263         if ((pInfo->u32ATSCLockStatus & DMD_ATSC_LOCK_VSB_FEC_LOCK) && ((pInit->GetSystemTimeMS()-pInfo->u32ATSCFECLockTime) < 100))
264         #endif
265         {
266             return DMD_ATSC_LOCK;
267         }
268         else//Step 0 or 5
269         {
270             pInfo->u32ATSCLockStatus &= (~DMD_ATSC_LOCK_VSB_FEC_LOCK);
271         }
272 
273         if (pInfo->u32ATSCLockStatus & DMD_ATSC_LOCK_VSB_PRE_LOCK)//Step 3,4
274         {
275             if (pInfo->u32ATSCLockStatus & DMD_ATSC_LOCK_VSB_FSYNC_LOCK)//Step 4
276             {
277                 #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
278                 if ((MsOS_GetSystemTime()-pInfo->u32ATSCScanTimeStart) < pInit->u16VSBFECLockCheckTime)
279                 #else
280                 if ((pInit->GetSystemTimeMS()-pInfo->u32ATSCScanTimeStart) < pInit->u16VSBFECLockCheckTime)
281                 #endif
282                 {
283                     return DMD_ATSC_CHECKING;
284                 }
285             }
286             else //Step 3
287             {
288                 if (ioctl(DMD_ATSC_HAL_CMD_Vsb_FSync_Lock, NULL))
289                 {
290                     pInfo->u32ATSCLockStatus |= DMD_ATSC_LOCK_VSB_FSYNC_LOCK;
291 
292                     #ifdef MS_DEBUG
293                     if (_u8DMD_ATSC_DbgLevel >= DMD_ATSC_DBGLV_DEBUG)
294                     {
295                         printf("DMD_ATSC_LOCK_VSB_FSYNC_LOCK");
296                     }
297                     #endif
298                     return DMD_ATSC_CHECKING;
299                 }
300                 else
301                 {
302                     #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
303                     if ((MsOS_GetSystemTime()-pInfo->u32ATSCScanTimeStart) < pInit->u16VSBFSyncLockCheckTime)
304                     #else
305                     if ((pInit->GetSystemTimeMS()-pInfo->u32ATSCScanTimeStart) < pInit->u16VSBFSyncLockCheckTime)
306                     #endif
307                     {
308                         return DMD_ATSC_CHECKING;
309                     }
310                 }
311             }
312         }
313         else //Step 1,2
314         {
315             if (ioctl(DMD_ATSC_HAL_CMD_Vsb_PreLock, NULL))
316             {
317                 pInfo->u32ATSCLockStatus |= DMD_ATSC_LOCK_VSB_PRE_LOCK;
318 
319                 #ifdef MS_DEBUG
320                 if (_u8DMD_ATSC_DbgLevel >= DMD_ATSC_DBGLV_DEBUG)
321                 {
322                     printf("DMD_ATSC_LOCK_VSB_PRE_LOCK\n");
323                 }
324                 #endif
325                 return DMD_ATSC_CHECKING;
326             }
327             else
328             {
329                 #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
330                 if ((MsOS_GetSystemTime()-pInfo->u32ATSCScanTimeStart) < pInit->u16VSBPreLockCheckTime)
331                 #else
332                 if ((pInit->GetSystemTimeMS()-pInfo->u32ATSCScanTimeStart) < pInit->u16VSBPreLockCheckTime)
333                 #endif
334                 {
335                     return DMD_ATSC_CHECKING;
336                 }
337             }
338         }
339         return DMD_ATSC_UNLOCK;
340     }
341 }
342 
_QAM_CheckLock(void)343 static DMD_ATSC_LOCK_STATUS _QAM_CheckLock(void)
344 {
345     MS_BOOL (*ioctl)(DMD_ATSC_HAL_COMMAND eCmd, void *pPara);
346 
347     DMD_ATSC_ResData  *pRes  = psDMD_ATSC_ResData + u8DMD_ATSC_DMD_ID;
348     DMD_ATSC_InitData *pInit = &(pRes->sDMD_ATSC_InitData);
349     DMD_ATSC_Info     *pInfo = &(pRes->sDMD_ATSC_Info);
350 
351     ioctl = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD;
352 
353     if (ioctl(DMD_ATSC_HAL_CMD_QAM_Main_Lock, NULL))
354     {
355         pInfo->u32ATSCLockStatus |= DMD_ATSC_LOCK_QAM_MAIN_LOCK;
356         #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
357         pInfo->u32ATSCFECLockTime = MsOS_GetSystemTime();
358         #else
359         pInfo->u32ATSCFECLockTime = pInit->GetSystemTimeMS();
360         #endif
361         return DMD_ATSC_LOCK;
362     }
363     else
364     {
365         #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
366         if ((pInfo->u32ATSCLockStatus & DMD_ATSC_LOCK_QAM_MAIN_LOCK) && ((MsOS_GetSystemTime()-pInfo->u32ATSCFECLockTime) < 100))
367         #else
368         if ((pInfo->u32ATSCLockStatus & DMD_ATSC_LOCK_QAM_MAIN_LOCK) && ((pInit->GetSystemTimeMS()-pInfo->u32ATSCFECLockTime) < 100))
369         #endif
370         {
371             return DMD_ATSC_LOCK;
372         }
373         else
374         {
375             pInfo->u32ATSCLockStatus &= (~DMD_ATSC_LOCK_QAM_MAIN_LOCK);
376         }
377 
378         if (pInfo->u32ATSCLockStatus & DMD_ATSC_LOCK_QAM_PRE_LOCK)//STEP 3
379         {
380             #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
381             if ((MsOS_GetSystemTime()-pInfo->u32ATSCScanTimeStart) < pInit->u16QAMMainLockCheckTime)
382             #else
383             if ((pInit->GetSystemTimeMS()-pInfo->u32ATSCScanTimeStart) < pInit->u16QAMMainLockCheckTime)
384             #endif
385             {
386                 return DMD_ATSC_CHECKING;
387             }
388         }
389         else //STEP 1,2
390         {
391             if (ioctl(DMD_ATSC_HAL_CMD_QAM_PreLock, NULL))
392             {
393                 pInfo->u32ATSCLockStatus |= DMD_ATSC_LOCK_QAM_PRE_LOCK;
394                 #ifdef MS_DEBUG
395                 if (_u8DMD_ATSC_DbgLevel >= DMD_ATSC_DBGLV_DEBUG)
396                 {
397                     printf("DMD_ATSC_LOCK_QAM_PRE_LOCK\n");
398                 }
399                 #endif
400                 return DMD_ATSC_CHECKING;
401             }
402             else
403             {
404                 #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
405                 if ((MsOS_GetSystemTime()-pInfo->u32ATSCScanTimeStart) < pInit->u16QAMPreLockCheckTime)
406                 #else
407                 if ((pInit->GetSystemTimeMS()-pInfo->u32ATSCScanTimeStart) < pInit->u16QAMPreLockCheckTime)
408                 #endif
409                 {
410                     return DMD_ATSC_CHECKING;
411                 }
412             }
413         }
414         return DMD_ATSC_UNLOCK;
415     }
416 }
417 
418 //-------------------------------------------------------------------------------------------------
419 //  Global Functions
420 //-------------------------------------------------------------------------------------------------
421 
422 #ifdef UTPA2
_MDrv_DMD_ATSC_SetDbgLevel(DMD_ATSC_DbgLv u8DbgLevel)423 MS_BOOL _MDrv_DMD_ATSC_SetDbgLevel(DMD_ATSC_DbgLv u8DbgLevel)
424 #else
425 MS_BOOL MDrv_DMD_ATSC_SetDbgLevel(DMD_ATSC_DbgLv u8DbgLevel)
426 #endif
427 {
428     _u8DMD_ATSC_DbgLevel = u8DbgLevel;
429 
430     return TRUE;
431 }
432 
433 #ifdef UTPA2
_MDrv_DMD_ATSC_GetInfo(void)434 DMD_ATSC_Info* _MDrv_DMD_ATSC_GetInfo(void)
435 #else
436 DMD_ATSC_Info* MDrv_DMD_ATSC_GetInfo(void)
437 #endif
438 {
439     psDMD_ATSC_ResData->sDMD_ATSC_Info.u8Version = 0;
440 
441     return &(psDMD_ATSC_ResData->sDMD_ATSC_Info);
442 }
443 
444 #ifdef UTPA2
_MDrv_DMD_ATSC_GetLibVer(const MSIF_Version ** ppVersion)445 MS_BOOL _MDrv_DMD_ATSC_GetLibVer(const MSIF_Version **ppVersion)
446 #else
447 MS_BOOL MDrv_DMD_ATSC_GetLibVer(const MSIF_Version **ppVersion)
448 #endif
449 {
450     if (!ppVersion) return FALSE;
451 
452     #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
453     *ppVersion = &_drv_dmd_atsc_version;
454     #else
455     *ppVersion = NULL;
456     #endif
457 
458     return TRUE;
459 }
460 
461 ////////////////////////////////////////////////////////////////////////////////
462 ///                            SINGLE DEMOD API                              ///
463 ////////////////////////////////////////////////////////////////////////////////
464 
465 #ifndef MSOS_TYPE_LINUX_KERNEL
MDrv_DMD_ATSC_Init(DMD_ATSC_InitData * pDMD_ATSC_InitData,MS_U32 u32InitDataLen)466 MS_BOOL MDrv_DMD_ATSC_Init(DMD_ATSC_InitData *pDMD_ATSC_InitData, MS_U32 u32InitDataLen)
467 {
468     return MDrv_DMD_ATSC_MD_Init(0, pDMD_ATSC_InitData, u32InitDataLen);
469 }
470 
MDrv_DMD_ATSC_Exit(void)471 MS_BOOL MDrv_DMD_ATSC_Exit(void)
472 {
473     return MDrv_DMD_ATSC_MD_Exit(0);
474 }
475 
MDrv_DMD_ATSC_GetConfig(DMD_ATSC_InitData * psDMD_ATSC_InitData)476 MS_U32 MDrv_DMD_ATSC_GetConfig(DMD_ATSC_InitData *psDMD_ATSC_InitData)
477 {
478     return MDrv_DMD_ATSC_MD_GetConfig(0, psDMD_ATSC_InitData);
479 }
480 
MDrv_DMD_ATSC_SetConfig(DMD_ATSC_DEMOD_TYPE eType,MS_BOOL bEnable)481 MS_BOOL MDrv_DMD_ATSC_SetConfig(DMD_ATSC_DEMOD_TYPE eType, MS_BOOL bEnable)
482 {
483     return MDrv_DMD_ATSC_MD_SetConfig(0, eType, bEnable);
484 }
485 
MDrv_DMD_ATSC_SetReset(void)486 MS_BOOL MDrv_DMD_ATSC_SetReset(void)
487 {
488     return MDrv_DMD_ATSC_MD_SetReset(0);
489 }
490 
MDrv_DMD_ATSC_Set_QAM_SR(DMD_ATSC_DEMOD_TYPE eType,MS_U16 symbol_rate)491 MS_BOOL MDrv_DMD_ATSC_Set_QAM_SR(DMD_ATSC_DEMOD_TYPE eType, MS_U16 symbol_rate)
492 {
493     return MDrv_DMD_ATSC_MD_Set_QAM_SR(0, eType, symbol_rate);
494 }
495 
MDrv_DMD_ATSC_SetActive(MS_BOOL bEnable)496 MS_BOOL MDrv_DMD_ATSC_SetActive(MS_BOOL bEnable)
497 {
498     return MDrv_DMD_ATSC_MD_SetActive(0, bEnable);
499 }
500 
501 #if DMD_ATSC_STR_EN
MDrv_DMD_ATSC_SetPowerState(EN_POWER_MODE u16PowerState)502 MS_U32 MDrv_DMD_ATSC_SetPowerState(EN_POWER_MODE u16PowerState)
503 {
504     return MDrv_DMD_ATSC_MD_SetPowerState(0, u16PowerState);
505 }
506 #endif
507 
MDrv_DMD_ATSC_GetLock(DMD_ATSC_GETLOCK_TYPE eType)508 DMD_ATSC_LOCK_STATUS MDrv_DMD_ATSC_GetLock(DMD_ATSC_GETLOCK_TYPE eType)
509 {
510     return MDrv_DMD_ATSC_MD_GetLock(0, eType);
511 }
512 
MDrv_DMD_ATSC_GetModulationMode(void)513 DMD_ATSC_DEMOD_TYPE MDrv_DMD_ATSC_GetModulationMode(void)
514 {
515     return MDrv_DMD_ATSC_MD_GetModulationMode(0);
516 }
517 
MDrv_DMD_ATSC_GetSignalStrength(MS_U16 * u16Strength)518 MS_BOOL MDrv_DMD_ATSC_GetSignalStrength(MS_U16 *u16Strength)
519 {
520     return MDrv_DMD_ATSC_MD_GetSignalStrength(0, u16Strength);
521 }
522 
MDrv_DMD_ATSC_GetSignalQuality(void)523 DMD_ATSC_SIGNAL_CONDITION MDrv_DMD_ATSC_GetSignalQuality(void)
524 {
525     return MDrv_DMD_ATSC_MD_GetSignalQuality(0);
526 }
527 
MDrv_DMD_ATSC_GetSNRPercentage(void)528 MS_U8 MDrv_DMD_ATSC_GetSNRPercentage(void)
529 {
530     return MDrv_DMD_ATSC_MD_GetSNRPercentage(0);
531 }
532 
MDrv_DMD_ATSC_GET_QAM_SNR(float * f_snr)533 MS_BOOL MDrv_DMD_ATSC_GET_QAM_SNR(float *f_snr)
534 {
535     return MDrv_DMD_ATSC_MD_GET_QAM_SNR(0, f_snr);
536 }
537 
MDrv_DMD_ATSC_Read_uCPKT_ERR(MS_U16 * u16PacketErr)538 MS_BOOL MDrv_DMD_ATSC_Read_uCPKT_ERR(MS_U16 *u16PacketErr)
539 {
540     return MDrv_DMD_ATSC_MD_Read_uCPKT_ERR(0, u16PacketErr);
541 }
542 
MDrv_DMD_ATSC_GetPreViterbiBer(float * ber)543 MS_BOOL MDrv_DMD_ATSC_GetPreViterbiBer(float *ber)
544 {
545     return MDrv_DMD_ATSC_MD_GetPreViterbiBer(0, ber);
546 }
547 
MDrv_DMD_ATSC_GetPostViterbiBer(float * ber)548 MS_BOOL MDrv_DMD_ATSC_GetPostViterbiBer(float *ber)
549 {
550     return MDrv_DMD_ATSC_MD_GetPostViterbiBer(0, ber);
551 }
552 
MDrv_DMD_ATSC_ReadFrequencyOffset(MS_S16 * cfo)553 MS_BOOL MDrv_DMD_ATSC_ReadFrequencyOffset(MS_S16 *cfo)
554 {
555     return MDrv_DMD_ATSC_MD_ReadFrequencyOffset(0, cfo);
556 }
557 
MDrv_DMD_ATSC_SetSerialControl(MS_U8 u8TsConfigData)558 MS_BOOL MDrv_DMD_ATSC_SetSerialControl(MS_U8 u8TsConfigData)
559 {
560     return MDrv_DMD_ATSC_MD_SetSerialControl(0, u8TsConfigData);
561 }
562 
MDrv_DMD_ATSC_IIC_BYPASS_MODE(MS_BOOL bEnable)563 MS_BOOL MDrv_DMD_ATSC_IIC_BYPASS_MODE(MS_BOOL bEnable)
564 {
565     return MDrv_DMD_ATSC_MD_IIC_BYPASS_MODE(0, bEnable);
566 }
567 
MDrv_DMD_ATSC_SWITCH_SSPI_GPIO(MS_BOOL bEnable)568 MS_BOOL MDrv_DMD_ATSC_SWITCH_SSPI_GPIO(MS_BOOL bEnable)
569 {
570     return MDrv_DMD_ATSC_MD_SWITCH_SSPI_GPIO(0, bEnable);
571 }
572 
MDrv_DMD_ATSC_GPIO_GET_LEVEL(MS_U8 u8Pin,MS_BOOL * bLevel)573 MS_BOOL MDrv_DMD_ATSC_GPIO_GET_LEVEL(MS_U8 u8Pin, MS_BOOL *bLevel)
574 {
575     return MDrv_DMD_ATSC_MD_GPIO_GET_LEVEL(0, u8Pin, bLevel);
576 }
577 
MDrv_DMD_ATSC_GPIO_SET_LEVEL(MS_U8 u8Pin,MS_BOOL bLevel)578 MS_BOOL MDrv_DMD_ATSC_GPIO_SET_LEVEL(MS_U8 u8Pin, MS_BOOL bLevel)
579 {
580     return MDrv_DMD_ATSC_MD_GPIO_SET_LEVEL(0, u8Pin, bLevel);
581 }
582 
MDrv_DMD_ATSC_GPIO_OUT_ENABLE(MS_U8 u8Pin,MS_BOOL bEnableOut)583 MS_BOOL MDrv_DMD_ATSC_GPIO_OUT_ENABLE(MS_U8 u8Pin, MS_BOOL bEnableOut)
584 {
585     return MDrv_DMD_ATSC_MD_GPIO_OUT_ENABLE(0, u8Pin, bEnableOut);
586 }
587 
MDrv_DMD_ATSC_DoIQSwap(MS_BOOL bIsQPad)588 MS_BOOL MDrv_DMD_ATSC_DoIQSwap(MS_BOOL bIsQPad)
589 {
590     return MDrv_DMD_ATSC_MD_DoIQSwap(0, bIsQPad);
591 }
592 
MDrv_DMD_ATSC_GetReg(MS_U16 u16Addr,MS_U8 * pu8Data)593 MS_BOOL MDrv_DMD_ATSC_GetReg(MS_U16 u16Addr, MS_U8 *pu8Data)
594 {
595     return MDrv_DMD_ATSC_MD_GetReg(0, u16Addr, pu8Data);
596 }
597 
MDrv_DMD_ATSC_SetReg(MS_U16 u16Addr,MS_U8 u8Data)598 MS_BOOL MDrv_DMD_ATSC_SetReg(MS_U16 u16Addr, MS_U8 u8Data)
599 {
600     return MDrv_DMD_ATSC_MD_SetReg(0, u16Addr, u8Data);
601 }
602 #endif // #ifndef MSOS_TYPE_LINUX_KERNEL
603 
604 ////////////////////////////////////////////////////////////////////////////////
605 ///                      BACKWARD COMPATIBLE API                             ///
606 ////////////////////////////////////////////////////////////////////////////////
607 
608 #ifndef UTPA2
MDrv_DMD_ATSC_SEL_DMD(eDMD_SEL eDMD_NUM)609 MS_BOOL MDrv_DMD_ATSC_SEL_DMD(eDMD_SEL eDMD_NUM)
610 {
611     return TRUE;
612 }
613 
MDrv_DMD_ATSC_LoadFW(eDMD_SEL DMD_NUM)614 MS_BOOL MDrv_DMD_ATSC_LoadFW(eDMD_SEL DMD_NUM)
615 {
616     return TRUE;
617 }
618 
MDrv_DMD_ATSC_SetVsbMode(void)619 MS_BOOL MDrv_DMD_ATSC_SetVsbMode(void)
620 {
621     return MDrv_DMD_ATSC_MD_SetConfig(0, DMD_ATSC_DEMOD_ATSC_VSB, TRUE);
622 }
623 
MDrv_DMD_ATSC_Set256QamMode(void)624 MS_BOOL MDrv_DMD_ATSC_Set256QamMode(void)
625 {
626     return MDrv_DMD_ATSC_MD_SetConfig(0, DMD_ATSC_DEMOD_ATSC_256QAM, TRUE);
627 }
628 
MDrv_DMD_ATSC_Set64QamMode(void)629 MS_BOOL MDrv_DMD_ATSC_Set64QamMode(void)
630 {
631     return MDrv_DMD_ATSC_MD_SetConfig(0, DMD_ATSC_DEMOD_ATSC_64QAM, TRUE);
632 }
633 #endif // #ifndef UTPA2
634 
635 ////////////////////////////////////////////////////////////////////////////////
636 ///                            MULTI DEMOD API                               ///
637 ////////////////////////////////////////////////////////////////////////////////
638 
639 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_Init(MS_U8 id,DMD_ATSC_InitData * pDMD_ATSC_InitData,MS_U32 u32InitDataLen)640 MS_BOOL _MDrv_DMD_ATSC_MD_Init(MS_U8 id, DMD_ATSC_InitData *pDMD_ATSC_InitData, MS_U32 u32InitDataLen)
641 #else
642 MS_BOOL MDrv_DMD_ATSC_MD_Init(MS_U8 id, DMD_ATSC_InitData *pDMD_ATSC_InitData, MS_U32 u32InitDataLen)
643 #endif
644 {
645     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
646     MS_BOOL bRFAGCTristateEnable = 0;
647     MS_PHY phyNonPMBankSize;
648 
649     #if DMD_ATSC_UTOPIA_EN && !DMD_ATSC_UTOPIA2_EN
650     if (_s32DMD_ATSC_Mutex == -1)
651     {
652         if ((_s32DMD_ATSC_Mutex = MsOS_CreateMutex(E_MSOS_FIFO, "Mutex DMD ATSC", MSOS_PROCESS_SHARED)) == -1)
653         {
654             DMD_DBG(printf("MDrv_DMD_ATSC_Init Create Mutex Fail\n"));
655             return FALSE;
656         }
657     }
658     #elif (!DMD_ATSC_UTOPIA_EN && !DMD_ATSC_UTOPIA2_EN && DMD_ATSC_MULTI_THREAD_SAFE)
659     if (!pRes->sDMD_ATSC_InitData.CreateMutex(TRUE))
660     {
661         DMD_DBG(printf("MDrv_DMD_ATSC_Init Create Mutex Fail\n"));
662         return FALSE;
663     }
664     #endif
665 
666     DMD_LOCK();
667     if (pRes->sDMD_ATSC_PriData.bInit)
668     {
669         DMD_DBG(printf("MDrv_DMD_ATSC_Init more than once\n"));
670         return FALSE;
671     }
672 
673     #ifdef MS_DEBUG
674     if (_u8DMD_ATSC_DbgLevel >= DMD_ATSC_DBGLV_INFO)
675     {
676         printf("MDrv_DMD_ATSC_Init\n");
677     }
678     #endif
679 
680     #ifndef MSOS_TYPE_LINUX_KERNEL
681     if (sizeof(DMD_ATSC_InitData) == u32InitDataLen)
682     {
683         memcpy(&(pRes->sDMD_ATSC_InitData), pDMD_ATSC_InitData, u32InitDataLen);
684     }
685     else
686     {
687         DMD_DBG(printf("MDrv_DMD_ATSC_Init input data structure incorrect\n"));
688         return FALSE;
689     }
690     #else
691     memcpy(&(pRes->sDMD_ATSC_InitData), pDMD_ATSC_InitData, sizeof(DMD_ATSC_InitData));
692     #endif
693 
694     if (!MDrv_MMIO_GetBASE(&(pRes->sDMD_ATSC_PriData.virtDMDBaseAddr), &phyNonPMBankSize, MS_MODULE_PM))
695     {
696         #ifdef MS_DEBUG
697         printf("HAL_DMD_RegInit failure to get MS_MODULE_PM\n");
698         #endif
699         return FALSE;
700     }
701 
702     pRes->sDMD_ATSC_PriData.bInit = TRUE;
703 
704     #if DMD_ATSC_STR_EN
705     pRes->sDMD_ATSC_PriData.eLastState = E_POWER_RESUME;
706     #endif
707 
708     pRes->sDMD_ATSC_PriData.eLastType  = DMD_ATSC_DEMOD_ATSC_VSB;
709     pRes->sDMD_ATSC_PriData.u16SymRate = 10762;
710 
711     #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
712     if (pRes->sDMD_ATSC_InitData.bIsExtDemod)
713         pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD = HAL_EXTERN_ATSC_IOCTL_CMD;
714     else pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD = HAL_INTERN_ATSC_IOCTL_CMD;
715     #else
716     pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD = HAL_EXTERN_ATSC_IOCTL_CMD;
717     #endif
718 
719     u8DMD_ATSC_DMD_ID = id;
720 
721     pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_InitClk, &bRFAGCTristateEnable);
722 
723     pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_Download, NULL);
724 
725     pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_FWVERSION, NULL);
726     DMD_UNLOCK();
727 
728     return TRUE;
729 }
730 
731 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_Exit(MS_U8 id)732 MS_BOOL _MDrv_DMD_ATSC_MD_Exit(MS_U8 id)
733 #else
734 MS_BOOL MDrv_DMD_ATSC_MD_Exit(MS_U8 id)
735 #endif
736 {
737     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
738     MS_BOOL bRet = TRUE;
739 
740     DMD_LOCK();
741     u8DMD_ATSC_DMD_ID = id;
742 
743     bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_Exit, NULL);
744 
745     pRes->sDMD_ATSC_PriData.bInit = FALSE;
746     DMD_UNLOCK();
747 
748     #if DMD_ATSC_UTOPIA_EN && !DMD_ATSC_UTOPIA2_EN
749     MsOS_DeleteMutex(_s32DMD_ATSC_Mutex);
750 
751     _s32DMD_ATSC_Mutex = -1;
752     #elif (!DMD_ATSC_UTOPIA_EN && !DMD_ATSC_UTOPIA2_EN && DMD_ATSC_MULTI_THREAD_SAFE)
753     pRes->sDMD_ATSC_InitData.CreateMutex(FALSE);
754     #endif
755 
756     return bRet;
757 }
758 
759 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_GetConfig(MS_U8 id,DMD_ATSC_InitData * psDMD_ATSC_InitData)760 MS_U32 _MDrv_DMD_ATSC_MD_GetConfig(MS_U8 id, DMD_ATSC_InitData *psDMD_ATSC_InitData)
761 #else
762 MS_U32 MDrv_DMD_ATSC_MD_GetConfig(MS_U8 id, DMD_ATSC_InitData *psDMD_ATSC_InitData)
763 #endif
764 {
765     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
766 
767     DMD_LOCK();
768     memcpy (psDMD_ATSC_InitData, &(pRes->sDMD_ATSC_InitData), sizeof(DMD_ATSC_InitData));
769 	DMD_UNLOCK();
770 
771 	return UTOPIA_STATUS_SUCCESS;
772 }
773 
774 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_SetConfig(MS_U8 id,DMD_ATSC_DEMOD_TYPE eType,MS_BOOL bEnable)775 MS_BOOL _MDrv_DMD_ATSC_MD_SetConfig(MS_U8 id, DMD_ATSC_DEMOD_TYPE eType, MS_BOOL bEnable)
776 #else
777 MS_BOOL MDrv_DMD_ATSC_MD_SetConfig(MS_U8 id, DMD_ATSC_DEMOD_TYPE eType, MS_BOOL bEnable)
778 #endif
779 {
780     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
781     MS_BOOL bRet = TRUE;
782 
783     DMD_LOCK();
784     u8DMD_ATSC_DMD_ID = id;
785 
786     bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_SoftReset, NULL);
787 
788     if (bEnable)
789     {
790         switch (eType)
791         {
792             case DMD_ATSC_DEMOD_ATSC_VSB:
793                 pRes->sDMD_ATSC_PriData.eLastType = DMD_ATSC_DEMOD_ATSC_VSB;
794                 pRes->sDMD_ATSC_PriData.u16SymRate = 10762;
795                 bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_SetVsbMode, NULL);
796                 break;
797             case DMD_ATSC_DEMOD_ATSC_64QAM:
798                 pRes->sDMD_ATSC_PriData.eLastType = DMD_ATSC_DEMOD_ATSC_64QAM;
799                 pRes->sDMD_ATSC_PriData.u16SymRate = 5056;
800                 bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_Set64QamMode, NULL);
801                 break;
802             case DMD_ATSC_DEMOD_ATSC_256QAM:
803                 pRes->sDMD_ATSC_PriData.eLastType = DMD_ATSC_DEMOD_ATSC_256QAM;
804                 pRes->sDMD_ATSC_PriData.u16SymRate = 5360;
805                 bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_Set256QamMode, NULL);
806                 break;
807             default:
808                 pRes->sDMD_ATSC_PriData.eLastType = DMD_ATSC_DEMOD_NULL;
809                 pRes->sDMD_ATSC_PriData.u16SymRate = 0;
810                 bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_SetModeClean, NULL);
811                 break;
812         }
813     }
814 
815     #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
816     pRes->sDMD_ATSC_Info.u32ATSCScanTimeStart = MsOS_GetSystemTime();
817     #else
818     pRes->sDMD_ATSC_Info.u32ATSCScanTimeStart = psDMD_ATSC_ResData->sDMD_ATSC_InitData.GetSystemTimeMS();
819     #endif
820     pRes->sDMD_ATSC_Info.u32ATSCLockStatus    = 0;
821     DMD_UNLOCK();
822 
823     return bRet;
824 }
825 
826 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_SetReset(MS_U8 id)827 MS_BOOL _MDrv_DMD_ATSC_MD_SetReset(MS_U8 id)
828 #else
829 MS_BOOL MDrv_DMD_ATSC_MD_SetReset(MS_U8 id)
830 #endif
831 {
832     return TRUE;
833 }
834 
835 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_Set_QAM_SR(MS_U8 id,DMD_ATSC_DEMOD_TYPE eType,MS_U16 symbol_rate)836 MS_BOOL _MDrv_DMD_ATSC_MD_Set_QAM_SR(MS_U8 id, DMD_ATSC_DEMOD_TYPE eType, MS_U16 symbol_rate)
837 #else
838 MS_BOOL MDrv_DMD_ATSC_MD_Set_QAM_SR(MS_U8 id, DMD_ATSC_DEMOD_TYPE eType, MS_U16 symbol_rate)
839 #endif
840 {
841     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
842     MS_BOOL bRet = TRUE;
843 
844     DMD_LOCK();
845     pRes->sDMD_ATSC_PriData.eLastType  = eType;
846     pRes->sDMD_ATSC_PriData.u16SymRate = symbol_rate;
847 
848     u8DMD_ATSC_DMD_ID = id;
849 
850     bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_Set_QAM_SR, NULL);
851     DMD_UNLOCK();
852 
853     return bRet;
854 }
855 
856 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_SetActive(MS_U8 id,MS_BOOL bEnable)857 MS_BOOL _MDrv_DMD_ATSC_MD_SetActive(MS_U8 id, MS_BOOL bEnable)
858 #else
859 MS_BOOL MDrv_DMD_ATSC_MD_SetActive(MS_U8 id, MS_BOOL bEnable)
860 #endif
861 {
862     return TRUE;
863 }
864 
865 #if DMD_ATSC_STR_EN
866 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_SetPowerState(MS_U8 id,EN_POWER_MODE u16PowerState)867 MS_U32 _MDrv_DMD_ATSC_MD_SetPowerState(MS_U8 id, EN_POWER_MODE u16PowerState)
868 #else
869 MS_U32 MDrv_DMD_ATSC_MD_SetPowerState(MS_U8 id, EN_POWER_MODE u16PowerState)
870 #endif
871 {
872     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
873     MS_U32 u32Return = UTOPIA_STATUS_FAIL;
874 
875     if (u16PowerState == E_POWER_SUSPEND)
876     {
877         pRes->sDMD_ATSC_PriData.bDownloaded = FALSE;
878         pRes->sDMD_ATSC_PriData.bIsDTV      = pRes->sDMD_ATSC_PriData.bInit;
879         pRes->sDMD_ATSC_PriData.eLastState  = u16PowerState;
880 
881         if (pRes->sDMD_ATSC_PriData.bInit)
882         {
883             #ifdef UTPA2
884             _MDrv_DMD_ATSC_MD_Exit(id);
885             #else
886             MDrv_DMD_ATSC_MD_Exit(id);
887             #endif
888         }
889 
890         u32Return = UTOPIA_STATUS_SUCCESS;
891     }
892     else if (u16PowerState == E_POWER_RESUME)
893     {
894         if (pRes->sDMD_ATSC_PriData.eLastState == E_POWER_SUSPEND)
895         {
896         	printf("\nVT: (Check Mode In DRV:) DTV Mode=%d\n", pRes->sDMD_ATSC_PriData.bIsDTV);
897 
898             if (pRes->sDMD_ATSC_PriData.bIsDTV)
899             {
900                 #ifdef UTPA2
901                 _MDrv_DMD_ATSC_MD_Init(id, &(pRes->sDMD_ATSC_InitData), sizeof(DMD_ATSC_InitData));
902                 _MDrv_DMD_ATSC_MD_DoIQSwap(id, pRes->sDMD_ATSC_PriData.bIsQPad);
903                 #else
904                 MDrv_DMD_ATSC_MD_Init(id, &(pRes->sDMD_ATSC_InitData), sizeof(DMD_ATSC_InitData));
905                 MDrv_DMD_ATSC_MD_DoIQSwap(id, pRes->sDMD_ATSC_PriData.bIsQPad);
906                 #endif
907 
908                 if (pRes->sDMD_ATSC_PriData.eLastType != DMD_ATSC_DEMOD_ATSC_VSB)
909                 {
910                     if (pRes->sDMD_ATSC_PriData.eLastType == DMD_ATSC_DEMOD_ATSC_64QAM &&
911                         pRes->sDMD_ATSC_PriData.u16SymRate == 5056)
912                     {
913                         #ifdef UTPA2
914                         _MDrv_DMD_ATSC_MD_SetConfig(id, pRes->sDMD_ATSC_PriData.eLastType, TRUE);
915                         #else
916                         MDrv_DMD_ATSC_MD_SetConfig(id, pRes->sDMD_ATSC_PriData.eLastType, TRUE);
917                         #endif
918                     }
919                     else if (pRes->sDMD_ATSC_PriData.eLastType == DMD_ATSC_DEMOD_ATSC_256QAM &&
920                              pRes->sDMD_ATSC_PriData.u16SymRate == 5360)
921                     {
922                         #ifdef UTPA2
923                         _MDrv_DMD_ATSC_MD_SetConfig(id, pRes->sDMD_ATSC_PriData.eLastType, TRUE);
924                         #else
925                         MDrv_DMD_ATSC_MD_SetConfig(id, pRes->sDMD_ATSC_PriData.eLastType, TRUE);
926                         #endif
927                     }
928                     else
929                     {
930                         #ifdef UTPA2
931                         _MDrv_DMD_ATSC_MD_Set_QAM_SR(id, pRes->sDMD_ATSC_PriData.eLastType,
932                                                     pRes->sDMD_ATSC_PriData.u16SymRate);
933                         #else
934                         MDrv_DMD_ATSC_MD_Set_QAM_SR(id, pRes->sDMD_ATSC_PriData.eLastType,
935                                                     pRes->sDMD_ATSC_PriData.u16SymRate);
936                         #endif
937                     }
938                 }
939                 else
940                 {
941                     #ifdef UTPA2
942                     _MDrv_DMD_ATSC_MD_SetConfig(id, pRes->sDMD_ATSC_PriData.eLastType, TRUE);
943                     #else
944                     MDrv_DMD_ATSC_MD_SetConfig(id, pRes->sDMD_ATSC_PriData.eLastType, TRUE);
945                     #endif
946                 }
947             }
948 
949             pRes->sDMD_ATSC_PriData.eLastState = u16PowerState;
950 
951             u32Return = UTOPIA_STATUS_SUCCESS;
952         }
953         else
954         {
955             printf("[%s,%5d]It is not suspended yet. We shouldn't resume\n",__FUNCTION__,__LINE__);
956 
957             u32Return = UTOPIA_STATUS_FAIL;
958 	    }
959     }
960     else
961     {
962         printf("[%s,%5d]Do Nothing: %d\n",__FUNCTION__,__LINE__, u16PowerState);
963 
964     	u32Return = UTOPIA_STATUS_FAIL;
965     }
966 
967     return u32Return;
968 }
969 #endif
970 
971 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_GetLock(MS_U8 id,DMD_ATSC_GETLOCK_TYPE eType)972 DMD_ATSC_LOCK_STATUS _MDrv_DMD_ATSC_MD_GetLock(MS_U8 id, DMD_ATSC_GETLOCK_TYPE eType)
973 #else
974 DMD_ATSC_LOCK_STATUS MDrv_DMD_ATSC_MD_GetLock(MS_U8 id, DMD_ATSC_GETLOCK_TYPE eType)
975 #endif
976 {
977     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
978     DMD_ATSC_LOCK_STATUS status  = DMD_ATSC_UNLOCK;
979 
980     DMD_LOCK();
981     u8DMD_ATSC_DMD_ID = id;
982 
983     switch (eType)
984     {
985         case DMD_ATSC_GETLOCK:
986             switch (pRes->sDMD_ATSC_PriData.eLastType)
987             {
988                 case DMD_ATSC_DEMOD_ATSC_VSB:
989                     status = _VSB_CheckLock();
990                     break;
991                 case DMD_ATSC_DEMOD_ATSC_16QAM:
992                 case DMD_ATSC_DEMOD_ATSC_32QAM:
993                 case DMD_ATSC_DEMOD_ATSC_64QAM:
994                 case DMD_ATSC_DEMOD_ATSC_128QAM:
995                 case DMD_ATSC_DEMOD_ATSC_256QAM:
996                     status = _QAM_CheckLock();
997                     break;
998                 default:
999                     status = DMD_ATSC_UNLOCK;
1000                     break;
1001             }
1002             break;
1003         case DMD_ATSC_GETLOCK_VSB_AGCLOCK:
1004             status = (pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_AGCLock, NULL)) ? DMD_ATSC_LOCK : DMD_ATSC_UNLOCK;
1005             break;
1006         case DMD_ATSC_GETLOCK_VSB_PRELOCK:
1007             status = (pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_Vsb_PreLock, NULL)) ? DMD_ATSC_LOCK : DMD_ATSC_UNLOCK;
1008             break;
1009         case DMD_ATSC_GETLOCK_VSB_FSYNCLOCK:
1010             status = (pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_Vsb_FSync_Lock, NULL)) ? DMD_ATSC_LOCK : DMD_ATSC_UNLOCK;
1011         	break;
1012         case DMD_ATSC_GETLOCK_VSB_CELOCK:
1013             status = (pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_Vsb_CE_Lock, NULL)) ? DMD_ATSC_LOCK : DMD_ATSC_UNLOCK;
1014             break;
1015         case DMD_ATSC_GETLOCK_VSB_FECLOCK:
1016             status = (pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_Vsb_FEC_Lock, NULL)) ? DMD_ATSC_LOCK : DMD_ATSC_UNLOCK;
1017             break;
1018         case DMD_ATSC_GETLOCK_QAM_AGCLOCK:
1019             status = (pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_AGCLock, NULL)) ? DMD_ATSC_LOCK : DMD_ATSC_UNLOCK;
1020             break;
1021         case DMD_ATSC_GETLOCK_QAM_PRELOCK:
1022             status = (pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_QAM_PreLock, NULL)) ? DMD_ATSC_LOCK : DMD_ATSC_UNLOCK;
1023             break;
1024         case DMD_ATSC_GETLOCK_QAM_MAINLOCK:
1025             status = (pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_QAM_Main_Lock, NULL)) ? DMD_ATSC_LOCK : DMD_ATSC_UNLOCK;
1026             break;
1027         default:
1028             status = DMD_ATSC_UNLOCK;
1029             break;
1030     }
1031     DMD_UNLOCK();
1032 
1033     return status;
1034 }
1035 
1036 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_GetModulationMode(MS_U8 id)1037 DMD_ATSC_DEMOD_TYPE _MDrv_DMD_ATSC_MD_GetModulationMode(MS_U8 id)
1038 #else
1039 DMD_ATSC_DEMOD_TYPE MDrv_DMD_ATSC_MD_GetModulationMode(MS_U8 id)
1040 #endif
1041 {
1042     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
1043     DMD_ATSC_DEMOD_TYPE eType = DMD_ATSC_DEMOD_NULL;
1044 
1045     DMD_LOCK();
1046     u8DMD_ATSC_DMD_ID = id;
1047 
1048     pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_Check8VSB64_256QAM, &eType);
1049     DMD_UNLOCK();
1050 
1051     return eType;
1052 }
1053 
1054 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_GetSignalStrength(MS_U8 id,MS_U16 * u16Strength)1055 MS_BOOL _MDrv_DMD_ATSC_MD_GetSignalStrength(MS_U8 id, MS_U16 *u16Strength)
1056 #else
1057 MS_BOOL MDrv_DMD_ATSC_MD_GetSignalStrength(MS_U8 id, MS_U16 *u16Strength)
1058 #endif
1059 {
1060     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
1061     MS_BOOL bRet = TRUE;
1062 
1063     DMD_LOCK();
1064     u8DMD_ATSC_DMD_ID = id;
1065 
1066     bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_ReadIFAGC, u16Strength);
1067     DMD_UNLOCK();
1068 
1069     return bRet;
1070 }
1071 
1072 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_GetSignalQuality(MS_U8 id)1073 DMD_ATSC_SIGNAL_CONDITION _MDrv_DMD_ATSC_MD_GetSignalQuality(MS_U8 id)
1074 #else
1075 DMD_ATSC_SIGNAL_CONDITION MDrv_DMD_ATSC_MD_GetSignalQuality(MS_U8 id)
1076 #endif
1077 {
1078     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
1079     DMD_ATSC_SIGNAL_CONDITION eSignal = DMD_ATSC_SIGNAL_NO;
1080 
1081     DMD_LOCK();
1082     u8DMD_ATSC_DMD_ID = id;
1083 
1084     pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_CheckSignalCondition, &eSignal);
1085     DMD_UNLOCK();
1086 
1087     return eSignal;
1088 }
1089 
1090 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_GetSNRPercentage(MS_U8 id)1091 MS_U8 _MDrv_DMD_ATSC_MD_GetSNRPercentage(MS_U8 id)
1092 #else
1093 MS_U8 MDrv_DMD_ATSC_MD_GetSNRPercentage(MS_U8 id)
1094 #endif
1095 {
1096     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
1097     MS_U8 percentage = 0;
1098 
1099     DMD_LOCK();
1100     u8DMD_ATSC_DMD_ID = id;
1101 
1102     pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_ReadSNRPercentage, &percentage);
1103     DMD_UNLOCK();
1104 
1105     return percentage;
1106 }
1107 
1108 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_GET_QAM_SNR(MS_U8 id,DMD_ATSC_SNR_DATA * f_snr)1109 MS_BOOL _MDrv_DMD_ATSC_MD_GET_QAM_SNR(MS_U8 id, DMD_ATSC_SNR_DATA *f_snr)
1110 #else
1111 MS_BOOL MDrv_DMD_ATSC_MD_GET_QAM_SNR(MS_U8 id, float *f_snr)
1112 #endif
1113 {
1114     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
1115     MS_BOOL bRet = TRUE;
1116 
1117     DMD_LOCK();
1118     u8DMD_ATSC_DMD_ID = id;
1119 
1120     bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_GET_QAM_SNR, f_snr);
1121     DMD_UNLOCK();
1122 
1123     return bRet;
1124 }
1125 
1126 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_Read_uCPKT_ERR(MS_U8 id,MS_U16 * u16PacketErr)1127 MS_BOOL _MDrv_DMD_ATSC_MD_Read_uCPKT_ERR(MS_U8 id, MS_U16 *u16PacketErr)
1128 #else
1129 MS_BOOL MDrv_DMD_ATSC_MD_Read_uCPKT_ERR(MS_U8 id, MS_U16 *u16PacketErr)
1130 #endif
1131 {
1132     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
1133     MS_BOOL bRet = TRUE;
1134 
1135     DMD_LOCK();
1136     u8DMD_ATSC_DMD_ID = id;
1137 
1138     bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_ReadPKTERR, u16PacketErr);
1139     DMD_UNLOCK();
1140 
1141     return bRet;
1142 }
1143 
1144 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_GetPreViterbiBer(MS_U8 id,DMD_ATSC_BER_DATA * ber)1145 MS_BOOL _MDrv_DMD_ATSC_MD_GetPreViterbiBer(MS_U8 id, DMD_ATSC_BER_DATA *ber)
1146 #else
1147 MS_BOOL MDrv_DMD_ATSC_MD_GetPreViterbiBer(MS_U8 id, float *ber)
1148 #endif
1149 {
1150     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
1151     MS_BOOL bRet = TRUE;
1152 
1153     DMD_LOCK();
1154     u8DMD_ATSC_DMD_ID = id;
1155 
1156     bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_GetPreViterbiBer, ber);
1157     DMD_UNLOCK();
1158 
1159     return bRet;
1160 }
1161 
1162 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_GetPostViterbiBer(MS_U8 id,DMD_ATSC_BER_DATA * ber)1163 MS_BOOL _MDrv_DMD_ATSC_MD_GetPostViterbiBer(MS_U8 id, DMD_ATSC_BER_DATA *ber)
1164 #else
1165 MS_BOOL MDrv_DMD_ATSC_MD_GetPostViterbiBer(MS_U8 id, float *ber)
1166 #endif
1167 {
1168     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
1169     MS_BOOL bRet = TRUE;
1170 
1171     DMD_LOCK();
1172     u8DMD_ATSC_DMD_ID = id;
1173 
1174     bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_GetPostViterbiBer, ber);
1175     DMD_UNLOCK();
1176 
1177     return bRet;
1178 }
1179 
1180 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_ReadFrequencyOffset(MS_U8 id,DMD_ATSC_CFO_DATA * cfo)1181 MS_BOOL _MDrv_DMD_ATSC_MD_ReadFrequencyOffset(MS_U8 id, DMD_ATSC_CFO_DATA *cfo)
1182 #else
1183 MS_BOOL MDrv_DMD_ATSC_MD_ReadFrequencyOffset(MS_U8 id, MS_S16 *cfo)
1184 #endif
1185 {
1186     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
1187     MS_BOOL bRet = TRUE;
1188 
1189     DMD_LOCK();
1190     u8DMD_ATSC_DMD_ID = id;
1191 
1192     bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_ReadFrequencyOffset, cfo);
1193     DMD_UNLOCK();
1194 
1195     return bRet;
1196 }
1197 
1198 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_SetSerialControl(MS_U8 id,MS_U8 u8TsConfigData)1199 MS_BOOL _MDrv_DMD_ATSC_MD_SetSerialControl(MS_U8 id, MS_U8 u8TsConfigData)
1200 #else
1201 MS_BOOL MDrv_DMD_ATSC_MD_SetSerialControl(MS_U8 id, MS_U8 u8TsConfigData)
1202 #endif
1203 {
1204     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
1205     MS_BOOL bRet = TRUE;
1206 
1207     DMD_LOCK();
1208     pRes->sDMD_ATSC_InitData.u1TsConfigByte_SerialMode = u8TsConfigData;
1209     pRes->sDMD_ATSC_InitData.u1TsConfigByte_DataSwap   = u8TsConfigData >> 1;
1210     pRes->sDMD_ATSC_InitData.u1TsConfigByte_ClockInv   = u8TsConfigData >> 2;
1211     pRes->sDMD_ATSC_InitData.u5TsConfigByte_DivNum     = u8TsConfigData >> 3;
1212 
1213     u8DMD_ATSC_DMD_ID = id;
1214 
1215     bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_TS_INTERFACE_CONFIG, NULL);
1216     DMD_UNLOCK();
1217 
1218     return bRet;
1219 }
1220 
1221 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_IIC_BYPASS_MODE(MS_U8 id,MS_BOOL bEnable)1222 MS_BOOL _MDrv_DMD_ATSC_MD_IIC_BYPASS_MODE(MS_U8 id, MS_BOOL bEnable)
1223 #else
1224 MS_BOOL MDrv_DMD_ATSC_MD_IIC_BYPASS_MODE(MS_U8 id, MS_BOOL bEnable)
1225 #endif
1226 {
1227     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
1228     MS_BOOL bRet = TRUE;
1229 
1230     DMD_LOCK();
1231     u8DMD_ATSC_DMD_ID = id;
1232 
1233     bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_IIC_Bypass_Mode, &bEnable);
1234     DMD_UNLOCK();
1235 
1236     return bRet;
1237 }
1238 
1239 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_SWITCH_SSPI_GPIO(MS_U8 id,MS_BOOL bEnable)1240 MS_BOOL _MDrv_DMD_ATSC_MD_SWITCH_SSPI_GPIO(MS_U8 id, MS_BOOL bEnable)
1241 #else
1242 MS_BOOL MDrv_DMD_ATSC_MD_SWITCH_SSPI_GPIO(MS_U8 id, MS_BOOL bEnable)
1243 #endif
1244 {
1245     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
1246     MS_BOOL bRet = TRUE;
1247 
1248     DMD_LOCK();
1249     u8DMD_ATSC_DMD_ID = id;
1250 
1251     bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_SSPI_TO_GPIO, &bEnable);
1252     DMD_UNLOCK();
1253 
1254     return bRet;
1255 }
1256 
1257 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_GPIO_GET_LEVEL(MS_U8 id,MS_U8 u8Pin,MS_BOOL * bLevel)1258 MS_BOOL _MDrv_DMD_ATSC_MD_GPIO_GET_LEVEL(MS_U8 id, MS_U8 u8Pin, MS_BOOL *bLevel)
1259 #else
1260 MS_BOOL MDrv_DMD_ATSC_MD_GPIO_GET_LEVEL(MS_U8 id, MS_U8 u8Pin, MS_BOOL *bLevel)
1261 #endif
1262 {
1263     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
1264     DMD_ATSC_GPIO_PIN_DATA sPin;
1265     MS_BOOL bRet = TRUE;
1266 
1267     sPin.u8Pin = u8Pin;
1268 
1269     DMD_LOCK();
1270     u8DMD_ATSC_DMD_ID = id;
1271 
1272     bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_GPIO_GET_LEVEL, &sPin);
1273     DMD_UNLOCK();
1274 
1275     *bLevel = sPin.bLevel;
1276 
1277     return bRet;
1278 }
1279 
1280 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_GPIO_SET_LEVEL(MS_U8 id,MS_U8 u8Pin,MS_BOOL bLevel)1281 MS_BOOL _MDrv_DMD_ATSC_MD_GPIO_SET_LEVEL(MS_U8 id, MS_U8 u8Pin, MS_BOOL bLevel)
1282 #else
1283 MS_BOOL MDrv_DMD_ATSC_MD_GPIO_SET_LEVEL(MS_U8 id, MS_U8 u8Pin, MS_BOOL bLevel)
1284 #endif
1285 {
1286     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
1287     DMD_ATSC_GPIO_PIN_DATA sPin;
1288     MS_BOOL bRet = TRUE;
1289 
1290     sPin.u8Pin  = u8Pin;
1291     sPin.bLevel = bLevel;
1292 
1293     DMD_LOCK();
1294     u8DMD_ATSC_DMD_ID = id;
1295 
1296     bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_GPIO_SET_LEVEL, &sPin);
1297     DMD_UNLOCK();
1298 
1299     return bRet;
1300 }
1301 
1302 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_GPIO_OUT_ENABLE(MS_U8 id,MS_U8 u8Pin,MS_BOOL bEnableOut)1303 MS_BOOL _MDrv_DMD_ATSC_MD_GPIO_OUT_ENABLE(MS_U8 id, MS_U8 u8Pin, MS_BOOL bEnableOut)
1304 #else
1305 MS_BOOL MDrv_DMD_ATSC_MD_GPIO_OUT_ENABLE(MS_U8 id, MS_U8 u8Pin, MS_BOOL bEnableOut)
1306 #endif
1307 {
1308     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
1309     DMD_ATSC_GPIO_PIN_DATA sPin;
1310     MS_BOOL bRet = TRUE;
1311 
1312     sPin.u8Pin  = u8Pin;
1313     sPin.bIsOut = bEnableOut;
1314 
1315     DMD_LOCK();
1316     u8DMD_ATSC_DMD_ID = id;
1317 
1318     bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_GPIO_OUT_ENABLE, &sPin);
1319     DMD_UNLOCK();
1320 
1321     return bRet;
1322 }
1323 
1324 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_DoIQSwap(MS_U8 id,MS_BOOL bIsQPad)1325 MS_BOOL _MDrv_DMD_ATSC_MD_DoIQSwap(MS_U8 id, MS_BOOL bIsQPad)
1326 #else
1327 MS_BOOL MDrv_DMD_ATSC_MD_DoIQSwap(MS_U8 id, MS_BOOL bIsQPad)
1328 #endif
1329 {
1330     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
1331     MS_BOOL bRet = TRUE;
1332 
1333     DMD_LOCK();
1334     u8DMD_ATSC_DMD_ID = id;
1335 
1336     bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_DoIQSwap, &bIsQPad);
1337     DMD_UNLOCK();
1338 
1339     return bRet;
1340 }
1341 
1342 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_GetReg(MS_U8 id,MS_U16 u16Addr,MS_U8 * pu8Data)1343 MS_BOOL _MDrv_DMD_ATSC_MD_GetReg(MS_U8 id, MS_U16 u16Addr, MS_U8 *pu8Data)
1344 #else
1345 MS_BOOL MDrv_DMD_ATSC_MD_GetReg(MS_U8 id, MS_U16 u16Addr, MS_U8 *pu8Data)
1346 #endif
1347 {
1348     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
1349     DMD_ATSC_REG_DATA reg;
1350     MS_BOOL bRet = TRUE;
1351 
1352     reg.u16Addr = u16Addr;
1353 
1354     DMD_LOCK();
1355     u8DMD_ATSC_DMD_ID = id;
1356 
1357     bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_GET_REG, &reg);
1358     DMD_UNLOCK();
1359 
1360     *pu8Data = reg.u8Data;
1361 
1362     return bRet;
1363 }
1364 
1365 #ifdef UTPA2
_MDrv_DMD_ATSC_MD_SetReg(MS_U8 id,MS_U16 u16Addr,MS_U8 u8Data)1366 MS_BOOL _MDrv_DMD_ATSC_MD_SetReg(MS_U8 id, MS_U16 u16Addr, MS_U8 u8Data)
1367 #else
1368 MS_BOOL MDrv_DMD_ATSC_MD_SetReg(MS_U8 id, MS_U16 u16Addr, MS_U8 u8Data)
1369 #endif
1370 {
1371     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + id;
1372     DMD_ATSC_REG_DATA reg;
1373     MS_BOOL bRet = TRUE;
1374 
1375     reg.u16Addr = u16Addr;
1376     reg.u8Data  = u8Data;
1377 
1378     DMD_LOCK();
1379     u8DMD_ATSC_DMD_ID = id;
1380 
1381     bRet = pRes->sDMD_ATSC_PriData.HAL_DMD_ATSC_IOCTL_CMD(DMD_ATSC_HAL_CMD_SET_REG, &reg);
1382     DMD_UNLOCK();
1383 
1384     return bRet;
1385 }
1386 
1387 #ifdef UTPA2
1388 
1389 ////////////////////////////////////////////////////////////////////////////////
1390 ///                              UTOPIA 2K API                               ///
1391 ////////////////////////////////////////////////////////////////////////////////
1392 #ifndef MSOS_TYPE_LINUX_KERNEL
1393 
1394 #ifndef MSOS_TYPE_LINUX
1395 static const float _LogApproxTableX[80] =
1396 { 1.00, 1.30, 1.69, 2.20, 2.86, 3.71, 4.83, 6.27, 8.16, 10.60, 13.79,
1397   17.92, 23.30, 30.29, 39.37, 51.19, 66.54, 86.50, 112.46, 146.19,
1398   190.05, 247.06, 321.18, 417.54, 542.80, 705.64, 917.33, 1192.53,
1399   1550.29, 2015.38, 2620.00, 3405.99, 4427.79, 5756.13, 7482.97,
1400   9727.86, 12646.22, 16440.08, 21372.11, 27783.74, 36118.86,
1401   46954.52, 61040.88, 79353.15, 103159.09, 134106.82, 174338.86,
1402   226640.52, 294632.68, 383022.48, 497929.22, 647307.99, 841500.39, 1093950.50,
1403   1422135.65, 1848776.35, 2403409.25, 3124432.03, 4061761.64, 5280290.13,
1404   6864377.17, 8923690.32, 11600797.42, 15081036.65, 19605347.64, 25486951.94,
1405   33133037.52, 43072948.77, 55994833.40, 72793283.42, 94631268.45,
1406   123020648.99, 159926843.68, 207904896.79, 270276365.82, 351359275.57,
1407   456767058.24, 593797175.72, 771936328.43, 1003517226.96
1408 };
1409 
1410 static const float _LogApproxTableY[80] =
1411 { 0.00, 0.11, 0.23, 0.34, 0.46, 0.57, 0.68, 0.80, 0.91, 1.03, 1.14, 1.25,
1412   1.37, 1.48, 1.60, 1.71, 1.82, 1.94, 2.05, 2.16, 2.28, 2.39, 2.51, 2.62,
1413   2.73, 2.85, 2.96, 3.08, 3.19, 3.30, 3.42, 3.53, 3.65, 3.76, 3.87, 3.99,
1414   4.10, 4.22, 4.33, 4.44, 4.56, 4.67, 4.79, 4.90, 5.01, 5.13, 5.24, 5.36,
1415   5.47, 5.58, 5.70, 5.81, 5.93, 6.04, 6.15, 6.27, 6.04, 6.15, 6.27, 6.38,
1416   6.49, 6.61, 6.72, 6.84, 6.95, 7.06, 7.18, 7.29, 7.41, 7.52, 7.63, 7.75,
1417   7.86, 7.98, 8.09, 8.20, 8.32, 8.43, 8.55, 8.66
1418 };
1419 
Log10Approx(float flt_x)1420 static float Log10Approx(float flt_x)
1421 {
1422     MS_U8  indx = 0;
1423 
1424     do {
1425         if (flt_x < _LogApproxTableX[indx])
1426             break;
1427         indx++;
1428     }while (indx < 79);   //stop at indx = 80
1429 
1430     return _LogApproxTableY[indx];
1431 }
1432 #endif // #ifndef MSOS_TYPE_LINUX
1433 
MDrv_DMD_ATSC_SetDbgLevel(DMD_ATSC_DbgLv u8DbgLevel)1434 MS_BOOL MDrv_DMD_ATSC_SetDbgLevel(DMD_ATSC_DbgLv u8DbgLevel)
1435 {
1436     ATSC_DBG_LEVEL_PARAM DbgLevelParam = {0};
1437 
1438     if (!_u32ATSCopen) return FALSE;
1439 
1440     DbgLevelParam.u8DbgLevel = u8DbgLevel;
1441 
1442     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_SetDbgLevel, &DbgLevelParam) == UTOPIA_STATUS_SUCCESS)
1443     {
1444         return TRUE;
1445     }
1446     else
1447     {
1448         return FALSE;
1449     }
1450 }
1451 
MDrv_DMD_ATSC_GetInfo(void)1452 DMD_ATSC_Info* MDrv_DMD_ATSC_GetInfo(void)
1453 {
1454     ATSC_GET_INFO_PARAM GetInfoParam = {0};
1455 
1456     if (!_u32ATSCopen) return NULL;
1457 
1458     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_GetInfo, &GetInfoParam) == UTOPIA_STATUS_SUCCESS)
1459     {
1460         return GetInfoParam.pInfo;
1461     }
1462     else
1463     {
1464         return NULL;
1465     }
1466 }
1467 
MDrv_DMD_ATSC_GetLibVer(const MSIF_Version ** ppVersion)1468 MS_BOOL MDrv_DMD_ATSC_GetLibVer(const MSIF_Version **ppVersion)
1469 {
1470     ATSC_GET_LIB_VER_PARAM GetLibVerParam = {0};
1471 
1472     if (!_u32ATSCopen) return FALSE;
1473 
1474     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_GetLibVer, &GetLibVerParam) == UTOPIA_STATUS_SUCCESS)
1475     {
1476         //*ppVersion = *GetLibVerParam.ppVersion;
1477         *ppVersion = NULL;
1478 
1479         return TRUE;
1480     }
1481     else
1482     {
1483         return FALSE;
1484     }
1485 }
1486 
MDrv_DMD_ATSC_MD_Init(MS_U8 id,DMD_ATSC_InitData * pDMD_ATSC_InitData,MS_U32 u32InitDataLen)1487 MS_BOOL MDrv_DMD_ATSC_MD_Init(MS_U8 id, DMD_ATSC_InitData *pDMD_ATSC_InitData, MS_U32 u32InitDataLen)
1488 {
1489     void* pAttribte = NULL;
1490     ATSC_INIT_PARAM InitParam = {0};
1491 
1492     if (_u32ATSCopen == 0)
1493     {
1494         if (UtopiaOpen(MODULE_ATSC /*| KERNEL_MODE*/, &_ppATSCInstant, 0, pAttribte) == UTOPIA_STATUS_SUCCESS)
1495             _u32ATSCopen = 1;
1496         else
1497         {
1498             return FALSE;
1499         }
1500     }
1501 
1502     if (!_u32ATSCopen) return FALSE;
1503 
1504     InitParam.id = id;
1505     InitParam.pDMD_ATSC_InitData = pDMD_ATSC_InitData;
1506     InitParam.u32InitDataLen = u32InitDataLen;
1507 
1508     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_Init, &InitParam) == UTOPIA_STATUS_SUCCESS)
1509     {
1510         return TRUE;
1511     }
1512     else
1513     {
1514         return FALSE;
1515     }
1516 }
1517 
MDrv_DMD_ATSC_MD_Exit(MS_U8 id)1518 MS_BOOL MDrv_DMD_ATSC_MD_Exit(MS_U8 id)
1519 {
1520     ATSC_ID_PARAM IdParam = {0};
1521 
1522     if (!_u32ATSCopen) return FALSE;
1523 
1524     IdParam.id = id;
1525 
1526     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_Exit, &IdParam) == UTOPIA_STATUS_SUCCESS)
1527     {
1528 
1529         return TRUE;
1530     }
1531     else
1532     {
1533         return FALSE;
1534     }
1535 }
1536 
MDrv_DMD_ATSC_MD_GetConfig(MS_U8 id,DMD_ATSC_InitData * psDMD_ATSC_InitData)1537 MS_U32 MDrv_DMD_ATSC_MD_GetConfig(MS_U8 id, DMD_ATSC_InitData *psDMD_ATSC_InitData)
1538 {
1539 	ATSC_INIT_PARAM InitParam = {0};
1540 
1541 	if (!_u32ATSCopen) return FALSE;
1542 
1543 	InitParam.id = id;
1544 	InitParam.pDMD_ATSC_InitData = psDMD_ATSC_InitData;
1545 
1546 	if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_GetConfig, &InitParam) == UTOPIA_STATUS_SUCCESS)
1547   	{
1548   	    return UTOPIA_STATUS_SUCCESS;
1549   	}
1550   	else
1551 	{
1552 		return UTOPIA_STATUS_ERR_NOT_AVAIL;
1553 	}
1554 }
1555 
MDrv_DMD_ATSC_MD_SetConfig(MS_U8 id,DMD_ATSC_DEMOD_TYPE eType,MS_BOOL bEnable)1556 MS_BOOL MDrv_DMD_ATSC_MD_SetConfig(MS_U8 id, DMD_ATSC_DEMOD_TYPE eType, MS_BOOL bEnable)
1557 {
1558     ATSC_SET_CONFIG_PARAM SetConfigParam = {0};
1559 
1560     if (!_u32ATSCopen) return FALSE;
1561 
1562     SetConfigParam.id = id;
1563     SetConfigParam.eType = eType;
1564     SetConfigParam.bEnable = bEnable;
1565 
1566     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_SetConfig, &SetConfigParam) == UTOPIA_STATUS_SUCCESS)
1567     {
1568         return TRUE;
1569     }
1570     else
1571     {
1572         return FALSE;
1573     }
1574 }
1575 
MDrv_DMD_ATSC_MD_SetReset(MS_U8 id)1576 MS_BOOL MDrv_DMD_ATSC_MD_SetReset(MS_U8 id)
1577 {
1578     ATSC_ID_PARAM IdParam = {0};
1579 
1580     if (!_u32ATSCopen) return FALSE;
1581 
1582     IdParam.id = id;
1583 
1584     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_SetReset, &IdParam) == UTOPIA_STATUS_SUCCESS)
1585     {
1586         return TRUE;
1587     }
1588     else
1589     {
1590         return FALSE;
1591     }
1592 }
1593 
MDrv_DMD_ATSC_MD_Set_QAM_SR(MS_U8 id,DMD_ATSC_DEMOD_TYPE eType,MS_U16 symbol_rate)1594 MS_BOOL MDrv_DMD_ATSC_MD_Set_QAM_SR(MS_U8 id, DMD_ATSC_DEMOD_TYPE eType, MS_U16 symbol_rate)
1595 {
1596     ATSC_SET_QAM_SR_PARAM SetQamSrParam = {0};
1597 
1598     if (!_u32ATSCopen) return FALSE;
1599 
1600     SetQamSrParam.id = id;
1601     SetQamSrParam.eType = eType;
1602     SetQamSrParam.symbol_rate = symbol_rate;
1603 
1604     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_Set_QAM_SR, &SetQamSrParam) == UTOPIA_STATUS_SUCCESS)
1605     {
1606         return TRUE;
1607     }
1608     else
1609     {
1610         return FALSE;
1611     }
1612 }
1613 
MDrv_DMD_ATSC_MD_SetActive(MS_U8 id,MS_BOOL bEnable)1614 MS_BOOL MDrv_DMD_ATSC_MD_SetActive(MS_U8 id, MS_BOOL bEnable)
1615 {
1616     ATSC_SET_ACTIVE_PARAM SetActiveParam = {0};
1617 
1618     if (!_u32ATSCopen) return FALSE;
1619 
1620     SetActiveParam.id = id;
1621     SetActiveParam.bEnable = bEnable;
1622 
1623     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_SetActive, &SetActiveParam) == UTOPIA_STATUS_SUCCESS)
1624     {
1625         return TRUE;
1626     }
1627     else
1628     {
1629         return FALSE;
1630     }
1631 }
1632 
1633 #if DMD_ATSC_STR_EN
MDrv_DMD_ATSC_MD_SetPowerState(MS_U8 id,EN_POWER_MODE u16PowerState)1634 MS_U32 MDrv_DMD_ATSC_MD_SetPowerState(MS_U8 id, EN_POWER_MODE u16PowerState)
1635 {
1636     ATSC_SET_POWER_STATE_PARAM SetPowerStateParam = {0};
1637 
1638     if (!_u32ATSCopen) return FALSE;
1639 
1640     SetPowerStateParam.id = id;
1641     SetPowerStateParam.u16PowerState = u16PowerState;
1642 
1643     return UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_SetPowerState, &SetPowerStateParam);
1644 }
1645 #endif
1646 
MDrv_DMD_ATSC_MD_GetLock(MS_U8 id,DMD_ATSC_GETLOCK_TYPE eType)1647 DMD_ATSC_LOCK_STATUS MDrv_DMD_ATSC_MD_GetLock(MS_U8 id, DMD_ATSC_GETLOCK_TYPE eType)
1648 {
1649     ATSC_GET_LOCK_PARAM GetLockParam = {0};
1650 
1651     if (!_u32ATSCopen) return DMD_ATSC_NULL;
1652 
1653     GetLockParam.id = id;
1654     GetLockParam.eType = eType;
1655 
1656     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_GetLock, &GetLockParam) == UTOPIA_STATUS_SUCCESS)
1657     {
1658         return GetLockParam.status;
1659     }
1660     else
1661     {
1662         return DMD_ATSC_NULL;
1663     }
1664 }
1665 
MDrv_DMD_ATSC_MD_GetModulationMode(MS_U8 id)1666 DMD_ATSC_DEMOD_TYPE MDrv_DMD_ATSC_MD_GetModulationMode(MS_U8 id)
1667 {
1668     ATSC_GET_MODULATION_MODE_PARAM GetModulationModeParam = {0};
1669 
1670     if (!_u32ATSCopen) return FALSE;
1671 
1672     GetModulationModeParam.id = id;
1673 
1674     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_GetModulationMode, &GetModulationModeParam) == UTOPIA_STATUS_SUCCESS)
1675     {
1676         return GetModulationModeParam.eType;
1677     }
1678     else
1679     {
1680         return DMD_ATSC_DEMOD_NULL;
1681     }
1682 }
1683 
MDrv_DMD_ATSC_MD_GetSignalStrength(MS_U8 id,MS_U16 * u16Strength)1684 MS_BOOL MDrv_DMD_ATSC_MD_GetSignalStrength(MS_U8 id, MS_U16 *u16Strength)
1685 {
1686     ATSC_GET_SIGNAL_STRENGTH_PARAM GetSignalStrengthParam = {0};
1687 
1688     if (!_u32ATSCopen) return FALSE;
1689 
1690     GetSignalStrengthParam.id = id;
1691 
1692     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_GetSignalStrength, &GetSignalStrengthParam) == UTOPIA_STATUS_SUCCESS)
1693     {
1694         *u16Strength = GetSignalStrengthParam.u16Strength;
1695 
1696         return TRUE;
1697     }
1698     else
1699     {
1700         return FALSE;
1701     }
1702 }
1703 
MDrv_DMD_ATSC_MD_GetSignalQuality(MS_U8 id)1704 DMD_ATSC_SIGNAL_CONDITION MDrv_DMD_ATSC_MD_GetSignalQuality(MS_U8 id)
1705 {
1706     ATSC_GET_SIGNAL_QUALITY_PARAM GetSignalQualityParam = {0};
1707 
1708     if (!_u32ATSCopen) return FALSE;
1709 
1710     GetSignalQualityParam.id = id;
1711 
1712     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_GetSignalQuality, &GetSignalQualityParam) == UTOPIA_STATUS_SUCCESS)
1713     {
1714         return GetSignalQualityParam.eQuality;
1715     }
1716     else
1717     {
1718         return DMD_ATSC_SIGNAL_NO;
1719     }
1720 }
1721 
MDrv_DMD_ATSC_MD_GetSNRPercentage(MS_U8 id)1722 MS_U8 MDrv_DMD_ATSC_MD_GetSNRPercentage(MS_U8 id)
1723 {
1724     ATSC_GET_SNR_PERCENTAGE_PARAM GetSnrPercentageParam = {0};
1725 
1726     if (!_u32ATSCopen) return FALSE;
1727 
1728     GetSnrPercentageParam.id = id;
1729 
1730     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_GetSNRPercentage, &GetSnrPercentageParam) == UTOPIA_STATUS_SUCCESS)
1731     {
1732         return GetSnrPercentageParam.u8Percentage;
1733     }
1734     else
1735     {
1736         return 0;
1737     }
1738 }
1739 
MDrv_DMD_ATSC_MD_GET_QAM_SNR(MS_U8 id,float * f_snr)1740 MS_BOOL MDrv_DMD_ATSC_MD_GET_QAM_SNR(MS_U8 id, float *f_snr)
1741 {
1742     ATSC_GET_SNR_PARAM GetSnrParam = {0};
1743 
1744     if (!_u32ATSCopen) return FALSE;
1745 
1746     GetSnrParam.id = id;
1747 
1748     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_GET_QAM_SNR, &GetSnrParam) == UTOPIA_STATUS_SUCCESS)
1749     {
1750         #ifdef MSOS_TYPE_LINUX
1751         *f_snr = 10.0f*log10f(((float)GetSnrParam.snr.sym_num)/(float)(GetSnrParam.snr.noisepower+1));
1752         #else
1753         *f_snr = 10.0f*Log10Approx(((float)GetSnrParam.snr.sym_num)/(float)(GetSnrParam.snr.noisepower+1));
1754         #endif
1755 
1756         return TRUE;
1757     }
1758     else
1759     {
1760         *f_snr = 0;
1761 
1762         return FALSE;
1763     }
1764 }
1765 
MDrv_DMD_ATSC_MD_Read_uCPKT_ERR(MS_U8 id,MS_U16 * u16PacketErr)1766 MS_BOOL MDrv_DMD_ATSC_MD_Read_uCPKT_ERR(MS_U8 id, MS_U16 *u16PacketErr)
1767 {
1768     ATSC_GET_UCPKT_ERR_PARAM GetUcpktErrParam = {0};
1769 
1770     if (!_u32ATSCopen) return FALSE;
1771 
1772     GetUcpktErrParam.id = id;
1773 
1774     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_Read_uCPKT_ERR, &GetUcpktErrParam) == UTOPIA_STATUS_SUCCESS)
1775     {
1776         *u16PacketErr = GetUcpktErrParam.u16PacketErr;
1777 
1778         return TRUE;
1779     }
1780     else
1781     {
1782         return FALSE;
1783     }
1784 }
1785 
MDrv_DMD_ATSC_MD_GetPreViterbiBer(MS_U8 id,float * ber)1786 MS_BOOL MDrv_DMD_ATSC_MD_GetPreViterbiBer(MS_U8 id, float *ber)
1787 {
1788     ATSC_GET_BER_PARAM GetBerParam = {0};
1789 
1790     if (!_u32ATSCopen) return FALSE;
1791 
1792     GetBerParam.id = id;
1793 
1794     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_GetPreViterbiBer, &GetBerParam) == UTOPIA_STATUS_SUCCESS)
1795     {
1796         *ber = 0;
1797 
1798         return TRUE;
1799     }
1800     else
1801     {
1802         *ber = 0;
1803 
1804         return FALSE;
1805     }
1806 }
1807 
MDrv_DMD_ATSC_MD_GetPostViterbiBer(MS_U8 id,float * ber)1808 MS_BOOL MDrv_DMD_ATSC_MD_GetPostViterbiBer(MS_U8 id, float *ber)
1809 {
1810     ATSC_GET_BER_PARAM GetBerParam = {0};
1811 
1812     if (!_u32ATSCopen) return FALSE;
1813 
1814     GetBerParam.id = id;
1815 
1816     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_GetPostViterbiBer, &GetBerParam) == UTOPIA_STATUS_SUCCESS)
1817     {
1818         if (!GetBerParam.ber.BitErr && !GetBerParam.ber.Error_window && !GetBerParam.ber.Win_unit)
1819             *ber = 0;
1820         else if (GetBerParam.ber.BitErr <=0 )
1821             *ber = 0.5f / ((float)(GetBerParam.ber.Error_window)*(GetBerParam.ber.Win_unit));
1822         else *ber = (float)(GetBerParam.ber.BitErr) / ((float)(GetBerParam.ber.Error_window)*(GetBerParam.ber.Win_unit));
1823 
1824         return TRUE;
1825     }
1826     else
1827     {
1828         *ber = 0;
1829 
1830         return FALSE;
1831     }
1832 }
1833 
MDrv_DMD_ATSC_MD_ReadFrequencyOffset(MS_U8 id,MS_S16 * cfo)1834 MS_BOOL MDrv_DMD_ATSC_MD_ReadFrequencyOffset(MS_U8 id, MS_S16 *cfo)
1835 {
1836     ATSC_READ_FREQ_OFFSET_PARAM ReadFreqOffsetParam = {0};
1837 
1838     if (!_u32ATSCopen) return FALSE;
1839 
1840     ReadFreqOffsetParam.id = id;
1841 
1842     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_ReadFrequencyOffset, &ReadFreqOffsetParam) == UTOPIA_STATUS_SUCCESS)
1843     {
1844         if ((ReadFreqOffsetParam.cfo.Mode & 0x7F) == DMD_ATSC_DEMOD_ATSC_VSB)
1845         {
1846             *cfo = ((float)(-(ReadFreqOffsetParam.cfo.FF))*0.04768);
1847 
1848             if ((MS_U8)(ReadFreqOffsetParam.cfo.Rate) == 0x07)
1849                 *cfo = *cfo - 100;
1850             else if ((MS_U8)(ReadFreqOffsetParam.cfo.Rate) == 0x08)
1851                 *cfo = *cfo - 500;
1852         }
1853         else if (ReadFreqOffsetParam.cfo.Mode & 0x80)
1854         {
1855             if ((ReadFreqOffsetParam.cfo.Mode & 0x7F) == DMD_ATSC_DEMOD_ATSC_256QAM)
1856                 *cfo = (float)((ReadFreqOffsetParam.cfo.FF)*0.0000199); //5.360537E6/2^28*1000
1857             else if ((ReadFreqOffsetParam.cfo.Mode & 0x7F) == DMD_ATSC_DEMOD_ATSC_64QAM)
1858                 *cfo = (float)((ReadFreqOffsetParam.cfo.FF)*0.0000188); //5.056941E6/2^21*1000
1859             else *cfo = 0;
1860 
1861             *cfo = *cfo + (float)((ReadFreqOffsetParam.cfo.Rate)-0x3A07)/330.13018; //(0.001/25.41*2^27/16)???
1862         }
1863         else
1864         {
1865             if ((ReadFreqOffsetParam.cfo.Mode & 0x7F) == DMD_ATSC_DEMOD_ATSC_256QAM)
1866                 *cfo = (float)((ReadFreqOffsetParam.cfo.FF)*0.0025561); //5.360537E6/2^21*1000
1867             else if ((ReadFreqOffsetParam.cfo.Mode & 0x7F) == DMD_ATSC_DEMOD_ATSC_64QAM)
1868                 *cfo = (float)((ReadFreqOffsetParam.cfo.FF)*0.00241134); //5.056941E6/2^21*1000
1869             else *cfo = 0;
1870 
1871             *cfo = *cfo + (float)((ReadFreqOffsetParam.cfo.Rate)-0x3D70)/2.62144; //(0.001/25*2^20/16)
1872         }
1873 
1874         return TRUE;
1875     }
1876     else
1877     {
1878         *cfo = 0;
1879 
1880         return FALSE;
1881     }
1882 }
1883 
MDrv_DMD_ATSC_MD_SetSerialControl(MS_U8 id,MS_U8 u8TsConfigData)1884 MS_BOOL MDrv_DMD_ATSC_MD_SetSerialControl(MS_U8 id, MS_U8 u8TsConfigData)
1885 {
1886     ATSC_SET_SERIAL_CONTROL_PARAM SetSerialControlParam = {0};
1887 
1888     if (!_u32ATSCopen) return FALSE;
1889 
1890     SetSerialControlParam.id = id;
1891     SetSerialControlParam.u8TsConfigData = u8TsConfigData;
1892 
1893     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_SetSerialControl, &SetSerialControlParam) == UTOPIA_STATUS_SUCCESS)
1894     {
1895         return TRUE;
1896     }
1897     else
1898     {
1899         return FALSE;
1900     }
1901 }
1902 
MDrv_DMD_ATSC_MD_IIC_BYPASS_MODE(MS_U8 id,MS_BOOL bEnable)1903 MS_BOOL MDrv_DMD_ATSC_MD_IIC_BYPASS_MODE(MS_U8 id, MS_BOOL bEnable)
1904 {
1905     ATSC_IIC_BYPASS_MODE_PARAM IicBypassModeParam = {0};
1906 
1907     if (!_u32ATSCopen) return FALSE;
1908 
1909     IicBypassModeParam.id = id;
1910     IicBypassModeParam.bEnable = bEnable;
1911 
1912     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_IIC_BYPASS_MODE, &IicBypassModeParam) == UTOPIA_STATUS_SUCCESS)
1913     {
1914         return TRUE;
1915     }
1916     else
1917     {
1918         return FALSE;
1919     }
1920 }
1921 
MDrv_DMD_ATSC_MD_SWITCH_SSPI_GPIO(MS_U8 id,MS_BOOL bEnable)1922 MS_BOOL MDrv_DMD_ATSC_MD_SWITCH_SSPI_GPIO(MS_U8 id, MS_BOOL bEnable)
1923 {
1924     ATSC_SWITCH_SSPI_GPIO_PARAM SwitchSspiGpioParam = {0};
1925 
1926     if (!_u32ATSCopen) return FALSE;
1927 
1928     SwitchSspiGpioParam.id = id;
1929     SwitchSspiGpioParam.bEnable = bEnable;
1930 
1931     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_SWITCH_SSPI_GPIO, &SwitchSspiGpioParam) == UTOPIA_STATUS_SUCCESS)
1932     {
1933         return TRUE;
1934     }
1935     else
1936     {
1937         return FALSE;
1938     }
1939 }
1940 
MDrv_DMD_ATSC_MD_GPIO_GET_LEVEL(MS_U8 id,MS_U8 u8Pin,MS_BOOL * bLevel)1941 MS_BOOL MDrv_DMD_ATSC_MD_GPIO_GET_LEVEL(MS_U8 id, MS_U8 u8Pin, MS_BOOL *bLevel)
1942 {
1943     ATSC_GPIO_LEVEL_PARAM GpioLevelParam = {0};
1944 
1945     if (!_u32ATSCopen) return FALSE;
1946 
1947     GpioLevelParam.id = id;
1948     GpioLevelParam.u8Pin = u8Pin;
1949 
1950     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_GPIO_GET_LEVEL, &GpioLevelParam) == UTOPIA_STATUS_SUCCESS)
1951     {
1952         *bLevel = GpioLevelParam.bLevel;
1953 
1954         return TRUE;
1955     }
1956     else
1957     {
1958         return FALSE;
1959     }
1960 }
1961 
MDrv_DMD_ATSC_MD_GPIO_SET_LEVEL(MS_U8 id,MS_U8 u8Pin,MS_BOOL bLevel)1962 MS_BOOL MDrv_DMD_ATSC_MD_GPIO_SET_LEVEL(MS_U8 id, MS_U8 u8Pin, MS_BOOL bLevel)
1963 {
1964     ATSC_GPIO_LEVEL_PARAM GpioLevelParam = {0};
1965 
1966     if (!_u32ATSCopen) return FALSE;
1967 
1968     GpioLevelParam.id = id;
1969     GpioLevelParam.u8Pin = u8Pin;
1970     GpioLevelParam.bLevel = bLevel;
1971 
1972     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_GPIO_SET_LEVEL, &GpioLevelParam) == UTOPIA_STATUS_SUCCESS)
1973     {
1974         return TRUE;
1975     }
1976     else
1977     {
1978         return FALSE;
1979     }
1980 }
1981 
MDrv_DMD_ATSC_MD_GPIO_OUT_ENABLE(MS_U8 id,MS_U8 u8Pin,MS_BOOL bEnableOut)1982 MS_BOOL MDrv_DMD_ATSC_MD_GPIO_OUT_ENABLE(MS_U8 id, MS_U8 u8Pin, MS_BOOL bEnableOut)
1983 {
1984     ATSC_GPIO_OUT_ENABLE_PARAM GpioOutEnableParam = {0};
1985 
1986     if (!_u32ATSCopen) return FALSE;
1987 
1988     GpioOutEnableParam.id = id;
1989     GpioOutEnableParam.u8Pin = u8Pin;
1990     GpioOutEnableParam.bEnableOut = bEnableOut;
1991 
1992     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_GPIO_OUT_ENABLE, &GpioOutEnableParam) == UTOPIA_STATUS_SUCCESS)
1993     {
1994         return TRUE;
1995     }
1996     else
1997     {
1998         return FALSE;
1999     }
2000 }
2001 
MDrv_DMD_ATSC_MD_DoIQSwap(MS_U8 id,MS_BOOL bIsQPad)2002 MS_BOOL MDrv_DMD_ATSC_MD_DoIQSwap(MS_U8 id, MS_BOOL bIsQPad)
2003 {
2004     ATSC_DO_IQ_SWAP_PARAM DoIQSwapParam = {0};
2005 
2006     if (!_u32ATSCopen) return FALSE;
2007 
2008     DoIQSwapParam.id = id;
2009     DoIQSwapParam.bIsQPad = bIsQPad;
2010 
2011     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_DoIQSwap, &DoIQSwapParam) == UTOPIA_STATUS_SUCCESS)
2012     {
2013         return TRUE;
2014     }
2015     else
2016     {
2017         return FALSE;
2018     }
2019 }
2020 
MDrv_DMD_ATSC_MD_GetReg(MS_U8 id,MS_U16 u16Addr,MS_U8 * pu8Data)2021 MS_BOOL MDrv_DMD_ATSC_MD_GetReg(MS_U8 id, MS_U16 u16Addr, MS_U8 *pu8Data)
2022 {
2023     ATSC_REG_PARAM RegParam = {0};
2024 
2025     if (!_u32ATSCopen) return FALSE;
2026 
2027     RegParam.id = id;
2028     RegParam.u16Addr = u16Addr;
2029 
2030     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_GetReg, &RegParam) == UTOPIA_STATUS_SUCCESS)
2031     {
2032         *pu8Data = RegParam.u8Data;
2033 
2034         return TRUE;
2035     }
2036     else
2037     {
2038         return FALSE;
2039     }
2040 }
2041 
MDrv_DMD_ATSC_MD_SetReg(MS_U8 id,MS_U16 u16Addr,MS_U8 u8Data)2042 MS_BOOL MDrv_DMD_ATSC_MD_SetReg(MS_U8 id, MS_U16 u16Addr, MS_U8 u8Data)
2043 {
2044     ATSC_REG_PARAM RegParam = {0};
2045 
2046     if (!_u32ATSCopen) return FALSE;
2047 
2048     RegParam.id = id;
2049     RegParam.u16Addr = u16Addr;
2050     RegParam.u8Data = u8Data;
2051 
2052     if (UtopiaIoctl(_ppATSCInstant, DMD_ATSC_DRV_CMD_MD_SetReg, &RegParam) == UTOPIA_STATUS_SUCCESS)
2053     {
2054         return TRUE;
2055     }
2056     else
2057     {
2058         return FALSE;
2059     }
2060 }
2061 
2062 #endif // #ifndef MSOS_TYPE_LINUX_KERNEL
2063 
2064 #endif // #ifdef UTPA2
2065