source: svn/trunk/zas_dstar/devices/Tuner/Oren_Cascade2B/org_TunerDTT7611.c

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

first commit

File size: 13.0 KB
Line 
1/*
2 * $Id: org_TunerDTT7611.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 <stdio.h>
10#include "TunerDTT7611.h"
11#include "IicComm.h"
12
13#if NIMTN_TYPE==NIMTN_DTT7611
14
15#define SOUND_TRAP_BYPASS       1
16
17int TunerDTT7611SendChannel(unsigned int uiChannel,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TUNERDTT7611_REF_DIVIDER_RATIO iRefDividerRatio,unsigned int uiAgc, unsigned int uiAgcMode,unsigned int uiChargePump,unsigned int uiAgcTimeConstant)
18{
19        unsigned long ulFrequency;
20
21        unsigned char Db1;
22        unsigned char Db2;
23        unsigned char Cb;
24        unsigned char Bb;
25        unsigned char Ab;
26        unsigned char Cb2;
27
28        DTT7611InitBytes(&Db1,&Db2,&Cb,&Bb,&Ab,&Cb2);
29
30        ulFrequency = TunerDTT7611GetFrequency(uiChannel,iChannelTable);
31        if(0 == ulFrequency)
32                return DTT7611_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY;
33       
34        if(FALSE == TunerDTT7611SetRFFreq(ulFrequency,uiAgcMode,&Bb))
35                return DTT7611_FREQUENCY_VALUE_OUT_OF_RANGE;
36       
37        if(FALSE  == DTT7611SetN( ulFrequency,iRefDividerRatio,&Db1,&Db2))
38                return DTT7611_COULD_NOT_SET_N;
39
40        DTT7611SetCP(uiChargePump,&Cb);
41        DTT7611SetStepSize( iRefDividerRatio, &Cb,&Cb2);
42        DTT7611SetAGC(uiAgc,&Ab);
43        DTT7611SetATC(uiAgcTimeConstant,&Ab);
44
45        return DTT7611SendControlData(uiAgcMode,Db1,Db2,Cb,Bb,Ab,Cb2);
46}
47
48int TunerDTT7611SendFreq(unsigned long ulFrequency,TYPE_TUNERDTT7611_REF_DIVIDER_RATIO iRefDividerRatio,unsigned int uiAgc, unsigned int uiAgcMode,unsigned int uiChargePump,unsigned int uiAgcTimeConstant)
49{
50        unsigned char Db1;
51        unsigned char Db2;
52        unsigned char Cb;
53        unsigned char Bb;
54        unsigned char Ab;
55        unsigned char Cb2;
56
57        DTT7611InitBytes(&Db1,&Db2,&Cb,&Bb,&Ab,&Cb2);
58
59        if(FALSE == TunerDTT7611SetRFFreq(ulFrequency,uiAgcMode,&Bb))
60                return DTT7611_FREQUENCY_VALUE_OUT_OF_RANGE;
61
62        if(FALSE  == DTT7611SetN( ulFrequency,iRefDividerRatio, &Db1,&Db2))
63                return DTT7611_COULD_NOT_SET_N;
64
65        DTT7611SetCP(uiChargePump,&Cb);
66        DTT7611SetStepSize( iRefDividerRatio, &Cb,&Cb2);
67        DTT7611SetAGC(uiAgc,&Ab);
68        DTT7611SetATC(uiAgcTimeConstant,&Ab);
69
70        return DTT7611SendControlData(uiAgcMode,Db1,Db2,Cb,Bb,Ab,Cb2);
71}
72
73int TunerDTT7611SendPicCarrier(unsigned long ulFrequency,TYPE_TUNERDTT7611_REF_DIVIDER_RATIO iRefDividerRatio,unsigned int uiAgc, unsigned int uiAgcMode,unsigned int uiChargePump,unsigned int uiAgcTimeConstant)
74{
75        //add 1.75 MHz to the picture carrier frequency
76        return TunerDTT7611SendFreq(ulFrequency + 1750 ,iRefDividerRatio,uiAgc, uiAgcMode,uiChargePump, uiAgcTimeConstant); 
77}
78
79unsigned long TunerDTT7611GetFrequency(unsigned int uiChannelNumber,CHANNEL_TABLE_TYPE iChannelTable)
80{
81        unsigned long ulFreq = 0;
82
83        if(NA_TERRESTRIAL ==  iChannelTable){//terrestrial
84                if ((uiChannelNumber >= 2) && (uiChannelNumber <= 6)) {
85                        switch (uiChannelNumber) {
86                                case 2:
87                                        ulFreq = 57;
88                                        break;
89                                case 3:
90                                        ulFreq = 63;
91                                        break;
92                                case 4:
93                                        ulFreq = 69;
94                                        break;
95                                case 5:
96                                        ulFreq = 79;
97                                        break;
98                                case 6:
99                                        ulFreq = 85;
100                                        break;
101                        }
102                }
103                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
104                        ulFreq = 174 + ((uiChannelNumber - 7) * 6) + 3; 
105                }
106                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 69)) {
107                        ulFreq = 470 + ((uiChannelNumber - 14) * 6) + 3; 
108                }
109                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 77)) {
110                        ulFreq = 470 + ((uiChannelNumber - 14) * 6) + 3; 
111                }
112                else{
113                        return 0;
114                }
115
116                return ulFreq * 1000;
117
118        }       
119        else if(NA_CATV ==  iChannelTable){//CATV
120                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
121                        switch (uiChannelNumber) {
122                                case 1:
123                                        ulFreq = 75;
124                                        break;
125                                case 2:
126                                        ulFreq = 57;
127                                        break;
128                                case 3:
129                                        ulFreq = 63;
130                                        break;
131                                case 4:
132                                        ulFreq = 69;
133                                        break;
134                                case 5:
135                                        ulFreq = 79;
136                                        break;
137                                case 6:
138                                        ulFreq = 85;
139                                        break;
140                        }
141                }
142                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
143                        ulFreq = 90 + ((uiChannelNumber - 95) * 6) + 3; 
144                }
145                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
146                        ulFreq = 174 + ((uiChannelNumber - 7) * 6) + 3; 
147                }
148                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
149                        ulFreq = 120 + ((uiChannelNumber - 14) * 6) + 3; 
150                }
151                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
152                        ulFreq = 216 + ((uiChannelNumber - 23) * 6) + 3; 
153                }
154                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
155                        ulFreq = 648 + ((uiChannelNumber - 100) * 6) + 3; 
156                }
157                else{
158                        return 0;
159                }
160
161                return ulFreq * 1000;
162
163        }
164        else if(IRC ==  iChannelTable){//IRC
165                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
166                        switch (uiChannelNumber) {
167                                case 1:
168                                        ulFreq = 75;
169                                        break;
170                                case 2:
171                                        ulFreq = 57;
172                                        break;
173                                case 3:
174                                        ulFreq = 63;
175                                        break;
176                                case 4:
177                                        ulFreq = 69;
178                                        break;
179                                case 5:
180                                        ulFreq = 81;
181                                        break;
182                                case 6:
183                                        ulFreq = 87;
184                                        break;
185                        }
186                }
187                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
188                        ulFreq = 90 + ((uiChannelNumber - 95) * 6) + 3; 
189                }
190                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
191                        ulFreq = 174 + ((uiChannelNumber - 7) * 6) + 3; 
192                }
193                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
194                        ulFreq = 120 + ((uiChannelNumber - 14) * 6) + 3; 
195                }
196                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
197                        ulFreq = 216 + ((uiChannelNumber - 23) * 6) + 3; 
198                }
199                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
200                        ulFreq = 648 + ((uiChannelNumber - 100) * 6) + 3; 
201                }
202                else{
203                        return 0;
204                }
205       
206                return ulFreq * 1000;
207        }
208        else if(HRC ==  iChannelTable){//HRC
209                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
210                        switch (uiChannelNumber) {
211                                case 1:
212                                        ulFreq = 73753;
213                                        break;
214                                case 2:
215                                        ulFreq = 55753;
216                                        break;
217                                case 3:
218                                        ulFreq = 61753;
219                                        break;
220                                case 4:
221                                        ulFreq = 67753;
222                                        break;
223                                case 5:
224                                        ulFreq = 79754;
225                                        break;
226                                case 6:
227                                        ulFreq = 85754;
228                                        break;
229                        }
230                }
231                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
232                        ulFreq = (917545 + ((uiChannelNumber - 95) * 60003))/10; 
233                }
234                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
235                        ulFreq = (1757587 + ((uiChannelNumber - 7) * 60003))/10; 
236                }
237                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
238                        ulFreq = (1217560 + ((uiChannelNumber - 14) * 60003))/10; 
239                }
240                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
241                        ulFreq = (2177608 + ((uiChannelNumber - 23) * 60003))/10; 
242                }
243                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
244                        ulFreq = (6497824 + ((uiChannelNumber - 100) * 60003))/10; 
245                }
246                else{
247                        return 0;
248                }
249
250                return ulFreq ;
251        }
252        else
253                return 0;
254
255
256}
257
258BOOLEAN TunerDTT7611SetRFFreq(unsigned long ulFrequency,unsigned int uiAgcMode,unsigned char* pucBb)
259{
260        *pucBb = 0;
261        if ((ulFrequency >= DTT7611_LOW_BAND_MIN) && (ulFrequency <= DTT7611_LOW_BAND_MAX) ) {
262                if(1 == uiAgcMode){
263                        *pucBb = 0x39;
264                }
265                else if(2 == uiAgcMode){
266                        *pucBb = 0x11;
267                }
268        }
269        else if((ulFrequency >=  DTT7611_MID_BAND_MIN) && (ulFrequency <= DTT7611_MID_BAND_MAX)){
270                if(1 == uiAgcMode){
271                        *pucBb = 0x3a;
272                }
273                else if(2 == uiAgcMode){
274                        *pucBb = 0x12;
275                }
276        }
277        else if((ulFrequency >= DTT7611_HIGH_BAND_MIN) && (ulFrequency <= DTT7611_HIGH_BAND_MAX)){
278                if(1 == uiAgcMode){
279                        *pucBb = 0x3c;
280                }
281                else if(2 == uiAgcMode){
282                        *pucBb = 0x14;
283                }
284        }
285        else 
286                return FALSE;
287        return TRUE;
288}
289
290BOOLEAN DTT7611SetN(unsigned long ulFrequency,TYPE_TUNERDTT7611_REF_DIVIDER_RATIO iRefDividerRatio,     unsigned char* pucDb1,unsigned char* pucDb2)
291{       
292        // calc N
293        unsigned short usNval,usMultiplier=0;
294        unsigned char ucNlow8,ucNbits8_14;
295
296        //1/(dRefDividerRatio/1000)
297        switch(iRefDividerRatio){
298        case TUNERDTT7611_REF_DIVIDER_RATIO_31_25:
299                usMultiplier = 32;
300                break;
301        case TUNERDTT7611_REF_DIVIDER_RATIO_50:
302                usMultiplier = 20;
303                break;
304        case TUNERDTT7611_REF_DIVIDER_RATIO_62_5:
305                usMultiplier = 16;
306                break;
307        case TUNERDTT7611_REF_DIVIDER_RATIO_166_7:
308                usMultiplier = 6;
309                break;
310        }
311
312        usNval = (unsigned short)(((ulFrequency + DTT7611_F_IF_KHZ) * usMultiplier)/1000);
313        if(usNval >= DTT7611_N_MAX){ 
314                //max n in 14 bits
315                usNval = usNval/2 ;
316        }
317       
318        // set N
319
320        if (usNval == 0 || usNval >= DTT7611_N_MAX) { //15 bits
321        return FALSE;
322    }
323       
324        // clear N bits
325        *pucDb1 = 0x00;
326        *pucDb2 = 0x00;
327
328    ucNlow8 = usNval & 0x00FF;
329    ucNbits8_14 = (usNval & 0x07f00) >> 8;
330
331    *pucDb2 = ucNlow8;
332    *pucDb1 |= ucNbits8_14 ; 
333
334        return TRUE;
335}
336
337void DTT7611SetCP(unsigned int uiChargePump,    unsigned char* pucCb)
338{
339        *pucCb &= 0xbf; 
340        if(60 == uiChargePump){
341                *pucCb &= 0xbf; 
342        }
343        else{//280
344                *pucCb |= 0x40; 
345        }
346}
347
348void DTT7611SetStepSize(TYPE_TUNERDTT7611_REF_DIVIDER_RATIO iRefDividerRatio, unsigned char* pucCb,unsigned char* pucCb2)
349{
350        *pucCb &= 0xf9;
351        *pucCb2 &= 0xf9;
352        if (TUNERDTT7611_REF_DIVIDER_RATIO_50 == iRefDividerRatio) {
353                *pucCb &= 0xf9;
354                *pucCb2 &= 0xf9;
355        }
356        else if (TUNERDTT7611_REF_DIVIDER_RATIO_31_25 == iRefDividerRatio) {
357                *pucCb |= 0x2;
358                *pucCb2 |= 0x2;
359        }
360        else if (TUNERDTT7611_REF_DIVIDER_RATIO_166_7 == iRefDividerRatio) {
361                *pucCb |= 0x4;
362                *pucCb2 |= 0x4;
363        }
364        else if (TUNERDTT7611_REF_DIVIDER_RATIO_62_5 == iRefDividerRatio) {
365                *pucCb |= 0x6;
366                *pucCb2 |= 0x6;
367        }
368}
369
370void DTT7611SetAGC(unsigned int uiAgc,  unsigned char* pucAb)
371{
372        *pucAb &= 0x8f;
373
374        if (0 == uiAgc) {
375                *pucAb &= 0x8f;
376        }
377        else if (1== uiAgc) {
378                *pucAb |= 0x10;
379        }
380        else if (2 == uiAgc) {
381                *pucAb |= 0x20;
382        }
383        else if (3 == uiAgc) {
384                *pucAb |= 0x30;
385        }
386        else if (4 == uiAgc) {
387                *pucAb |= 0x40;
388        }
389        else if (5 == uiAgc) {
390                *pucAb |= 0x50;
391        }
392        else if (6 == uiAgc) {
393                *pucAb |= 0x60;
394        }
395}
396
397void DTT7611SetATC(unsigned int uiAgcTimeConstant,unsigned char* pucAb)
398{
399        if (2 == uiAgcTimeConstant) 
400                *pucAb &= ~0x80;
401        else if (50== uiAgcTimeConstant) 
402                *pucAb |= 0x80; 
403}
404
405BOOLEAN TunerDTT7611BeforeSendBytes()
406{
407        if(IIC_COM_SUCCESS != SendHostControl(0, 0))
408                return FALSE;
409        else
410                return TRUE;
411}
412
413BOOLEAN TunerDTT7611AfterSendBytes()
414{
415        if(IIC_COM_SUCCESS != SendHostControl(0x80, 0))
416                return FALSE;
417        else
418                return TRUE;
419}
420
421
422unsigned int  DTT7611SendControlData(unsigned int uiAgcMode,unsigned char Db1,unsigned char Db2,unsigned char Cb,unsigned char Bb,unsigned char Ab,unsigned char Cb2)
423{
424        unsigned char str[10];
425#if 0
426        unsigned long ulWait = 1000;
427#endif
428
429        //open 2nd IIC channel 
430        if( !TunerDTT7611BeforeSendBytes())
431                return DTT7611_BEFORE_SEND_BYTES_FAILED;
432
433        str[0] = Db1;
434        str[1] = Db2;   
435        str[2] = Cb;
436        str[3] = Bb;
437        str[4]= '\0';
438        if (IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), str, 4)) {
439                return DTT7611_SEND_CONTROL_DATA_FAILED;
440        }
441
442        if(1 == uiAgcMode){
443                //wait
444#if 0
445                while(ulWait != 0)
446                        ulWait --;
447#else
448        Demux_STCDelay(90); /* 1 ms */
449#endif
450
451                str[0] = Cb2;
452                str[1] = Ab;   
453                str[2]= '\0';
454                if (IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), str, 2)) {
455                        return DTT7611_SEND_CONTROL_DATA_FAILED;
456                }
457        }
458        if(2 == uiAgcMode){
459                //wait
460#if 0
461                while(ulWait != 0)
462                        ulWait --;
463#else
464        Demux_STCDelay(90); /* 1 ms */
465#endif
466
467                str[0] = Cb2;
468                str[1] = 0xE0; 
469                str[2]= '\0';
470                if (IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), str, 2)) {
471                        return DTT7611_SEND_CONTROL_DATA_FAILED;
472                }
473        }
474
475
476        //Send data byte if internal analog AGC mode.
477        if(2 == uiAgcMode){
478                str[0] = 0x00;
479#if SOUND_TRAP_BYPASS
480                str[1] = 0xD5;
481#else
482                str[1] = 0xD4; 
483#endif
484
485                if (IicTransmit(TLSys_TunerSlaveAddress(I2CWRITE), str, 2)) {
486                        return DTT7611_SEND_CONTROL_DATA_FAILED;
487                }
488
489                str[0] = 0x01;
490                str[1] = 0x30; 
491                if (IicTransmit(TLSys_TunerSlaveAddress(I2CWRITE), str, 2)) {
492                        return DTT7611_SEND_CONTROL_DATA_FAILED;
493                }
494
495                str[0] = 0x02;
496                str[1] = 0x04; 
497                if (IicTransmit(TLSys_TunerSlaveAddress(I2CWRITE), str, 2)) {
498                        return DTT7611_SEND_CONTROL_DATA_FAILED;
499                }
500        }
501
502        //Send data byte if internal digital AGC mode.
503        if(1 == uiAgcMode){
504                str[0] = 0x00;
505#if SOUND_TRAP_BYPASS
506                str[1] = 0xD5;
507#else
508                str[1] = 0xD4; 
509#endif
510                if (IicTransmit(TLSys_TunerSlaveAddress(I2CWRITE), str, 2)) {
511                        return DTT7611_SEND_CONTROL_DATA_FAILED;
512                }
513
514                str[0] = 0x01;
515                str[1] = 0x30; 
516                if (IicTransmit(TLSys_TunerSlaveAddress(I2CWRITE), str, 2)) {
517                        return DTT7611_SEND_CONTROL_DATA_FAILED;
518                }
519
520                str[0] = 0x02;
521                str[1] = 0x24; 
522                if (IicTransmit(TLSys_TunerSlaveAddress(I2CWRITE), str, 2)) {
523                        return DTT7611_SEND_CONTROL_DATA_FAILED;
524                }
525        }
526        //close 2nd IIC channel
527        if( !TunerDTT7611AfterSendBytes())
528                return DTT7611_AFTER_SEND_BYTES_FAILED;
529        else
530                return DTT7611_SUCCESS;
531}
532
533void DTT7611InitBytes(unsigned char* pucDb1,unsigned char* pucDb2,unsigned char* pucCb,unsigned char* pucBb,unsigned char* pucAb,unsigned char* pucCb2)
534{
535        *pucDb1 = 0;
536        *pucDb2 = 0;
537        *pucCb = 0x88;
538        *pucBb = 0;
539        *pucAb = 0;
540        *pucCb2 = 0x98;
541}
542
543unsigned int DTT7611GetTunerStatusReg(unsigned char * pucStatusReg)
544{       
545       
546        unsigned int uiError;
547#if 0
548        unsigned long ulWait = 1000;
549#endif
550
551        if(NULL == pucStatusReg)
552                return FUNCTION_RECEIVED_NULL_PARAMETER;
553
554        *pucStatusReg = 0;
555       
556        //open 2nd IIC channel 
557        if( !TunerDTT7611BeforeSendBytes()){
558                return DTT7611_BEFORE_SEND_BYTES_FAILED;
559        }
560
561        //wait
562#if 0
563        while(ulWait != 0)
564                ulWait --;
565#else
566    Demux_STCDelay(90);                 /* 1 ms */
567#endif
568       
569        *pucStatusReg = ReceiveByteOfDataFromAddress(TLSys_TunerSlaveAddress(I2CWRITE),&uiError);
570
571        //close 2nd IIC channel
572        if( !TunerDTT7611AfterSendBytes())
573                return DTT7611_AFTER_SEND_BYTES_FAILED;
574
575        return uiError;
576}
577
578#endif//#if NIMTN_TYPE==NIMTN_DTT7611
579
Note: See TracBrowser for help on using the repository browser.