xref: /utopia/UTPA2-700.0.x/modules/demodulator/drv/demod/drvDMD_ATSC_v2.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_v2.c
99 /// @brief  DMD ATSC Driver Interface
100 /// @author MStar Semiconductor Inc.
101 ///////////////////////////////////////////////////////////////////////////////////////////////////
102 
103 //-------------------------------------------------------------------------------------------------
104 //  Include Files
105 //-------------------------------------------------------------------------------------------------
106 
107 #ifdef MSOS_TYPE_LINUX_KERNEL
108 #include <linux/string.h>
109 #else
110 #include <string.h>
111 #include <stdio.h>
112 #endif
113 
114 #include "utopia.h"
115 #include "utopia_dapi.h"
116 
117 #include "drvDMD_ATSC_v2.h"
118 
119 //-------------------------------------------------------------------------------------------------
120 //  Driver Compiler Options
121 //-------------------------------------------------------------------------------------------------
122 
123 
124 //-------------------------------------------------------------------------------------------------
125 //  Local Defines
126 //-------------------------------------------------------------------------------------------------
127 
128 #ifdef MS_DEBUG
129 #define DMD_DBG(x)          (x)
130 #else
131 #define DMD_DBG(x)          //(x)
132 #endif
133 
134 //-------------------------------------------------------------------------------------------------
135 //  Local Structurs
136 //-------------------------------------------------------------------------------------------------
137 
138 typedef enum _ATSC_POOL_ID
139 {
140     ATSC_POOL_ID_DMD0 = 0
141 } ATSC_POOL_ID;
142 
143 typedef struct DLL_PACKED _ATSC_RESOURCE_PRIVATE
144 {
145     DMD_ATSC_ResData sDMD_ATSC_ResData[DMD_ATSC_MAX_DEMOD_NUM];
146 } ATSC_RESOURCE_PRIVATE, *PATSC_RESOURCE_PRIVATE;
147 
148 #ifdef UTPA2
149 
150 typedef MS_BOOL                   (*IOCTL_ATSC_SetDbgLevel)(DMD_ATSC_DbgLv);
151 typedef DMD_ATSC_Info*            (*IOCTL_ATSC_GetInfo)(void);
152 typedef MS_BOOL                   (*IOCTL_ATSC_GetLibVer)(const MSIF_Version**);
153 typedef MS_BOOL                   (*IOCTL_ATSC_Init)(MS_U8, DMD_ATSC_InitData*, MS_U32);
154 typedef MS_BOOL                   (*IOCTL_ATSC_Exit)(MS_U8);
155 typedef MS_U32                    (*IOCTL_ATSC_GetConfig)(MS_U8, DMD_ATSC_InitData*);
156 typedef MS_BOOL                   (*IOCTL_ATSC_SetConfig)(MS_U8, DMD_ATSC_DEMOD_TYPE, MS_BOOL);
157 typedef MS_BOOL                   (*IOCTL_ATSC_SetReset)(MS_U8);
158 typedef MS_BOOL                   (*IOCTL_ATSC_Set_QAM_SR)(MS_U8, DMD_ATSC_DEMOD_TYPE, MS_U16);
159 typedef MS_BOOL                   (*IOCTL_ATSC_SetActive)(MS_U8, MS_BOOL);
160 typedef MS_U32                    (*IOCTL_ATSC_SetPowerState)(MS_U8, EN_POWER_MODE);
161 typedef DMD_ATSC_LOCK_STATUS      (*IOCTL_ATSC_GetLock)(MS_U8, DMD_ATSC_GETLOCK_TYPE);
162 typedef DMD_ATSC_DEMOD_TYPE       (*IOCTL_ATSC_GetModulationMode)(MS_U8);
163 typedef MS_BOOL                   (*IOCTL_ATSC_GetSignalStrength)(MS_U8, MS_U16*);
164 typedef DMD_ATSC_SIGNAL_CONDITION (*IOCTL_ATSC_GetSignalQuality)(MS_U8);
165 typedef MS_U8                     (*IOCTL_ATSC_GetSNRPercentage)(MS_U8);
166 typedef MS_BOOL                   (*IOCTL_ATSC_GET_QAM_SNR)(MS_U8, DMD_ATSC_SNR_DATA*);
167 typedef MS_BOOL                   (*IOCTL_ATSC_Read_uCPKT_ERR)(MS_U8, MS_U16*);
168 typedef MS_BOOL                   (*IOCTL_ATSC_GetPreViterbiBer)(MS_U8, DMD_ATSC_BER_DATA*);
169 typedef MS_BOOL                   (*IOCTL_ATSC_GetPostViterbiBer)(MS_U8, DMD_ATSC_BER_DATA*);
170 typedef MS_BOOL                   (*IOCTL_ATSC_ReadFrequencyOffset)(MS_U8, DMD_ATSC_CFO_DATA*);
171 typedef MS_BOOL                   (*IOCTL_ATSC_SetSerialControl)(MS_U8, MS_U8);
172 typedef MS_BOOL                   (*IOCTL_ATSC_IIC_BYPASS_MODE)(MS_U8, MS_BOOL);
173 typedef MS_BOOL                   (*IOCTL_ATSC_SWITCH_SSPI_GPIO)(MS_U8, MS_BOOL);
174 typedef MS_BOOL                   (*IOCTL_ATSC_GPIO_GET_LEVEL)(MS_U8, MS_U8, MS_BOOL*);
175 typedef MS_BOOL                   (*IOCTL_ATSC_GPIO_SET_LEVEL)(MS_U8, MS_U8, MS_BOOL);
176 typedef MS_BOOL                   (*IOCTL_ATSC_GPIO_OUT_ENABLE)(MS_U8, MS_U8, MS_BOOL);
177 typedef MS_BOOL                   (*IOCTL_ATSC_DO_IQ_SWAP)(MS_U8, MS_BOOL);
178 typedef MS_BOOL                   (*IOCTL_ATSC_GetReg)(MS_U8, MS_U16, MS_U8*);
179 typedef MS_BOOL                   (*IOCTL_ATSC_SetReg)(MS_U8, MS_U16, MS_U8);
180 
181 typedef struct _ATSC_INSTANT_PRIVATE
182 {
183     IOCTL_ATSC_SetDbgLevel              fpSetDbgLevel;
184     IOCTL_ATSC_GetInfo                  fpGetInfo;
185     IOCTL_ATSC_GetLibVer                fpGetLibVer;
186     IOCTL_ATSC_Init                     fpInit;
187     IOCTL_ATSC_Exit                     fpExit;
188     IOCTL_ATSC_GetConfig                fpGetConfig;
189     IOCTL_ATSC_SetConfig                fpSetConfig;
190     IOCTL_ATSC_SetReset                 fpSetReset;
191     IOCTL_ATSC_Set_QAM_SR               fpSet_QAM_SR;
192     IOCTL_ATSC_SetActive                fpSetActive;
193     #if DMD_ATSC_STR_EN
194     IOCTL_ATSC_SetPowerState            fpSetPowerState;
195     #endif
196     IOCTL_ATSC_GetLock                  fpGetLock;
197     IOCTL_ATSC_GetModulationMode        fpGetModulationMode;
198     IOCTL_ATSC_GetSignalStrength        fpGetSignalStrength;
199     IOCTL_ATSC_GetSignalQuality         fpGetSignalQuality;
200     IOCTL_ATSC_GetSNRPercentage         fpGetSNRPercentage;
201     IOCTL_ATSC_GET_QAM_SNR              fpGET_QAM_SNR;
202     IOCTL_ATSC_Read_uCPKT_ERR           fpRead_uCPKT_ERR;
203     IOCTL_ATSC_GetPreViterbiBer         fpGetPreViterbiBer;
204     IOCTL_ATSC_GetPostViterbiBer        fpGetPostViterbiBer;
205     IOCTL_ATSC_SetSerialControl         fpSetSerialControl;
206     IOCTL_ATSC_ReadFrequencyOffset      fpReadFrequencyOffset;
207     IOCTL_ATSC_IIC_BYPASS_MODE          fpIIC_BYPASS_MODE;
208     IOCTL_ATSC_SWITCH_SSPI_GPIO         fpSWITCH_SSPI_GPIO;
209     IOCTL_ATSC_GPIO_GET_LEVEL           fpGPIO_GET_LEVEL;
210     IOCTL_ATSC_GPIO_SET_LEVEL           fpGPIO_SET_LEVEL;
211     IOCTL_ATSC_GPIO_OUT_ENABLE          fpGPIO_OUT_ENABLE;
212     IOCTL_ATSC_DO_IQ_SWAP               fpDO_IQ_SWAP;
213     IOCTL_ATSC_GetReg                   fpGetReg;
214     IOCTL_ATSC_SetReg                   fpSetReg;
215 } ATSC_INSTANT_PRIVATE;
216 
217 //-------------------------------------------------------------------------------------------------
218 //  Global Variables
219 //-------------------------------------------------------------------------------------------------
220 
221 extern DMD_ATSC_ResData *psDMD_ATSC_ResData;
222 
223 //-------------------------------------------------------------------------------------------------
224 //  Local Variables
225 //-------------------------------------------------------------------------------------------------
226 
227 
228 //-------------------------------------------------------------------------------------------------
229 //  Debug Functions
230 //-------------------------------------------------------------------------------------------------
231 
232 
233 //-------------------------------------------------------------------------------------------------
234 //  Local Functions
235 //-------------------------------------------------------------------------------------------------
236 
237 
238 //-------------------------------------------------------------------------------------------------
239 //  Global Functions
240 //-------------------------------------------------------------------------------------------------
241 
ATSCOpen(void ** ppInstance,MS_U32 u32ModuleVersion,void * pAttribute)242 MS_U32 ATSCOpen(void** ppInstance, MS_U32 u32ModuleVersion, void* pAttribute)
243 {
244     ATSC_INSTANT_PRIVATE *pAtscPri = NULL;
245     void *pAtscPriVoid = NULL;
246 
247 	printf("\n[ATSC INFO] atsc open");
248 
249     // instance is allocated here, also can allocate private for internal use, ex, BDMA_INSTANT_PRIVATE
250     UtopiaInstanceCreate(sizeof(ATSC_INSTANT_PRIVATE), ppInstance);
251     // setup func in private and assign the calling func in func ptr in instance private
252     UtopiaInstanceGetPrivate(*ppInstance, &pAtscPriVoid);
253     pAtscPri = (ATSC_INSTANT_PRIVATE*)pAtscPriVoid;
254 
255     pAtscPri->fpSetDbgLevel         = _MDrv_DMD_ATSC_SetDbgLevel;
256     pAtscPri->fpGetInfo             = _MDrv_DMD_ATSC_GetInfo;
257     pAtscPri->fpGetLibVer           = _MDrv_DMD_ATSC_GetLibVer;
258     pAtscPri->fpInit                = _MDrv_DMD_ATSC_MD_Init;
259     pAtscPri->fpExit                = _MDrv_DMD_ATSC_MD_Exit;
260     pAtscPri->fpGetConfig           = _MDrv_DMD_ATSC_MD_GetConfig;
261     pAtscPri->fpSetConfig           = _MDrv_DMD_ATSC_MD_SetConfig;
262     pAtscPri->fpSetReset            = _MDrv_DMD_ATSC_MD_SetReset;
263     pAtscPri->fpSet_QAM_SR          = _MDrv_DMD_ATSC_MD_Set_QAM_SR;
264     pAtscPri->fpSetActive           = _MDrv_DMD_ATSC_MD_SetActive;
265     #if DMD_ATSC_STR_EN
266     pAtscPri->fpSetPowerState       = _MDrv_DMD_ATSC_MD_SetPowerState;
267     #endif
268     pAtscPri->fpGetLock             = _MDrv_DMD_ATSC_MD_GetLock;
269     pAtscPri->fpGetModulationMode   = _MDrv_DMD_ATSC_MD_GetModulationMode;
270     pAtscPri->fpGetSignalStrength   = _MDrv_DMD_ATSC_MD_GetSignalStrength;
271     pAtscPri->fpGetSignalQuality    = _MDrv_DMD_ATSC_MD_GetSignalQuality;
272     pAtscPri->fpGetSNRPercentage    = _MDrv_DMD_ATSC_MD_GetSNRPercentage;
273     pAtscPri->fpGET_QAM_SNR         = _MDrv_DMD_ATSC_MD_GET_QAM_SNR;
274     pAtscPri->fpRead_uCPKT_ERR      = _MDrv_DMD_ATSC_MD_Read_uCPKT_ERR;
275     pAtscPri->fpGetPreViterbiBer    = _MDrv_DMD_ATSC_MD_GetPreViterbiBer;
276     pAtscPri->fpGetPostViterbiBer   = _MDrv_DMD_ATSC_MD_GetPostViterbiBer;
277     pAtscPri->fpReadFrequencyOffset = _MDrv_DMD_ATSC_MD_ReadFrequencyOffset;
278     pAtscPri->fpSetSerialControl    = _MDrv_DMD_ATSC_MD_SetSerialControl;
279     pAtscPri->fpIIC_BYPASS_MODE     = _MDrv_DMD_ATSC_MD_IIC_BYPASS_MODE;
280     pAtscPri->fpSWITCH_SSPI_GPIO    = _MDrv_DMD_ATSC_MD_SWITCH_SSPI_GPIO;
281     pAtscPri->fpGPIO_GET_LEVEL      = _MDrv_DMD_ATSC_MD_GPIO_GET_LEVEL;
282     pAtscPri->fpGPIO_SET_LEVEL      = _MDrv_DMD_ATSC_MD_GPIO_SET_LEVEL;
283     pAtscPri->fpGPIO_OUT_ENABLE     = _MDrv_DMD_ATSC_MD_GPIO_OUT_ENABLE;
284     pAtscPri->fpDO_IQ_SWAP          = _MDrv_DMD_ATSC_MD_DoIQSwap;
285     pAtscPri->fpGetReg              = _MDrv_DMD_ATSC_MD_GetReg;
286     pAtscPri->fpSetReg              = _MDrv_DMD_ATSC_MD_SetReg;
287 
288 	return UTOPIA_STATUS_SUCCESS;
289 }
290 
291 #if DMD_ATSC_STR_EN
ATSCStr(MS_U32 u32PowerState,void * pModule)292 MS_U32 ATSCStr(MS_U32 u32PowerState, void* pModule)
293 {
294     void* pResource = NULL;
295 	ATSC_RESOURCE_PRIVATE* psATSCResPri = NULL;
296 
297 	MS_U32 i = 0;
298 	MS_U32 u32Ret = FALSE;
299 
300 	if (UtopiaResourceObtain(pModule, ATSC_POOL_ID_DMD0, &pResource) != 0)
301     {
302         printf("UtopiaResourceObtainToInstant fail\n");
303 	    return UTOPIA_STATUS_ERR_RESOURCE;
304     }
305 
306     if (UtopiaResourceGetPrivate(pResource, (void*)&psATSCResPri) != 0)
307     {
308         printf("UtopiaResourceGetPrivate fail\n");
309         return UTOPIA_STATUS_FAIL;
310     }
311 
312     psDMD_ATSC_ResData = ((PATSC_RESOURCE_PRIVATE)psATSCResPri)->sDMD_ATSC_ResData;
313 
314     do
315     {
316         u32Ret = _MDrv_DMD_ATSC_MD_SetPowerState(i++, u32PowerState);
317     } while (i < DMD_ATSC_MAX_DEMOD_NUM && u32Ret);
318 
319     UtopiaResourceRelease(pResource);
320 
321     return (u32Ret ? UTOPIA_STATUS_SUCCESS : UTOPIA_STATUS_FAIL);
322 }
323 #endif
324 
ATSCIoctl(void * pInstance,MS_U32 u32Cmd,void * pArgs)325 MS_U32 ATSCIoctl(void* pInstance, MS_U32 u32Cmd, void* pArgs)
326 {
327     void* pModule = NULL;
328 	UtopiaInstanceGetModule(pInstance, &pModule);
329 	void* pResource = NULL;
330 	ATSC_RESOURCE_PRIVATE* psATSCResPri = NULL;
331     ATSC_INSTANT_PRIVATE* psATSCInstPri = NULL;
332     void* psATSCInstPriVoid = NULL;
333 	UtopiaInstanceGetPrivate(pInstance, (void**)&psATSCInstPriVoid);
334     psATSCInstPri = (ATSC_INSTANT_PRIVATE*)psATSCInstPriVoid;
335 
336     MS_U32 u32Ret = FALSE;
337 
338     if (UtopiaResourceObtain(pModule, ATSC_POOL_ID_DMD0, &pResource) != 0)
339     {
340         printf("UtopiaResourceObtainToInstant fail\n");
341 	    return UTOPIA_STATUS_ERR_RESOURCE;
342     }
343 
344     if(UtopiaResourceGetPrivate(pResource,(void*)&psATSCResPri) != 0)
345     {
346         printf("UtopiaResourceGetPrivate fail\n");
347         return UTOPIA_STATUS_FAIL;
348     }
349 
350     psDMD_ATSC_ResData = ((PATSC_RESOURCE_PRIVATE)psATSCResPri)->sDMD_ATSC_ResData;
351 
352     switch (u32Cmd)
353     {
354         case DMD_ATSC_DRV_CMD_SetDbgLevel:
355             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_SetDbgLevel\n"));
356             u32Ret = psATSCInstPri->fpSetDbgLevel(((PATSC_DBG_LEVEL_PARAM)pArgs)->u8DbgLevel);
357             break;
358         case DMD_ATSC_DRV_CMD_GetInfo:
359             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_GetInfo\n"));
360             ((PATSC_GET_INFO_PARAM)pArgs)->pInfo = psATSCInstPri->fpGetInfo();
361             u32Ret = TRUE;
362             break;
363         case DMD_ATSC_DRV_CMD_GetLibVer:
364             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_GetLibVer\n"));
365             u32Ret = psATSCInstPri->fpGetLibVer(((PATSC_GET_LIB_VER_PARAM)pArgs)->ppVersion);
366             break;
367         case DMD_ATSC_DRV_CMD_Init:
368             ((PATSC_INIT_PARAM)pArgs)->id = 0;
369         case DMD_ATSC_DRV_CMD_MD_Init:
370             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_Init\n"));
371             u32Ret = psATSCInstPri->fpInit(((PATSC_INIT_PARAM)pArgs)->id, ((PATSC_INIT_PARAM)pArgs)->pDMD_ATSC_InitData, ((PATSC_INIT_PARAM)pArgs)->u32InitDataLen);
372             break;
373         case DMD_ATSC_DRV_CMD_Exit:
374             ((PATSC_ID_PARAM)pArgs)->id = 0;
375         case DMD_ATSC_DRV_CMD_MD_Exit:
376             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_Exit\n"));
377             u32Ret = psATSCInstPri->fpExit(((PATSC_ID_PARAM)pArgs)->id);
378             break;
379         case DMD_ATSC_DRV_CMD_GetConfig:
380         	((PATSC_INIT_PARAM)pArgs)->id = 0;
381         case DMD_ATSC_DRV_CMD_MD_GetConfig:
382             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_GetConfig\n"));
383             u32Ret = psATSCInstPri->fpGetConfig(((PATSC_INIT_PARAM)pArgs)->id, ((PATSC_INIT_PARAM)pArgs)->pDMD_ATSC_InitData);
384 	        break;
385         case DMD_ATSC_DRV_CMD_SetConfig:
386             ((PATSC_SET_CONFIG_PARAM)pArgs)->id = 0;
387         case DMD_ATSC_DRV_CMD_MD_SetConfig:
388             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_SetConfig\n"));
389             u32Ret = psATSCInstPri->fpSetConfig(((PATSC_SET_CONFIG_PARAM)pArgs)->id, ((PATSC_SET_CONFIG_PARAM)pArgs)->eType, ((PATSC_SET_CONFIG_PARAM)pArgs)->bEnable);
390             break;
391         case DMD_ATSC_DRV_CMD_SetReset:
392             ((PATSC_ID_PARAM)pArgs)->id = 0;
393         case DMD_ATSC_DRV_CMD_MD_SetReset:
394             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_SetReset\n"));
395             u32Ret = psATSCInstPri->fpSetReset(((PATSC_ID_PARAM)pArgs)->id);
396             break;
397         case DMD_ATSC_DRV_CMD_Set_QAM_SR:
398             ((PATSC_SET_QAM_SR_PARAM)pArgs)->id = 0;
399         case DMD_ATSC_DRV_CMD_MD_Set_QAM_SR:
400             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_Set_QAM_SR\n"));
401             u32Ret = psATSCInstPri->fpSet_QAM_SR(((PATSC_SET_QAM_SR_PARAM)pArgs)->id, ((PATSC_SET_QAM_SR_PARAM)pArgs)->eType, ((PATSC_SET_QAM_SR_PARAM)pArgs)->symbol_rate);
402             break;
403         case DMD_ATSC_DRV_CMD_SetActive:
404             ((PATSC_SET_ACTIVE_PARAM)pArgs)->id = 0;
405         case DMD_ATSC_DRV_CMD_MD_SetActive:
406             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_SetActive\n"));
407             u32Ret = psATSCInstPri->fpSetActive(((PATSC_SET_ACTIVE_PARAM)pArgs)->id, ((PATSC_SET_ACTIVE_PARAM)pArgs)->bEnable);
408             break;
409         case DMD_ATSC_DRV_CMD_SetPowerState:
410             ((PATSC_SET_POWER_STATE_PARAM)pArgs)->id = 0;
411         case DMD_ATSC_DRV_CMD_MD_SetPowerState:
412             #if DMD_ATSC_STR_EN
413             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_SetPowerState\n"));
414             if(psATSCInstPri->fpSetPowerState(((PATSC_SET_POWER_STATE_PARAM)pArgs)->id, ((PATSC_SET_POWER_STATE_PARAM)pArgs)->u16PowerState) == UTOPIA_STATUS_SUCCESS)
415                 u32Ret = TRUE;
416             else
417                 u32Ret = FALSE;
418             #else
419             DMD_DBG(printf("ATSCIoctl - Don't support MDrv_DMD_ATSC_MD_SetPowerState\n"));
420             #endif
421             break;
422         case DMD_ATSC_DRV_CMD_GetLock:
423             ((PATSC_GET_LOCK_PARAM)pArgs)->id = 0;
424         case DMD_ATSC_DRV_CMD_MD_GetLock:
425             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_GetLock\n"));
426             ((PATSC_GET_LOCK_PARAM)pArgs)->status = psATSCInstPri->fpGetLock(((PATSC_GET_LOCK_PARAM)pArgs)->id, ((PATSC_GET_LOCK_PARAM)pArgs)->eType);
427             u32Ret = TRUE;
428             break;
429         case DMD_ATSC_DRV_CMD_GetModulationMode:
430             ((PATSC_GET_MODULATION_MODE_PARAM)pArgs)->id = 0;
431         case DMD_ATSC_DRV_CMD_MD_GetModulationMode:
432             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_GetModulationMode\n"));
433             ((PATSC_GET_MODULATION_MODE_PARAM)pArgs)->eType = psATSCInstPri->fpGetModulationMode(((PATSC_GET_MODULATION_MODE_PARAM)pArgs)->id);
434             u32Ret = TRUE;
435             break;
436         case DMD_ATSC_DRV_CMD_GetSignalStrength:
437             ((PATSC_GET_SIGNAL_STRENGTH_PARAM)pArgs)->id = 0;
438         case DMD_ATSC_DRV_CMD_MD_GetSignalStrength:
439             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_GetSignalStrength\n"));
440             u32Ret = psATSCInstPri->fpGetSignalStrength(((PATSC_GET_SIGNAL_STRENGTH_PARAM)pArgs)->id, &(((PATSC_GET_SIGNAL_STRENGTH_PARAM)pArgs)->u16Strength));
441             break;
442         case DMD_ATSC_DRV_CMD_GetSignalQuality:
443             ((PATSC_GET_SIGNAL_QUALITY_PARAM)pArgs)->id = 0;
444         case DMD_ATSC_DRV_CMD_MD_GetSignalQuality:
445             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_GetSignalQuality\n"));
446             ((PATSC_GET_SIGNAL_QUALITY_PARAM)pArgs)->eQuality = psATSCInstPri->fpGetSignalQuality(((PATSC_GET_SIGNAL_QUALITY_PARAM)pArgs)->id);
447             u32Ret = TRUE;
448             break;
449         case DMD_ATSC_DRV_CMD_GetSNRPercentage:
450             ((PATSC_GET_SNR_PERCENTAGE_PARAM)pArgs)->id = 0;
451         case DMD_ATSC_DRV_CMD_MD_GetSNRPercentage:
452             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_GetSNRPercentage\n"));
453             ((PATSC_GET_SNR_PERCENTAGE_PARAM)pArgs)->u8Percentage = psATSCInstPri->fpGetSNRPercentage(((PATSC_GET_SNR_PERCENTAGE_PARAM)pArgs)->id);
454             u32Ret = TRUE;
455             break;
456         case DMD_ATSC_DRV_CMD_GET_QAM_SNR:
457             ((PATSC_GET_SNR_PARAM)pArgs)->id = 0;
458         case DMD_ATSC_DRV_CMD_MD_GET_QAM_SNR:
459             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_GET_QAM_SNR\n"));
460             u32Ret = psATSCInstPri->fpGET_QAM_SNR(((PATSC_GET_SNR_PARAM)pArgs)->id, &(((PATSC_GET_SNR_PARAM)pArgs)->snr));
461             break;
462         case DMD_ATSC_DRV_CMD_Read_uCPKT_ERR:
463             ((PATSC_GET_UCPKT_ERR_PARAM)pArgs)->id = 0;
464         case DMD_ATSC_DRV_CMD_MD_Read_uCPKT_ERR:
465             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_Read_uCPKT_ERR\n"));
466             u32Ret = psATSCInstPri->fpRead_uCPKT_ERR(((PATSC_GET_UCPKT_ERR_PARAM)pArgs)->id, &(((PATSC_GET_UCPKT_ERR_PARAM)pArgs)->u16PacketErr));
467             break;
468         case DMD_ATSC_DRV_CMD_GetPreViterbiBer:
469             ((PATSC_GET_BER_PARAM)pArgs)->id = 0;
470         case DMD_ATSC_DRV_CMD_MD_GetPreViterbiBer:
471             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_GetPreViterbiBer\n"));
472             u32Ret = psATSCInstPri->fpGetPreViterbiBer(((PATSC_GET_BER_PARAM)pArgs)->id, &(((PATSC_GET_BER_PARAM)pArgs)->ber));
473             break;
474         case DMD_ATSC_DRV_CMD_GetPostViterbiBer:
475             ((PATSC_GET_BER_PARAM)pArgs)->id = 0;
476         case DMD_ATSC_DRV_CMD_MD_GetPostViterbiBer:
477             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_GetPostViterbiBer\n"));
478             u32Ret = psATSCInstPri->fpGetPostViterbiBer(((PATSC_GET_BER_PARAM)pArgs)->id, &(((PATSC_GET_BER_PARAM)pArgs)->ber));
479             break;
480         case DMD_ATSC_DRV_CMD_ReadFrequencyOffset:
481             ((PATSC_READ_FREQ_OFFSET_PARAM)pArgs)->id = 0;
482         case DMD_ATSC_DRV_CMD_MD_ReadFrequencyOffset:
483             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_ReadFrequencyOffset\n"));
484             u32Ret = psATSCInstPri->fpReadFrequencyOffset(((PATSC_READ_FREQ_OFFSET_PARAM)pArgs)->id, &(((PATSC_READ_FREQ_OFFSET_PARAM)pArgs)->cfo));
485             break;
486         case DMD_ATSC_DRV_CMD_SetSerialControl:
487             ((PATSC_SET_SERIAL_CONTROL_PARAM)pArgs)->id = 0;
488         case DMD_ATSC_DRV_CMD_MD_SetSerialControl:
489             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_SetSerialControl\n"));
490             u32Ret = psATSCInstPri->fpSetSerialControl(((PATSC_SET_SERIAL_CONTROL_PARAM)pArgs)->id, ((PATSC_SET_SERIAL_CONTROL_PARAM)pArgs)->u8TsConfigData);
491             break;
492         case DMD_ATSC_DRV_CMD_IIC_BYPASS_MODE:
493             ((PATSC_IIC_BYPASS_MODE_PARAM)pArgs)->id = 0;
494         case DMD_ATSC_DRV_CMD_MD_IIC_BYPASS_MODE:
495             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_IIC_BYPASS_MODE\n"));
496             u32Ret = psATSCInstPri->fpIIC_BYPASS_MODE(((PATSC_IIC_BYPASS_MODE_PARAM)pArgs)->id, ((PATSC_IIC_BYPASS_MODE_PARAM)pArgs)->bEnable);
497             break;
498         case DMD_ATSC_DRV_CMD_SWITCH_SSPI_GPIO:
499             ((PATSC_SWITCH_SSPI_GPIO_PARAM)pArgs)->id = 0;
500         case DMD_ATSC_DRV_CMD_MD_SWITCH_SSPI_GPIO:
501             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_SWITCH_SSPI_GPIO\n"));
502             u32Ret = psATSCInstPri->fpSWITCH_SSPI_GPIO(((PATSC_SWITCH_SSPI_GPIO_PARAM)pArgs)->id, ((PATSC_SWITCH_SSPI_GPIO_PARAM)pArgs)->bEnable);
503             break;
504         case DMD_ATSC_DRV_CMD_GPIO_GET_LEVEL:
505             ((PATSC_GPIO_LEVEL_PARAM)pArgs)->id = 0;
506         case DMD_ATSC_DRV_CMD_MD_GPIO_GET_LEVEL:
507             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_GPIO_GET_LEVEL\n"));
508             u32Ret = psATSCInstPri->fpGPIO_GET_LEVEL(((PATSC_GPIO_LEVEL_PARAM)pArgs)->id, ((PATSC_GPIO_LEVEL_PARAM)pArgs)->u8Pin, &(((PATSC_GPIO_LEVEL_PARAM)pArgs)->bLevel));
509             break;
510         case DMD_ATSC_DRV_CMD_GPIO_SET_LEVEL:
511             ((PATSC_GPIO_LEVEL_PARAM)pArgs)->id = 0;
512         case DMD_ATSC_DRV_CMD_MD_GPIO_SET_LEVEL:
513             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_GPIO_SET_LEVEL\n"));
514             u32Ret = psATSCInstPri->fpGPIO_SET_LEVEL(((PATSC_GPIO_LEVEL_PARAM)pArgs)->id, ((PATSC_GPIO_LEVEL_PARAM)pArgs)->u8Pin, ((PATSC_GPIO_LEVEL_PARAM)pArgs)->bLevel);
515             break;
516         case DMD_ATSC_DRV_CMD_GPIO_OUT_ENABLE:
517             ((PATSC_GPIO_OUT_ENABLE_PARAM)pArgs)->id = 0;
518         case DMD_ATSC_DRV_CMD_MD_GPIO_OUT_ENABLE:
519             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_GPIO_OUT_ENABLE\n"));
520             u32Ret = psATSCInstPri->fpGPIO_OUT_ENABLE(((PATSC_GPIO_OUT_ENABLE_PARAM)pArgs)->id, ((PATSC_GPIO_OUT_ENABLE_PARAM)pArgs)->u8Pin, ((PATSC_GPIO_OUT_ENABLE_PARAM)pArgs)->bEnableOut);
521             break;
522         case DMD_ATSC_DRV_CMD_DoIQSwap:
523             ((PATSC_DO_IQ_SWAP_PARAM)pArgs)->id = 0;
524         case DMD_ATSC_DRV_CMD_MD_DoIQSwap:
525             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_DO_IQ_SWAP\n"));
526             u32Ret = psATSCInstPri->fpDO_IQ_SWAP(((PATSC_DO_IQ_SWAP_PARAM)pArgs)->id, ((PATSC_DO_IQ_SWAP_PARAM)pArgs)->bIsQPad);
527             break;
528         case DMD_ATSC_DRV_CMD_GetReg:
529             ((PATSC_REG_PARAM)pArgs)->id = 0;
530         case DMD_ATSC_DRV_CMD_MD_GetReg:
531             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_GetReg\n"));
532             u32Ret = psATSCInstPri->fpGetReg(((PATSC_REG_PARAM)pArgs)->id, ((PATSC_REG_PARAM)pArgs)->u16Addr, &(((PATSC_REG_PARAM)pArgs)->u8Data));
533             break;
534         case DMD_ATSC_DRV_CMD_SetReg:
535             ((PATSC_REG_PARAM)pArgs)->id = 0;
536         case DMD_ATSC_DRV_CMD_MD_SetReg:
537             DMD_DBG(printf("ATSCIoctl - MDrv_DMD_ATSC_MD_SetReg\n"));
538             u32Ret = psATSCInstPri->fpSetReg(((PATSC_REG_PARAM)pArgs)->id, ((PATSC_REG_PARAM)pArgs)->u16Addr, ((PATSC_REG_PARAM)pArgs)->u8Data);
539             break;
540         default:
541             break;
542     }
543 
544     UtopiaResourceRelease(pResource);
545 
546     return (u32Ret ? UTOPIA_STATUS_SUCCESS : UTOPIA_STATUS_FAIL);
547 }
548 
ATSCClose(void * pInstance)549 MS_U32 ATSCClose(void* pInstance)
550 {
551     UtopiaInstanceDelete(pInstance);
552 
553 	return UTOPIA_STATUS_SUCCESS;
554 }
555 
ATSCRegisterToUtopia(FUtopiaOpen ModuleType)556 void ATSCRegisterToUtopia(FUtopiaOpen ModuleType)
557 {
558     // 1. deal with module
559     void* pUtopiaModule = NULL;
560 	UtopiaModuleCreate(MODULE_ATSC, 8, &pUtopiaModule);
561     UtopiaModuleRegister(pUtopiaModule);
562     // register func for module, after register here, then ap call UtopiaOpen/UtopiaIoctl/UtopiaClose can call to these registered standard func
563     UtopiaModuleSetupFunctionPtr(pUtopiaModule, (FUtopiaOpen)ATSCOpen, (FUtopiaClose)ATSCClose, (FUtopiaIOctl)ATSCIoctl);
564     // register func for module, after register here, then ap call UtopiaSTR can call to registered standard func
565     #if DMD_ATSC_STR_EN
566     UtopiaModuleSetupSTRFunctionPtr(pUtopiaModule, (FUtopiaSTR)ATSCStr);
567     #endif
568 
569     // 2. deal with resource
570     void* psResource = NULL;
571     // start func to add res, call once will create 2 access in resource. Also can declare BDMA_POOL_ID_BDMA1 for another channel depend on driver owner.
572 	UtopiaModuleAddResourceStart(pUtopiaModule, ATSC_POOL_ID_DMD0);
573     // resource can alloc private for internal use, ex, BDMA_RESOURCE_PRIVATE
574     UtopiaResourceCreate("atsc0", sizeof(ATSC_RESOURCE_PRIVATE), &psResource);
575     // func to reg res
576     UtopiaResourceRegister(pUtopiaModule, psResource, ATSC_POOL_ID_DMD0);
577     // end function to add res
578 	UtopiaModuleAddResourceEnd(pUtopiaModule, ATSC_POOL_ID_DMD0);
579 }
580 
581 #endif // #ifdef UTPA2