source: svn/trunk/zas_dstar/devices/Tuner/S5H1411/TunerDTVS205FH201A.c @ 2

Last change on this file since 2 was 2, checked in by phkim, 11 years ago

1.phkim

  1. revision copy newcon3sk r27
File size: 21.9 KB
Line 
1/****************************************************************************/
2/*                                                                          */
3/*           Copyright (c) 2003 Trident Technologies, Inc.                  */
4/*                       All rights reserved                                */
5/*                                                                          */
6/* The content of this file or document is CONFIDENTIAL and PROPRIETARY     */
7/* to Trident Microsystems, Inc.  It is subject to the terms of a           */
8/* License Agreement between Licensee and Trident Technologies, Inc.        */
9/* restricting among other things, the use, reproduction, distribution      */
10/* and transfer.  Each of the embodiments, including this information and   */
11/* any derivative work shall retain this copyright notice                   */
12/*                                                                          */
13/****************************************************************************/
14/****************************************************************************
15 *  Copyright (C) 2003-2005, Trident Technologies, Inc.
16 *  Copyright (C) 2003-2005, Oren Semiconductor
17 *             
18 *  File:        TunerDTVS205FH201A.c
19 * 
20 *  Created:     01-25-05
21 *  Description: This file contain source code for DTVS205FH201A
22 *
23 *      Modified by Alex, 2006-4-29
24 *
25 ****************************************************************************/
26#include <stdio.h>
27#include <unistd.h>
28#include "dsthalcommon.h"
29#include "dsthalcfg.h"
30#include "S5H1411Core.h"
31//#include "TunerDTVS205FH201A.h"
32//#include "IicComm.h"
33//#include "trid_sysdef.h"
34//#include "TunerDebug.h"
35
36
37#undef DTVS205_DEVICE_ADDRESS_WRITE
38#define DTVS205_DEVICE_ADDRESS_WRITE  0xC2
39
40extern int S5H1409_IicTransmit(unsigned char chipAddr, unsigned char *pBuffer, int len );
41#define MY_MSG_LEVEL 1
42
43// global data structure for our tuner i2c address and tuner type
44TUNER_INIT_PARAMETERS gStInitParam[MAX_TUNER_SUPPORT];  // port
45
46#ifdef _DEBUG_AGC_
47TYPE_TUNERDTVS205FH201A_AGC g_AgcValue=TUNERDTVS205FH201A_AGC_96;
48#endif
49
50
51static BOOLEAN TunerDTVS205BeforeSendBytes(void)
52{
53        if ( S5H1411x_RepeaterEnable() )
54                return 0;
55       
56        return 1;
57}
58static BOOLEAN TunerDTVS205AfterSendBytes(void)
59{
60        if ( S5H1411x_RepeaterDisable() )
61                return 0;
62       
63        return 1;
64}
65
66int TunerDTVS205FH201ASendChannel( unsigned int uiChannel, int iAdjustFreqKHZ, CHANNEL_TABLE_TYPE iChannelTable,TYPE_TUNERDTVS205FH201A_REF_DIVIDER_RATIO iRefDividerRatio,unsigned int uiAgc, unsigned int uiAgcMode,unsigned int uiChargePump,unsigned int uiAgcTimeConstant)
67{
68        unsigned long ulFrequency;
69        unsigned char Db1;
70        unsigned char Db2;
71        unsigned char Cb;
72        unsigned char Bb;
73
74        printf("uiChannel=%d\n", uiChannel);
75
76        DTVS205FH201AInitBytes(&Db1,&Db2,&Cb,&Bb);
77        ulFrequency = TunerDTVS205FH201AGetFrequency(uiChannel,iChannelTable);
78        if(0 == ulFrequency)
79                return DTVS205FH201A_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY;
80
81        //Add for the adjust
82        ulFrequency+=iAdjustFreqKHZ;
83       
84//printf("  ###    AgcMode = %d ###  \n",uiAgcMode);
85
86        if(FALSE == TunerDTVS205FH201ASetRFFreq(ulFrequency,uiAgcMode,&Bb))
87                return DTVS205FH201A_FREQUENCY_VALUE_OUT_OF_RANGE;
88
89        if(FALSE  == DTVS205FH201ASetN( ulFrequency,iRefDividerRatio,&Db1,&Db2))
90                return DTVS205FH201A_COULD_NOT_SET_N;
91
92#if 1//20071110
93        if (((ulFrequency>=DTVS205FH201A_100MHz)&&(ulFrequency<=DTVS205FH201A_168MHz)) || ((ulFrequency>=DTVS205FH201A_700MHz)&&(ulFrequency<=DTVS205FH201A_866MHz)))
94        {
95                uiChargePump=TUNERDTVS205FH201A_CHARGE_PUMP_100;
96        }
97        else
98        {
99                uiChargePump=TUNERDTVS205FH201A_CHARGE_PUMP_20;
100        }
101#endif
102
103        DTVS205FH201ASetCPandStepSize(iRefDividerRatio, uiChargePump, &Cb);
104//      DTVS205FH201ASetStepSize( iRefDividerRatio, &Cb,&Cb2);
105//      DTVS205FH201ASetAGC(uiAgc,&Ab);
106//      DTVS205FH201ASetATC(uiAgcTimeConstant,&Ab);
107
108        return DTVS205FH201ASendControlData(uiAgcMode,Db1,Db2,Cb,Bb);
109}
110
111#if 1
112int TunerDTVS205FH201ASendFreq( unsigned long ulFrequency,TYPE_TUNERDTVS205FH201A_REF_DIVIDER_RATIO iRefDividerRatio,unsigned int uiAgc, unsigned int uiAgcMode,unsigned int uiChargePump,unsigned int uiAgcTimeConstant)
113{
114        unsigned char Db1;
115        unsigned char Db2;
116        unsigned char Cb;
117        unsigned char Bb;
118//      unsigned char Ab;
119//      unsigned char Cb2;
120
121        DTVS205FH201AInitBytes(&Db1,&Db2,&Cb,&Bb);
122
123//printf("  ###    AgcMode = %d ###  \n",uiAgcMode);
124        printf("ulFrequency is %ld\n",ulFrequency);
125        ulFrequency /= 1000;
126        if(FALSE == TunerDTVS205FH201ASetRFFreq(ulFrequency,uiAgcMode,&Bb)){
127                printf("|%s|%d|\n",__FUNCTION__,__LINE__);
128                return DTVS205FH201A_FREQUENCY_VALUE_OUT_OF_RANGE;
129        }
130
131        if(FALSE  == DTVS205FH201ASetN( ulFrequency,iRefDividerRatio,&Db1,&Db2)){
132                printf("|%s|%d|\n",__FUNCTION__,__LINE__);
133                return DTVS205FH201A_COULD_NOT_SET_N;
134        }
135
136#if 1//20071110
137        if (((ulFrequency>=DTVS205FH201A_100MHz)&&(ulFrequency<=DTVS205FH201A_168MHz)) || ((ulFrequency>=DTVS205FH201A_700MHz)&&(ulFrequency<=DTVS205FH201A_866MHz)))
138        {
139                printf("|%s|%d|\n",__FUNCTION__,__LINE__);
140                uiChargePump=TUNERDTVS205FH201A_CHARGE_PUMP_100;
141        }
142        else
143        {
144                printf("|%s|%d|\n",__FUNCTION__,__LINE__);
145                uiChargePump=TUNERDTVS205FH201A_CHARGE_PUMP_20;
146        }
147#endif
148
149        DTVS205FH201ASetCPandStepSize(iRefDividerRatio, uiChargePump, &Cb);
150//      DTVS205FH201ASetStepSize( iRefDividerRatio, &Cb,&Cb2);
151//      DTVS205FH201ASetAGC(uiAgc,&Ab);
152//      DTVS205FH201ASetATC(uiAgcTimeConstant,&Ab);
153
154        return DTVS205FH201ASendControlData(uiAgcMode,Db1,Db2,Cb,Bb);
155}
156
157int TunerDTVS205FH201ASendPicCarrier( unsigned long ulFrequency,TYPE_TUNERDTVS205FH201A_REF_DIVIDER_RATIO iRefDividerRatio,unsigned int uiAgc, unsigned int uiAgcMode,unsigned int uiChargePump,unsigned int uiAgcTimeConstant)
158{
159        //add 1.75 MHz to the picture carrier frequency
160        return TunerDTVS205FH201ASendFreq( ulFrequency + 1750 ,iRefDividerRatio,uiAgc, uiAgcMode,uiChargePump, uiAgcTimeConstant); 
161}
162#endif
163
164unsigned long TunerDTVS205FH201AGetFrequency( unsigned int uiChannelNumber,CHANNEL_TABLE_TYPE iChannelTable)
165{
166        unsigned long ulFreq = 0;
167
168        if(NA_TERRESTRIAL ==  iChannelTable)
169        {//terrestrial
170                if ((uiChannelNumber >= 2) && (uiChannelNumber <= 6)) 
171                {
172                        switch (uiChannelNumber) 
173                        {
174                                case 2:
175                                        ulFreq = 57;
176                                        break;
177                                case 3:
178                                        ulFreq = 63;
179                                        break;
180                                case 4:
181                                        ulFreq = 69;
182                                        break;
183                                case 5:
184                                        ulFreq = 79;
185                                        break;
186                                case 6:
187                                        ulFreq = 85;
188                                        break;
189                        }
190                }
191                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) 
192                {
193                        ulFreq = 174 + ((uiChannelNumber - 7) * 6) + 3; 
194                }
195                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 69)) 
196                {
197                        ulFreq = 470 + ((uiChannelNumber - 14) * 6) + 3; 
198                }
199                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 77)) 
200                {
201                        ulFreq = 470 + ((uiChannelNumber - 14) * 6) + 3; 
202                }
203                else
204                {
205                        return 0;
206                }
207
208                return ulFreq * 1000;
209
210        }       
211        else if(NA_CATV ==  iChannelTable)
212        {//CATV
213                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) 
214                {
215                        switch (uiChannelNumber) 
216                        {
217                                case 1:
218                                        ulFreq = 75;
219                                        break;
220                                case 2:
221                                        ulFreq = 57;
222                                        break;
223                                case 3:
224                                        ulFreq = 63;
225                                        break;
226                                case 4:
227                                        ulFreq = 69;
228                                        break;
229                                case 5:
230                                        ulFreq = 79;
231                                        break;
232                                case 6:
233                                        ulFreq = 85;
234                                        break;
235                        }
236                }
237                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) 
238                {
239                        ulFreq = 90 + ((uiChannelNumber - 95) * 6) + 3; 
240                }
241                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) 
242                {
243                        ulFreq = 174 + ((uiChannelNumber - 7) * 6) + 3; 
244                }
245                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) 
246                {
247                        ulFreq = 120 + ((uiChannelNumber - 14) * 6) + 3; 
248                }
249                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) 
250                {
251                        ulFreq = 216 + ((uiChannelNumber - 23) * 6) + 3; 
252                }
253                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) 
254                {
255                        ulFreq = 648 + ((uiChannelNumber - 100) * 6) + 3; 
256                }
257                else
258                {
259                        return 0;
260                }
261                return ulFreq * 1000;
262        }
263        else if(IRC ==  iChannelTable)
264        {//IRC
265                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) 
266                {
267                        switch (uiChannelNumber) 
268                        {
269                                case 1:
270                                        ulFreq = 75;
271                    //ulFreq = 75012;                 
272                                        break;
273                                case 2:
274                                        ulFreq = 57;
275                    //ulFreq = 57015;                 
276                                        break;
277                                case 3:
278                                        ulFreq = 63;
279                    //ulFreq = 63012;                 
280                                        break;
281                                case 4:
282                                        ulFreq = 69;
283                    //ulFreq = 69012;                 
284                                        break;
285                                case 5:
286                                        ulFreq = 81;
287                    //ulFreq = 81012;                 
288                                        break;
289                                case 6:
290                                        ulFreq = 87;
291                    //ulFreq = 87012;                 
292                                        break;
293                        }
294                }
295                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) 
296                {
297                        ulFreq = 90 + ((uiChannelNumber - 95) * 6) + 3; 
298                }
299                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) 
300                {
301                        ulFreq = 174 + ((uiChannelNumber - 7) * 6) + 3; 
302                }
303                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) 
304                {
305                        ulFreq = 120 + ((uiChannelNumber - 14) * 6) + 3; 
306                }
307                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) 
308                {
309                        ulFreq = 216 + ((uiChannelNumber - 23) * 6) + 3; 
310                }
311                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) 
312                {
313                        ulFreq = 648 + ((uiChannelNumber - 100) * 6) + 3; 
314                }
315                else
316                {
317                        return 0;
318                }
319                return (ulFreq * 1000) +12 ;
320        }
321        else if(HRC ==  iChannelTable)
322        {//HRC
323                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) 
324                {
325                        switch (uiChannelNumber) {
326                                case 1:
327                                        //ulFreq = 75;
328                                    ulFreq = 73753;
329                                        break;
330                                case 2:
331                                        ulFreq = 55753;
332                                        break;
333                                case 3:
334                                        ulFreq = 61753;
335                                        break;
336                                case 4:
337                                        ulFreq = 67753;
338                                        break;
339                                case 5:
340                                        ulFreq = 79754;
341                                        break;
342                                case 6:
343                                        ulFreq = 85754;
344                                        break;
345                        }
346                }
347                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) 
348                {
349                        ulFreq = (917545 + ((uiChannelNumber - 95) * 60003))/10; 
350                }
351                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) 
352                {
353                        ulFreq = (1757587 + ((uiChannelNumber - 7) * 60003))/10; 
354                }
355                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) 
356                {
357                        ulFreq = (1217560 + ((uiChannelNumber - 14) * 60003))/10; 
358                }
359                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) 
360                {
361                        ulFreq = (2177608 + ((uiChannelNumber - 23) * 60003))/10; 
362                }
363                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) 
364                {
365                        ulFreq = (6497824 + ((uiChannelNumber - 100) * 60003))/10; 
366                }
367                else
368                {
369                        return 0;
370                }
371                return ulFreq ;
372        }
373        else
374                return 0;
375}
376
377
378BOOLEAN TunerDTVS205FH201ASetRFFreq(unsigned long ulFrequency,unsigned int iAgcMode ,unsigned char* pucBb)
379{
380        *pucBb = 0;
381        if (iAgcMode==TUNER_AGC_MODE_INTERNAL_ANALOG)
382                *pucBb=0x00;//0x00
383        else
384                *pucBb=0x04;//0x04
385
386        if ((ulFrequency >= DTVS205FH201A_LOW_BAND_MIN) && (ulFrequency <= DTVS205FH201A_LOW_BAND_MAX) ) 
387        {
388                        *pucBb |= 0x01;
389        }
390        else if((ulFrequency >=  DTVS205FH201A_MID_BAND_MIN) && (ulFrequency <= DTVS205FH201A_MID_BAND_MAX))
391        {
392                        *pucBb |= 0x02;
393        }
394        else if((ulFrequency >= DTVS205FH201A_HIGH_BAND_MIN) && (ulFrequency <= DTVS205FH201A_HIGH_BAND_MAX))
395        {
396                        *pucBb |= 0x08;
397        }
398        else 
399                return FALSE;
400        return TRUE;
401}
402
403
404BOOLEAN DTVS205FH201ASetN(unsigned long ulFrequency,TYPE_TUNERDTVS205FH201A_REF_DIVIDER_RATIO iRefDividerRatio, unsigned char* pucDb1,unsigned char* pucDb2)
405{       
406        // calc N
407        unsigned short usNval,usMultiplier;
408        unsigned char ucNlow8,ucNbits8_14;
409
410        usMultiplier = 0;
411   
412        //1/(dRefDividerRatio/1000)
413        switch(iRefDividerRatio)
414        {
415                case TUNERDTVS205FH201A_REF_DIVIDER_RATIO_31_25:
416                        usMultiplier = 32;
417                        break;
418                case TUNERDTVS205FH201A_REF_DIVIDER_RATIO_50:
419                        usMultiplier = 20;
420                        break;
421                case TUNERDTVS205FH201A_REF_DIVIDER_RATIO_62_5:
422                        usMultiplier = 16;
423                        break;
424//              case TUNERDTVS205FH201A_REF_DIVIDER_RATIO_166_7:
425//                      usMultiplier = 6;
426//                      break;
427                default:
428                        usMultiplier = 20;
429                        break;
430
431        }
432
433        usNval = (unsigned short)(((ulFrequency + DTVS205FH201A_F_IF_KHZ) * usMultiplier)/1000);
434        if(usNval >= DTVS205FH201A_N_MAX)
435        { 
436                //max n in 14 bits
437                usNval = usNval/2 ;
438        }
439       
440        // set N
441        if (usNval == 0 || usNval >= DTVS205FH201A_N_MAX) 
442        { //15 bits
443                return FALSE;
444        }
445       
446        // clear N bits
447        *pucDb1 = 0x00;
448        *pucDb2 = 0x00;
449
450        ucNlow8 = usNval & 0x00FF;
451        ucNbits8_14 = (usNval & 0x07f00) >> 8;
452
453        *pucDb2 = ucNlow8;
454        *pucDb1 |= ucNbits8_14 ; 
455
456        return TRUE;
457}
458
459
460void DTVS205FH201ASetCPandStepSize(TYPE_TUNERDTVS205FH201A_REF_DIVIDER_RATIO iRefDividerRatio, TYPE_TUNERDTVS205FH201A_CHARGE_PUMP iRefChargePump, unsigned char* pucCb)
461{
462        *pucCb = 0x00;
463       
464        if (TUNERDTVS205FH201A_CHARGE_PUMP_20 == iRefChargePump) 
465                *pucCb = 0x00;
466        else 
467                *pucCb = 0x40;
468       
469        if (TUNERDTVS205FH201A_REF_DIVIDER_RATIO_50 == iRefDividerRatio) 
470        {
471                *pucCb |= 0x02;
472        }
473        else if (TUNERDTVS205FH201A_REF_DIVIDER_RATIO_31_25 == iRefDividerRatio) 
474        {
475                *pucCb |= 0x02;
476        }
477        else if (TUNERDTVS205FH201A_REF_DIVIDER_RATIO_62_5 == iRefDividerRatio) 
478        {
479                *pucCb |= 0x06;
480        }
481        *pucCb |= 0x80;
482}
483
484#if 0
485void DTVS205FH201ASetStepSize(TYPE_TUNERDTVS205FH201A_REF_DIVIDER_RATIO iRefDividerRatio, unsigned char* pucCb,unsigned char* pucCb2)
486{
487        *pucCb &= 0xf9;
488        *pucCb2 &= 0xf9;
489        if (TUNERDTVS205FH201A_REF_DIVIDER_RATIO_50 == iRefDividerRatio)
490        {
491                *pucCb &= 0xf9;
492                *pucCb2 &= 0xf9;
493        }
494        else if (TUNERDTVS205FH201A_REF_DIVIDER_RATIO_31_25 == iRefDividerRatio)
495        {
496                *pucCb |= 0x2;
497                *pucCb2 |= 0x2;
498        }
499        else if (TUNERDTVS205FH201A_REF_DIVIDER_RATIO_166_7 == iRefDividerRatio)
500        {
501                *pucCb |= 0x4;
502                *pucCb2 |= 0x4;
503        }
504        else if (TUNERDTVS205FH201A_REF_DIVIDER_RATIO_62_5 == iRefDividerRatio)
505        {
506                *pucCb |= 0x6;
507                *pucCb2 |= 0x6;
508        }
509}
510
511
512void DTVS205FH201ASetAGC(unsigned int uiAgc,    unsigned char* pucAb)
513{
514        *pucAb &= 0x8f;
515
516        if (0 == uiAgc)
517        {
518                *pucAb &= 0x8f;
519        }
520        else if (1== uiAgc)
521        {
522                *pucAb |= 0x10;
523        }
524        else if (2 == uiAgc)
525        {
526                *pucAb |= 0x20;
527        }
528        else if (3 == uiAgc)
529        {
530                *pucAb |= 0x30;
531        }
532        else if (4 == uiAgc)
533        {
534                *pucAb |= 0x40; 
535        }
536        else if (5 == uiAgc)
537        {
538                *pucAb |= 0x50;
539        }
540        else if (6 == uiAgc)
541        {
542                *pucAb |= 0x60;
543        }
544}
545
546
547void DTVS205FH201ASetATC(unsigned int uiAgcTimeConstant,unsigned char* pucAb)
548{
549        if (2 == uiAgcTimeConstant)
550                *pucAb &= ~0x80;
551        else if (50== uiAgcTimeConstant)
552                *pucAb |= 0x80;
553}
554#endif
555
556extern int S5H1409_IicTransmitEx(unsigned char chipAddr, unsigned char *pBuffer, int len );
557unsigned int  DTVS205FH201ASendControlData( unsigned int uiAgcMode,unsigned char Db1,unsigned char Db2,unsigned char Cb,unsigned char Bb)
558{
559        unsigned char str[10];
560//      unsigned char ucSlaveAddr = gStInitParam[TunerID].ucDeviceSlaveAddr;
561        if (!TunerDTVS205BeforeSendBytes())
562                return -1;
563        str[0] = Db1;   
564        str[1] = Db2;           
565        str[2] = Cb;      // cb1_ta1   
566        str[3] = Bb;     // CB2
567        str[4]= '\0';   
568
569        fprintf(stderr,"###   <%s> Tuner Data: %#02x %#02x %#02x %#02x  ###\n", 
570                __func__,str[0],str[1],str[2],str[3]);
571
572        if (S5H1409_IicTransmitEx(DTVS205_DEVICE_ADDRESS_WRITE, str, 4)) 
573        {
574                return DTVS205FH201A_SEND_CONTROL_DATA_FAILED;
575        }
576        if( !TunerDTVS205AfterSendBytes())
577                return -1;
578        else
579                return 0;
580/*
581        if(1 == uiAgcMode)
582        {
583#ifdef MS_WINDOW       
584                while(ulWait != 0)
585                        ulWait --;
586#else
587        usleep(YIELD_TIME);
588#endif                 
589
590                str[0] = Cb2;
591                str[1] = Ab;   
592                str[2]= '\0';
593                if (IicTransmit((unsigned char)gStInitParam[TunerID].ucDeviceI2CAddr, str, 2))
594                {
595                        return DTVS205FH201A_SEND_CONTROL_DATA_FAILED;
596                }
597        }
598
599        //Send data byte if internal analog AGC mode.
600        if(2 == uiAgcMode)
601        {
602                str[0] = 0x00;
603                str[1] = 0xD4; 
604                if (IicTransmit((unsigned char)ucSlaveAddr, str, 2))
605                {
606                        return DTVS205FH201A_SEND_CONTROL_DATA_FAILED;
607                }
608                str[0] = 0x01;
609                str[1] = 0x30; 
610                if (IicTransmit((unsigned char)ucSlaveAddr, str, 2))
611                {
612                        return DTVS205FH201A_SEND_CONTROL_DATA_FAILED;
613                }
614                str[0] = 0x02;
615                str[1] = 0x04; 
616                if (IicTransmit((unsigned char)ucSlaveAddr, str, 2))
617                {
618                        return DTVS205FH201A_SEND_CONTROL_DATA_FAILED;
619                }
620        }
621
622        //Send data byte if internal digital AGC mode.
623        if(1 == uiAgcMode)
624        {
625                str[0] = 0x00;
626                str[1] = 0xD4; 
627                if (IicTransmit((unsigned char)ucSlaveAddr, str, 2))
628                {
629                        return DTVS205FH201A_SEND_CONTROL_DATA_FAILED;
630                }
631                str[0] = 0x01;
632                str[1] = 0x30; 
633                if (IicTransmit((unsigned char)ucSlaveAddr, str, 2))
634                {
635                        return DTVS205FH201A_SEND_CONTROL_DATA_FAILED;
636                }
637                str[0] = 0x02;
638                str[1] = 0x24; 
639                if (IicTransmit((unsigned char)ucSlaveAddr, str, 2))
640                {
641                        return DTVS205FH201A_SEND_CONTROL_DATA_FAILED;
642                }
643        }
644*/
645        return DTVS205FH201A_SUCCESS;
646}
647
648
649void DTVS205FH201AInitBytes(unsigned char* pucDb1,unsigned char* pucDb2,unsigned char* pucCb,unsigned char* pucBb)
650{
651        *pucDb1 = 0;
652        *pucDb2 = 0;
653        *pucCb = 0x88;
654        *pucBb = 0;
655}
656
657int DTVS205FH201A_Init(TUNER_INIT_PARAMETERS InitParam[MAX_TUNER_SUPPORT])
658{
659        int i;
660        for(i=0; i<MAX_TUNER_SUPPORT; i++)
661        {
662                gStInitParam[i].bUseDefault = FALSE;
663                if(InitParam[i].bUseDefault)
664                {
665                        gStInitParam[i].ucDeviceI2CAddr = DTVS205FH201A_DEVICE_ADDRESS_WRITE;
666                        gStInitParam[i].ucDeviceSlaveAddr = DTVS205FH201A_SLAVE_ADDRESS;
667                }
668                else
669                {
670                        gStInitParam[i].ucDeviceI2CAddr = InitParam[i].ucDeviceI2CAddr;
671                        gStInitParam[i].ucDeviceSlaveAddr = InitParam[i].ucDeviceSlaveAddr;
672                }
673        }
674        return 0;
675}
676
677
678int DTVS205FH201A_GetInfo( CAS_2B_TUNER_GET_PARAMETERS* pstTunerParameters)
679{
680        ERROR_TYPE iError=0;
681        unsigned char tmp=0;
682        int AFCValue=0;
683
684        if(TUNER_DTVS205FH201A != pstTunerParameters->iTunerType)
685                return CAS_2B_UNDEFINED_TUNER_TYPE;
686        switch(pstTunerParameters->iTunerGet)
687        {
688                case TUNER_GET_AFC:
689                        tmp = S5H_IicReadTunerByte(DTVS205_DEVICE_ADDRESS_WRITE);
690                        printf("AFC get :%#02x\n", tmp);
691                        AFCValue = tmp & 0x07;
692                        switch(AFCValue)
693                        {
694                                case 0:
695                                        AFCValue = -250;
696                                        break;
697                                case 1:
698                                        AFCValue = -49;
699                                        break;
700                                case 2:
701                                        AFCValue = 0;
702                                        break;
703                                case 3:
704                                        AFCValue = +49;
705                                        break;
706                                case 4:
707                                        AFCValue = +250;
708                                        break;
709                                default:
710                                        AFCValue = +250;
711                                        break;
712                        }
713                        pstTunerParameters->RetValue1 = AFCValue;
714                        pstTunerParameters->RetValue2 =  (tmp & 0x40)!=0;
715                        break;
716               
717                default:
718                        break;
719        }
720        return iError;
721}
722
723int DTVS205FH201A_SetChannel( CAS_2B_TUNER_PARAMETERS* pstTunerParameters,unsigned short usDelay,CAS_2B_CHANNEL_CHANGE_PARAMETERS* pstChannelChangeParameters)
724{
725        ERROR_TYPE iError;
726        unsigned long ulDelay;
727
728        printf("stTunerParameters.iAgcMode = %d \n",pstTunerParameters->iAgcMode);
729   
730        if(TUNER_DTVS205FH201A == pstTunerParameters->iTunerType)
731        {
732        printf("SetValue=%ld\n", pstTunerParameters->ulSetValue);
733#ifdef _DEBUG_AGC_
734                iError = SetTunerDTVS205FH201A( pstTunerParameters->iTunerSet, &(pstTunerParameters->ulSetValue), pstTunerParameters->iAdjustFreqKHZ,
735                                        pstTunerParameters->iChannelTableType,
736                                        TUNERDTVS205FH201A_REF_DIVIDER_RATIO_62_5,/*default value*/
737                                        0,  //TUNERDTVS205FH201A_AGC_93,/*default value*/
738                                        pstTunerParameters->iAgcMode,
739                                        TUNERDTVS205FH201A_CHARGE_PUMP_20,/*default value*/
740                                        0);/*default value*/
741#else
742                iError = SetTunerDTVS205FH201A( pstTunerParameters->iTunerSet, &(pstTunerParameters->ulSetValue), pstTunerParameters->iAdjustFreqKHZ,
743                                        pstTunerParameters->iChannelTableType,
744                                        TUNERDTVS205FH201A_REF_DIVIDER_RATIO_62_5,/*default value*/
745                                        0,  //TUNERDTVS205FH201A_AGC_93,/*default value*/
746                                        pstTunerParameters->iAgcMode,
747                                        TUNERDTVS205FH201A_CHARGE_PUMP_20,/*default value*/
748                                        0);/*default value*/
749
750#endif
751                if(CAS_2B_API_SUCCESS != iError)
752                {
753                        printf("SetTunerDTVS205FH201A failure\n");
754                        return iError;
755                }
756        }
757        else
758        {
759                printf("Undefined tuner type\n");                 
760                return CAS_2B_UNDEFINED_TUNER_TYPE;
761        }
762
763        //if the pstChannelChangeParameters argument is NULL it means that we send only
764        //the tuner PLL frequency
765        if(NULL == pstChannelChangeParameters)
766                return CAS_2B_API_SUCCESS;
767
768        //wait a delay;
769        ulDelay = usDelay * 10000;
770#ifdef MS_WINDOW   
771        while(ulDelay != 0)
772                ulDelay --;
773#else
774    usleep(ulDelay/2);
775#endif     
776
777        printf("SetChannel Done!");
778        return CAS_2B_API_SUCCESS;
779
780}
781
782
783int __stdcall SetTunerDTVS205FH201A( TYPE_TUNER_SET_OPTION TunerSet, void* pvTunerSet, int iAdjustFreqKHZ,
784                                        CHANNEL_TABLE_TYPE iChannelTable,
785                                        TYPE_TUNERDTVS205FH201A_REF_DIVIDER_RATIO iRefDividerRatio ,
786                                        TYPE_TUNERDTVS205FH201A_AGC iAgc,
787                                        TYPE_TUNER_AGC_MODE iAgcMode,
788                                        CHARGE_PUMP iChargePump,
789                                        TYPE_TUNERDTVS205FH201A_AGC_TIME_CONSTANT iAgcTimeConstant )
790{
791        unsigned int uiAgc=0,uiChargePump,uiAgcTimeConstant=0,uiAgcMode=0;
792        int iRes;
793       
794        if((TUNERDTVS205FH201A_REF_DIVIDER_RATIO_31_25 != iRefDividerRatio) &&
795                (TUNERDTVS205FH201A_REF_DIVIDER_RATIO_50 != iRefDividerRatio) &&
796                (TUNERDTVS205FH201A_REF_DIVIDER_RATIO_62_5 != iRefDividerRatio))
797                        return CAS_2B_UNDEFINED_TUNER_DTVS205FH201A_REF_DIVIDER_RATIO_TYPE;
798
799        printf("&&&&&&&&&&&&&  iAgc = %d &&&&&&&&&&&&\n",iAgc);
800
801
802        if(CHARGE_PUMP_20 == iChargePump)
803                uiChargePump = 20;
804        else if(CHARGE_PUMP_100 == iChargePump)
805                uiChargePump = 100;
806        else
807                return CAS_2B_UNDEFINED_TUNER_DTVS205FH201A_CHRGE_PUMP_TYPE;
808
809
810        if(TUNER_AGC_MODE_INTERNAL_DIGITAL == iAgcMode )
811                uiAgcMode = 1;
812        else if(TUNER_AGC_MODE_INTERNAL_ANALOG == iAgcMode)
813                uiAgcMode = 0;
814        else
815                return CAS_2B_UNDEFINED_TUNER_DTVS205FH201A_AGC_MODE_TYPE;
816
817        printf("uiAgcMode = %d \n",uiAgcMode);
818        if( TUNER_SET_CHANNEL == TunerSet)
819                iRes = TunerDTVS205FH201ASendChannel(*((unsigned long*)pvTunerSet), iAdjustFreqKHZ, iChannelTable,iRefDividerRatio,uiAgc, uiAgcMode,uiChargePump, uiAgcTimeConstant);
820#if 0
821        else if( TUNER_SET_CENTER_FREQUENCY_KHZ == TunerSet)
822                iRes = TunerDTVS205FH201ASendFreq(*((unsigned long*)pvTunerSet),iRefDividerRatio,uiAgc, uiAgcMode,uiChargePump, uiAgcTimeConstant);
823        else if( TUNER_SET_PIC_CARRIER_KHZ == TunerSet)
824                iRes = TunerDTVS205FH201ASendPicCarrier(*((unsigned long*)pvTunerSet),iRefDividerRatio,uiAgc, uiAgcMode,uiChargePump, uiAgcTimeConstant);
825#endif
826        else
827                return CAS_2B_UNDEFINED_TUNER_DTVS205FH201A_SET_OPTION_TYPE;
828       
829        switch(iRes)
830        {
831                case DTVS205FH201A_SUCCESS:
832                        return CAS_2B_API_SUCCESS;
833                case DTVS205FH201A_CHANNEL_OUT_OF_RANGE:
834                        return CAS_2B_TUNER_DTVS205FH201A_CHANNEL_OUT_OF_RANGE;
835                case DTVS205FH201A_COULD_NOT_SET_N:
836                        return CAS_2B_TUNER_DTVS205FH201A_N_VALUE_OUT_OF_RANGE;
837                case DTVS205FH201A_SEND_CONTROL_DATA_FAILED:
838                case DTVS205FH201A_BEFORE_SEND_BYTES_FAILED:
839                case DTVS205FH201A_AFTER_SEND_BYTES_FAILED:
840                        return CAS_2B_TUNER_DTVS205FH201A_SEND_CONTROL_DATA_FAILED;
841                case DTVS205FH201A_FREQUENCY_VALUE_OUT_OF_RANGE:
842                        return CAS_2B_TUNER_DTVS205FH201A_FREQUENCY_VALUE_OUT_OF_RANGE;
843                case DTVS205FH201A_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY:
844                        return CAS_2B_TUNER_DTVS205FH201A_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY;
845                default:
846                        return CAS_2B_TUNER_DTVS205FH201A_GENERAL_FAILIUR;
847        }
848}
849
850
Note: See TracBrowser for help on using the repository browser.