source: svn/newcon3bcm2_21bu/dst/dhl/src/devices/dtqs22ddp101b/MxL601_TunerApi.c

Last change on this file was 76, checked in by megakiss, 10 years ago

1W 대기전력을 만족시키기 위하여 POWEROFF시 튜너를 Standby 상태로 함

  • Property svn:executable set to *
File size: 74.3 KB
Line 
1/*******************************************************************************
2 *
3 * FILE NAME          : MxL601_TunerApi.cpp
4 *
5 * AUTHOR             : Sunghoon Park
6 *                      Dong Liu
7 *                     
8 *
9 * DATE CREATED       : 07/12/2011
10 *                      11/30/2011
11 *
12 * DESCRIPTION        : This file contains MxL601 driver APIs
13 *
14 *
15 *******************************************************************************
16 *                Copyright (c) 2011, MaxLinear, Inc.
17 ******************************************************************************/
18
19#include <math.h>
20#include "MxL601_TunerApi.h"
21#include "MxL_Debug.h"
22
23/* MxLWare Driver version for MxL601 */
24const UINT8 MxLWareDrvVersion[] = {2, 1, 10, 2}; 
25
26// Candidate version number, 0 means for release version
27const UINT8 BuildNumber = 0; 
28
29static XTAL_SPUR_CFG_T xtalSpurCfg[5] = {{96, 0, 0, 99},
30                                         {97, 0, 0, 99},
31                                         {98, 0, 0, 99},
32                                         {99, 0, 0, 99},
33                                         {0, 0, 0, 0}};
34
35static IF_FCW_CFG_T ifFcwCfg[5] = {{96, 0, 0, 0},
36                                   {97, 0, 0, 0},
37                                   {98, 0, 0, 0},
38                                   {99, 0, 0, 0},
39                                   {0, 0, 0, 0}};
40
41static IF_FCW_LUT_T ifFcwOverwriteTable[17] = {{0x0092, 0x0083},
42                                               {0x009F, 0x0091},
43                                               {0x00A3, 0x0094},
44                                               {0x00A4, 0x0096},
45                                               {0x00B2, 0x00A4},
46                                               {0x00B4, 0x00A6},
47                                               {0x00C5, 0x00B7},
48                                               {0x00D3, 0x00C5},
49                                               {0x00EB, 0x00DC},
50                                               {0x00F5, 0x00E7},
51                                               {0x0118, 0x010A},
52                                               {0x0140, 0x0132},
53                                               {0x0540, 0x0532},
54                                               {0x055C, 0x054E},
55                                               {0x0562, 0x0554},
56                                               {0x0575, 0x0567},
57                                               {0x068C, 0x067E}};
58
59/*------------------------------------------------------------------------------
60--| FUNCTION NAME : MxL601_ConfigDevReset - MXL_DEV_SOFT_RESET_CFG
61--|
62--| AUTHOR        : Dong Liu
63--|
64--| DATE CREATED  : 03/23/2011 
65--|
66--| DESCRIPTION   : By writing any value into address 0xFF, all control
67--|                 registers are initialized to the default value.
68--|
69--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
70--|
71--|---------------------------------------------------------------------------*/
72
73static MXL_STATUS MxL601_ConfigDevReset(PMXL_RESET_CFG_T resetCfg)
74{
75  UINT8 status = MXL_TRUE;
76  UINT8 idx = 0;
77 
78  MxL_DLL_DEBUG0("MXL_DEV_SOFT_RESET_CFG \n"); 
79 
80  // Write 0xFF with 0 to reset tuner
81  status = Ctrl_WriteRegister(resetCfg->I2cSlaveAddr, AIC_RESET_REG, 0x00); 
82 
83  for (idx = 0; idx < 4; idx++)
84  {
85    if (xtalSpurCfg[idx].i2cAddr == resetCfg->I2cSlaveAddr)
86    {
87      xtalSpurCfg[idx].appMode = 99;
88      xtalSpurCfg[idx].xtalAmp_Rb = 0;
89      xtalSpurCfg[idx].xtalAmp_LinRb = 0;
90      break;
91    }
92  }
93
94  return (MXL_STATUS)status;
95}
96
97/*------------------------------------------------------------------------------
98--| FUNCTION NAME : MxL601_ConfigDevOverwriteDefault -
99--|                                               MXL_DEV_OVERWRITE_DEFAULT_CFG
100--|
101--| AUTHOR        : Sunghoon Park
102--|                 Dong Liu
103--|
104--| DATE CREATED  : 06/14/2011 
105--|                 06/21/2011
106--|
107--| DESCRIPTION   : Register(s) that requires default values to be overwritten
108--|                 during initialization
109--|
110--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
111--|
112--|---------------------------------------------------------------------------*/
113
114static MXL_STATUS MxL601_ConfigDevOverwriteDefault(PMXL_OVERWRITE_DEFAULT_CFG_T overDefaultPtr)
115{
116  UINT8 status = MXL_TRUE;
117  UINT8 readData = 0;
118
119  MxL_DLL_DEBUG0("MXL_DEV_OVERWRITE_DEFAULT_CFG \n"); 
120  status |= Ctrl_ProgramRegisters(overDefaultPtr->I2cSlaveAddr, MxL_OverwriteDefaults);
121
122  status |= Ctrl_WriteRegister(overDefaultPtr->I2cSlaveAddr, 0x00, 0x01);
123  status |= Ctrl_ReadRegister(overDefaultPtr->I2cSlaveAddr, 0x31, &readData);
124  readData &= 0x2F;
125  readData |= 0xD0;
126  status |= Ctrl_WriteRegister(overDefaultPtr->I2cSlaveAddr, 0x31, readData);
127  status |= Ctrl_WriteRegister(overDefaultPtr->I2cSlaveAddr, 0x00, 0x00);
128
129
130  /* If Single supply 3.3v is used */
131  if (MXL_ENABLE == overDefaultPtr->SingleSupply_3_3V)
132    status |= Ctrl_WriteRegister(overDefaultPtr->I2cSlaveAddr, MAIN_REG_AMP, 0x04);
133
134  return (MXL_STATUS)status;
135}
136
137/*------------------------------------------------------------------------------
138--| FUNCTION NAME : MxL601_ConfigDevPowerMode - MXL_DEV_POWER_MODE_CFG
139--|
140--| AUTHOR        : Dong Liu
141--|                 Sunghoon Park
142--|
143--| DATE CREATED  : 06/21/2011
144--|                 06/15/2011
145--|
146--| DESCRIPTION   : This API configures MxL601 power mode
147--|
148--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
149--|
150--|---------------------------------------------------------------------------*/
151
152static MXL_STATUS MxL601_ConfigDevPowerMode(PMXL_PWR_MODE_CFG_T pwrModePtr)
153{
154  UINT8 status = MXL_TRUE;
155  UINT8 i2cAddr; 
156
157  MxL_DLL_DEBUG0("MXL_DEV_POWER_MODE_CFG \n");
158  i2cAddr = pwrModePtr->I2cSlaveAddr;
159
160  switch(pwrModePtr->PowerMode)
161  {
162    case MXL_PWR_MODE_SLEEP:
163      break;
164
165    case MXL_PWR_MODE_ACTIVE:
166      status |= Ctrl_WriteRegister(i2cAddr, TUNER_ENABLE_REG, MXL_ENABLE);
167      status |= Ctrl_WriteRegister(i2cAddr, START_TUNE_REG, MXL_ENABLE);
168      break;
169
170    case MXL_PWR_MODE_STANDBY:
171      status |= Ctrl_WriteRegister(i2cAddr, START_TUNE_REG, MXL_DISABLE);
172      status |= Ctrl_WriteRegister(i2cAddr, TUNER_ENABLE_REG, MXL_DISABLE);
173      break;
174
175    default:
176      return MXL_FALSE;
177  }
178
179  return(MXL_STATUS)status;
180}
181
182/*------------------------------------------------------------------------------
183--| FUNCTION NAME : MxL601_ConfigDevXtalSet - MXL_DEV_XTAL_SET_CFG
184--|
185--| AUTHOR        : Sunghoon Park
186--|                 Dong Liu
187--|
188--| DATE CREATED  : 06/14/2011
189--|                 10/20/2011
190--|                 11/13/2011 (MK) - Update Reg address for V2
191--|
192--| DESCRIPTION   : This API is used to configure XTAL settings of MxL601 tuner
193--|                 device. XTAL settings include frequency, capacitance &
194--|                 clock out
195--|
196--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
197--|
198--|---------------------------------------------------------------------------*/
199
200static MXL_STATUS MxL601_ConfigDevXtalSet(PMXL_XTAL_SET_CFG_T xtalSetPtr)
201{
202  UINT8 status = MXL_TRUE;
203  UINT8 control = 0;
204 
205  MxL_DLL_DEBUG0("MXL_DEV_XTAL_SET_CFG \n"); 
206
207  // XTAL freq and cap setting, Freq set is located at bit<5>, cap bit<4:0>
208  control = (UINT8)((xtalSetPtr->XtalFreqSel << 5) | (xtalSetPtr->XtalCap & 0x1F)); 
209  control |= (xtalSetPtr->ClkOutEnable << 7);
210  status |= Ctrl_WriteRegister(xtalSetPtr->I2cSlaveAddr, XTAL_CAP_CTRL_REG, control);
211
212  // XTAL frequency div 4 setting <1> and  XTAL clock out enable <0>
213  // XTAL sharing mode in slave
214  control = (0x01 & (UINT8)xtalSetPtr->ClkOutDiv);
215  if (xtalSetPtr->XtalSharingMode == MXL_ENABLE) control |= 0x40; 
216  else control &= 0x01; 
217  status |= Ctrl_WriteRegister(xtalSetPtr->I2cSlaveAddr, XTAL_ENABLE_DIV_REG, control); 
218
219  // Main regulator re-program
220  if (MXL_ENABLE == xtalSetPtr->SingleSupply_3_3V)
221    status |= Ctrl_WriteRegister(xtalSetPtr->I2cSlaveAddr, MAIN_REG_AMP, 0x14);
222 
223  return(MXL_STATUS)status;
224}
225
226/*------------------------------------------------------------------------------
227--| FUNCTION NAME : MxL601_ConfigDevIfOutSet - MXL_DEV_IF_OUT_CFG
228--|
229--| AUTHOR        : Sunghoon Park
230--|                 Dong Liu
231--|
232--| DATE CREATED  : 06/15/2011
233--|                 09/22/2011
234--|
235--| DESCRIPTION   : This function is used to configure IF out settings of MxL601
236--|                 tuner device.
237--|
238--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
239--|
240--|---------------------------------------------------------------------------*/
241
242static MXL_STATUS MxL601_ConfigDevIfOutSet(PMXL_IF_OUT_CFG_T ifOutPtr)
243{
244  UINT16 ifFcw;
245  UINT8 status = MXL_TRUE;
246  UINT8 readData = 0;
247  UINT8 control = 0;
248  UINT8 idx = 0;
249 
250//  MxL_DLL_DEBUG0("%s: Manual set = %d \n",
251//                                __FUNCTION__, ifOutPtr->ManualFreqSet);
252
253  for (idx = 0; idx < 4; idx++)
254  {
255    if (ifFcwCfg[idx].i2cAddr == ifOutPtr->I2cSlaveAddr) break;
256  }
257
258  if (idx >= 4) return (MXL_STATUS)status;
259
260  // Read back register for manual IF Out
261  status |= Ctrl_ReadRegister(ifOutPtr->I2cSlaveAddr, IF_FREQ_SEL_REG, &readData);
262
263  if (ifOutPtr->ManualFreqSet == MXL_ENABLE)
264  {
265
266    ifFcwCfg[idx].if_fcw_byp = 1; 
267    ifFcwCfg[idx].manualIFOutFreqInKHz = ifOutPtr->ManualIFOutFreqInKHz;
268
269    // IF out manual setting : bit<5>
270    readData |= 0x20;
271    status |= Ctrl_WriteRegister(ifOutPtr->I2cSlaveAddr, IF_FREQ_SEL_REG, readData);
272
273    MxL_DLL_DEBUG0("Manual Freq set = %d \n", ifOutPtr->ManualIFOutFreqInKHz); 
274
275    // Manual IF freq set
276    ifFcw = (UINT16)(ifOutPtr->ManualIFOutFreqInKHz * 8192 / 216000);
277    control = (ifFcw & 0xFF); // Get low 8 bit
278    status |= Ctrl_WriteRegister(ifOutPtr->I2cSlaveAddr, IF_FCW_LOW_REG, control); 
279
280    control = ((ifFcw >> 8) & 0x0F); // Get high 4 bit
281    status |= Ctrl_WriteRegister(ifOutPtr->I2cSlaveAddr, IF_FCW_HIGH_REG, control);
282  }
283  else 
284  {
285    ifFcwCfg[idx].if_fcw_byp = 0; 
286    ifFcwCfg[idx].if_sel = ifOutPtr->IFOutFreq; 
287
288    // bit<5> = 0, use IF frequency from IF frequency table 
289    readData &= 0xC0;
290
291    // IF Freq <4:0>
292    readData |= ifOutPtr->IFOutFreq;
293    status |= Ctrl_WriteRegister(ifOutPtr->I2cSlaveAddr, IF_FREQ_SEL_REG, readData);
294  }
295 
296  // Set spectrum invert, gain level and IF path
297  // Spectrum invert indication is bit<7:6>
298  if (MXL_ENABLE == ifOutPtr->IFInversion)
299  {
300    ifFcwCfg[idx].if_invert = 1; 
301    control = 0x3 << 6;
302  }
303  else
304  {
305    ifFcwCfg[idx].if_invert = 0; 
306  }
307
308  // Path selection is bit<5:4>
309  control += ((ifOutPtr->PathSel & 0x03) << 4);
310
311  // Gain level is bit<3:0>
312  control += (ifOutPtr->GainLevel & 0x0F);
313  status |= Ctrl_WriteRegister(ifOutPtr->I2cSlaveAddr, IF_PATH_GAIN_REG, control);
314
315  return(MXL_STATUS) status;
316}
317
318/*------------------------------------------------------------------------------
319--| FUNCTION NAME : MxL601_ConfigDevGPO - MXL_DEV_GPO_CFG
320--|
321--| AUTHOR        : Dong Liu
322--|
323--| DATE CREATED  : 3/24/2011
324--|
325--| DESCRIPTION   : This API configures GPOs of MxL601 tuner device.
326--|                 (General Purpose Output Port) of the MxL601.
327--|                 There are 3 GPOs in MxL601 
328--|
329--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
330--|
331--|---------------------------------------------------------------------------*/
332
333static MXL_STATUS  MxL601_ConfigDevGPO(PMXL_GPO_CFG_T gpoParamPtr)
334{
335  UINT8 status = MXL_TRUE;
336  UINT8 regData = 0;
337
338  MxL_DLL_DEBUG0("MXL_DEV_GPO_CFG \n"); 
339
340  status |= Ctrl_ReadRegister(gpoParamPtr->I2cSlaveAddr, GPO_SETTING_REG, &regData);
341
342  switch (gpoParamPtr->GPOId)
343  {
344    case GPO1:
345      if (PORT_AUTO_CTRL == gpoParamPtr->GPOState)
346      {
347        regData &= 0xFE;
348      }
349      else
350      {
351        regData &= 0xFC;
352        // Bit<0> = 1, user manual set GP1
353        regData |= (UINT8)(0x01 | (gpoParamPtr->GPOState << 1)); 
354      }
355      break;
356   
357    case GPO2:
358      if (PORT_AUTO_CTRL == gpoParamPtr->GPOState)
359      {
360        regData &= 0xFB;
361      }
362      else
363      {
364        regData &= 0xF3;
365        // Bit<2> = 1, user manual set GP2
366        regData |= (UINT8) (0x04 | (gpoParamPtr->GPOState << 3)); 
367      }
368      break;
369
370    case GPO3:
371      if (PORT_AUTO_CTRL == gpoParamPtr->GPOState)
372      {
373        regData &= 0xEF;
374      }
375      else
376      {
377        regData &= 0xCF;
378
379        // Bit<4> = 1, user manual set GP3
380        regData |= (UINT8)(0x10 | (gpoParamPtr->GPOState << 5)); 
381      }
382      break;
383
384    default:
385      status |= MXL_FALSE;
386      break;
387  }
388 
389  if (MXL_FALSE != status)
390    status |= Ctrl_WriteRegister(gpoParamPtr->I2cSlaveAddr, GPO_SETTING_REG, regData);
391
392  return (MXL_STATUS)status;
393}
394
395/*------------------------------------------------------------------------------
396--| FUNCTION NAME : MxL601_GetDeviceInfo - MXL_DEV_ID_VERSION_REQ
397--|
398--| AUTHOR        : Dong Liu
399--|
400--| DATE CREATED  : 6/21/2011
401--|
402--| DESCRIPTION   : This function is used to get MxL601 version information.
403--|
404--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
405--|
406--|---------------------------------------------------------------------------*/
407 
408static MXL_STATUS MxL601_GetDeviceInfo(PMXL_DEV_INFO_T DevInfoPtr)
409{
410  UINT8 status = MXL_TRUE;
411  UINT8 readBack = 0;
412  UINT8 i2cAddr = 0;
413  UINT8 k = 0;
414
415  MxL_DLL_DEBUG0("MXL_DEV_ID_VERSION_REQ \n");
416
417  i2cAddr = DevInfoPtr->I2cSlaveAddr;
418
419  status |= Ctrl_ReadRegister(i2cAddr, CHIP_ID_REQ_REG, &readBack);
420  DevInfoPtr->ChipId = (readBack & 0xFF); 
421
422  status |= Ctrl_ReadRegister(i2cAddr, CHIP_VERSION_REQ_REG, &readBack);
423  DevInfoPtr->ChipVersion = (readBack & 0xFF); 
424
425  MxL_DLL_DEBUG0("Chip ID = 0x%d, Version = 0x%d \n", 
426                                    DevInfoPtr->ChipId, DevInfoPtr->ChipVersion);
427 
428  // Get MxLWare version infromation
429  for (k = 0; k < MXL_VERSION_SIZE; k++)
430    DevInfoPtr->MxLWareVer[k] = MxLWareDrvVersion[k];
431 
432  return (MXL_STATUS)status;
433}
434
435/*------------------------------------------------------------------------------
436--| FUNCTION NAME : MxL601_GetDeviceGpoState - MXL_DEV_GPO_STATE_REQ
437--|
438--| AUTHOR        : Dong Liu
439--|
440--| DATE CREATED  : 3/24/2011
441--|
442--| DESCRIPTION   : This API is used to get GPO's status information from
443--|                 MxL601 tuner device
444--|
445--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
446--|
447--|---------------------------------------------------------------------------*/
448
449static MXL_STATUS  MxL601_GetDeviceGpoState(PMXL_GPO_INFO_T gpoPtr)
450{
451  MXL_STATUS status = MXL_TRUE;
452  UINT8 regData = 0;
453
454  MxL_DLL_DEBUG0("MXL_DEV_GPO_STATE_REQ \n"); 
455
456  status = Ctrl_ReadRegister(gpoPtr->I2cSlaveAddr, GPO_SETTING_REG, &regData);
457
458  // GPO1 bit<1:0>
459  if ((regData & 0x01) == 0) gpoPtr->GPO1 = PORT_AUTO_CTRL;
460  else gpoPtr->GPO1 = (MXL_GPO_STATE_E)((regData & 0x02) >> 1);
461
462  // GPO2 bit<3:2>
463  if ((regData & 0x04) == 0) gpoPtr->GPO2 = PORT_AUTO_CTRL;
464  else gpoPtr->GPO2 = (MXL_GPO_STATE_E)((regData & 0x08) >> 3);
465
466  // GPO3 bit<5:4>
467  if ((regData & 0x10) == 0) gpoPtr->GPO3 = PORT_AUTO_CTRL;
468  else gpoPtr->GPO3 = (MXL_GPO_STATE_E)((regData & 0x20) >> 5);
469
470  return status;
471}
472
473/*------------------------------------------------------------------------------
474--| FUNCTION NAME : MxL601_ConfigTunerEnableState - MXL_TUNER_POWER_UP_CFG
475--|
476--| AUTHOR        : Dong Liu
477--|                 Sunghoon Park
478--|
479--| DATE CREATED  : 1/27/2011
480--|                 6/22/2011
481--|
482--| DESCRIPTION   : This function is used to power up/down MxL601 tuner module
483--|
484--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
485--|
486--|---------------------------------------------------------------------------*/
487
488static MXL_STATUS MxL601_ConfigTunerPowerUp(PMXL_POWER_UP_CFG_T topMasterCfgPtr) 
489{
490  UINT8 status = MXL_TRUE;
491  UINT8 regData = 0; 
492 
493  MxL_DLL_DEBUG0("MXL_TUNER_POWER_UP_CFG, ENABLE = %d \n", topMasterCfgPtr->Enable);
494
495  // Power up tuner <0> = 1 for enable, 0 for disable
496  if (MXL_ENABLE == topMasterCfgPtr->Enable) regData |= 0x01;
497
498  status = Ctrl_WriteRegister(topMasterCfgPtr->I2cSlaveAddr, TUNER_ENABLE_REG, regData);
499
500  return (MXL_STATUS)status;
501}
502
503/*------------------------------------------------------------------------------
504--| FUNCTION NAME : MxL601_ConfigTunerSequenceSet - MXL_TUNER_START_TUNE_CFG
505--|
506--| AUTHOR        : Sunghoon Park
507--|                 Dong Liu
508--|                 Mahee
509--|                 
510--|
511--| DATE CREATED  : 03/24/2011
512--|                 08/04/2011
513--|                 09/23/2011 - 1.1.11.1
514--|                 Change in flow chart for resetting RSSI when START_TUNE = 1
515--|                 N+1 blocker settings for Analog modes - 05/18
516--|
517--| DESCRIPTION   : This function is used to start or abort channel tune.
518--|
519--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
520--|
521--|---------------------------------------------------------------------------*/
522
523static MXL_STATUS MxL601_ConfigTunerSequenceSet(PMXL_START_TUNE_CFG_T sequnCfgPtr) 
524{
525  UINT8 status = MXL_TRUE;
526  UINT8 regData0 = 0;
527  UINT8 regData1 = 0;
528  UINT8 idx = 0;
529  MxL_DLL_DEBUG0("MXL_TUNER_START_TUNE_CFG, SEQUENCE SET = %d \n", 
530                                                      sequnCfgPtr->StartTune);
531
532  status |= Ctrl_WriteRegister(sequnCfgPtr->I2cSlaveAddr, START_TUNE_REG, 0x00); 
533
534  if (sequnCfgPtr->StartTune == MXL_ENABLE) 
535  {
536
537    for (idx = 0; idx < 4; idx++)
538    {
539      if (xtalSpurCfg[idx].i2cAddr == sequnCfgPtr->I2cSlaveAddr) 
540        break;
541    }
542   
543    status |= Ctrl_ReadRegister(sequnCfgPtr->I2cSlaveAddr, 0x14, &regData0); 
544    status |= Ctrl_WriteRegister(sequnCfgPtr->I2cSlaveAddr, 0x14, (regData0 & 0xDF)); 
545
546    // Bit <0> 1 : start , 0 : abort calibrations
547    status |= Ctrl_WriteRegister(sequnCfgPtr->I2cSlaveAddr, START_TUNE_REG, 0x01); 
548    MxL_Sleep(10);
549    status |= Ctrl_WriteRegister(sequnCfgPtr->I2cSlaveAddr, 0x14, (regData0 | 0x20)); 
550
551     // Check if signal type is Analog
552    if (xtalSpurCfg[idx].appMode == ANA_NTSC_MODE) 
553    {
554      // Apply N+1 blocker settings
555      status |= Ctrl_WriteRegister(sequnCfgPtr->I2cSlaveAddr, 0x84, 0x83); 
556      status |= Ctrl_WriteRegister(sequnCfgPtr->I2cSlaveAddr, 0x13, 0x00); 
557      status |= Ctrl_WriteRegister(sequnCfgPtr->I2cSlaveAddr, 0x13, 0x01); 
558    }
559
560  }
561 
562  return(MXL_STATUS) status;
563}
564
565/*------------------------------------------------------------------------------
566--| FUNCTION NAME : MxL601_ConfigTunerApplicationModeSet - MXL_TUNER_MODE_CFG
567--|
568--| AUTHOR        : Dong Liu
569--|                 Sunghoon Park
570--|
571--| DATE CREATED  : 3/24/2011
572--|                 6/16/2011
573--|                 11/13/2011 (MK) - Change register address of 0x53 & 0x54
574--|                                   with 0x5A & 0x5B (DIG_ANA_IF_CFG_0 &
575--|                                   DIG_ANA_IF_CFG_1)
576--|                                 - Update Application mode settings.
577--|                 12/28/2011 (MK) - support conditional compilation for
578--|                                   customer specific settings.
579--|                 04/11/2012 - xtal spurs improvement cfg
580--|
581--| DESCRIPTION   : This fucntion is used to configure MxL601 tuner's
582--|                 application modes like DVB-T, DVB-C, ISDB-T, PAL, SECAM,
583--|                 ATSC, NTSC etc.
584--|
585--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
586--|
587--|---------------------------------------------------------------------------*/
588
589static MXL_STATUS MxL601_ConfigTunerApplicationModeSet(PMXL_TUNER_MODE_CFG_T modeSetPtr)
590{
591  UINT8 status = MXL_TRUE;
592  UINT8 dfeRegData = 0;
593  REG_CTRL_INFO_T* tmpRegTable = NULL;
594  UINT8 idx = 0;
595  UINT8 regData = 0;
596  UINT16 ifFcw = 0;
597 
598  {
599    MxL_DLL_DEBUG0("MXL_TUNER_MODE_CFG, application mode = %d , IF = %d\n", 
600                                                            modeSetPtr->SignalMode,
601                                                            modeSetPtr->IFOutFreqinKHz);
602
603    switch(modeSetPtr->SignalMode)
604    {
605      // Application modes settings for NTSC mode
606      case ANA_NTSC_MODE:
607        tmpRegTable = AnalogNtsc;
608        status |= Ctrl_ProgramRegisters(modeSetPtr->I2cSlaveAddr, tmpRegTable);
609
610        if (modeSetPtr->IFOutFreqinKHz < HIGH_IF_35250_KHZ)
611        {
612          // Low power IF dependent settings
613#ifdef CUSTOMER_SPECIFIC_SETTING_1
614          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0xFE);
615#else
616          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0x7E); 
617#endif
618          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_1, 0x10);
619
620          if (modeSetPtr->XtalFreqSel == XTAL_16MHz) 
621          {
622            tmpRegTable = Ntsc_16MHzRfLutSwpLIF;
623            dfeRegData = 0x00;
624          }
625          else 
626          {
627            tmpRegTable = Ntsc_24MHzRfLutSwpLIF;
628            dfeRegData = 0x01;
629          }
630         
631          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, 0xDD, dfeRegData);
632         
633        }
634        else
635        {
636          // High power IF dependent settings
637          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0xD9);
638          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_1, 0x16);
639 
640          tmpRegTable = Ntsc_RfLutSwpHIF;
641        }
642
643        if (tmpRegTable)
644          status |= Ctrl_ProgramRegisters(modeSetPtr->I2cSlaveAddr, tmpRegTable);
645        else
646          status |= MXL_FALSE;
647       
648        break;
649
650      // Application modes settings for PAL-BG mode 
651      case ANA_PAL_BG:
652
653        tmpRegTable = AnalogPal;
654        status |= Ctrl_ProgramRegisters(modeSetPtr->I2cSlaveAddr, tmpRegTable);
655
656        if (modeSetPtr->IFOutFreqinKHz < HIGH_IF_35250_KHZ)
657        {
658          // Low power IF dependent settings
659#ifdef CUSTOMER_SPECIFIC_SETTING_1
660          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0xFE);
661#else
662          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0x7E); 
663#endif
664          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_1, 0x10);
665
666          status |= Ctrl_ProgramRegisters(modeSetPtr->I2cSlaveAddr, Pal_RfLutSwpLIF);
667        }
668        else
669        {
670          // High power IF dependent settings
671          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0xD9);
672          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_1, 0x16);
673        }
674
675        break;
676
677      // Application modes settings for PAL-I mode 
678      case ANA_PAL_I:
679        status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, 0x0C, 0x0B);
680       
681        tmpRegTable = AnalogPal;
682        status |= Ctrl_ProgramRegisters(modeSetPtr->I2cSlaveAddr, tmpRegTable);
683
684        if (modeSetPtr->IFOutFreqinKHz < HIGH_IF_35250_KHZ)
685        {
686          // Low power IF dependent settings
687#ifdef CUSTOMER_SPECIFIC_SETTING_1
688          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0xFE);
689#else
690          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0x7E); 
691#endif
692          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_1, 0x10);
693
694          status |= Ctrl_ProgramRegisters(modeSetPtr->I2cSlaveAddr, Pal_RfLutSwpLIF);
695        }
696        else
697        {
698          // High power IF dependent settings
699          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0xD9);
700          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_1, 0x16);
701
702          status |= Ctrl_ProgramRegisters(modeSetPtr->I2cSlaveAddr, PalI_RfLutSwpHIF); 
703
704        }
705
706        break;
707 
708      // Application modes settings for PAL-D mode   
709      case ANA_PAL_D:
710        status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, 0x0C, 0x0C);
711       
712        tmpRegTable = AnalogPal;
713        status |= Ctrl_ProgramRegisters(modeSetPtr->I2cSlaveAddr, tmpRegTable);
714
715        if (modeSetPtr->IFOutFreqinKHz < HIGH_IF_35250_KHZ)
716        {
717          // Low power IF dependent settings
718#ifdef CUSTOMER_SPECIFIC_SETTING_1
719          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0xFE);
720#else
721          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0x7E); 
722#endif
723          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_1, 0x10);
724
725          status |= Ctrl_ProgramRegisters(modeSetPtr->I2cSlaveAddr, Pal_RfLutSwpLIF);
726        }
727        else
728        {
729          // High power IF dependent settings
730          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0xD9);
731          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_1, 0x16);
732
733          status |= Ctrl_ProgramRegisters(modeSetPtr->I2cSlaveAddr, PalD_RfLutSwpHIF);
734
735        }
736        break;
737
738      // Application modes settings for SECAM-I mode   
739      case ANA_SECAM_I:
740        status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, 0x0C, 0x0B);
741
742        tmpRegTable = AnalogSecam;
743        status |= Ctrl_ProgramRegisters(modeSetPtr->I2cSlaveAddr, tmpRegTable);
744
745        if (modeSetPtr->IFOutFreqinKHz < HIGH_IF_35250_KHZ)
746        {
747          // Low power IF dependent settings
748#ifdef CUSTOMER_SPECIFIC_SETTING_1
749          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0xFE);
750#else
751          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0x7E); 
752#endif
753          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_1, 0x10);
754        }
755        else
756        {
757          // High power IF dependent settings
758          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0xD9);
759          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_1, 0x16);
760        }
761        break;
762
763      // Application modes settings for SECAM-L mode   
764      case ANA_SECAM_L:
765        status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, 0x0C, 0x0C);
766
767        tmpRegTable = AnalogSecam;
768        status |= Ctrl_ProgramRegisters(modeSetPtr->I2cSlaveAddr, tmpRegTable);
769
770        if (modeSetPtr->IFOutFreqinKHz < HIGH_IF_35250_KHZ)
771        {
772          // Low power IF dependent settings
773#ifdef CUSTOMER_SPECIFIC_SETTING_1
774          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0xFE);
775#else
776          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0x7E); 
777#endif
778          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_1, 0x10);
779        }
780        else
781        {
782          // High power IF dependent settings
783          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0xD9);
784          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_1, 0x16);
785        }
786        break;
787
788      // Application modes settings for DVB-C/J.83B modes   
789      case DIG_DVB_C:
790      case DIG_J83B:
791        tmpRegTable = DigitalDvbc;
792        status |= Ctrl_ProgramRegisters(modeSetPtr->I2cSlaveAddr, tmpRegTable);
793
794        if (modeSetPtr->IFOutFreqinKHz < HIGH_IF_35250_KHZ)
795        {
796          // Low power IF dependent settings
797          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0xFE);
798          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_1, 0x10);
799        }
800        else
801        {
802          // High power IF dependent settings
803          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0xD9);
804          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_1, 0x16);
805        }
806
807        if (modeSetPtr->XtalFreqSel == XTAL_16MHz) dfeRegData = 0x0D;
808        else dfeRegData = 0x0E;
809       
810        status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DFE_CSF_SS_SEL, dfeRegData);
811
812        break;
813
814      // Application modes settings for ISDB-T & ATSC modes   
815      case DIG_ISDBT_ATSC:
816        tmpRegTable = DigitalIsdbtAtsc;
817        status |= Ctrl_ProgramRegisters(modeSetPtr->I2cSlaveAddr, tmpRegTable);
818
819        if (modeSetPtr->IFOutFreqinKHz < HIGH_IF_35250_KHZ)
820        {
821          // Low power IF dependent settings
822          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0xF9);
823          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_1, 0x18);
824          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_PWR, 0xF1);
825        }
826        else
827        {
828          // High power IF dependent settings
829          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0xD9);
830          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_1, 0x16);
831          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_PWR, 0xB1);
832        }
833
834        if (XTAL_16MHz == modeSetPtr->XtalFreqSel) dfeRegData = 0x0D;
835        else if (XTAL_24MHz == modeSetPtr->XtalFreqSel) dfeRegData = 0x0E;
836       
837        status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DFE_CSF_SS_SEL, dfeRegData);
838
839        dfeRegData = 0;
840
841        // IF gain dependent settings
842        switch(modeSetPtr->IFOutGainLevel)
843        {
844          case 0x09: dfeRegData = 0x44; break;
845          case 0x08: dfeRegData = 0x43; break;
846          case 0x07: dfeRegData = 0x42; break;
847          case 0x06: dfeRegData = 0x41; break;
848          case 0x05: dfeRegData = 0x40; break;
849          default: break;
850        }
851        status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DFE_DACIF_GAIN, dfeRegData);
852       
853        break;
854
855      // Application modes settings for DVB-T mode
856      case DIG_DVB_T:
857        tmpRegTable = DigitalDvbt;
858        status |= Ctrl_ProgramRegisters(modeSetPtr->I2cSlaveAddr, tmpRegTable);
859
860        if (modeSetPtr->IFOutFreqinKHz < HIGH_IF_35250_KHZ)
861        {
862          // Low power IF dependent settings
863          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0xFE);
864          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_1, 0x18);
865          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_PWR, 0xF1);
866        }
867        else
868        {
869          // High power IF dependent settings
870          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_0, 0xD9);
871          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_CFG_1, 0x16);
872          status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DIG_ANA_IF_PWR, 0xB1);
873        }
874       
875        if (XTAL_16MHz == modeSetPtr->XtalFreqSel) dfeRegData = 0x0D;
876        else if (XTAL_24MHz == modeSetPtr->XtalFreqSel) dfeRegData = 0x0E;
877       
878        status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DFE_CSF_SS_SEL, dfeRegData);
879
880        dfeRegData = 0;
881        // IF gain dependent settings
882        switch(modeSetPtr->IFOutGainLevel)
883        {
884          case 0x09: dfeRegData = 0x44; break;
885          case 0x08: dfeRegData = 0x43; break;
886          case 0x07: dfeRegData = 0x42; break;
887          case 0x06: dfeRegData = 0x41; break;
888          case 0x05: dfeRegData = 0x40; break;
889          default: break;
890        }
891
892        status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, DFE_DACIF_GAIN, dfeRegData);
893        break;
894     
895      default:
896        status |= MXL_FALSE;
897        break;
898    }
899
900  }
901
902  if (MXL_FALSE != status)
903  {
904    status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, 0x6D, 0x00);
905
906    // XTAL calibration
907    status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, XTAL_CALI_SET_REG, 0x00);   
908    status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, XTAL_CALI_SET_REG, 0x01);   
909 
910    // 50 ms sleep after XTAL calibration
911    MxL_Sleep(50);
912
913    // Only for Analog modes
914    if (modeSetPtr->SignalMode <= ANA_SECAM_L) 
915    {
916      // read data to improve xtal spurs - to be used during channel tune function
917      for (idx = 0; idx < 4; idx++)
918      {
919        if (modeSetPtr->SignalMode == ANA_NTSC_MODE) 
920        {
921          if (ifFcwCfg[idx].i2cAddr == modeSetPtr->I2cSlaveAddr)
922          {
923            if (ifFcwCfg[idx].if_fcw_byp == 0)
924            {
925              status |= Ctrl_ReadRegister(modeSetPtr->I2cSlaveAddr, IF_FREQ_SEL_REG, &regData); 
926              status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, IF_FREQ_SEL_REG, (regData | 0x20));   
927
928              if (ifFcwCfg[idx].if_invert == 0)
929                ifFcw = ifFcwOverwriteTable[ifFcwCfg[idx].if_sel].if_fcw_noninvert;
930              else
931                ifFcw = ifFcwOverwriteTable[ifFcwCfg[idx].if_sel].if_fcw_invert;
932            }
933            else
934            {
935              if (ifFcwCfg[idx].if_invert == 0)
936                ifFcw = (UINT16)((ifFcwCfg[idx].manualIFOutFreqInKHz - 188) * 8192 / 216000);
937              else
938                ifFcw = (UINT16)((ifFcwCfg[idx].manualIFOutFreqInKHz + 188) * 8192 / 216000);
939            }
940
941            regData = (UINT8)(ifFcw & 0x00FF);
942            status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, IF_FCW_LOW_REG, regData);   
943
944            regData = (UINT8)((ifFcw >> 8) & 0x000F);
945            status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, IF_FCW_HIGH_REG, regData);   
946
947          }
948        }
949 
950        if (xtalSpurCfg[idx].i2cAddr == modeSetPtr->I2cSlaveAddr)
951        {
952          // If previous Application mode is PAL-BG & current mode
953          // is also PAL B/G then do not read reg values.
954          if (!((xtalSpurCfg[idx].appMode == (UINT8)ANA_PAL_BG) && (modeSetPtr->SignalMode == ANA_PAL_BG)))
955          {
956            // change page to 1
957            status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, 0x00, 0x01);   
958
959            // read reg ana_dig_refsx_xtal_amp_rb
960            status |= Ctrl_ReadRegister(modeSetPtr->I2cSlaveAddr, 0xA2, &xtalSpurCfg[idx].xtalAmp_Rb);
961
962            // read reg ana_dig_refsx_xtal_amp_lin_rb
963            status |= Ctrl_ReadRegister(modeSetPtr->I2cSlaveAddr, 0xA1, &xtalSpurCfg[idx].xtalAmp_LinRb);
964
965            xtalSpurCfg[idx].xtalAmp_LinRb &= 0x30;
966            xtalSpurCfg[idx].xtalAmp_LinRb >>= 4;
967
968            // change page to 0
969            status |= Ctrl_WriteRegister(modeSetPtr->I2cSlaveAddr, 0x00, 0x00);   
970
971            xtalSpurCfg[idx].appMode = (UINT8)modeSetPtr->SignalMode;
972
973          }
974        }
975      }
976    }
977
978  }
979 
980  return (MXL_STATUS)status;
981}
982
983/*------------------------------------------------------------------------------
984--| FUNCTION NAME : MxL601_ConfigTunerAgcSet - MXL_TUNER_AGC_CFG
985--|
986--| AUTHOR        : Dong Liu
987--|                 Sunghoon Park
988--|
989--| DATE CREATED  : 06/21/2011
990--|                 04/21/2011
991--|                 11/13/2011 (MK) - Change bit address for AGC Type function.
992--|
993--| DESCRIPTION   : This function is used to configure AGC settings of MxL601
994--|                 tuner device.
995--|
996--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
997--|
998--|---------------------------------------------------------------------------*/
999
1000static MXL_STATUS MxL601_ConfigTunerAgcSet(PMXL_AGC_SET_CFG_T agcSetPtr)
1001{
1002  UINT8 status = MXL_TRUE;
1003  UINT8 regData = 0; 
1004
1005  MxL_DLL_DEBUG0("MXL_TUNER_AGC_CFG, AGC mode = %d, sel = %d, set point = %d", 
1006    agcSetPtr->AgcSel, agcSetPtr->AgcType, agcSetPtr->SetPoint);
1007
1008  // AGC selecton <3:2> and mode setting <0>
1009  status |= Ctrl_ReadRegister(agcSetPtr->I2cSlaveAddr, AGC_CONFIG_REG, &regData); 
1010  regData &= 0xF2; // Clear bits <3:2> & <0>
1011  regData = (UINT8) (regData | (agcSetPtr->AgcType << 2) | agcSetPtr->AgcSel);
1012  status |= Ctrl_WriteRegister(agcSetPtr->I2cSlaveAddr, AGC_CONFIG_REG, regData);
1013
1014  // AGC set point <6:0>
1015  status |= Ctrl_ReadRegister(agcSetPtr->I2cSlaveAddr, AGC_SET_POINT_REG, &regData);
1016  regData &= 0x80; // Clear bit <6:0>
1017  regData |= agcSetPtr->SetPoint;
1018  status |= Ctrl_WriteRegister(agcSetPtr->I2cSlaveAddr, AGC_SET_POINT_REG, regData);
1019
1020  // AGC Polarity <4>
1021  status |= Ctrl_ReadRegister(agcSetPtr->I2cSlaveAddr, AGC_FLIP_REG, &regData);
1022  regData &= 0xEF; // Clear bit <4>
1023  regData |= (agcSetPtr->AgcPolarityInverstion << 4);
1024  status |= Ctrl_WriteRegister(agcSetPtr->I2cSlaveAddr, AGC_FLIP_REG, regData);
1025
1026#if ( defined _FE_DTQS22DDP101A_LG ||defined _FE_DTQS22DDP101B_LG ||defined _FE_LGH952F_LG)
1027
1028#else
1029  //Tuner Default ->ATSC for test
1030  //AGC Gain offset
1031  status |= Ctrl_WriteRegister(agcSetPtr->I2cSlaveAddr, 0xB4, 0x30);
1032  //AGC Gain slope
1033  status |= Ctrl_WriteRegister(agcSetPtr->I2cSlaveAddr, 0xB5, 0x66);
1034  //AGC speed
1035  status |= Ctrl_WriteRegister(agcSetPtr->I2cSlaveAddr, 0xC2, 0xA8);
1036#endif
1037
1038
1039  return(MXL_STATUS) status;
1040 
1041}
1042
1043/*------------------------------------------------------------------------------
1044--| FUNCTION NAME : MxL601_ConfigTunerFineTune - MXL_TUNER_FINE_TUNE_CFG
1045--|
1046--| AUTHOR        : Dong Liu
1047--|                 Sunghoon Park
1048--|
1049--| DATE CREATED  : 03/28/2011
1050--|                 04/22/2011
1051--|
1052--| DESCRIPTION   : This function is used to control fine tune step (freq offset) 
1053--|                 when MxL601 is used in Analog mode.
1054--|
1055--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
1056--|
1057--|---------------------------------------------------------------------------*/
1058
1059static MXL_STATUS MxL601_ConfigTunerFineTune(PMXL_FINE_TUNE_CFG_T fineTunePtr)
1060{
1061  UINT8 status = MXL_TRUE;
1062  UINT8 regData = 0;
1063
1064  MxL_DLL_DEBUG0("MXL_TUNER_FINE_TUNE_CFG, fine tune = %d", fineTunePtr->ScaleUp);
1065
1066  status |= Ctrl_ReadRegister(fineTunePtr->I2cSlaveAddr, FINE_TUNE_SET_REG, &regData);
1067
1068  // Fine tune <1:0>
1069  regData &= 0xFC;
1070  status |= Ctrl_WriteRegister(fineTunePtr->I2cSlaveAddr, FINE_TUNE_SET_REG, regData);
1071
1072  if (MXL_FINE_TUNE_STEP_UP == fineTunePtr->ScaleUp)
1073    regData |= FINE_TUNE_FREQ_INCREASE;
1074  else 
1075    regData |= FINE_TUNE_FREQ_DECREASE;
1076
1077  status |= Ctrl_WriteRegister(fineTunePtr->I2cSlaveAddr, FINE_TUNE_SET_REG, regData); 
1078
1079  return(MXL_STATUS)status;
1080}
1081
1082/*------------------------------------------------------------------------------
1083--| FUNCTION NAME : MxL601_ConfigTunerEnableFineTune -
1084--|                                           MXL_TUNER_ENABLE_FINE_TUNE_CFG
1085--|
1086--| AUTHOR        : Sunghoon Park
1087--|                 Dong Liu
1088--|
1089--| DATE CREATED  : 04/22/2011
1090--|                 07/01/2011 
1091--|
1092--| DESCRIPTION   : This fucntion is used to enable or disable fine tune function
1093--|                 when MxL601 device is used in Analog mode.
1094--|
1095--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
1096--|
1097--|---------------------------------------------------------------------------*/
1098
1099static MXL_STATUS MxL601_ConfigTunerEnableFineTune(PMXL_ENABLE_FINE_TUNE_CFG_T fineTunePtr)
1100{
1101  UINT8 status = MXL_TRUE;
1102  UINT8 fineTuneReg1 = 0;
1103  UINT8 fineTuneReg2 = 0;
1104 
1105  MxL_DLL_DEBUG0("MXL_TUNER_ENABLE_FINE_TUNE_CFG, fine tune = %d",
1106                                                    fineTunePtr->EnableFineTune);
1107
1108  status |= Ctrl_ReadRegister(fineTunePtr->I2cSlaveAddr, FINE_TUNE_CTRL_REG_0, &fineTuneReg1);
1109  status |= Ctrl_ReadRegister(fineTunePtr->I2cSlaveAddr, FINE_TUNE_CTRL_REG_1, &fineTuneReg2);
1110 
1111  if (MXL_ENABLE == fineTunePtr->EnableFineTune) 
1112  {
1113    fineTuneReg1 |= 0x04;
1114    fineTuneReg2 |= 0x20;
1115  }
1116  else
1117  {
1118    fineTuneReg1 &= 0xF8;
1119    fineTuneReg2 &= 0xDF;
1120  }
1121
1122  status |= Ctrl_WriteRegister(fineTunePtr->I2cSlaveAddr, FINE_TUNE_CTRL_REG_0, fineTuneReg1);   
1123  status |= Ctrl_WriteRegister(fineTunePtr->I2cSlaveAddr, FINE_TUNE_CTRL_REG_1, fineTuneReg2);   
1124 
1125  return (MXL_STATUS)status;
1126}
1127
1128/*------------------------------------------------------------------------------
1129--| FUNCTION NAME : MxL601_ConfigTunerChanTune - MXL_TUNER_CHAN_TUNE_CFG
1130--|
1131--| AUTHOR        : Sunghoon Park
1132--|                 Mahendra Kondur
1133--|                 Dong Liu
1134--|
1135--| DATE CREATED  : 3/17/2011
1136--|                 9/23/2011 - NTSC HRC & IRC modes
1137--|                 11/16/2011
1138--|                 04/11/2012 - xtal spurs improvement cfg
1139--|                 04/21/2012 - S1 blocker improvements for PAL-D
1140--|
1141--| DESCRIPTION   : This API configures RF channel frequency and bandwidth.
1142--|                 Radio Frequency unit is Hz, and Bandwidth is in MHz units.
1143--|                 For analog broadcast standards, corresponding spur shifitng
1144--|                 settiings will be aplied.
1145--|
1146--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
1147--|
1148--|---------------------------------------------------------------------------*/
1149
1150static MXL_STATUS MxL601_ConfigTunerChanTune(PMXL_TUNER_TUNE_CFG_T tuneParamPtr)
1151{
1152  UINT64 frequency;
1153  UINT32 freq = 0;
1154  UINT8 status = MXL_TRUE;
1155  UINT8 regData = 0;
1156  UINT8 idx = 0;
1157  SINT16 tmpData = 0;
1158#ifdef CUSTOMER_SPECIFIC_SETTING_1
1159  MXL_ENABLE_FINE_TUNE_CFG_T fineTuneCfg;
1160#endif
1161  CHAN_DEPENDENT_FREQ_TABLE_T *freqLutPtr = NULL;
1162
1163  MxL_DLL_DEBUG0("MXL_TUNER_CHAN_TUNE_CFG, signal type = %d (%d), Freq = %d, BW = %d, Xtal = %d \n", 
1164                                              tuneParamPtr->SignalMode, 
1165                                              tuneParamPtr->NtscCarrier, 
1166                                              tuneParamPtr->FreqInHz, 
1167                                              tuneParamPtr->BandWidth, 
1168                                              tuneParamPtr->XtalFreqSel);
1169   
1170  if ((tuneParamPtr->SignalMode <= ANA_SECAM_L) && (tuneParamPtr->TuneType == VIEW_MODE))
1171  {
1172    // RF Frequency VCO Band Settings
1173    regData = 0;
1174    if (tuneParamPtr->FreqInHz < 700000000) 
1175    {
1176      status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, 0x7C, 0x1F);
1177      if ((tuneParamPtr->SignalMode == DIG_DVB_C) || (tuneParamPtr->SignalMode == DIG_J83B)) 
1178        regData = 0xC1;
1179      else
1180        regData = 0x81;
1181     
1182    }
1183    else 
1184    {
1185      status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, 0x7C, 0x9F);
1186
1187      if ((tuneParamPtr->SignalMode == DIG_DVB_C) || (tuneParamPtr->SignalMode == DIG_J83B)) 
1188        regData = 0xD1;
1189      else
1190        regData = 0x91;
1191     
1192    }
1193
1194    status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, 0x00, 0x01);
1195    status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, 0x31, regData);
1196    status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, 0x00, 0x00);
1197   
1198    switch(tuneParamPtr->SignalMode)
1199    {
1200      // Signal type is NTSC mode
1201      case ANA_NTSC_MODE:
1202
1203        // If 16MHz XTAL is used then need to program registers based on frequency value
1204        if (XTAL_16MHz == tuneParamPtr->XtalFreqSel)
1205        {
1206          if (MXL_NTSC_CARRIER_NA == tuneParamPtr->NtscCarrier)
1207          {
1208            // Select spur shifting LUT to be used based NTSC, HRC or IRC frequency
1209            if ((tuneParamPtr->FreqInHz % 1000000) == 0) 
1210            {
1211              // Apply spur shifting LUT based on HIF or LIF setting
1212              if (tuneParamPtr->IFOutFreqinKHz < HIGH_IF_35250_KHZ) freqLutPtr = NTSC_FREQ_LUT_XTAL_16MHZ_LIF;
1213              else freqLutPtr = NTSC_FREQ_LUT_XTAL_16MHZ_HIF;
1214
1215            }
1216            else if ((tuneParamPtr->FreqInHz % 12500) == 0)
1217            {
1218              freqLutPtr = NTSC_FREQ_LUT_IRC_16MHZ;
1219            }
1220            else 
1221            {
1222              freqLutPtr = NTSC_FREQ_LUT_HRC_16MHZ;
1223              status |= Ctrl_ProgramRegisters(tuneParamPtr->I2cSlaveAddr, Ntsc_HRCRfLutSwpLIF);
1224            }
1225           
1226          }
1227          else
1228          {
1229            // Select LUT based on NTSC carriers
1230            if (MXL_NTSC_CARRIER_HRC == tuneParamPtr->NtscCarrier) 
1231            {
1232              freqLutPtr = NTSC_FREQ_LUT_HRC_16MHZ;
1233              status |= Ctrl_ProgramRegisters(tuneParamPtr->I2cSlaveAddr, Ntsc_HRCRfLutSwpLIF);
1234            }
1235            else
1236            {
1237              freqLutPtr = NTSC_FREQ_LUT_IRC_16MHZ;
1238            }       
1239
1240          }
1241
1242        } // end of if (16 MHz XTAL
1243        else if (XTAL_24MHz == tuneParamPtr->XtalFreqSel)
1244        {
1245          if (MXL_NTSC_CARRIER_NA == tuneParamPtr->NtscCarrier)
1246          {
1247            // Select spur shifting LUT to be used based NTSC, HRC or IRC frequency
1248            if ((tuneParamPtr->FreqInHz % 1000000) == 0) 
1249            {
1250              freqLutPtr = NTSC_FREQ_LUT_XTAL_24MHZ;
1251            }
1252            else if ((tuneParamPtr->FreqInHz % 12500) == 0) 
1253            {
1254              freqLutPtr = NTSC_FREQ_LUT_IRC_24MHZ;
1255            }
1256            else 
1257            {
1258              freqLutPtr = NTSC_FREQ_LUT_HRC_24MHZ;
1259              status |= Ctrl_ProgramRegisters(tuneParamPtr->I2cSlaveAddr, Ntsc_HRCRfLutSwpLIF);
1260            }
1261           
1262          }
1263          else
1264          {
1265             // Select LUT based on NTSC carriers
1266            if (MXL_NTSC_CARRIER_HRC == tuneParamPtr->NtscCarrier) 
1267            {
1268              freqLutPtr = NTSC_FREQ_LUT_HRC_24MHZ;
1269              status |= Ctrl_ProgramRegisters(tuneParamPtr->I2cSlaveAddr, Ntsc_HRCRfLutSwpLIF);
1270            }
1271            else 
1272            {
1273              freqLutPtr = NTSC_FREQ_LUT_IRC_24MHZ;
1274            }
1275
1276          }
1277
1278        } // end of if (24 MHz XTAL
1279
1280        if (freqLutPtr)
1281          status |= Ctrl_SetRfFreqLutReg(tuneParamPtr->I2cSlaveAddr, tuneParamPtr->FreqInHz, freqLutPtr);
1282
1283        break;
1284
1285      // Signal type is PAL D
1286      case ANA_PAL_D:     
1287
1288        // If 16MHz XTAL is used then need to program registers based on frequency value
1289        if (XTAL_16MHz == tuneParamPtr->XtalFreqSel)
1290        {
1291          if (tuneParamPtr->IFOutFreqinKHz < HIGH_IF_35250_KHZ) freqLutPtr = PAL_D_LUT_XTAL_16MHZ_LIF;
1292          else freqLutPtr = PAL_D_LUT_XTAL_16MHZ_HIF;
1293
1294        } // end of if (16 MHz XTAL
1295        else if (XTAL_24MHz == tuneParamPtr->XtalFreqSel)
1296        {
1297          freqLutPtr = PAL_D_LUT_XTAL_24MHZ;
1298        } // end of if (24 MHz XTAL
1299
1300        if (freqLutPtr)
1301          status |= Ctrl_SetRfFreqLutReg(tuneParamPtr->I2cSlaveAddr, tuneParamPtr->FreqInHz, freqLutPtr);
1302
1303        // For PAL-D, additional registers need to be programmed for
1304        // S1 blocker performance improvement in VHF channels.
1305        if (tuneParamPtr->FreqInHz >= 358000000)
1306        {
1307          status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, 0x93, 0x33);
1308          status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, 0x94, 0x44);
1309          status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, 0xBA, 0x40);
1310          status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, 0x5D, 0x0E);
1311        }
1312        else
1313        {
1314          status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, 0x93, 0x44);
1315          status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, 0x94, 0x55);
1316          status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, 0xBA, 0x50);
1317          status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, 0x5D, 0x0F);
1318        }
1319
1320        break;
1321
1322      case ANA_PAL_BG:
1323
1324        switch(tuneParamPtr->BandWidth)
1325        {
1326          case ANA_TV_DIG_CABLE_BW_7MHz:
1327            regData = 0x09;
1328            break;
1329
1330          case ANA_TV_DIG_CABLE_BW_8MHz:
1331            regData = 0x0A;
1332            break;
1333         
1334          case ANA_TV_DIG_CABLE_BW_6MHz:
1335          case DIG_TERR_BW_6MHz:
1336          case DIG_TERR_BW_7MHz:
1337          case DIG_TERR_BW_8MHz:
1338          default: 
1339            break;
1340        }
1341
1342        status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, 0x0C, regData);
1343
1344        // If 16MHz XTAL is used then need to program registers based on frequency value
1345        if (XTAL_16MHz == tuneParamPtr->XtalFreqSel)
1346        {
1347          // PAL - BG 7 MHz Frequency range
1348          if (ANA_TV_DIG_CABLE_BW_7MHz == tuneParamPtr->BandWidth) 
1349          {
1350            if (tuneParamPtr->IFOutFreqinKHz < HIGH_IF_35250_KHZ) 
1351            {
1352              freqLutPtr = PAL_BG_7MHZ_LUT_XTAL_16MHZ_LIF;
1353              status |= Ctrl_ProgramRegisters(tuneParamPtr->I2cSlaveAddr, Pal_RfLutSwpLIF);
1354            }
1355            else
1356            {
1357              freqLutPtr = PAL_BG_7MHZ_LUT_XTAL_16MHZ_HIF;
1358              status |= Ctrl_ProgramRegisters(tuneParamPtr->I2cSlaveAddr, PalBG_7MHzBW_RfLutSwpHIF);
1359            }
1360
1361          }
1362          else
1363          {
1364            if (tuneParamPtr->IFOutFreqinKHz < HIGH_IF_35250_KHZ) 
1365            {
1366              freqLutPtr = PAL_BG_8MHZ_LUT_XTAL_16MHZ_LIF;
1367              status |= Ctrl_ProgramRegisters(tuneParamPtr->I2cSlaveAddr, Pal_RfLutSwpLIF);
1368            }
1369            else
1370            {
1371              freqLutPtr = PAL_BG_8MHZ_LUT_XTAL_16MHZ_HIF;
1372              status |= Ctrl_ProgramRegisters(tuneParamPtr->I2cSlaveAddr, PalBG_8MHzBW_RfLutSwpHIF);
1373            }
1374          }
1375         
1376        } // end of if (XTAL_16MHz     
1377        else if (XTAL_24MHz == tuneParamPtr->XtalFreqSel)
1378        { 
1379          // If 16MHz XTAL is used then need to program registers based on frequency value
1380          // PAL - BG 7 MHz Frequency range
1381          if (ANA_TV_DIG_CABLE_BW_7MHz == tuneParamPtr->BandWidth) 
1382          {
1383            freqLutPtr = PAL_BG_7MHZ_LUT_XTAL_24MHZ;
1384
1385            if (tuneParamPtr->IFOutFreqinKHz < HIGH_IF_35250_KHZ) 
1386              status |= Ctrl_ProgramRegisters(tuneParamPtr->I2cSlaveAddr, Pal_RfLutSwpLIF);
1387            else
1388              status |= Ctrl_ProgramRegisters(tuneParamPtr->I2cSlaveAddr, PalBG_7MHzBW_RfLutSwpHIF);
1389
1390          }
1391          else
1392          {
1393            freqLutPtr = PAL_BG_8MHZ_LUT_XTAL_24MHZ;   
1394
1395            if (tuneParamPtr->IFOutFreqinKHz < HIGH_IF_35250_KHZ) 
1396              status |= Ctrl_ProgramRegisters(tuneParamPtr->I2cSlaveAddr, Pal_RfLutSwpLIF);
1397            else
1398              status |= Ctrl_ProgramRegisters(tuneParamPtr->I2cSlaveAddr, PalBG_8MHzBW_RfLutSwpHIF);
1399           
1400          }
1401
1402        } // end of if (XTAL_24MHz
1403
1404        if (freqLutPtr)
1405          status |= Ctrl_SetRfFreqLutReg(tuneParamPtr->I2cSlaveAddr, tuneParamPtr->FreqInHz, freqLutPtr);
1406       
1407        break;
1408
1409      case ANA_PAL_I:     
1410
1411        // If 16MHz XTAL is used then need to program registers based on frequency value
1412        if (XTAL_16MHz == tuneParamPtr->XtalFreqSel)
1413        {
1414          if (tuneParamPtr->IFOutFreqinKHz < HIGH_IF_35250_KHZ) freqLutPtr = PAL_I_LUT_XTAL_16MHZ_LIF;
1415          else freqLutPtr = PAL_I_LUT_XTAL_16MHZ_HIF;
1416        } 
1417        else
1418        {
1419          freqLutPtr = PAL_I_LUT_XTAL_24MHZ; 
1420        }
1421
1422        if (freqLutPtr)
1423          status |= Ctrl_SetRfFreqLutReg(tuneParamPtr->I2cSlaveAddr, tuneParamPtr->FreqInHz, freqLutPtr);
1424
1425        break;
1426
1427      case ANA_SECAM_L:     
1428
1429        // If 16MHz XTAL is used then need to program registers based on frequency value
1430        if (XTAL_16MHz == tuneParamPtr->XtalFreqSel)
1431        {
1432          freqLutPtr = SECAM_L_LUT_XTAL_16MHZ;
1433        } // end of if (16 MHz XTAL   
1434        else
1435        {
1436          freqLutPtr = SECAM_L_LUT_XTAL_24MHZ;
1437        }
1438
1439        if (freqLutPtr)
1440          status |= Ctrl_SetRfFreqLutReg(tuneParamPtr->I2cSlaveAddr, tuneParamPtr->FreqInHz, freqLutPtr);
1441        break;
1442
1443      case DIG_DVB_C:
1444      case DIG_J83B:
1445        if ((tuneParamPtr->BandWidth == DIG_TERR_BW_6MHz) || (tuneParamPtr->BandWidth == DIG_TERR_BW_8MHz))
1446        {
1447          if (tuneParamPtr->BandWidth == DIG_TERR_BW_6MHz) freqLutPtr = DIG_CABLE_FREQ_LUT_BW_6MHZ;
1448          else freqLutPtr = DIG_CABLE_FREQ_LUT_BW_8MHZ;
1449
1450          status |= Ctrl_SetRfFreqLutReg(tuneParamPtr->I2cSlaveAddr, tuneParamPtr->FreqInHz, freqLutPtr);
1451        }
1452        break;
1453
1454      case DIG_ISDBT_ATSC:
1455      case DIG_DVB_T:
1456       
1457        if (tuneParamPtr->BandWidth == DIG_TERR_BW_6MHz) freqLutPtr = DIG_TERR_FREQ_LUT_BW_6MHZ;
1458        else if (tuneParamPtr->BandWidth == DIG_TERR_BW_7MHz) freqLutPtr = DIG_TERR_FREQ_LUT_BW_7MHZ;
1459        else freqLutPtr = DIG_TERR_FREQ_LUT_BW_8MHZ;
1460
1461        status |= Ctrl_SetRfFreqLutReg(tuneParamPtr->I2cSlaveAddr, tuneParamPtr->FreqInHz, freqLutPtr);
1462        break;
1463
1464      case MXL_SIGNAL_NA:
1465      default: 
1466        break;
1467    }
1468  }
1469
1470  // Tune mode <0>
1471  status |= Ctrl_ReadRegister(tuneParamPtr->I2cSlaveAddr, TUNE_MODE_REG, &regData);
1472  regData &= 0xFE;
1473
1474  if (SCAN_MODE == tuneParamPtr->TuneType) regData |= 0x01;
1475
1476  status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, TUNE_MODE_REG, regData);
1477
1478  // Bandwidth <7:0>
1479  status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, CHAN_TUNE_BW_REG, (UINT8)tuneParamPtr->BandWidth);
1480
1481  // Frequency
1482  frequency = tuneParamPtr->FreqInHz;
1483
1484  /* Calculate RF Channel = DIV(64*RF(Hz), 1E6) */
1485  frequency *= 64;
1486  freq = (UINT32)(frequency / 1000000); 
1487
1488  // Set RF 
1489  status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, CHAN_TUNE_LOW_REG, (UINT8)(freq & 0xFF));
1490  status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, CHAN_TUNE_HI_REG, (UINT8)((freq >> 8 ) & 0xFF));
1491
1492  // Only for Analog modes
1493  if (tuneParamPtr->SignalMode <= ANA_SECAM_L)
1494  {
1495    // apply xtal spur improvement settings
1496    for (idx = 0; idx < 4; idx++)
1497    {
1498      if (xtalSpurCfg[idx].i2cAddr == tuneParamPtr->I2cSlaveAddr)
1499      {
1500        regData = 0x80;
1501        tmpData = (xtalSpurCfg[idx].xtalAmp_Rb + xtalSpurCfg[idx].xtalAmp_LinRb);
1502 
1503        //if ((tuneParamPtr->FreqInHz < 300000000) && (tuneParamPtr->SignalMode <= ANA_SECAM_L))
1504        if (tuneParamPtr->FreqInHz < 300000000)
1505        {
1506          if ((tmpData - 5) > 0)
1507            regData += ((xtalSpurCfg[idx].xtalAmp_Rb + xtalSpurCfg[idx].xtalAmp_LinRb)-5);
1508        }
1509        else
1510        {
1511          regData += (xtalSpurCfg[idx].xtalAmp_Rb + xtalSpurCfg[idx].xtalAmp_LinRb); 
1512        }
1513       
1514        status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, 0x6D, regData);
1515
1516        break;
1517      }
1518    }
1519  }
1520 
1521#ifdef CUSTOMER_SPECIFIC_SETTING_1
1522  if ((tuneParamPtr->SignalMode <= ANA_SECAM_L) && (tuneParamPtr->TuneType == VIEW_MODE))
1523  {
1524    // Disable Fine tune for Analog mode channels
1525    fineTuneCfg.I2cSlaveAddr = tuneParamPtr->I2cSlaveAddr;
1526    fineTuneCfg.EnableFineTune = MXL_DISABLE;
1527    status |= MxL601_ConfigTunerEnableFineTune(&fineTuneCfg);
1528   
1529    regData = 0;
1530    status |= Ctrl_ReadRegister(tuneParamPtr->I2cSlaveAddr, FINE_TUNE_CTRL_REG_1, &regData);
1531    regData |= 0x20;
1532    status |= Ctrl_WriteRegister(tuneParamPtr->I2cSlaveAddr, FINE_TUNE_CTRL_REG_1, regData);   
1533
1534  }
1535#endif
1536     
1537  return (MXL_STATUS)status;
1538}
1539
1540/*------------------------------------------------------------------------------
1541--| FUNCTION NAME : MxL601_ConfigSpurShiftAdjustment -
1542--|                                                MXL_TUNER_SPUR_SHIFT_ADJ_CFG
1543--|
1544--| AUTHOR        : Mahee
1545--|
1546--| DATE CREATED  : 11/22/2011
1547--|                 12/20/2011
1548--|
1549--| DESCRIPTION   : This API configures MxL601 to move spurs caused by digital clock
1550--|                 out of band by adjusting digital clock frequency. The clock
1551--|                 frequency  adjustment value should be from 205 & 227.
1552--|                 Apply sequencer settings after updating registers.
1553--|
1554--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
1555--|
1556--|---------------------------------------------------------------------------*/
1557
1558static MXL_STATUS MxL601_ConfigSpurShiftAdjustment(PMXL_SPUR_SHIFT_ADJ_CFG_T spurShiftAdjPtr)
1559{
1560  UINT8 status = MXL_TRUE;
1561  UINT8 regData = 0;
1562
1563  MxL_DLL_DEBUG0("MXL_TUNER_SPUR_SHIFT_ADJ_CFG, Clock freq adjustment value = %d\n", 
1564                                            spurShiftAdjPtr->SpurShiftingClkAdjValue);
1565
1566  /* Check for spur shift clock adjustment value.
1567     The value should be greater than 205 & less than 227 */
1568  if ((spurShiftAdjPtr->SpurShiftingClkAdjValue >= SPUR_SHIFT_CLOCK_ADJUST_MIN) && 
1569      (spurShiftAdjPtr->SpurShiftingClkAdjValue <= SPUR_SHIFT_CLOCK_ADJUST_MAX))
1570  {
1571    status |= Ctrl_ReadRegister(spurShiftAdjPtr->I2cSlaveAddr, 0xEA, &regData);
1572    regData |= 0x20;
1573    status |= Ctrl_WriteRegister(spurShiftAdjPtr->I2cSlaveAddr, 0xEA, regData);   
1574
1575    status |= Ctrl_WriteRegister(spurShiftAdjPtr->I2cSlaveAddr, 
1576                                 0xEB, 
1577                                 spurShiftAdjPtr->SpurShiftingClkAdjValue);   
1578
1579    status |= Ctrl_WriteRegister(spurShiftAdjPtr->I2cSlaveAddr, START_TUNE_REG, 0x00); 
1580    status |= Ctrl_WriteRegister(spurShiftAdjPtr->I2cSlaveAddr, START_TUNE_REG, 0x01); 
1581
1582  }
1583  else status = MXL_FALSE;
1584 
1585  return (MXL_STATUS)status;
1586}
1587
1588/*------------------------------------------------------------------------------
1589--| FUNCTION NAME : MxL601_ConfigHlfrfSettings -
1590--|                                     MXL_TUNER_HLFRF_CFG
1591--|
1592--| AUTHOR        : Mahee
1593--|
1594--| DATE CREATED  : 12/28/2011
1595--|
1596--| DESCRIPTION   : This API configures register settings to improve hlfrf
1597--|                 performance.
1598--|
1599--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
1600--|
1601--|---------------------------------------------------------------------------*/
1602
1603static MXL_STATUS MxL601_ConfigHlfrfSettings(PMXL_HLFRF_CFG_T hlfrfCfgPtr)
1604{
1605  UINT8 status = MXL_TRUE;
1606  UINT8 regData0 = 0;
1607  UINT8 regData1 = 0;
1608
1609  MxL_DLL_DEBUG0("MXL_TUNER_HLFRF_CFG\n");
1610
1611  status |= Ctrl_WriteRegister(hlfrfCfgPtr->I2cSlaveAddr, 0x00, 0x01);
1612  status |= Ctrl_ReadRegister(hlfrfCfgPtr->I2cSlaveAddr, 0x96, &regData0);
1613
1614  if (hlfrfCfgPtr->Enable == MXL_ENABLE) 
1615  {
1616    regData0 |= 0x10; 
1617    regData1 = 0x48;
1618  }
1619  else 
1620  {
1621    regData0 &= 0xEF;
1622    regData1 = 0x59;
1623  }
1624
1625  status |= Ctrl_WriteRegister(hlfrfCfgPtr->I2cSlaveAddr, 0x96, regData0);
1626  status |= Ctrl_WriteRegister(hlfrfCfgPtr->I2cSlaveAddr, 0x00, 0x00);
1627 
1628  status |= Ctrl_WriteRegister(hlfrfCfgPtr->I2cSlaveAddr, 0xA9, regData1);
1629
1630  return (MXL_STATUS)status;
1631}
1632
1633/*------------------------------------------------------------------------------
1634--| FUNCTION NAME : MxL601_GetTunerSignalType - MXL_TUNER_SIGNAL_TYPE_REQ
1635--|
1636--| AUTHOR        : Sunghoon Park
1637--|
1638--| DATE CREATED  : 6/24/2011
1639--|
1640--| DESCRIPTION   : This function returns signal type received.
1641--|
1642--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
1643--|
1644--|---------------------------------------------------------------------------*/
1645
1646static MXL_STATUS MxL601_GetTunerSignalType(PMXL_SIGNAL_TYPE_T tuneSigTypePtr)
1647{
1648  MXL_STATUS status = MXL_TRUE;
1649  UINT8 regData = 0;
1650
1651  status = Ctrl_ReadRegister(tuneSigTypePtr->I2cSlaveAddr, SIGNAL_TYPE_REG, &regData);
1652
1653  // Signal type
1654  if ((regData & 0x10) == 0x10) tuneSigTypePtr->SignalMode = SIGNAL_TYPE_ANALOG;
1655  else tuneSigTypePtr->SignalMode = SIGNAL_TYPE_DIGITAL;
1656
1657  return status;
1658}
1659
1660/*------------------------------------------------------------------------------
1661--| FUNCTION NAME : MxL601_GetTunerLockStatus - MXL_TUNER_LOCK_STATUS_REQ
1662--|
1663--| AUTHOR        : Dong Liu
1664--|                 Sunghoon Park
1665--|
1666--| DATE CREATED  : 6/21/2011
1667--|                 6/24/2011
1668--|
1669--| DESCRIPTION   : This function returns Tuner Lock status of MxL601 tuner.
1670--|
1671--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
1672--|
1673--|---------------------------------------------------------------------------*/
1674
1675static MXL_STATUS MxL601_GetTunerLockStatus(PMXL_TUNER_LOCK_STATUS_T tunerLockStatusPtr)
1676{
1677  MXL_STATUS status = MXL_TRUE;
1678  UINT8 regData = 0;
1679  MXL_BOOL rfSynthStatus = MXL_UNLOCKED;
1680  MXL_BOOL refSynthStatus = MXL_UNLOCKED;
1681
1682  MxL_DLL_DEBUG0("MXL_TUNER_LOCK_STATUS_REQ \n");
1683
1684  status = Ctrl_ReadRegister(tunerLockStatusPtr->I2cSlaveAddr, RF_REF_STATUS_REG, &regData); 
1685
1686  if ((regData & 0x01) == 0x01) refSynthStatus = MXL_LOCKED;
1687
1688  if ((regData & 0x02) == 0x02) rfSynthStatus = MXL_LOCKED;
1689
1690  MxL_DLL_DEBUG0(" RfSynthStatus = %d, RefSynthStatus = %d", 
1691                                    (UINT8)rfSynthStatus,(UINT8)refSynthStatus); 
1692
1693  tunerLockStatusPtr->RfSynLock =  rfSynthStatus;
1694  tunerLockStatusPtr->RefSynLock = refSynthStatus;
1695
1696  return status;
1697}
1698
1699/*------------------------------------------------------------------------------
1700--| FUNCTION NAME : MxL601_GetTunerAgcLockStatus - MXL_TUNER_AGC_LOCK_REQ
1701--|
1702--| AUTHOR        : Dong Liu
1703--|
1704--| DATE CREATED  : 10/12/2011
1705--|
1706--| DESCRIPTION   : This function returns AGC Lock status of MxL601 tuner.
1707--|
1708--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
1709--|
1710--|---------------------------------------------------------------------------*/
1711
1712static MXL_STATUS MxL601_GetTunerAgcLockStatus(PMXL_TUNER_AGC_LOCK_T agcLockStatusPtr)
1713{
1714  MXL_STATUS status = MXL_FALSE;
1715  UINT8 regData = 0;
1716  MXL_BOOL lockStatus = MXL_UNLOCKED;
1717
1718  MxL_DLL_DEBUG0("MXL_TUNER_AGC_LOCK_REQ \n");
1719
1720  status = Ctrl_ReadRegister(agcLockStatusPtr->I2cSlaveAddr, AGC_SAGCLOCK_STATUS_REG, &regData); 
1721
1722  // Bit<3>
1723  if ((regData & 0x08) == 0x08) lockStatus = MXL_LOCKED;
1724 
1725  MxL_DLL_DEBUG0(" Agc lock = %d", (UINT8)lockStatus); 
1726
1727  agcLockStatusPtr->AgcLock =  lockStatus;
1728
1729  return status;
1730}
1731
1732/*------------------------------------------------------------------------------
1733--| FUNCTION NAME : MxL601_GetTunerRxPower - MXL_TUNER_RX_PWR_REQ
1734--|
1735--| AUTHOR        : Dong Liu
1736--|                 Sunghoon Park
1737--|
1738--| DATE CREATED  : 03/24/2010
1739--|                 06/17/2011
1740--|
1741--| DESCRIPTION   : This function returns RF input power in dBm.
1742--|
1743--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
1744--|
1745--|---------------------------------------------------------------------------*/
1746
1747static MXL_STATUS MxL601_GetTunerRxPower(PMXL_TUNER_RX_PWR_T rxPwrPtr)
1748{
1749  UINT8 status = MXL_TRUE;
1750  UINT8 regData = 0;
1751  UINT16 tmpData = 0;
1752
1753  MxL_DLL_DEBUG0("MXL_TUNER_RX_PWR_REQ \n");
1754
1755  // RF input power low <7:0>
1756  status = Ctrl_ReadRegister(rxPwrPtr->I2cSlaveAddr, RFPIN_RB_LOW_REG, &regData);
1757  tmpData = regData;
1758
1759  // RF input power high <1:0>
1760  status |= Ctrl_ReadRegister(rxPwrPtr->I2cSlaveAddr, RFPIN_RB_HIGH_REG, &regData);
1761  tmpData |= (regData & 0x03) << 8;
1762
1763  // Fractional last 2 bits
1764  rxPwrPtr->RxPwr = (REAL32)((tmpData & 0x01FF) >> 2);
1765
1766  if (tmpData & 0x02) rxPwrPtr->RxPwr += 0.5;
1767  if (tmpData & 0x01) rxPwrPtr->RxPwr += 0.25;
1768  if (tmpData & 0x0200) rxPwrPtr->RxPwr -= 128;
1769   
1770  MxL_DLL_DEBUG0(" Rx power = %f dBm \n", rxPwrPtr->RxPwr);
1771
1772  return (MXL_STATUS)status;
1773}
1774
1775/*------------------------------------------------------------------------------
1776--| FUNCTION NAME : MxL601_GetTunerAfcCorrection - MXL_TUNER_AFC_CORRECTION_REQ
1777--|
1778--| AUTHOR        : Dong Liu
1779--|
1780--| DATE CREATED  : 11/15/2011
1781--|
1782--| DESCRIPTION   : This function returns AFC offset value, unit is kHz 
1783--|
1784--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
1785--|
1786--|---------------------------------------------------------------------------*/
1787
1788static MXL_STATUS MxL601_GetTunerAfcCorrection(PMXL_TUNER_AFC_CORRECTION_T afcCorrectionPtr)
1789{
1790  UINT32 tmpData = 0;
1791  UINT8 status = MXL_TRUE;
1792  UINT8 regData = 0;
1793  UINT8 regData2 = 0;
1794  UINT8 regData3 = 0;
1795  UINT8 afcLock = 0;
1796
1797  MxL_DLL_DEBUG0("MXL_TUNER_AFC_CORRECTION_REQ \n");
1798
1799  status |= Ctrl_ReadRegister(afcCorrectionPtr->I2cSlaveAddr, RFPIN_RB_HIGH_REG, &regData);
1800  afcLock = (regData & 0x10) >> 4; 
1801
1802  // AFC offset correction readback <7:0> correponding to bit<7:0>
1803  status |= Ctrl_ReadRegister(afcCorrectionPtr->I2cSlaveAddr, DFE_CTRL_ACCUM_LOW_REG, &regData);
1804
1805  // AFC offset correction readback <15:8> correponding to bit<7:0>
1806  status |= Ctrl_ReadRegister(afcCorrectionPtr->I2cSlaveAddr, DFE_CTRL_ACCUM_MID_REG, &regData2);
1807
1808  // AFC offset correction readback <17:16> correponding to bit<1:0>
1809  status |= Ctrl_ReadRegister(afcCorrectionPtr->I2cSlaveAddr, DFE_CTRL_ACCUM_HI_REG, &regData3);
1810 
1811  tmpData = regData3 & 0x03;
1812  tmpData = (tmpData << 8) + regData2;
1813  tmpData = (tmpData << 8) + regData;
1814
1815  if ((afcLock == 0) && (tmpData == 0))
1816  {
1817    // MxL601 AFC could not find peak
1818          status = MXL_FALSE; 
1819    MxL_DLL_DEBUG0(" Can not find peak \n");
1820  }
1821  else
1822  {
1823    // Check if return data is negative number
1824    if (tmpData & 0x020000)  // Bit<17> = 1
1825      afcCorrectionPtr->AfcOffsetKHz = ((REAL64)tmpData - 262144) / 65536.0 * 1000.0; 
1826    else 
1827      afcCorrectionPtr->AfcOffsetKHz = (REAL64)tmpData / 65536.0 * 1000.0;
1828
1829    MxL_DLL_DEBUG0(" AFC correction = %f kHz \n", afcCorrectionPtr->AfcOffsetKHz);
1830  }
1831
1832  return (MXL_STATUS)status;
1833}
1834
1835/*------------------------------------------------------------------------------
1836--| FUNCTION NAME : MxL601_SetTeletextSpurMitigationAlgo -
1837--|                                                 MXL_TUNER_TELETEXT_SPUR_CFG
1838--|
1839--| AUTHOR        : Mahendra Kondur
1840--|
1841--| DATE CREATED  : March 04, 2012
1842--|
1843--| DESCRIPTION   : This function will apply settings to reduce spurs caused
1844--|                 by teletext broadcast 
1845--|
1846--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
1847--|
1848--|---------------------------------------------------------------------------*/
1849
1850static MXL_STATUS MxL601_SetTeletextSpurMitigation(PMXL_TELETEXT_SPUR_CFG_T teletextSpurCfgPtr)
1851{
1852  UINT8 numOfDCCalSamples = (UINT8)teletextSpurCfgPtr->numofDCCalSamples; // Number of DC Cal sample;
1853  REAL64 Sthreshold = teletextSpurCfgPtr->dcCalThreshold; // DC Cal threshold
1854  UINT16 dcCalSamplePeriod = (UINT16)teletextSpurCfgPtr->dcCalSamplesInterval; // 20 ms
1855   
1856  REAL64 maxSi = 0.0;
1857  REAL64 minSi = 0.0;
1858 
1859  REAL64 maxSq = 0.0;
1860  REAL64 minSq = 0.0;
1861
1862  REAL64 Si = 0.0;
1863  REAL64 Sq = 0.0;
1864
1865  REAL32 dcCal_i[MAX_DC_CAL_SAMPLES];
1866  REAL32 dcCal_q[MAX_DC_CAL_SAMPLES];
1867
1868  REAL64 SiVariance = 0.0;
1869  REAL64 SqVariance = 0.0;
1870
1871  UINT16 dcCalWordi = 0;
1872  UINT16 dcCalWordq = 0;
1873
1874  UINT8 idx = 0;
1875  UINT8 regData = 0;
1876  UINT8 status = MXL_TRUE;
1877   
1878  MxL_DLL_DEBUG0("MXL_TUNER_TELETEXT_SPUR_CFG \n");
1879
1880  if (dcCalSamplePeriod == 0) dcCalSamplePeriod = 20;
1881  if (numOfDCCalSamples == 0) numOfDCCalSamples = 50;
1882  if (Sthreshold == 0) Sthreshold = 0.3;
1883  if (teletextSpurCfgPtr->initialTimeDelay  == 0) teletextSpurCfgPtr->initialTimeDelay = 500;
1884
1885  MxL_DLL_DEBUG0("DC CAL Sample Interval = %d ms \n", dcCalSamplePeriod);
1886  MxL_DLL_DEBUG0("DC Number of DC CAL Samples = %d \n", numOfDCCalSamples);
1887  MxL_DLL_DEBUG0("DC CAL threshold = %lf ms \n", Sthreshold);
1888
1889    // Program FDC BW = 20 Hz
1890  status |= Ctrl_WriteRegister(teletextSpurCfgPtr->I2cSlaveAddr, DFE_FDC_IIR0_1, 0x77);
1891  status |= Ctrl_WriteRegister(teletextSpurCfgPtr->I2cSlaveAddr, DFE_FDC_IIR2_3, 0x77);
1892
1893  MxL_DLL_DEBUG0("%d ms delay....", teletextSpurCfgPtr->initialTimeDelay);
1894  MxL_Sleep((UINT16)teletextSpurCfgPtr->initialTimeDelay);
1895 
1896  // Read DC CAL word
1897  for (idx = 0; idx < numOfDCCalSamples; idx++)
1898  {
1899    // Change Page to 0
1900    status = Ctrl_WriteRegister(teletextSpurCfgPtr->I2cSlaveAddr, 0x00, 0x01);
1901
1902    // Read dfe_fdc_offset_i
1903    status |= Ctrl_ReadRegister(teletextSpurCfgPtr->I2cSlaveAddr, DFE_FDC_OFFSET_I_LSB, &regData);
1904    dcCalWordi = (regData & 0xFF);
1905
1906    status |= Ctrl_ReadRegister(teletextSpurCfgPtr->I2cSlaveAddr, DFE_FDC_OFFSET_I_MSB, &regData);
1907    dcCalWordi |= ((regData & 0x7F) << 8);
1908
1909    Si = MxL_GetTunerSignedBits(dcCalWordi, 1, 15, 4);
1910
1911    dcCal_i[idx] = (REAL32)Si;
1912
1913    if (idx == 0)
1914    {
1915      maxSi = minSi = Si;
1916    }
1917    else
1918    {
1919      if (Si > maxSi) maxSi = Si;
1920      else if (Si < minSi) minSi = Si;
1921    }
1922
1923    // Read dfe_fdc_offset_q
1924    status |= Ctrl_ReadRegister(teletextSpurCfgPtr->I2cSlaveAddr, DFE_FDC_OFFSET_Q_LSB, &regData);
1925    dcCalWordq = (regData & 0xFF);
1926
1927    status |= Ctrl_ReadRegister(teletextSpurCfgPtr->I2cSlaveAddr, DFE_FDC_OFFSET_Q_MSB, &regData);
1928    dcCalWordq |= ((regData & 0x7F) << 8);
1929
1930    Sq = MxL_GetTunerSignedBits(dcCalWordq, 1, 15, 4);
1931
1932    dcCal_q[idx] = (REAL32)Sq;
1933
1934    if (idx == 0)
1935    {
1936      maxSq = minSq = Sq;
1937    }
1938    else
1939    {
1940      if (Sq > maxSq) maxSq = Sq;
1941      else if (Sq < minSq) minSq = Sq;
1942    }
1943
1944    // Change Page to 1
1945    status |= Ctrl_WriteRegister(teletextSpurCfgPtr->I2cSlaveAddr, 0x00, 0x00);
1946
1947    // wait for next sample interval
1948    MxL_DLL_DEBUG0("%d ms delay....", dcCalSamplePeriod);
1949    MxL_Sleep(dcCalSamplePeriod);
1950  }
1951
1952  MxL_DLL_DEBUG0("Max Si = %lf \n", maxSi);
1953  MxL_DLL_DEBUG0("Min Si = %lf \n", minSi);
1954  MxL_DLL_DEBUG0("DELTA Si = %lf \n", (maxSi - minSi));
1955
1956  MxL_DLL_DEBUG0("Max Sq = %lf \n", maxSq);
1957  MxL_DLL_DEBUG0("Min Sq = %lf \n", minSq);
1958  MxL_DLL_DEBUG0("DELTA Sq = %lf \n", (maxSq - minSq));
1959
1960  // Calculate Variance Si
1961  SiVariance = MxL_CalculateVariance(dcCal_i, numOfDCCalSamples);
1962
1963  // Calculate Variance Sq
1964  SqVariance = MxL_CalculateVariance(dcCal_q, numOfDCCalSamples);
1965   
1966  MxL_DLL_DEBUG0("Si Variance = %lf \n", SiVariance);
1967  MxL_DLL_DEBUG0("Sq Variance = %lf \n", SqVariance);
1968
1969 
1970  if (((maxSi - minSi) >= Sthreshold) || ((maxSq - minSq) >= Sthreshold))
1971  {
1972    status |= MXL_SUCCESS; 
1973  }
1974  else
1975  {
1976    // Program FDC BW = 251 Hz
1977    status |= Ctrl_WriteRegister(teletextSpurCfgPtr->I2cSlaveAddr, DFE_FDC_IIR0_1, 0x56);
1978    status |= Ctrl_WriteRegister(teletextSpurCfgPtr->I2cSlaveAddr, DFE_FDC_IIR2_3, 0x44);
1979  }
1980
1981  return (MXL_STATUS)status;
1982}
1983
1984/*------------------------------------------------------------------------------
1985--| FUNCTION NAME : MxLWare601_API_ConfigDevice
1986--|
1987--| AUTHOR        : Dong Liu
1988--|
1989--| DATE CREATED  : 02/12/2011
1990--|
1991--| DESCRIPTION   : The general device configuration shall be handled
1992--|                 through this API.
1993--|
1994--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
1995--|
1996--|---------------------------------------------------------------------------*/
1997
1998MXL_STATUS MxLWare601_API_ConfigDevice(MXL_COMMAND_T *ParamPtr)
1999{
2000  MXL_STATUS status = MXL_TRUE;
2001  MXL_CMD_TYPE_E cmdType;
2002
2003  if (ParamPtr == NULL) return MXL_FALSE;
2004
2005  cmdType = ParamPtr->commandId;
2006
2007  MxL_DLL_DEBUG0("MxLWare601_API_ConfigDevice : cmdType = %d", cmdType);
2008
2009  switch (cmdType)
2010  {
2011    case MXL_DEV_SOFT_RESET_CFG:
2012      status = MxL601_ConfigDevReset(&ParamPtr->MxLIf.cmdResetCfg);
2013      break;
2014
2015    case MXL_DEV_OVERWRITE_DEFAULT_CFG:
2016      status = MxL601_ConfigDevOverwriteDefault(&ParamPtr->MxLIf.cmdOverwriteDefault);
2017      break;
2018
2019    case MXL_DEV_XTAL_SET_CFG:
2020      status = MxL601_ConfigDevXtalSet(&ParamPtr->MxLIf.cmdXtalCfg);
2021      break;
2022
2023    case MXL_DEV_POWER_MODE_CFG:
2024      status = MxL601_ConfigDevPowerMode(&ParamPtr->MxLIf.cmdPwrModeCfg);
2025      break;
2026
2027    case MXL_DEV_IF_OUT_CFG:
2028      status = MxL601_ConfigDevIfOutSet(&ParamPtr->MxLIf.cmdIfOutCfg);
2029      break;
2030
2031    case MXL_DEV_GPO_CFG:
2032      status = MxL601_ConfigDevGPO(&ParamPtr->MxLIf.cmdGpoCfg);
2033      break;
2034 
2035    default:
2036      status = MXL_FALSE;
2037      break;
2038  }
2039
2040  return status;
2041}
2042
2043/*------------------------------------------------------------------------------
2044--| FUNCTION NAME : MxLWare601_API_GetDeviceStatus
2045--|
2046--| AUTHOR        : Dong Liu
2047--|
2048--| DATE CREATED  : 01/30/2011
2049--|
2050--| DESCRIPTION   : The general device inquiries shall be handled
2051--|                 through this API
2052--|
2053--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
2054--|
2055--|---------------------------------------------------------------------------*/
2056
2057MXL_STATUS MxLWare601_API_GetDeviceStatus(MXL_COMMAND_T *ParamPtr)
2058{
2059  MXL_STATUS status = MXL_TRUE;
2060  MXL_CMD_TYPE_E cmdType;
2061
2062  if (ParamPtr == NULL) return MXL_FALSE;
2063
2064  cmdType = ParamPtr->commandId;
2065
2066  MxL_DLL_DEBUG0("MxLWare601_API_GetDeviceStatus : cmdType = %d", cmdType);
2067
2068  switch (cmdType)
2069  {
2070    case MXL_DEV_ID_VERSION_REQ:
2071      status = MxL601_GetDeviceInfo(&ParamPtr->MxLIf.cmdDevInfoReq);
2072      break;
2073
2074    case MXL_DEV_GPO_STATE_REQ:
2075      status = MxL601_GetDeviceGpoState(&ParamPtr->MxLIf.cmdGpoReq);
2076      break;
2077
2078    default:
2079      status = MXL_FALSE;
2080      break;
2081  }
2082
2083  return status;
2084}
2085
2086/*------------------------------------------------------------------------------
2087--| FUNCTION NAME : MxLWare601_API_ConfigTuner
2088--|
2089--| AUTHOR        : Dong Liu
2090--|
2091--| DATE CREATED  : 02/12/2011
2092--|                 12/28/2011
2093--|
2094--| DESCRIPTION   : The tuner block specific configuration shall be handled
2095--|                 through this API
2096--|                 New API added - MXL_TUNER_HALF_RF_OPTIMIZATION_CFG
2097--|     
2098--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
2099--|
2100--|---------------------------------------------------------------------------*/
2101
2102MXL_STATUS MxLWare601_API_ConfigTuner(MXL_COMMAND_T *ParamPtr)
2103{
2104  MXL_STATUS status = MXL_TRUE;
2105  MXL_CMD_TYPE_E cmdType;
2106
2107  if (ParamPtr == NULL) return MXL_FALSE;
2108
2109  cmdType = ParamPtr->commandId;
2110
2111  MxL_DLL_DEBUG0("MxLWare601_API_ConfigTuner : cmdType =%d", cmdType);
2112 
2113  switch (cmdType)
2114  {
2115    case MXL_TUNER_POWER_UP_CFG:
2116      status = MxL601_ConfigTunerPowerUp(&ParamPtr->MxLIf.cmdTunerPoweUpCfg);
2117      break;
2118
2119    case MXL_TUNER_START_TUNE_CFG:
2120      status = MxL601_ConfigTunerSequenceSet(&ParamPtr->MxLIf.cmdStartTuneCfg);
2121      break;     
2122
2123    case MXL_TUNER_MODE_CFG:
2124      status = MxL601_ConfigTunerApplicationModeSet(&ParamPtr->MxLIf.cmdModeCfg);
2125      break;     
2126
2127    case MXL_TUNER_AGC_CFG:
2128      status = MxL601_ConfigTunerAgcSet(&ParamPtr->MxLIf.cmdAgcSetCfg);
2129      break;
2130
2131    case MXL_TUNER_FINE_TUNE_CFG:
2132      status = MxL601_ConfigTunerFineTune(&ParamPtr->MxLIf.cmdFineTuneCfg);
2133      break;
2134
2135    case MXL_TUNER_ENABLE_FINE_TUNE_CFG:
2136      status = MxL601_ConfigTunerEnableFineTune(&ParamPtr->MxLIf.cmdEnableFineTuneCfg);
2137      break;
2138
2139    case MXL_TUNER_CHAN_TUNE_CFG:
2140      status = MxL601_ConfigTunerChanTune(&ParamPtr->MxLIf.cmdChanTuneCfg);
2141      break;
2142
2143    case MXL_TUNER_SPUR_SHIFT_ADJ_CFG:
2144      status = MxL601_ConfigSpurShiftAdjustment(&ParamPtr->MxLIf.cmdSuprShiftAdjCfg);
2145      break;
2146
2147    case MXL_TUNER_HLFRF_CFG:
2148      status = MxL601_ConfigHlfrfSettings(&ParamPtr->MxLIf.cmdHlfrfCfg);
2149      break;
2150
2151    case MXL_TUNER_TELETEXT_SPUR_CFG:
2152      status = MxL601_SetTeletextSpurMitigation(&ParamPtr->MxLIf.cmdTeletextSpurCfg);
2153      break;
2154
2155    default:
2156      status = MXL_FALSE;
2157      break;
2158  }
2159  return status;
2160}
2161
2162/*--------------------------------------------------------------------------------
2163--| FUNCTION NAME : MxLWare601_API_GetTunerStatus
2164--|
2165--| AUTHOR        : Dong Liu
2166--|
2167--| DATE CREATED  : 02/12/2011
2168--|
2169--| DESCRIPTION   : The tuner specific inquiries shall be handled through this API         
2170--|
2171--| RETURN VALUE  : MXL_TRUE or MXL_FALSE
2172--|
2173--|-----------------------------------------------------------------------------*/
2174
2175MXL_STATUS MxLWare601_API_GetTunerStatus(MXL_COMMAND_T *ParamPtr)
2176{
2177  MXL_STATUS status;
2178  MXL_CMD_TYPE_E cmdType;
2179
2180  if (ParamPtr == NULL) return MXL_FALSE;
2181
2182  cmdType = ParamPtr->commandId;
2183
2184  MxL_DLL_DEBUG0("MxLWare601_API_GetTunerStatus : cmdType = %d", cmdType);
2185 
2186  switch (cmdType)
2187  {
2188    case MXL_TUNER_SIGNAL_TYPE_REQ:
2189      status = MxL601_GetTunerSignalType(&ParamPtr->MxLIf.cmdTunerSignalTypeReq);
2190      break;
2191
2192    case MXL_TUNER_LOCK_STATUS_REQ:
2193      status = MxL601_GetTunerLockStatus(&ParamPtr->MxLIf.cmdTunerLockReq);
2194      break;
2195
2196    case MXL_TUNER_AGC_LOCK_REQ:
2197      status = MxL601_GetTunerAgcLockStatus(&ParamPtr->MxLIf.cmdTunerAgcLockReq);
2198      break;
2199
2200    case MXL_TUNER_RX_PWR_REQ:
2201      status = MxL601_GetTunerRxPower(&ParamPtr->MxLIf.cmdTunerPwrReq);
2202      break;
2203
2204    case MXL_TUNER_AFC_CORRECTION_REQ:
2205      status = MxL601_GetTunerAfcCorrection(&ParamPtr->MxLIf.cmdTunerAfcCorectionReq);
2206      break;
2207
2208    default:
2209      status = MXL_FALSE;
2210      break;
2211  }
2212
2213  return status;
2214}
Note: See TracBrowser for help on using the repository browser.