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