source: svn/trunk/zas_dstar/devices/Tuner/Oren_Cascade2B/DTT7600Tuner.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: 13.9 KB
Line 
1/*
2 * $Id: DTT7600Tuner.c,v 1.1 2011/07/08 03:43:59 megakiss Exp $
3 * $Revision: 1.1 $
4 * $DateTime: 2005/08/24 19:03:17 $
5 * $Change: 28028 $
6 * $Author: megakiss $
7 */
8
9#include "DTT7600Tuner.h"
10#include "IicComm.h"
11
12BOOLEAN TunerDTT760xATSCBeforeSendBytes(void);
13BOOLEAN TunerDTT760xATSCAfterSendBytes(void);
14
15int TunerDTT760xATSCSendChannel(unsigned int uiChannel, CHANNEL_TABLE_TYPE iChannelTable, TYPE_TUNERDTT760xATSC_REF_DIVIDER_RATIO iRefDividerRatio,unsigned int uiAgc, BOOLEAN bUseExternalAgc,unsigned int uiChargePump,unsigned int uiAgcTimeConstant)
16{
17        unsigned long ulFrequency;
18
19        unsigned char Db1;
20        unsigned char Db2;
21        unsigned char Cb;
22        unsigned char Bb;
23        unsigned char Ab;
24        unsigned char Cb2;
25       
26        TunerDTT760xATSCInitsendBytes(&Db1, &Db2, &Cb ,&Bb, &Ab,&Cb2);
27
28        ulFrequency = TunerDTT760xATSCGetFrequency(uiChannel, iChannelTable);
29        if(0 == ulFrequency)
30                return TUNER_DTT760xATSC_CHANNEL_OUT_OF_RANGE;
31
32        if(!TunerDTT760xATSCSetRFFreq(ulFrequency,bUseExternalAgc,&Bb))
33                return TUNER_DTT760xATSC_FREQUENCY_VALUE_OUT_OF_RANGE;
34
35        if(!TunerDTT760xATSCSetN( ulFrequency,iRefDividerRatio,&Db1,&Db2))
36                return TUNER_DTT760xATSC_N_VALU_OUT_OF_RANGE;
37
38        if(!TunerDTT760xATSCSetCP(uiChargePump,&Cb))
39                return TUNER_DTT760xATSC_CHARGE_PUMP_VALUE_OUT_OF_RANGE;
40
41        if(!TunerDTT760xATSCSetStepSize(iRefDividerRatio,&Cb,&Cb2)) 
42                return TUNER_DTT760xATSC_STEP_SIZE_VALUE_OUT_OF_RANGE;
43       
44        if(!TunerDTT760xATSCSetAGC(uiAgc,&Ab))
45                return TUNER_DTT760xATSC_AGC_VALUE_OUT_OF_RANGE;
46       
47        if(!TunerDTT760xATSCSetATC(uiAgcTimeConstant,&Ab))
48                return TUNER_DTT760xATSC_ATC_VALUE_OUT_OF_RANGE;
49       
50        return TunerDTT760xATSCSendControlData(Db1, Db2, Cb, Bb, Ab,Cb2);
51}
52
53int TunerDTT760xATSCSendFreq(unsigned long ulFrequency,TYPE_TUNERDTT760xATSC_REF_DIVIDER_RATIO iRefDividerRatio,unsigned int uiAgc, BOOLEAN bUseExternalAgc,unsigned int uiChargePump,unsigned int uiAgcTimeConstant) 
54{
55        unsigned char Db1;
56        unsigned char Db2;
57        unsigned char Cb;
58        unsigned char Bb;
59        unsigned char Ab;
60        unsigned char Cb2;
61       
62        TunerDTT760xATSCInitsendBytes(&Db1, &Db2, &Cb ,&Bb, &Ab,&Cb2);
63
64        if(!TunerDTT760xATSCSetRFFreq(ulFrequency,bUseExternalAgc,&Bb))
65                return TUNER_DTT760xATSC_FREQUENCY_VALUE_OUT_OF_RANGE;
66
67        if(!TunerDTT760xATSCSetN( ulFrequency,iRefDividerRatio,&Db1,&Db2))
68                return TUNER_DTT760xATSC_N_VALU_OUT_OF_RANGE;
69
70        if(!TunerDTT760xATSCSetCP(uiChargePump,&Cb))
71                return TUNER_DTT760xATSC_CHARGE_PUMP_VALUE_OUT_OF_RANGE;
72
73        if(!TunerDTT760xATSCSetStepSize(iRefDividerRatio,&Cb,&Cb2)) 
74                return TUNER_DTT760xATSC_STEP_SIZE_VALUE_OUT_OF_RANGE;
75       
76        if(!TunerDTT760xATSCSetAGC(uiAgc,&Ab))
77                return TUNER_DTT760xATSC_AGC_VALUE_OUT_OF_RANGE;
78       
79        if(!TunerDTT760xATSCSetATC(uiAgcTimeConstant,&Ab))
80                return TUNER_DTT760xATSC_ATC_VALUE_OUT_OF_RANGE;
81       
82        return TunerDTT760xATSCSendControlData( Db1,  Db2,  Cb , Bb,  Ab,Cb2);
83}
84
85int TunerDTT760xATSCSendPicCarrier(unsigned long ulFrequency,TYPE_TUNERDTT760xATSC_REF_DIVIDER_RATIO iRefDividerRatio,unsigned int uiAgc, BOOLEAN bUseExternalAgc,unsigned int uiChargePump,unsigned int uiAgcTimeConstant)
86{
87        //add 1.75 MHz to the picture carrier frequency
88        return TunerDTT760xATSCSendFreq(ulFrequency + 1750  ,iRefDividerRatio,uiAgc, bUseExternalAgc,uiChargePump, uiAgcTimeConstant); 
89}
90
91
92// Function name        : TunerDTT760xATSCGetFrequency
93// Description      : returns the frequency in KHz
94// Return type          : unsigned short
95// Argument         : unsigned int uiChannelNumber
96unsigned long TunerDTT760xATSCGetFrequency(unsigned int uiChannelNumber, CHANNEL_TABLE_TYPE iChannelTable)
97{
98        unsigned long ulFreq = 0;
99        #if 0 //old code only support ATSC Terrestrial
100        if ((uiChannelNumber >=2) && (uiChannelNumber <= 6)) {
101                switch (uiChannelNumber) {
102                        case 2:
103                                ulFrequency = 57;
104                                break;
105                        case 3:
106                                ulFrequency = 63;
107                                break;
108                        case 4:
109                                ulFrequency = 69;
110                                break;
111                        case 5:
112                                ulFrequency = 79;
113                                break;
114                        case 6:
115                                ulFrequency = 85;
116                                break;
117                }
118        }
119        else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
120                ulFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3;
121        }
122        else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 69)) {
123                ulFrequency = 470 + ((uiChannelNumber - 14) * 6) + 3;
124        }
125        else{
126                return 0;
127        }
128        return (1000*ulFrequency);
129        #endif
130       
131        // to support digital cable for Lynx
132        if(NA_TERRESTRIAL ==  iChannelTable){//terrestrial
133                if ((uiChannelNumber >= 2) && (uiChannelNumber <= 6)) {
134                        switch (uiChannelNumber) {
135                                case 2:
136                                        ulFreq = 57;
137                                        break;
138                                case 3:
139                                        ulFreq = 63;
140                                        break;
141                                case 4:
142                                        ulFreq = 69;
143                                        break;
144                                case 5:
145                                        ulFreq = 79;
146                                        break;
147                                case 6:
148                                        ulFreq = 85;
149                                        break;
150                        }
151                }
152                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
153                        ulFreq = 174 + ((uiChannelNumber - 7) * 6) + 3; 
154                }
155                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 69)) {
156                        ulFreq = 470 + ((uiChannelNumber - 14) * 6) + 3; 
157                }
158                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 77)) {
159                        ulFreq = 470 + ((uiChannelNumber - 14) * 6) + 3; 
160                }
161                else{
162                        return 0;
163                }
164
165                return ulFreq * 1000;
166
167        }       
168        else if(NA_CATV ==  iChannelTable){//CATV
169                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
170                        switch (uiChannelNumber) {
171                                case 1:
172                                        ulFreq = 75;
173                                        break;
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 >= 95) && (uiChannelNumber <= 99)) {
192                        ulFreq = 90 + ((uiChannelNumber - 95) * 6) + 3; 
193                }
194                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
195                        ulFreq = 174 + ((uiChannelNumber - 7) * 6) + 3; 
196                }
197                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
198                        ulFreq = 120 + ((uiChannelNumber - 14) * 6) + 3; 
199                }
200                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
201                        ulFreq = 216 + ((uiChannelNumber - 23) * 6) + 3; 
202                }
203                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
204                        ulFreq = 648 + ((uiChannelNumber - 100) * 6) + 3; 
205                }
206                else{
207                        return 0;
208                }
209
210                return ulFreq * 1000;
211
212        }
213        else if(IRC ==  iChannelTable){//IRC
214                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
215                        switch (uiChannelNumber) {
216                                case 1:
217                                        ulFreq = 75;
218                                        break;
219                                case 2:
220                                        ulFreq = 57;
221                                        break;
222                                case 3:
223                                        ulFreq = 63;
224                                        break;
225                                case 4:
226                                        ulFreq = 69;
227                                        break;
228                                case 5:
229                                        ulFreq = 81;
230                                        break;
231                                case 6:
232                                        ulFreq = 87;
233                                        break;
234                        }
235                }
236                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
237                        ulFreq = 90 + ((uiChannelNumber - 95) * 6) + 3; 
238                }
239                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
240                        ulFreq = 174 + ((uiChannelNumber - 7) * 6) + 3; 
241                }
242                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
243                        ulFreq = 120 + ((uiChannelNumber - 14) * 6) + 3; 
244                }
245                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
246                        ulFreq = 216 + ((uiChannelNumber - 23) * 6) + 3; 
247                }
248                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
249                        ulFreq = 648 + ((uiChannelNumber - 100) * 6) + 3; 
250                }
251                else{
252                        return 0;
253                }
254       
255                return ulFreq * 1000;
256        }
257        else if(HRC ==  iChannelTable){//HRC
258                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
259                        switch (uiChannelNumber) {
260                                case 1:
261                                        ulFreq = 73753;
262                                        break;
263                                case 2:
264                                        ulFreq = 55753;
265                                        break;
266                                case 3:
267                                        ulFreq = 61753;
268                                        break;
269                                case 4:
270                                        ulFreq = 67753;
271                                        break;
272                                case 5:
273                                        ulFreq = 79754;
274                                        break;
275                                case 6:
276                                        ulFreq = 85754;
277                                        break;
278                        }
279                }
280                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
281                        ulFreq = (917545 + ((uiChannelNumber - 95) * 60003))/10; 
282                }
283                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
284                        ulFreq = (1757587 + ((uiChannelNumber - 7) * 60003))/10; 
285                }
286                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
287                        ulFreq = (1217560 + ((uiChannelNumber - 14) * 60003))/10; 
288                }
289                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
290                        ulFreq = (2177608 + ((uiChannelNumber - 23) * 60003))/10; 
291                }
292                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
293                        ulFreq = (6497824 + ((uiChannelNumber - 100) * 60003))/10; 
294                }
295                else{
296                        return 0;
297                }
298
299                return ulFreq ;
300        }
301        else
302                return 0;
303
304}
305
306BOOLEAN TunerDTT760xATSCSetRFFreq(unsigned long ulFrequency,BOOLEAN bUseExternalAgc,unsigned char *Bb)
307{
308        if ((ulFrequency >= DTT760xATSC_LOW_BAND_MIN) && (ulFrequency <= DTT760xATSC_LOW_BAND_MAX) ) {
309                if(bUseExternalAgc){
310                        *Bb &= ~0x08;
311                        *Bb &= ~0x04;
312                        *Bb &= ~0x02;
313                        *Bb |= 0x01;
314                }
315                else{
316                        *Bb |= 0x08;
317                        *Bb &= ~0x04;
318                        *Bb &= ~0x02;
319                        *Bb |= 0x01;
320                }
321        }
322        else if((ulFrequency >=  DTT760xATSC_MID_BAND_MIN) && (ulFrequency <= DTT760xATSC_MID_BAND_MAX)){
323                if(bUseExternalAgc){
324                        *Bb &= ~0x08;
325                        *Bb &= ~0x04;
326                        *Bb |= 0x02;
327                        *Bb &= ~0x01;
328                }
329                else{
330                        *Bb |= 0x08;
331                        *Bb &= ~0x04;
332                        *Bb |= 0x02;
333                        *Bb &= ~0x01;
334                }
335        }
336        else if((ulFrequency >= DTT760xATSC_HIGH_BAND_MIN) && (ulFrequency <= DTT760xATSC_HIGH_BAND_MAX)){
337                if(bUseExternalAgc){
338                        *Bb &= ~0x08;
339                        *Bb |= 0x04;
340                        *Bb &= ~0x02;
341                        *Bb &= ~0x01;
342                }
343                else{
344                        *Bb |= 0x08;
345                        *Bb |= 0x04;
346                        *Bb &= ~0x02;
347                        *Bb &= ~0x01;
348                }
349        }
350        else 
351                return FALSE;
352        return TRUE;
353}
354
355
356// Function name        : TunerDTT760xATSCSetN
357// Description      : gets the frequency as Khz and calculates the N value
358// Return type          : BOOLEAN
359// Argument         :  unsigned long ulFrequency the frequency in Khz
360// Argument         : unsigned char *Divider_Byte1
361// Argument         : unsigned char *Divider_Byte2
362BOOLEAN TunerDTT760xATSCSetN( unsigned long ulFrequency, TYPE_TUNERDTT760xATSC_REF_DIVIDER_RATIO iRefDividerRatio,unsigned char *Divider_Byte1, unsigned char *Divider_Byte2)
363{
364        // calc N
365        unsigned short usNval,usMultiplier=0;
366        unsigned char ucNlow8,ucNbits8_14;
367
368        //1/(dRefDividerRatio/1000)
369        switch(iRefDividerRatio){
370        case TUNERDTT760xATSC_REF_DIVIDER_RATIO_31_25:
371                usMultiplier = 32;
372                break;
373        case TUNERDTT760xATSC_REF_DIVIDER_RATIO_50:
374                usMultiplier = 20;
375                break;
376        case TUNERDTT760xATSC_REF_DIVIDER_RATIO_62_5:
377                usMultiplier = 16;
378                break;
379        case TUNERDTT760xATSC_REF_DIVIDER_RATIO_166_7:
380                usMultiplier = 6;
381                break;
382        }
383
384        usNval = (unsigned short)(((ulFrequency + DTT760xATSC_F_IF_KHZ) * usMultiplier)/1000);
385        if(usNval > DTT760xATSC_N_MAX){ 
386                //max n in 15 bits
387                usNval = usNval/2;
388        }
389       
390        // set N
391        if (usNval <= 0 || usNval >= DTT760xATSC_N_MAX){ //15 bits
392        return FALSE;
393    }
394
395        // clear N bits
396        *Divider_Byte1 &= 0x00;
397        *Divider_Byte2 &= 0x00;
398
399    ucNlow8 = usNval & 0x00FF;
400    ucNbits8_14 = (usNval & 0x07f00) >> 8;
401
402    *Divider_Byte2 = ucNlow8;
403        *Divider_Byte1 = 0x00;
404    *Divider_Byte1 |= ucNbits8_14; 
405
406        return TRUE;
407}
408
409BOOLEAN TunerDTT760xATSCSetCP(unsigned int uiChargePump,unsigned char *Control_Byte1)
410{
411        if(60 == uiChargePump)
412                *Control_Byte1 &= ~0x40;
413        else if(280 == uiChargePump)
414                *Control_Byte1 |= 0x40;
415        else
416                return FALSE;
417        return TRUE;
418}
419
420BOOLEAN TunerDTT760xATSCSetStepSize(TYPE_TUNERDTT760xATSC_REF_DIVIDER_RATIO iRefDividerRatio ,unsigned char *Control_Byte1,unsigned char *Control_Byte2)
421{
422        if (TUNERDTT760xATSC_REF_DIVIDER_RATIO_50 == iRefDividerRatio) {
423                *Control_Byte1 &= ~0x06;
424                *Control_Byte2 &= ~0x06;
425        }
426        else if (TUNERDTT760xATSC_REF_DIVIDER_RATIO_31_25== iRefDividerRatio) {
427                *Control_Byte1 |= 0x02;
428                *Control_Byte1 &= ~0x04;
429                *Control_Byte2 |= 0x02;
430                *Control_Byte2 &= ~0x04;
431        }
432        else if (TUNERDTT760xATSC_REF_DIVIDER_RATIO_166_7 == iRefDividerRatio) {
433                *Control_Byte1 &= ~0x02;
434                *Control_Byte1 |= 0x04;
435                *Control_Byte2 &= ~0x02;
436                *Control_Byte2 |= 0x04;
437        }
438        else if (TUNERDTT760xATSC_REF_DIVIDER_RATIO_62_5 == iRefDividerRatio) {
439                *Control_Byte1 |= 0x06;
440                *Control_Byte2 |= 0x06;
441        }
442        else
443                return FALSE;
444        return TRUE;
445}
446
447
448BOOLEAN TunerDTT760xATSCSetAGC(unsigned int uiAgc,unsigned char *Auxiliary_Byte)
449{
450        if (106 == uiAgc) {
451                *Auxiliary_Byte |= ~0x70;
452        }
453        else if (103== uiAgc) {
454                *Auxiliary_Byte |= 0x10;
455                *Auxiliary_Byte &= ~0x20;
456                *Auxiliary_Byte &= ~0x40;
457        }
458        else if (100 == uiAgc) {
459                *Auxiliary_Byte &= ~0x10;
460                *Auxiliary_Byte |= 0x20;
461                *Auxiliary_Byte &= ~0x40;
462        }
463        else if (97 == uiAgc) {
464                *Auxiliary_Byte |= 0x10;
465                *Auxiliary_Byte |= 0x20;
466                *Auxiliary_Byte &= ~0x40;
467        }
468        else if (94 == uiAgc) {
469                *Auxiliary_Byte &= ~0x10;
470                *Auxiliary_Byte &= ~0x20;
471                *Auxiliary_Byte |= 0x40;
472        }
473        else if (91 == uiAgc) {
474                *Auxiliary_Byte |= 0x10;
475                *Auxiliary_Byte &= ~0x20;
476                *Auxiliary_Byte |= 0x40;
477        }
478        else
479                return FALSE;
480        return TRUE;
481}
482
483BOOLEAN TunerDTT760xATSCSetATC(unsigned int uiATC,unsigned char *Auxiliary_Byte)
484{
485        if (50 == uiATC) 
486                *Auxiliary_Byte |= 0x80; 
487        else if (2== uiATC) 
488                *Auxiliary_Byte &= ~0x80; 
489        else
490                return FALSE;
491        return TRUE;
492}
493
494unsigned int TunerDTT760xATSCSendControlData(unsigned char Divider_Byte1, unsigned char Divider_Byte2, unsigned char Control_Byte1, unsigned char Band_Switch_Byte, unsigned char Auxiliary_Byte,unsigned char Control_Byte2)
495{
496        unsigned char str[10];
497        if( !TunerDTT760xATSCBeforeSendBytes())
498                return TUNER_DTT760xATSC_BEFORE_SEND_BYTES_FAILED;
499
500        str[0] = Divider_Byte1;
501        str[1] = Divider_Byte2; 
502        str[2] = Control_Byte1;
503        str[3] = Band_Switch_Byte;
504        str[4]= '\0';
505        if (IIC_COM_SUCCESS !=  OrenIicTransmit(DTT7600ATSC_DEVICE_ADDRESS_WRITE, str, 4)) {
506                return TUNER_DTT760xATSC_SEND_CONTROL_DATA_FAILED;
507        }
508
509        str[0] = Control_Byte2;
510        str[1] = Auxiliary_Byte;       
511        str[2]= '\0';
512        if (IIC_COM_SUCCESS !=  OrenIicTransmit(DTT7600ATSC_DEVICE_ADDRESS_WRITE, str, 2)) {
513                return TUNER_DTT760xATSC_SEND_CONTROL_DATA_FAILED;
514        }
515
516        if( !TunerDTT760xATSCAfterSendBytes())
517                return TUNER_DTT760xATSC_AFTER_SEND_BYTES_FAILED;
518       
519        else
520                return TUNER_DTT760xATSC_SUCCESS;
521}
522
523BOOLEAN TunerDTT760xATSCBeforeSendBytes(void)
524{
525        if(IIC_COM_SUCCESS != SendHostControl(0, 0))
526                return FALSE;
527        else
528                return TRUE;
529}
530
531BOOLEAN TunerDTT760xATSCAfterSendBytes(void)
532{
533        if(IIC_COM_SUCCESS != SendHostControl(0x80, 0))
534                return FALSE;
535        else
536                return TRUE;
537}
538
539void TunerDTT760xATSCInitsendBytes(unsigned char *Divider_Byte1, unsigned char *Divider_Byte2, unsigned char *Control_Byte1, unsigned char *Band_Switch_Byte, unsigned char *Auxiliary_Byte,unsigned char *Control_Byte2)
540{
541        *Divider_Byte1 = 0;
542        *Divider_Byte2 = 0;
543        *Control_Byte1 = 0xcc;
544        *Band_Switch_Byte = 0;
545        *Band_Switch_Byte &= ~0xC0;
546        *Auxiliary_Byte = 0;
547        *Control_Byte2 = 0x98; 
548}
549
Note: See TracBrowser for help on using the repository browser.