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