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