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