xref: /utopia/UTPA2-700.0.x/modules/xc/drv/xc/mdrv_adc.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 your customers, any assistance
62 //        of any kind whatsoever, or any information; or
63 //    (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 //    of Taiwan, R.O.C., excluding its conflict of law rules.
67 //    Any and all dispute arising out hereof or related hereto shall be finally
68 //    settled by arbitration referred to the Chinese Arbitration Association,
69 //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 //    Rules of the Association by three (3) arbitrators appointed in accordance
71 //    with the said Rules.
72 //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73 //    be English.
74 //    The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 ////////////////////////////////////////////////////////////////////////////////
79 //
80 // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81 // All rights reserved.
82 //
83 // Unless otherwise stipulated in writing, any and all information contained
84 // herein regardless in any format shall remain the sole proprietary of
85 // MStar Semiconductor Inc. and be kept in strict confidence
86 // ("MStar Confidential Information") by the recipient.
87 // Any unauthorized act including without limitation unauthorized disclosure,
88 // copying, use, reproduction, sale, distribution, modification, disassembling,
89 // reverse engineering and compiling of the contents of MStar Confidential
90 // Information is unlawful and strictly prohibited. MStar hereby reserves the
91 // rights to any and all damages, losses, costs and expenses resulting therefrom.
92 //
93 ////////////////////////////////////////////////////////////////////////////////
94 
95 ///////////////////////////////////////////////////////////////////////////////////////////////////
96 /// file    Mdrv_adc.c
97 /// @brief  Driver Interface
98 /// @author MStar Semiconductor Inc.
99 ///////////////////////////////////////////////////////////////////////////////////////////////////
100 #define MDRV_ADC_C
101 
102 //-------------------------------------------------------------------------------------------------
103 //  Include Files
104 //-------------------------------------------------------------------------------------------------
105 // Common Definition
106 #if !defined(MSOS_TYPE_LINUX_KERNEL)
107 #include "string.h"
108 #else
109 #include <linux/string.h>
110 #endif
111 #include "MsCommon.h"
112 #include "MsIRQ.h"
113 #include "MsOS.h"
114 #include "mhal_xc_chip_config.h"
115 #include "utopia.h"
116 
117 // Internal Definition
118 #include "drvXC_IOPort.h"
119 #include "xc_Analog_Reg.h"
120 #include "xc_hwreg_utility2.h"
121 #include "apiXC.h"
122 #include "mvideo_context.h"
123 #include "apiXC_Adc.h"
124 #include "apiXC_Auto.h"
125 #include "drvXC_ADC_Internal.h"
126 #include "mhal_adc.h"
127 #include "apiXC_PCMonitor.h"
128 #include "drv_sc_ip.h"
129 #include "drv_sc_scaling.h"
130 //-------------------------------------------------------------------------------------------------
131 //  Driver Compiler Options
132 //-------------------------------------------------------------------------------------------------
133 
134 
135 //-------------------------------------------------------------------------------------------------
136 //  Local Defines
137 //-------------------------------------------------------------------------------------------------
138 #define TRACE_ADC_INPUT(x) //x
139 #define MAX_ADCSOUCE_NUM 2
140 
141 //-------------------------------------------------------------------------------------------------
142 //  Local Structurs
143 //-------------------------------------------------------------------------------------------------
144 
145 
146 //-------------------------------------------------------------------------------------------------
147 //  Global Variables
148 //-------------------------------------------------------------------------------------------------
149 
150 
151 //-------------------------------------------------------------------------------------------------
152 //  Local Variables
153 //-------------------------------------------------------------------------------------------------
154 
155 
156 
157 //-------------------------------------------------------------------------------------------------
158 //  Debug Functions
159 //-------------------------------------------------------------------------------------------------
160 
161 
162 //-------------------------------------------------------------------------------------------------
163 //  Local Functions
164 //-------------------------------------------------------------------------------------------------
165 
166 
167 //-------------------------------------------------------------------------------------------------
168 //  Global Functions
169 //-------------------------------------------------------------------------------------------------
170 
171 
172 //----------------------------------------------------------------------
173 //
174 //----------------------------------------------------------------------
MDrv_XC_ADC_set_cvbs_out(void * pInstance,E_ADC_CVBSOUT_TYPE e_cvbs_out_type)175 void MDrv_XC_ADC_set_cvbs_out(void *pInstance, E_ADC_CVBSOUT_TYPE e_cvbs_out_type)
176 {
177     Hal_ADC_set_cvbs_out(pInstance, e_cvbs_out_type);
178 }
179 
MDrv_XC_ADC_Is_cvbs_out_enabled(void * pInstance,E_DEST_TYPE enOutputType)180 MS_BOOL MDrv_XC_ADC_Is_cvbs_out_enabled(void *pInstance, E_DEST_TYPE enOutputType)
181 {
182     if (enOutputType == OUTPUT_CVBS1)
183     {
184         return Hal_ADC_is_cvbs_out_enabled(pInstance, OUTPUT_PORT_CVBS1);
185     }
186     else if (enOutputType == OUTPUT_CVBS2)
187     {
188         return Hal_ADC_is_cvbs_out_enabled(pInstance, OUTPUT_PORT_CVBS2);
189     }
190     else
191     {
192         return FALSE;
193     }
194 
195 }
196 
MDrv_XC_ADC_use_hardware_auto_offset(void * pInstance,INPUT_SOURCE_TYPE_t eSource)197 MS_BOOL MDrv_XC_ADC_use_hardware_auto_offset(void *pInstance, INPUT_SOURCE_TYPE_t eSource)
198 {
199     if ( IsSrcTypeYPbPr(eSource) )
200     {
201         return ADC_HARDWARE_AUTOOFFSET_YPBPR;
202     }
203     else if ( IsSrcTypeVga(eSource) )
204     {
205         return ADC_HARDWARE_AUTOOFFSET_RGB;
206     }
207     else if ( IsSrcTypeScart(eSource) )
208     {
209         return ADC_HARDWARE_AUTOOFFSET_SCARTRGB;
210     }
211     else
212     {
213         return ENABLE;
214     }
215 
216 }
217 
218 //----------------------------------------------------------------------
219 //
220 //----------------------------------------------------------------------
221 //******************************************************************************
222 /// set offset to HW
223 /// @param  pstADCSetting \b IN: offset
224 /// @return MS_BOOL \b:TRUE succeed, FALSE fail
225 //******************************************************************************
MDrv_XC_ADC_SetOffsetSetting(void * pInstance,APIXC_AdcGainOffsetSetting * pstADCSetting)226 void MDrv_XC_ADC_SetOffsetSetting(void *pInstance, APIXC_AdcGainOffsetSetting *pstADCSetting)
227 {
228     Hal_ADC_SetOffsetR(pInstance, pstADCSetting->u16RedOffset);
229     Hal_ADC_SetOffsetG(pInstance, pstADCSetting->u16GreenOffset);
230     Hal_ADC_SetOffsetB(pInstance, pstADCSetting->u16BlueOffset);
231 }
232 
233 //******************************************************************************
234 /// set gain to HW
235 /// @param  pstADCSetting \b IN: gain
236 /// @return MS_BOOL \b:TRUE succeed, FALSE fail
237 //******************************************************************************
MDrv_XC_ADC_SetGainSetting(void * pInstance,APIXC_AdcGainOffsetSetting * pstADCSetting)238 void MDrv_XC_ADC_SetGainSetting(void *pInstance, APIXC_AdcGainOffsetSetting *pstADCSetting)
239 {
240     Hal_ADC_SetGainR(pInstance, pstADCSetting->u16RedGain);
241     Hal_ADC_SetGainG(pInstance, pstADCSetting->u16GreenGain);
242     Hal_ADC_SetGainB(pInstance, pstADCSetting->u16BlueGain);
243 }
244 
245 //******************************************************************************
246 /// get offset from HW
247 /// @param  pstADCSetting \b OUT: offset
248 /// @return MS_BOOL \b:TRUE succeed, FALSE fail
249 //******************************************************************************
MDrv_XC_ADC_GetOffsetSetting(void * pInstance,APIXC_AdcGainOffsetSetting * pstADCSetting)250 MS_BOOL MDrv_XC_ADC_GetOffsetSetting(void *pInstance, APIXC_AdcGainOffsetSetting *pstADCSetting)
251 {
252     if (NULL == pstADCSetting)
253     {
254         return FALSE;
255     }
256     pstADCSetting->u16RedOffset = Hal_ADC_GetOffsetR(pInstance);
257     pstADCSetting->u16GreenOffset = Hal_ADC_GetOffsetG(pInstance);
258     pstADCSetting->u16BlueOffset = Hal_ADC_GetOffsetB(pInstance);
259     return TRUE;
260 }
261 
262 //******************************************************************************
263 /// get gain from HW
264 /// @param  pstADCSetting \b OUT: gain
265 /// @return MS_BOOL \b:TRUE succeed, FALSE fail
266 //******************************************************************************
MDrv_XC_ADC_GetGainSetting(void * pInstance,APIXC_AdcGainOffsetSetting * pstADCSetting)267 MS_BOOL MDrv_XC_ADC_GetGainSetting(void *pInstance, APIXC_AdcGainOffsetSetting *pstADCSetting)
268 {
269     if (NULL == pstADCSetting)
270     {
271         return FALSE;
272     }
273     pstADCSetting->u16RedGain= Hal_ADC_GetGainR(pInstance);
274     pstADCSetting->u16GreenGain = Hal_ADC_GetGainG(pInstance);
275     pstADCSetting->u16BlueGain = Hal_ADC_GetGainB(pInstance);
276     return TRUE;
277 }
278 
MDrv_XC_ADC_Source_Calibrate(void * pInstance,ADC_INPUTSOURCE_TYPE enADCInput)279 void MDrv_XC_ADC_Source_Calibrate(void *pInstance, ADC_INPUTSOURCE_TYPE enADCInput)
280 {
281     Hal_ADC_Set_Source_Calibration(pInstance, enADCInput);
282 }
283 
284 //******************************************************************************
285 /// Initial with middle values of max gain and max offset
286 /// before external calibration
287 /// @param  enInputSrc  \b IN:input source
288 /// @param  pstInitialGainOffset \b OUT: gain offset
289 /// @return MS_BOOL \b:TRUE succeed, FALSE fail
290 //******************************************************************************
MDrv_XC_ADC_InitExternalCalibration(void * pInstance,INPUT_SOURCE_TYPE_t enInputSrc,APIXC_AdcGainOffsetSetting * pstInitialGainOffset)291 MS_BOOL MDrv_XC_ADC_InitExternalCalibration(void *pInstance, INPUT_SOURCE_TYPE_t enInputSrc, APIXC_AdcGainOffsetSetting* pstInitialGainOffset)
292 {
293     MS_BOOL bRet = FALSE;
294     ADC_INPUTSOURCE_TYPE enAdcSource = ADC_INPUTSOURCE_UNKNOW;
295 
296     if ( IsSrcTypeYPbPr(enInputSrc) )
297     {
298         enAdcSource = ADC_INPUTSOURCE_ONLY_YPBPR;
299         bRet = TRUE;
300     }
301     else if ( IsSrcTypeVga(enInputSrc) )
302     {
303         enAdcSource = ADC_INPUTSOURCE_ONLY_RGB;
304         bRet = TRUE;
305     }
306     else if ( IsSrcTypeScart(enInputSrc) )
307     {
308         enAdcSource = ADC_INPUTSOURCE_ONLY_SCART;
309         bRet = TRUE;
310     }
311     else
312     {
313         XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Wrong input source %u!!\n", enInputSrc);
314         bRet = FALSE;
315     }
316 
317     if (bRet)
318     {
319         bRet = MDrv_ADC_GetInitCalibrationGain(pInstance, enInputSrc, pstInitialGainOffset);
320         if (bRet)
321         {
322             bRet = MDrv_ADC_GetInitCalibrationOffset(pInstance, enInputSrc, pstInitialGainOffset);
323             if (bRet)
324             {
325                 _XC_ENTRY(pInstance);
326                 bRet = Hal_ADC_InitExternalCalibration(pInstance, enAdcSource);
327                 if (bRet)
328                 {
329                     Hal_ADC_gain_setting(pInstance, (XC_AdcGainOffsetSetting*)pstInitialGainOffset);
330                     Hal_ADC_offset_setting(pInstance, (XC_AdcGainOffsetSetting*)pstInitialGainOffset);
331                 }
332                 _XC_RETURN(pInstance);
333             }
334             else
335             {
336                 XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Get Initial Calibration Offset fail!!\n");
337             }
338         }
339         else
340         {
341             XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Get Initial Calibration Gain fail!!\n");
342         }
343     }
344     return bRet;
345 }
346 
347 //******************************************************************************
348 /// Initial with fixed offset before external calibrating gain
349 /// @param  enInputSrc  \b IN:input source
350 /// @param  pstInitialGainOffset \b OUT: gain offset
351 /// @return MS_BOOL \b:TRUE succeed, FALSE fail
352 //******************************************************************************
MDrv_XC_ADC_InitExternalCalibrationWithFixedOffset(void * pInstance,INPUT_SOURCE_TYPE_t enInputSrc,APIXC_AdcGainOffsetSetting * pstInitialGainOffset)353 MS_BOOL MDrv_XC_ADC_InitExternalCalibrationWithFixedOffset(void *pInstance, INPUT_SOURCE_TYPE_t enInputSrc, APIXC_AdcGainOffsetSetting* pstInitialGainOffset)
354 {
355     MS_BOOL bRet = FALSE;
356     ADC_INPUTSOURCE_TYPE enAdcSource = ADC_INPUTSOURCE_UNKNOW;
357 
358     if (IsSrcTypeYPbPr(enInputSrc))
359     {
360         enAdcSource = ADC_INPUTSOURCE_ONLY_YPBPR;
361         bRet = TRUE;
362     }
363     else if ( IsSrcTypeVga(enInputSrc) )
364     {
365         enAdcSource = ADC_INPUTSOURCE_ONLY_RGB;
366         bRet = TRUE;
367     }
368     else if ( IsSrcTypeScart(enInputSrc) )
369     {
370         enAdcSource = ADC_INPUTSOURCE_ONLY_SCART;
371         bRet = TRUE;
372     }
373     else
374     {
375         XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Wrong input source %u!!\n", enInputSrc);
376         bRet = FALSE;
377     }
378 
379     if (bRet)
380     {
381         bRet = MDrv_ADC_GetInitCalibrationGain(pInstance, enInputSrc, pstInitialGainOffset);
382         if (bRet)
383         {
384             bRet = MDrv_ADC_GetFixedOffset(pInstance, enInputSrc, pstInitialGainOffset);
385             if (bRet)
386             {
387                 _XC_ENTRY(pInstance);
388                 bRet = Hal_ADC_InitExternalCalibration(pInstance, enAdcSource);
389                 if (bRet)
390                 {
391                     Hal_ADC_gain_setting(pInstance, (XC_AdcGainOffsetSetting*)pstInitialGainOffset);
392                     Hal_ADC_offset_setting(pInstance, (XC_AdcGainOffsetSetting*)pstInitialGainOffset);
393                 }
394                 _XC_RETURN(pInstance);
395             }
396             else
397             {
398                 XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Get Initial Calibration Offset fail!!\n");
399             }
400         }
401         else
402         {
403             XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Get Initial Calibration Gain fail!!\n");
404         }
405     }
406     return bRet;
407 }
408 
409 //******************************************************************************
410 /// Initial before internal calibration
411 /// @param  enInputSrc  \b IN:input source
412 /// @param  pstInitialGainOffset \b OUT: gain offset
413 /// @return MS_BOOL \b:TRUE succeed, FALSE fail
414 //******************************************************************************
MDrv_XC_ADC_InitInternalCalibration(void * pInstance,INPUT_SOURCE_TYPE_t enInputSrc,APIXC_AdcGainOffsetSetting * pstInitialGainOffset)415 MS_BOOL MDrv_XC_ADC_InitInternalCalibration(void *pInstance, INPUT_SOURCE_TYPE_t enInputSrc, APIXC_AdcGainOffsetSetting* pstInitialGainOffset)
416 {
417     MS_BOOL bRet = FALSE;
418     ADC_INPUTSOURCE_TYPE enAdcSrc = ADC_INPUTSOURCE_UNKNOW;
419 
420     if (IsSrcTypeYPbPr(enInputSrc))
421     {
422         enAdcSrc = ADC_INPUTSOURCE_ONLY_YPBPR;
423         bRet = TRUE;
424     }
425     else if (IsSrcTypeVga(enInputSrc))
426     {
427         enAdcSrc = ADC_INPUTSOURCE_ONLY_RGB;
428         bRet = TRUE;
429     }
430     else if (IsSrcTypeScart(enInputSrc))
431     {
432         enAdcSrc = ADC_INPUTSOURCE_ONLY_SCART;
433         bRet = TRUE;
434     }
435     else
436     {
437         XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Wrong input source %u!!\n", enInputSrc);
438         bRet = FALSE;
439     }
440 
441     if (bRet)
442     {
443         bRet = MDrv_ADC_GetInitCalibrationGain(pInstance, enInputSrc, pstInitialGainOffset);
444         if (bRet)
445         {
446             bRet = MDrv_ADC_GetInitCalibrationOffset(pInstance, enInputSrc, pstInitialGainOffset);
447             if (bRet)
448             {
449                 _XC_ENTRY(pInstance);
450                 Hal_ADC_InitInternalCalibration(pInstance, enAdcSrc, MAIN_WINDOW);
451                 Hal_ADC_disable_csc(pInstance, MAIN_WINDOW);
452                 _XC_RETURN(pInstance);
453             }
454             else
455             {
456                 XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Get Initial Calibration Offset fail!!\n");
457             }
458         }
459         else
460         {
461             XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Get Initial Calibration Gain fail!!\n");
462         }
463     }
464     return bRet;
465 }
466 
467 //******************************************************************************
468 /// Initial before internal calibrate gain
469 /// @param  enInputSrc  \b IN:input source
470 /// @param  pstInitialGainOffset \b OUT: gain offset
471 /// @return MS_BOOL \b:TRUE succeed, FALSE fail
472 //******************************************************************************
MDrv_XC_ADC_InitInternalCalibrationWithFixedOffset(void * pInstance,INPUT_SOURCE_TYPE_t enInputSrc,APIXC_AdcGainOffsetSetting * pstInitialGainOffset,SCALER_WIN eWindow)473 MS_BOOL MDrv_XC_ADC_InitInternalCalibrationWithFixedOffset(void *pInstance, INPUT_SOURCE_TYPE_t enInputSrc, APIXC_AdcGainOffsetSetting* pstInitialGainOffset, SCALER_WIN eWindow)
474 {
475     MS_BOOL bRet = FALSE;
476     ADC_INPUTSOURCE_TYPE enAdcSrc = ADC_INPUTSOURCE_UNKNOW;
477 
478     if (IsSrcTypeYPbPr(enInputSrc))
479     {
480         enAdcSrc = ADC_INPUTSOURCE_ONLY_YPBPR;
481         bRet = TRUE;
482     }
483     else if (IsSrcTypeVga(enInputSrc))
484     {
485         enAdcSrc = ADC_INPUTSOURCE_ONLY_RGB;
486         bRet = TRUE;
487     }
488     else if (IsSrcTypeScart(enInputSrc))
489     {
490         enAdcSrc = ADC_INPUTSOURCE_ONLY_SCART;
491         bRet = TRUE;
492     }
493     else
494     {
495         XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Wrong input source %u!!\n", enInputSrc);
496         bRet = FALSE;
497     }
498 
499     if (bRet)
500     {
501         bRet = MDrv_ADC_GetInitCalibrationGain(pInstance, enInputSrc, pstInitialGainOffset);
502         if (bRet)
503         {
504             bRet = MDrv_ADC_GetFixedOffset(pInstance, enInputSrc, pstInitialGainOffset);
505             if (bRet)
506             {
507                 _XC_ENTRY(pInstance);
508                 Hal_ADC_InitInternalCalibration(pInstance, enAdcSrc, eWindow);
509                 Hal_ADC_disable_csc(pInstance, eWindow);
510                 _XC_RETURN(pInstance);
511             }
512             else
513             {
514                 XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Get Initial Calibration Offset fail!!\n");
515             }
516         }
517         else
518         {
519             XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Get Initial Calibration Gain fail!!\n");
520         }
521     }
522     return bRet;
523 }
524 
525 //******************************************************************************
526 /// Initial gain before internal calibration
527 /// @param enInputSrc         \b IN: input source
528 /// @param pstInitialGain   \b OUT: gain value struct
529 /// @return MS_BOOL \b:TRUE succeed, FALSE fail
530 //******************************************************************************
MDrv_ADC_GetInitCalibrationGain(void * pInstance,INPUT_SOURCE_TYPE_t enInputSrc,APIXC_AdcGainOffsetSetting * pstInitialGain)531 MS_BOOL MDrv_ADC_GetInitCalibrationGain(void *pInstance, INPUT_SOURCE_TYPE_t enInputSrc, APIXC_AdcGainOffsetSetting* pstInitialGain)
532 {
533     MS_BOOL bRet = FALSE;
534 
535     if (IsSrcTypeVga(enInputSrc) || IsSrcTypeYPbPr(enInputSrc) || IsSrcTypeScart(enInputSrc))
536     {
537         // Initial gain
538         pstInitialGain->u16RedGain = (1 << ADC_GAIN_BIT_CNT) >> 1;
539         pstInitialGain->u16GreenGain = (1 << ADC_GAIN_BIT_CNT) >> 1;
540         pstInitialGain->u16BlueGain = (1 << ADC_GAIN_BIT_CNT) >> 1;
541         bRet = TRUE;
542     }
543     else
544     {
545         XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Wrong input source %u!!\n", enInputSrc);
546         bRet = FALSE;
547     }
548 
549     return bRet;
550 }
551 
552 //******************************************************************************
553 /// Initial offset before internal calibration
554 /// @param enInputSrc         \b IN: input source
555 /// @param pstInitialOffset   \b OUT: offset value struct
556 /// @return MS_BOOL \b:TRUE succeed, FALSE fail
557 //******************************************************************************
MDrv_ADC_GetInitCalibrationOffset(void * pInstance,INPUT_SOURCE_TYPE_t enInputSrc,APIXC_AdcGainOffsetSetting * pstInitialOffset)558 MS_BOOL MDrv_ADC_GetInitCalibrationOffset(void *pInstance, INPUT_SOURCE_TYPE_t enInputSrc, APIXC_AdcGainOffsetSetting* pstInitialOffset)
559 {
560     MS_BOOL bRet = FALSE;
561 
562     if (IsSrcTypeVga(enInputSrc) || IsSrcTypeYPbPr(enInputSrc) || IsSrcTypeScart(enInputSrc))
563     {
564         // Initial offset
565         pstInitialOffset->u16RedOffset = (1 << ADC_OFFSET_BIT_CNT) >> 1;
566         pstInitialOffset->u16GreenOffset = (1 << ADC_OFFSET_BIT_CNT) >> 1;
567         pstInitialOffset->u16BlueOffset = (1 << ADC_OFFSET_BIT_CNT) >> 1;
568         bRet = TRUE;
569     }
570     else
571     {
572         XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Wrong input source %u!!\n", enInputSrc);
573         bRet = FALSE;
574     }
575 
576     return bRet;
577 }
578 
MApi_XC_ADC_ExitExternalCalibration(void * pInstance,INPUT_SOURCE_TYPE_t eSource,APIXC_AdcGainOffsetSetting * InitialGainOffset)579 void MApi_XC_ADC_ExitExternalCalibration(void *pInstance, INPUT_SOURCE_TYPE_t eSource, APIXC_AdcGainOffsetSetting* InitialGainOffset)
580 {
581 
582     ADC_INPUTSOURCE_TYPE eADCSource = ADC_INPUTSOURCE_UNKNOW;
583 
584     if ( IsSrcTypeYPbPr(eSource) )
585     {
586         eADCSource = ADC_INPUTSOURCE_ONLY_YPBPR;
587     }
588     else if ( IsSrcTypeVga(eSource) )
589     {
590         eADCSource = ADC_INPUTSOURCE_ONLY_RGB;
591     }
592     else if ( IsSrcTypeScart(eSource) )
593     {
594         eADCSource = ADC_INPUTSOURCE_ONLY_SCART;
595     }
596     else
597     {
598         // Undefined
599     }
600 
601     Hal_ADC_ExitExternalCalibration(pInstance, eADCSource,(XC_AdcGainOffsetSetting*)InitialGainOffset);
602 
603 }
604 
605 //******************************************************************************
606 /// Generate ADC clock
607 /// @param clocktype \b IN Clock type need to generate
608 //******************************************************************************
MApi_XC_ADC_GenClock(void * pInstance,ADC_Gen_Clock_Type clocktype)609 void MApi_XC_ADC_GenClock(void *pInstance, ADC_Gen_Clock_Type clocktype)
610 {
611 
612     _XC_ENTRY(pInstance);
613     Hal_ADC_clk_gen_setting(pInstance, clocktype);
614     _XC_RETURN(pInstance);
615 }
616 
617 //******************************************************************************
618 /// Generate Internal voltage in ADC
619 /// @param InternalVoltage \b IN Voltage type will be generate
620 //******************************************************************************
MApi_XC_ADC_SetInternalVoltage(void * pInstance,ADC_Internal_Voltage InternalVoltage)621 void MApi_XC_ADC_SetInternalVoltage(void *pInstance, ADC_Internal_Voltage InternalVoltage)
622 {
623     _XC_ENTRY(pInstance);
624     Hal_ADC_dtop_internaldc_setting(pInstance, InternalVoltage);
625     _XC_RETURN(pInstance);
626     MsOS_DelayTask(50);  //** must delay n Vsync
627 }
628 
629 //******************************************************************************
630 /// Get ADC Default gain / offset by referring input structure.
631 /// @param eSource \b IN The input source
632 /// @param pstADCSetting \b IN gain / offset need to be set
633 //******************************************************************************
MDrv_XC_ADC_GetDefaultGainOffset(void * pInstance,INPUT_SOURCE_TYPE_t eSource,APIXC_AdcGainOffsetSetting * pstADCSetting)634 void MDrv_XC_ADC_GetDefaultGainOffset(void *pInstance, INPUT_SOURCE_TYPE_t eSource , APIXC_AdcGainOffsetSetting* pstADCSetting)
635 {
636     if ( IsSrcTypeYPbPr(eSource) )
637     {
638         pstADCSetting->u16RedGain = ADC_YPBPR_DEFAULT_GAIN_R;
639         pstADCSetting->u16GreenGain = ADC_YPBPR_DEFAULT_GAIN_G;
640         pstADCSetting->u16BlueGain = ADC_YPBPR_DEFAULT_GAIN_B;
641         pstADCSetting->u16RedOffset = ADC_YPBPR_DEFAULT_OFFSET_R;
642         pstADCSetting->u16GreenOffset= ADC_YPBPR_DEFAULT_OFFSET_G;
643         pstADCSetting->u16BlueOffset= ADC_YPBPR_DEFAULT_OFFSET_B;
644     }
645     else if ( IsSrcTypeVga(eSource) )
646     {
647         pstADCSetting->u16RedGain = ADC_VGA_DEFAULT_GAIN_R;
648         pstADCSetting->u16GreenGain = ADC_VGA_DEFAULT_GAIN_G;
649         pstADCSetting->u16BlueGain = ADC_VGA_DEFAULT_GAIN_B;
650         pstADCSetting->u16RedOffset = ADC_VGA_DEFAULT_OFFSET_R;
651         pstADCSetting->u16GreenOffset= ADC_VGA_DEFAULT_OFFSET_G;
652         pstADCSetting->u16BlueOffset= ADC_VGA_DEFAULT_OFFSET_B;
653     }
654     else if ( IsSrcTypeScart(eSource) )
655     {
656         pstADCSetting->u16RedGain = ADC_SCART_DEFAULT_GAIN_R;
657         pstADCSetting->u16GreenGain = ADC_SCART_DEFAULT_GAIN_G;
658         pstADCSetting->u16BlueGain = ADC_SCART_DEFAULT_GAIN_B;
659         pstADCSetting->u16RedOffset = ADC_SCART_DEFAULT_OFFSET_R;
660         pstADCSetting->u16GreenOffset= ADC_SCART_DEFAULT_OFFSET_G;
661         pstADCSetting->u16BlueOffset= ADC_SCART_DEFAULT_OFFSET_B;
662     }
663     else
664     {
665         XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Wrong input source %u!!\n", eSource);
666     }
667 }
668 
669 //******************************************************************************
670 /// get HW center Gain value
671 /// @param
672 /// @return HW default Gain value
673 //******************************************************************************
MDrv_XC_ADC_GetCenterGain(void * pInstance)674 MS_U16 MDrv_XC_ADC_GetCenterGain(void *pInstance)
675 {
676     return ADC_CENTER_GAIN;
677 }
678 
679 //******************************************************************************
680 /// get HW center Gain value
681 /// @param
682 /// @return HW default Gain value
683 //******************************************************************************
MDrv_XC_ADC_GetCenterOffset(void * pInstance)684 MS_U16 MDrv_XC_ADC_GetCenterOffset(void *pInstance)
685 {
686     return ADC_CENTER_OFFSET;
687 }
688 
689 //******************************************************************************
690 /// get maximal value of offset
691 /// @param
692 /// @return maximal value of offset
693 //******************************************************************************
MDrv_XC_ADC_GetMaximalOffsetValue(void * pInstance)694 MS_U16 MDrv_XC_ADC_GetMaximalOffsetValue(void *pInstance)
695 {
696     MS_U8 u8AdcOffsetBitCnt = ADC_OFFSET_BIT_CNT;
697 
698     return  (1 << u8AdcOffsetBitCnt ) - 1;
699 }
700 
701 //******************************************************************************
702 /// get maximal value of gain
703 /// @param
704 /// @return maximal value of gain
705 //******************************************************************************
MDrv_XC_ADC_GetMaximalGainValue(void * pInstance)706 MS_U16 MDrv_XC_ADC_GetMaximalGainValue(void *pInstance)
707 {
708     MS_U8 u8AdcGainBitCnt = ADC_GAIN_BIT_CNT;
709 
710     return  (1 << u8AdcGainBitCnt ) - 1;
711 }
712 
713 //******************************************************************************
714 /// Set Gain value
715 /// @param u8color \b IN The channel type need to be set
716 /// @param u16value \b IN The value need to be set.
717 //******************************************************************************
MDrv_XC_ADC_SetGain(void * pInstance,MS_U8 u8Color,MS_U16 u16Value)718 void MDrv_XC_ADC_SetGain(void *pInstance, MS_U8 u8Color, MS_U16 u16Value)
719 {
720     _XC_ENTRY(pInstance);
721     switch(u8Color)
722     {
723         case ADC_CHR:
724             Hal_ADC_SetGainR(pInstance, u16Value);
725             break;
726         case ADC_CHG:
727             Hal_ADC_SetGainG(pInstance, u16Value);
728             break;
729         case ADC_CHB:
730             Hal_ADC_SetGainB(pInstance, u16Value);
731             break;
732         case ADC_ALL:
733         default:
734             Hal_ADC_SetGainR(pInstance, u16Value);
735             Hal_ADC_SetGainG(pInstance, u16Value);
736             Hal_ADC_SetGainB(pInstance, u16Value);
737             break;
738     }
739     _XC_RETURN(pInstance);
740 }
741 
742 //******************************************************************************
743 /// Set offset value
744 /// @param u8color \b IN The channel type need to be set
745 /// @param u16Value \b IN The value need to be set.
746 //******************************************************************************
MDrv_XC_ADC_SetOffset(void * pInstance,MS_U8 u8Color,MS_U16 u16Value)747 void MDrv_XC_ADC_SetOffset(void *pInstance, MS_U8 u8Color, MS_U16 u16Value)
748 {
749     _XC_ENTRY(pInstance);
750     switch(u8Color)
751     {
752         case ADC_CHR:
753             Hal_ADC_SetOffsetR(pInstance, u16Value);
754             break;
755         case ADC_CHG:
756             Hal_ADC_SetOffsetG(pInstance, u16Value);
757             break;
758         case ADC_CHB:
759             Hal_ADC_SetOffsetB(pInstance, u16Value);
760             break;
761         case ADC_ALL:
762         default:
763             Hal_ADC_SetOffsetR(pInstance, u16Value);
764             Hal_ADC_SetOffsetG(pInstance, u16Value);
765             Hal_ADC_SetOffsetB(pInstance, u16Value);
766             break;
767     }
768     _XC_RETURN(pInstance);
769 }
770 
771 //******************************************************************************
772 /// Enable auto function (auto gain/offset) for Component or RGB source
773 /// @param bEnable \b IN Enable or Disable
774 /// @param bIsYPbPrFlag \b IN Is current source Ypbpr or not
775 /// @param bIsAutoSWMode \b IN Is auto software?
776 //******************************************************************************
MApi_XC_ADC_AutoSetting(void * pInstance,MS_BOOL bEnable,MS_BOOL bIsYPbPrFlag,MS_BOOL bIsAutoSWMode)777 void MApi_XC_ADC_AutoSetting(void *pInstance, MS_BOOL bEnable, MS_BOOL bIsYPbPrFlag, MS_BOOL bIsAutoSWMode)
778 {
779     _XC_ENTRY(pInstance);
780     Hal_ADC_dtop_calibration_target_setting(pInstance, bIsYPbPrFlag);
781     Hal_ADC_dtop_sw_mode_setting(pInstance, bEnable, bIsAutoSWMode);
782     _XC_RETURN(pInstance);
783 }
784 
MDrv_XC_ADC_reset(void * pInstance,MS_U16 u16Resete)785 void MDrv_XC_ADC_reset(void *pInstance, MS_U16 u16Resete)
786 {
787     Hal_ADC_reset(pInstance, u16Resete);
788 }
789 
MDrv_XC_ADC_Set_Source(void * pInstance,ADC_INPUTSOURCE_TYPE enADC_SourceType,E_MUX_INPUTPORT * enInputPortType,MS_U8 u8PortCount)790 void MDrv_XC_ADC_Set_Source(void *pInstance, ADC_INPUTSOURCE_TYPE enADC_SourceType, E_MUX_INPUTPORT* enInputPortType, MS_U8 u8PortCount)
791 {
792     Hal_ADC_Set_Source(pInstance, enADC_SourceType, enInputPortType, u8PortCount);
793 }
794 
795 /******************************************************************************/
796 /// Set ADC Sample clock
797 /// @param u16Value \b IN value need to be set.
798 /******************************************************************************/
MDrv_XC_ADC_SetPcClock(void * pInstance,MS_U16 u16Value)799 void MDrv_XC_ADC_SetPcClock(void *pInstance, MS_U16 u16Value )
800 {
801     _XC_ENTRY(pInstance);
802     Hal_ADC_dtop_clk_setting(pInstance, u16Value);
803     _XC_RETURN(pInstance);
804 }
805 
MDrv_XC_ADC_hpolarity_setting(void * pInstance,MS_BOOL bHightActive)806 void MDrv_XC_ADC_hpolarity_setting(void *pInstance, MS_BOOL bHightActive )
807 {
808     Hal_ADC_hpolarity_setting(pInstance, bHightActive);
809 }
810 
811 /******************************************************************************/
812 /// Set ADC Phase Ex
813 /// @param u16Value \b IN The adc phase need to be update
814 /******************************************************************************/
MDrv_XC_ADC_SetPhaseWithVSync(void * pInstance,MS_U16 u16Value)815 void MDrv_XC_ADC_SetPhaseWithVSync(void *pInstance, MS_U16 u16Value)
816 {
817     _XC_ENTRY(pInstance);
818 	if (MDrv_SC_GetSkipWaitVsync(pInstance,MAIN_WINDOW) == FALSE)
819     {
820     	MDrv_XC_wait_input_vsync(pInstance, 1, 50, MAIN_WINDOW);
821 	}
822     Hal_ADC_set_phaseEx(pInstance, u16Value);
823     _XC_RETURN(pInstance);
824 }
825 
826 /******************************************************************************/
827 /// Set ADC Phase Ex
828 /// @param u16Value \b IN The adc phase need to be update
829 /******************************************************************************/
MDrv_XC_ADC_SetPhaseEx(void * pInstance,MS_U16 u16Value)830 void MDrv_XC_ADC_SetPhaseEx(void *pInstance, MS_U16 u16Value )
831 {
832     _XC_ENTRY(pInstance);
833     Hal_ADC_set_phaseEx(pInstance, u16Value);
834     _XC_RETURN(pInstance);
835 }
836 
837 //******************************************************************************
838 /// Get current ADC Phase set
839 /// @return Current Phase
840 //******************************************************************************
MDrv_XC_ADC_GetPhaseRange(void * pInstance)841 MS_U16 MDrv_XC_ADC_GetPhaseRange(void *pInstance)
842 {
843     return Hal_ADC_get_phase_range(pInstance);
844 }
845 
846 /******************************************************************************/
847 ///Get SOG level range
848 ///@param u32Min \b OUT: min of SOG level
849 ///@param u32Max \b OUT: max of SOG level
850 ///@param u32Recommend_value \b OUT: recommend value
851 /******************************************************************************/
MDrv_XC_ADC_GetSoGLevelRange(void * pInstance,MS_U32 * u32Min,MS_U32 * u32Max,MS_U32 * u32Recommend_value)852 void MDrv_XC_ADC_GetSoGLevelRange(void *pInstance, MS_U32 *u32Min, MS_U32 *u32Max, MS_U32 *u32Recommend_value)
853 {
854     Hal_ADC_get_SoG_LevelRange(pInstance, u32Min, u32Max, u32Recommend_value);
855 }
856 
857 /******************************************************************************/
858 ///Set SOG level
859 ///@param u32Min \b IN: set SOG level
860 /******************************************************************************/
MDrv_XC_ADC_SetSoGLevel(void * pInstance,MS_U32 u32Value)861 void MDrv_XC_ADC_SetSoGLevel(void *pInstance, MS_U32 u32Value)
862 {
863     Hal_ADC_set_SoG_Level(pInstance, u32Value);
864 }
865 
866 /******************************************************************************/
867 ///Set SOG level
868 /******************************************************************************/
MDrv_XC_ADC_SetSoGCal(void * pInstance)869 void MDrv_XC_ADC_SetSoGCal(void *pInstance)
870 {
871     Hal_ADC_set_SoG_Calibration(pInstance);
872 }
873 
874 //******************************************************************************
875 /// Get current ADC Phase set
876 /// @return Current Phase
877 //******************************************************************************
MDrv_XC_ADC_GetPhase(void * pInstance)878 MS_U8 MDrv_XC_ADC_GetPhase( void *pInstance )
879 {
880     MS_U8 u8ADC_phase;
881     _XC_ENTRY(pInstance);
882     u8ADC_phase = Hal_ADC_get_phase(pInstance);
883     _XC_RETURN(pInstance);
884     return u8ADC_phase;//Hal_ADC_get_phase();
885 }
886 
MDrv_XC_ADC_GetPhaseEx(void * pInstance)887 MS_U16 MDrv_XC_ADC_GetPhaseEx( void *pInstance )
888 {
889     MS_U16 u16ADC_phase;
890     _XC_ENTRY(pInstance);
891     u16ADC_phase = Hal_ADC_get_phaseEx(pInstance);
892     _XC_RETURN(pInstance);
893     return u16ADC_phase;
894 }
895 
MDrv_XC_ADC_clamp_placement_setting(void * pInstance,MS_U16 u16InputClockMHz)896 void MDrv_XC_ADC_clamp_placement_setting(void *pInstance, MS_U16 u16InputClockMHz)
897 {
898     Hal_ADC_clamp_placement_setting(pInstance, u16InputClockMHz);
899 }
900 
901 //******************************************************************************
902 /// Set V clamping type
903 /// @param type \b IN The Vclampling type
904 //******************************************************************************
MApi_XC_ADC_SetVClampLevel(void * pInstance,ADC_VClamp_Level_Type type)905 void MApi_XC_ADC_SetVClampLevel(void *pInstance, ADC_VClamp_Level_Type type)
906 {
907     Hal_XC_ADC_Set_VClamp_level(pInstance, type);
908 }
909 
910 
911 /******************************************************************************/
912 ///This function will set ADC registers for different port
913 ///@param enInputSourceType \b IN: source type
914 ///@param u8InputClock \b IN: pixel clock
915 /******************************************************************************/
MDrv_XC_ADC_vco_ctrl(void * pInstance,MS_BOOL bIsDVIPort,MS_U16 u16InputClock)916 void MDrv_XC_ADC_vco_ctrl (void *pInstance, MS_BOOL bIsDVIPort, MS_U16 u16InputClock)
917 {
918     Hal_ADC_set_vco_ctrl(pInstance, bIsDVIPort, u16InputClock);
919 }
920 
921 //******************************************************************************
922 /// Turn off ADC
923 //******************************************************************************
MDrv_XC_ADC_PowerOff(void * pInstance)924 void MDrv_XC_ADC_PowerOff(void *pInstance)
925 {
926     Hal_ADC_poweroff(pInstance);
927 }
928 
MDrv_XC_ADC_poweron_source(void * pInstance,ADC_INPUTSOURCE_TYPE enADC_SourceType)929 void MDrv_XC_ADC_poweron_source (void *pInstance, ADC_INPUTSOURCE_TYPE enADC_SourceType)
930 {
931     Hal_XC_ADC_poweron_source(pInstance, enADC_SourceType);
932 }
933 
MDrv_ADC_SourceSwitch(void * pInstance,MS_BOOL bSwitch)934 void MDrv_ADC_SourceSwitch(void *pInstance, MS_BOOL bSwitch)
935 {
936    Hal_ADC_SourceSwitch(pInstance, bSwitch);
937 }
938 
MDrv_XC_ADC_Reload(void * pInstance,INPUT_SOURCE_TYPE_t enSourceType,MS_U16 u16PixelClockPerSecond,MS_U16 u16HorizontalTotal,MS_U16 u16SamplingRatio)939 void MDrv_XC_ADC_Reload(void *pInstance, INPUT_SOURCE_TYPE_t enSourceType, MS_U16 u16PixelClockPerSecond, MS_U16 u16HorizontalTotal, MS_U16 u16SamplingRatio)
940 {
941     if (IsSrcTypeVga(enSourceType) || IsSrcTypeYPbPr(enSourceType) || IsSrcTypeScart(enSourceType) )
942     {
943 	    Hal_ADC_set_mode(pInstance, MDrv_XC_ADC_ConvertSrcToADCSrc(pInstance, enSourceType), u16PixelClockPerSecond, u16HorizontalTotal, u16SamplingRatio);
944     }
945 }
946 
MDrv_XC_ADC_BackupAdcReg(void * pInstance,SCALER_WIN eWindow)947 void MDrv_XC_ADC_BackupAdcReg(void *pInstance, SCALER_WIN eWindow)
948 {
949     _XC_ENTRY(pInstance);
950     Hal_ADC_auto_adc_backup(pInstance, eWindow);
951     _XC_RETURN(pInstance);
952 }
953 
MDrv_XC_ADC_RestoreAdcReg(void * pInstance,SCALER_WIN eWindow)954 void MDrv_XC_ADC_RestoreAdcReg(void *pInstance, SCALER_WIN eWindow)
955 {
956     _XC_ENTRY(pInstance);
957     Hal_ADC_auto_adc_restore(pInstance, eWindow);
958     _XC_RETURN(pInstance);
959 }
960 
MDrv_XC_ADC_IsScartRGB(void * pInstance)961 MS_BOOL MDrv_XC_ADC_IsScartRGB(void *pInstance)
962 {
963     MS_BOOL bRGB = 0;
964     bRGB = Hal_ADC_is_scart_rgb(pInstance);
965 
966     return bRGB;
967 }
968 
MDrv_XC_ADC_GetPcClock(void * pInstance)969 MS_U16 MDrv_XC_ADC_GetPcClock(void *pInstance)
970 {
971     return Hal_ADC_get_clk(pInstance);
972 }
973 
MDrv_XC_ADC_SetRGB_PIPE_Delay(void * pInstance,MS_U8 u8Value)974 void MDrv_XC_ADC_SetRGB_PIPE_Delay(void *pInstance, MS_U8 u8Value)
975 {
976     Hal_ADC_set_RGB_PIPE_Delay(pInstance, u8Value);
977 }
978 
MDrv_XC_ADC_ScartRGB_SOG_ClampDelay(void * pInstance,MS_U16 u16Clpdly,MS_U16 u16Caldur)979 void MDrv_XC_ADC_ScartRGB_SOG_ClampDelay(void *pInstance, MS_U16 u16Clpdly, MS_U16 u16Caldur)
980 {
981     Hal_ADC_set_ScartRGB_SOG_ClampDelay(pInstance, u16Clpdly, u16Caldur);
982 }
983 
MDrv_XC_ADC_Set_YPbPrLooseLPF(void * pInstance,MS_BOOL bEnable)984 void MDrv_XC_ADC_Set_YPbPrLooseLPF(void *pInstance, MS_BOOL bEnable)
985 {
986     Hal_ADC_set_YPbPrLooseLPF(pInstance, bEnable);
987 }
988 
MDrv_XC_ADC_Set_SOGBW(void * pInstance,MS_U16 u16value)989 void MDrv_XC_ADC_Set_SOGBW(void *pInstance, MS_U16 u16value)
990 {
991     Hal_ADC_Set_SOGBW(pInstance, u16value);
992 }
993 
994 //******************************************************************************
995 /// Convert input source type to ADC input source type
996 /// @param enInputSource \b IN The source array.
997 //******************************************************************************
MDrv_XC_ADC_ConvertSrcToADCSrc(void * pInstance,INPUT_SOURCE_TYPE_t enInputSourceType)998 ADC_INPUTSOURCE_TYPE MDrv_XC_ADC_ConvertSrcToADCSrc(void *pInstance, INPUT_SOURCE_TYPE_t enInputSourceType)
999 {
1000     if ( IsSrcTypeVga(enInputSourceType) )
1001     {
1002         return ADC_INPUTSOURCE_ONLY_RGB;
1003     }
1004     else if ( IsSrcTypeYPbPr(enInputSourceType) )
1005     {
1006         return ADC_INPUTSOURCE_ONLY_YPBPR;
1007     }
1008     else if ( IsSrcTypeATV(enInputSourceType) )
1009     {
1010         return ADC_INPUTSOURCE_ONLY_ATV;
1011     }
1012     else if ( IsSrcTypeSV(enInputSourceType) )
1013     {
1014         return ADC_INPUTSOURCE_ONLY_SVIDEO;
1015     }
1016     else if ( IsSrcTypeAV(enInputSourceType) )
1017     {
1018         return ADC_INPUTSOURCE_ONLY_CVBS;
1019     }
1020     else if ( IsSrcTypeScart(enInputSourceType) )
1021     {
1022         return ADC_INPUTSOURCE_ONLY_SCART;
1023     }
1024     else if ( IsSrcTypeHDMI(enInputSourceType) )
1025     {
1026         return ADC_INPUTSOURCE_ONLY_DVI;
1027     }
1028     else if ( IsSrcTypeStorage(enInputSourceType) || IsSrcTypeDTV(enInputSourceType))
1029     {
1030         return ADC_INPUTSOURCE_ONLY_MVOP;
1031     }
1032     else
1033     {
1034         return ADC_INPUTSOURCE_UNKNOW;
1035     }
1036 }
1037 
MDrv_XC_ADC_SetClampDuration(void * pInstance,MS_U16 u16Value)1038 void MDrv_XC_ADC_SetClampDuration(void *pInstance, MS_U16 u16Value)
1039 {
1040     Hal_ADC_dtop_vClampDuration_setting(pInstance, u16Value);
1041 }
1042 
MDrv_XC_ADC_EnableHWCalibration(void * pInstance,MS_BOOL bEnable)1043 void MDrv_XC_ADC_EnableHWCalibration(void *pInstance, MS_BOOL bEnable)
1044 {
1045     Hal_ADC_Enable_HWCalibration(pInstance, bEnable);
1046 }
MDrv_XC_ADC_CheckHWCalibrationSupport(void * pInstance)1047 MS_BOOL MDrv_XC_ADC_CheckHWCalibrationSupport(void *pInstance)
1048 {
1049     return ADC_HARDWARE_AUTOGAIN_SUPPORTED;
1050 }
1051 
MDrv_ADC_ISOG_Enable(void * pInstance,MS_BOOL bEnable)1052 void MDrv_ADC_ISOG_Enable(void *pInstance, MS_BOOL bEnable)
1053 {
1054     Hal_ADC_ISOG_Enable(pInstance, bEnable);
1055 }
1056 
MDrv_ADC_ISOG_SetDetectMode(void * pInstance,ADC_iSogDetectMode stMode)1057 void MDrv_ADC_ISOG_SetDetectMode(void *pInstance, ADC_iSogDetectMode stMode)
1058 {
1059     if(Hal_ADC_ISOG_CheckEnabled(pInstance))
1060     {
1061         switch(stMode)
1062         {
1063             default:
1064             case E_ADC_ISOG_NORMAL_MODE:
1065                 Hal_ADC_ISOG_SetResetWidth(pInstance, 0);
1066                 break;
1067             case E_ADC_ISOG_STANDBY_MODE:
1068                 Hal_ADC_ISOG_SetResetWidth(pInstance, 1);
1069                 break;
1070         }
1071     }
1072 }
1073 
MDrv_XC_ADC_GetFixedGain(void * pInstance,const INPUT_SOURCE_TYPE_t enInputSrc,APIXC_AdcGainOffsetSetting * pstAdcFixedGain)1074 MS_BOOL MDrv_XC_ADC_GetFixedGain(void *pInstance, const INPUT_SOURCE_TYPE_t enInputSrc, APIXC_AdcGainOffsetSetting* pstAdcFixedGain)
1075 {
1076     MS_BOOL bResult = FALSE;
1077     if ((enInputSrc >= INPUT_SOURCE_NUM) || (NULL == pstAdcFixedGain))
1078     {
1079         XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Error parameter InputSource:%u, pointer null:%u!!\n", enInputSrc, (NULL == pstAdcFixedGain));
1080         return FALSE;
1081     }
1082 
1083 #if ADC_HARDWARE_AUTOGAIN_SUPPORTED
1084     if (IsSrcTypeYPbPr(enInputSrc))
1085     {
1086         pstAdcFixedGain->u16RedGain = ADC_YPBPR_FIXED_GAIN_R;
1087         pstAdcFixedGain->u16GreenGain = ADC_YPBPR_FIXED_GAIN_G;
1088         pstAdcFixedGain->u16BlueGain = ADC_YPBPR_FIXED_GAIN_B;
1089         bResult = TRUE;
1090     }
1091     else if (IsSrcTypeVga(enInputSrc))
1092     {
1093         pstAdcFixedGain->u16RedGain = ADC_VGA_FIXED_GAIN_R;
1094         pstAdcFixedGain->u16GreenGain = ADC_VGA_FIXED_GAIN_G;
1095         pstAdcFixedGain->u16BlueGain = ADC_VGA_FIXED_GAIN_B;
1096         bResult = TRUE;
1097     }
1098     else if (IsSrcTypeScart(enInputSrc))
1099     {
1100         pstAdcFixedGain->u16RedGain = ADC_SCART_FIXED_GAIN_R;
1101         pstAdcFixedGain->u16GreenGain = ADC_SCART_FIXED_GAIN_G;
1102         pstAdcFixedGain->u16BlueGain = ADC_SCART_FIXED_GAIN_B;
1103         bResult = TRUE;
1104     }
1105     else
1106     {
1107         XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Wrong input source %u!!\n", enInputSrc);
1108         bResult = FALSE;
1109     }
1110 #else
1111     UNUSED(pstAdcFixedGain);
1112     XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Unsupport ADC HW calibration on this chip!!\n");
1113     bResult = FALSE;
1114 #endif
1115 
1116     return bResult;
1117 }
1118 
1119 //******************************************************************************
1120 /// Get fixed offset
1121 /// @param enInputSrc         \b IN: input source
1122 /// @param pstInitialOffset   \b OUT: offset value struct
1123 /// @return MS_BOOL \b:TRUE succeed, FALSE fail
1124 //******************************************************************************
MDrv_ADC_GetFixedOffset(void * pInstance,const INPUT_SOURCE_TYPE_t enInputSrc,APIXC_AdcGainOffsetSetting * pstInitialOffset)1125 MS_BOOL MDrv_ADC_GetFixedOffset(void *pInstance, const INPUT_SOURCE_TYPE_t enInputSrc, APIXC_AdcGainOffsetSetting* pstInitialOffset)
1126 {
1127     MS_BOOL bRet = FALSE;
1128 
1129     if ((enInputSrc >= INPUT_SOURCE_NUM) || (NULL == pstInitialOffset))
1130     {
1131         XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Error parameter InputSource:%u, pointer null:%u!!\n", enInputSrc, (NULL == pstInitialOffset));
1132         return FALSE;
1133     }
1134 
1135     if (IsSrcTypeVga(enInputSrc))
1136     {
1137 #if ADC_HARDWARE_AUTOOFFSET_RGB
1138         // Initial offset for VGA
1139         pstInitialOffset->u16RedOffset = ADC_VGA_FIXED_OFFSET_R;
1140         pstInitialOffset->u16GreenOffset = ADC_VGA_FIXED_OFFSET_G;
1141         pstInitialOffset->u16BlueOffset = ADC_VGA_FIXED_OFFSET_B;
1142         bRet = TRUE;
1143 #endif
1144     }
1145     else if (IsSrcTypeYPbPr(enInputSrc))
1146     {
1147 #if ADC_HARDWARE_AUTOOFFSET_YPBPR
1148         // Initial offset for YPbPr
1149         pstInitialOffset->u16RedOffset = ADC_YPBPR_FIXED_OFFSET_R;
1150         pstInitialOffset->u16GreenOffset = ADC_YPBPR_FIXED_OFFSET_G;
1151         pstInitialOffset->u16BlueOffset = ADC_YPBPR_FIXED_OFFSET_B;
1152         bRet = TRUE;
1153 #endif
1154     }
1155     else if (IsSrcTypeScart(enInputSrc))
1156     {
1157 #if ADC_HARDWARE_AUTOOFFSET_SCARTRGB
1158         // Initial offset for Scart
1159         pstInitialOffset->u16RedOffset = ADC_SCART_FIXED_OFFSET_R;
1160         pstInitialOffset->u16GreenOffset = ADC_SCART_FIXED_OFFSET_G;
1161         pstInitialOffset->u16BlueOffset = ADC_SCART_FIXED_OFFSET_B;
1162         bRet = TRUE;
1163 #endif
1164     }
1165     else
1166     {
1167         XC_LOG_TRACE(XC_DBGLEVEL_AUTOGEOMETRY, "Wrong input source %u!!\n", enInputSrc);
1168         bRet = FALSE;
1169     }
1170 
1171     return bRet;
1172 }
1173 
1174 
1175 
1176 //******************************************************************************
1177 /// Set ADC for specific input source
1178 /// @param enInputSource \b IN The source array. It is possible there are multi-active sources at the same time (For ex. RGB source with ATV monitor out).
1179 /// @param u8InputSourceCount \b IN The number of active source.
1180 //******************************************************************************
MDrv_XC_ADC_SetInputSource(void * pInstance,INPUT_SOURCE_TYPE_t * enInputSource,MS_U8 u8InputSourceCount)1181 void MDrv_XC_ADC_SetInputSource(void *pInstance, INPUT_SOURCE_TYPE_t*  enInputSource, MS_U8 u8InputSourceCount)
1182 {
1183     ADC_INPUTSOURCE_TYPE adc_source_index[MAX_ADCSOUCE_NUM] = {ADC_INPUTSOURCE_UNKNOW, ADC_INPUTSOURCE_UNKNOW};
1184     E_MUX_INPUTPORT enPorts[3] = {INPUT_PORT_NONE_PORT, INPUT_PORT_NONE_PORT, INPUT_PORT_NONE_PORT};
1185     MS_U8 u8Port_count = 0;
1186     MS_BOOL isMultipleSource = ( u8InputSourceCount > 1 );
1187     MS_U8 i;
1188     MS_BOOL bIsYPbPrSource = FALSE;
1189 
1190 
1191     TRACE_ADC_INPUT(
1192         for(i=0; i<u8InputSourceCount; i++)
1193         {
1194             printf("(src %d)enInputSource(%s), u8InputSourceCount(%d)\n",
1195                     i,
1196                     enInputSource[i] == INPUT_SOURCE_VGA?"VGA" :
1197                     enInputSource[i] == INPUT_SOURCE_TV? "TV"  :
1198                     enInputSource[i] == INPUT_SOURCE_YPBPR? "YPBPR"  :
1199                     enInputSource[i] == INPUT_SOURCE_YPBPR2? "YPBPR2"  :
1200                     enInputSource[i] == INPUT_SOURCE_YPBPR3? "YPBPR3"  :
1201                     "Others Input",
1202                     u8InputSourceCount);
1203         }
1204     );
1205 
1206     if(u8InputSourceCount > MAX_ADCSOUCE_NUM)
1207     {
1208         printf("[ASSERT]MDrv_XC_ADC_SetInputSource: u8InputSourceCount(%u) shouldn't be bigger than MAX_ADCSOUCE_NUM(%u)!\n",u8InputSourceCount,MAX_ADCSOUCE_NUM);
1209         MS_ASSERT(0);
1210         return;
1211     }
1212 
1213     for(i=0;i <u8InputSourceCount; i++)
1214     {
1215         adc_source_index[i] = MDrv_XC_ADC_ConvertSrcToADCSrc(pInstance, enInputSource[i]);
1216         if(IsSrcTypeYPbPr(enInputSource[i]))
1217         {
1218             bIsYPbPrSource |= TRUE;
1219         }
1220     }
1221 
1222     // Per ADC HW designer's suggestion, only for YPbPr case, internal SOG reset signal should be configured before sync detect.
1223     if (bIsYPbPrSource)
1224     {
1225         MDrv_ADC_ISOG_SetDetectMode(pInstance, E_ADC_ISOG_NORMAL_MODE);
1226     }
1227 
1228     TRACE_ADC_INPUT(printf("===> %s\n", isMultipleSource?"Multi Input":"Single Input"));
1229 
1230     if(isMultipleSource)
1231     {
1232         // set Power for main/sub
1233         if(adc_source_index[0] != ADC_INPUTSOURCE_UNKNOW && adc_source_index[1] != ADC_INPUTSOURCE_UNKNOW)
1234         {
1235             MDrv_XC_ADC_poweron_source(pInstance, (ADC_INPUTSOURCE_TYPE)(adc_source_index[0]|adc_source_index[1]));
1236         }
1237 
1238         // set mux for main
1239         if(adc_source_index[0] != ADC_INPUTSOURCE_UNKNOW)
1240         {
1241             MDrv_XC_Mux_GetPort(pInstance, enInputSource[0] , enPorts , &u8Port_count );
1242             MDrv_XC_ADC_Set_Source(pInstance, (ADC_INPUTSOURCE_TYPE)(adc_source_index[0] | adc_source_index[1]), enPorts, u8Port_count);
1243         }
1244     }
1245     else
1246     {
1247         // set Mux & Power
1248         if(adc_source_index[0] != ADC_INPUTSOURCE_UNKNOW)
1249         {
1250             MDrv_XC_Mux_GetPort(pInstance, enInputSource[0] , enPorts , &u8Port_count );
1251             MDrv_XC_ADC_poweron_source(pInstance, adc_source_index[0]);
1252             MDrv_XC_ADC_Set_Source(pInstance, adc_source_index[0], enPorts, u8Port_count);
1253         }
1254     }
1255 }
1256 
MDrv_XC_ADC_SetIdacCurrentMode(void * pInstance,ADC_DacCurrentMode_t eMode)1257 MS_BOOL MDrv_XC_ADC_SetIdacCurrentMode(void *pInstance, ADC_DacCurrentMode_t eMode)
1258 {
1259     return Hal_ADC_SetIdacCurrentMode(pInstance, (MS_U16)eMode);
1260 }
1261 
MDrv_XC_ADC_GetIdacCurrentMode(void * pInstance)1262 ADC_DacCurrentMode_t MDrv_XC_ADC_GetIdacCurrentMode(void *pInstance)
1263 {
1264     return (ADC_DacCurrentMode_t)Hal_ADC_GetIdacCurrentMode(pInstance);
1265 }
1266 
MDrv_XC_ADC_SCART_RGB_setMode(void * pInstance,MS_BOOL bEnable)1267 void MDrv_XC_ADC_SCART_RGB_setMode(void *pInstance, MS_BOOL bEnable)
1268 {
1269     Hal_ADC_SCART_RGB_setMode(pInstance,bEnable);
1270 }
1271 
1272 #undef MDRV_ADC_C
1273