source: svn/trunk/zas_dstar/devices/Tuner/Oren_Cascade2B/TunerDTT7612.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: 12.3 KB
Line 
1/*
2 * $Id: TunerDTT7612.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 "TunerDTT7612.h"
11#include "IicComm.h"
12
13#if NIMTN_TYPE==NIMTN_DTT7612
14
15
16int TunerDTT7612SendChannel(unsigned int uiChannel,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TUNERDTT7612_REF_DIVIDER_RATIO iRefDividerRatio,unsigned int uiAgc, unsigned int uiAgcMode,unsigned int uiChargePump,unsigned int uiAgcTimeConstant)
17{
18        unsigned long ulFrequency;
19
20        unsigned char Db1;
21        unsigned char Db2;
22        unsigned char Cb;
23        unsigned char Bb;
24        unsigned char Ab;
25        unsigned char Cb2;
26
27        DTT7612InitBytes(&Db1,&Db2,&Cb,&Bb,&Ab,&Cb2);
28
29        ulFrequency = TunerDTT7612GetFrequency(uiChannel,iChannelTable);
30        if(0 == ulFrequency)
31                return DTT7612_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY;
32       
33        if(FALSE == TunerDTT7612SetRFFreq(ulFrequency,uiAgcMode,&Bb))
34                return DTT7612_FREQUENCY_VALUE_OUT_OF_RANGE;
35       
36        if(FALSE  == DTT7612SetN( ulFrequency,iRefDividerRatio,&Db1,&Db2))
37                return DTT7612_COULD_NOT_SET_N;
38
39        DTT7612SetCP(uiChargePump,&Cb);
40        DTT7612SetStepSize( iRefDividerRatio, &Cb,&Cb2);
41        DTT7612SetAGC(uiAgc,&Ab);
42        DTT7612SetATC(uiAgcTimeConstant,&Ab);
43
44        return DTT7612SendControlData(uiAgcMode,Db1,Db2,Cb,Bb,Ab,Cb2);
45}
46
47int TunerDTT7612SendFreq(unsigned long ulFrequency,TYPE_TUNERDTT7612_REF_DIVIDER_RATIO iRefDividerRatio,unsigned int uiAgc, unsigned int uiAgcMode,unsigned int uiChargePump,unsigned int uiAgcTimeConstant)
48{
49        unsigned char Db1;
50        unsigned char Db2;
51        unsigned char Cb;
52        unsigned char Bb;
53        unsigned char Ab;
54        unsigned char Cb2;
55
56        DTT7612InitBytes(&Db1,&Db2,&Cb,&Bb,&Ab,&Cb2);
57
58        if(FALSE == TunerDTT7612SetRFFreq(ulFrequency,uiAgcMode,&Bb))
59                return DTT7612_FREQUENCY_VALUE_OUT_OF_RANGE;
60
61        if(FALSE  == DTT7612SetN( ulFrequency,iRefDividerRatio, &Db1,&Db2))
62                return DTT7612_COULD_NOT_SET_N;
63
64        DTT7612SetCP(uiChargePump,&Cb);
65        DTT7612SetStepSize( iRefDividerRatio, &Cb,&Cb2);
66        DTT7612SetAGC(uiAgc,&Ab);
67        DTT7612SetATC(uiAgcTimeConstant,&Ab);
68
69        return DTT7612SendControlData(uiAgcMode,Db1,Db2,Cb,Bb,Ab,Cb2);
70}
71
72int TunerDTT7612SendPicCarrier(unsigned long ulFrequency,TYPE_TUNERDTT7612_REF_DIVIDER_RATIO iRefDividerRatio,unsigned int uiAgc, unsigned int uiAgcMode,unsigned int uiChargePump,unsigned int uiAgcTimeConstant)
73{
74        //add 1.75 MHz to the picture carrier frequency
75        return TunerDTT7612SendFreq(ulFrequency + 1750 ,iRefDividerRatio,uiAgc, uiAgcMode,uiChargePump, uiAgcTimeConstant); 
76}
77
78unsigned long TunerDTT7612GetFrequency(unsigned int uiChannelNumber,CHANNEL_TABLE_TYPE iChannelTable)
79{
80        unsigned long ulFreq = 0;
81
82        if(NA_TERRESTRIAL ==  iChannelTable){//terrestrial
83                if ((uiChannelNumber >= 2) && (uiChannelNumber <= 6)) {
84                        switch (uiChannelNumber) {
85                                case 2:
86                                        ulFreq = 57;
87                                        break;
88                                case 3:
89                                        ulFreq = 63;
90                                        break;
91                                case 4:
92                                        ulFreq = 69;
93                                        break;
94                                case 5:
95                                        ulFreq = 79;
96                                        break;
97                                case 6:
98                                        ulFreq = 85;
99                                        break;
100                        }
101                }
102                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
103                        ulFreq = 174 + ((uiChannelNumber - 7) * 6) + 3; 
104                }
105                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 77)) {
106                        ulFreq = 470 + ((uiChannelNumber - 14) * 6) + 3; 
107                }
108                else{
109                        return 0;
110                }
111
112                return ulFreq * 1000;
113
114        }       
115        else if(NA_CATV ==  iChannelTable){//CATV
116                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
117                        switch (uiChannelNumber) {
118                                case 1:
119                                        ulFreq = 75;
120                                        break;
121                                case 2:
122                                        ulFreq = 57;
123                                        break;
124                                case 3:
125                                        ulFreq = 63;
126                                        break;
127                                case 4:
128                                        ulFreq = 69;
129                                        break;
130                                case 5:
131                                        ulFreq = 79;
132                                        break;
133                                case 6:
134                                        ulFreq = 85;
135                                        break;
136                        }
137                }
138                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
139                        ulFreq = 90 + ((uiChannelNumber - 95) * 6) + 3; 
140                }
141                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
142                        ulFreq = 174 + ((uiChannelNumber - 7) * 6) + 3; 
143                }
144                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
145                        ulFreq = 120 + ((uiChannelNumber - 14) * 6) + 3; 
146                }
147                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
148                        ulFreq = 216 + ((uiChannelNumber - 23) * 6) + 3; 
149                }
150                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
151                        ulFreq = 648 + ((uiChannelNumber - 100) * 6) + 3; 
152                }
153                else{
154                        return 0;
155                }
156
157                return ulFreq * 1000;
158
159        }
160        else if(IRC ==  iChannelTable){//IRC
161                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
162                        switch (uiChannelNumber) {
163                                case 1:
164                                        ulFreq = 75;
165                                        break;
166                                case 2:
167                                        ulFreq = 57;
168                                        break;
169                                case 3:
170                                        ulFreq = 63;
171                                        break;
172                                case 4:
173                                        ulFreq = 69;
174                                        break;
175                                case 5:
176                                        ulFreq = 81;
177                                        break;
178                                case 6:
179                                        ulFreq = 87;
180                                        break;
181                        }
182                }
183                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
184                        ulFreq = 90 + ((uiChannelNumber - 95) * 6) + 3; 
185                }
186                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
187                        ulFreq = 174 + ((uiChannelNumber - 7) * 6) + 3; 
188                }
189                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
190                        ulFreq = 120 + ((uiChannelNumber - 14) * 6) + 3; 
191                }
192                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
193                        ulFreq = 216 + ((uiChannelNumber - 23) * 6) + 3; 
194                }
195                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
196                        ulFreq = 648 + ((uiChannelNumber - 100) * 6) + 3; 
197                }
198                else{
199                        return 0;
200                }
201       
202                return ulFreq * 1000;
203        }
204        else if(HRC ==  iChannelTable){//HRC
205                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
206                        switch (uiChannelNumber) {
207                                case 1:
208                                        ulFreq = 75000;
209                                        break;
210                                case 2:
211                                        ulFreq = 55753;
212                                        break;
213                                case 3:
214                                        ulFreq = 61753;
215                                        break;
216                                case 4:
217                                        ulFreq = 66753;
218                                        break;
219                                case 5:
220                                        ulFreq = 79754;
221                                        break;
222                                case 6:
223                                        ulFreq = 85754;
224                                        break;
225                        }
226                }
227                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
228                        ulFreq = (917545 + ((uiChannelNumber - 95) * 60003))/10; 
229                }
230                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
231                        ulFreq = (1757587 + ((uiChannelNumber - 7) * 60003))/10; 
232                }
233                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
234                        ulFreq = (1217560 + ((uiChannelNumber - 14) * 60003))/10; 
235                }
236                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
237                        ulFreq = (2177608 + ((uiChannelNumber - 23) * 60003))/10; 
238                }
239                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
240                        ulFreq = (6497824 + ((uiChannelNumber - 100) * 60003))/10; 
241                }
242                else{
243                        return 0;
244                }
245
246                return ulFreq ;
247        }
248        else
249                return 0;
250
251}
252
253BOOLEAN TunerDTT7612SetRFFreq(unsigned long ulFrequency,unsigned int uiAgcMode,unsigned char* pucBb)
254{
255        *pucBb = 0;
256        if ((ulFrequency >= DTT7612_LOW_BAND_MIN) && (ulFrequency <= DTT7612_LOW_BAND_MAX) ) {
257                if(1 == uiAgcMode){
258                        *pucBb = 0x39;
259                }
260                else if(2 == uiAgcMode){
261                        *pucBb = 0x11;
262                }
263        }
264        else if((ulFrequency >=  DTT7612_MID_BAND_MIN) && (ulFrequency <= DTT7612_MID_BAND_MAX)){
265                if(1 == uiAgcMode){
266                        *pucBb = 0x3a;
267                }
268                else if(2 == uiAgcMode){
269                        *pucBb = 0x12;
270                }
271        }
272        else if((ulFrequency >= DTT7612_HIGH_BAND_MIN) && (ulFrequency <= DTT7612_HIGH_BAND_MAX)){
273                if(1 == uiAgcMode){
274                        *pucBb = 0x3c;
275                }
276                else if(2 == uiAgcMode){
277                        *pucBb = 0x14;
278                }
279        }
280        else 
281                return FALSE;
282        return TRUE;
283}
284
285BOOLEAN DTT7612SetN(unsigned long ulFrequency,TYPE_TUNERDTT7612_REF_DIVIDER_RATIO iRefDividerRatio,     unsigned char* pucDb1,unsigned char* pucDb2)
286{       
287        // calc N
288        unsigned short usNval,usMultiplier=1;
289        unsigned char ucNlow8,ucNbits8_14;
290
291        //1/(dRefDividerRatio/1000)
292        switch(iRefDividerRatio){
293        case TUNERDTT7612_REF_DIVIDER_RATIO_31_25:
294                usMultiplier = 32;
295                break;
296        case TUNERDTT7612_REF_DIVIDER_RATIO_50:
297                usMultiplier = 20;
298                break;
299        case TUNERDTT7612_REF_DIVIDER_RATIO_62_5:
300                usMultiplier = 16;
301                break;
302        case TUNERDTT7612_REF_DIVIDER_RATIO_166_7:
303                usMultiplier = 6;
304                break;
305        }
306
307        usNval = (unsigned short)(((ulFrequency + DTT7612_F_IF_KHZ) * usMultiplier)/1000);
308        if(usNval >= DTT7612_N_MAX){ 
309                //max n in 14 bits
310                usNval = usNval/2 ;
311        }
312       
313        // set N
314
315        if (usNval == 0 || usNval >= DTT7612_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 DTT7612SetCP(unsigned int uiChargePump,    unsigned char* pucCb)
333{
334        *pucCb &= 0xbf; 
335        if(60 == uiChargePump){
336                *pucCb &= 0xbf; 
337        }
338        else{//280
339                *pucCb |= 0x40; 
340        }
341}
342
343void DTT7612SetStepSize(TYPE_TUNERDTT7612_REF_DIVIDER_RATIO iRefDividerRatio, unsigned char* pucCb,unsigned char* pucCb2)
344{
345        *pucCb &= 0xf9;
346        *pucCb2 &= 0xf9;
347        if (TUNERDTT7612_REF_DIVIDER_RATIO_50 == iRefDividerRatio) {
348                *pucCb &= 0xf9;
349                *pucCb2 &= 0xf9;
350        }
351        else if (TUNERDTT7612_REF_DIVIDER_RATIO_31_25 == iRefDividerRatio) {
352                *pucCb |= 0x2;
353                *pucCb2 |= 0x2;
354        }
355        else if (TUNERDTT7612_REF_DIVIDER_RATIO_166_7 == iRefDividerRatio) {
356                *pucCb |= 0x4;
357                *pucCb2 |= 0x4;
358        }
359        else if (TUNERDTT7612_REF_DIVIDER_RATIO_62_5 == iRefDividerRatio) {
360                *pucCb |= 0x6;
361                *pucCb2 |= 0x6;
362        }
363}
364
365void DTT7612SetAGC(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}
391
392void DTT7612SetATC(unsigned int uiAgcTimeConstant,unsigned char* pucAb)
393{
394        if (2 == uiAgcTimeConstant) 
395                *pucAb &= ~0x80;
396        else if (50== uiAgcTimeConstant) 
397                *pucAb |= 0x80; 
398}
399
400BOOLEAN TunerDTT7612BeforeSendBytes()
401{
402        if(IIC_COM_SUCCESS != SendHostControl(0, 0))
403                return FALSE;
404        else
405                return TRUE;
406}
407
408BOOLEAN TunerDTT7612AfterSendBytes()
409{
410        if(IIC_COM_SUCCESS != SendHostControl(0x80, 0))
411                return FALSE;
412        else
413                return TRUE;
414}
415
416
417unsigned int  DTT7612SendControlData(unsigned int uiAgcMode,unsigned char Db1,unsigned char Db2,unsigned char Cb,unsigned char Bb,unsigned char Ab,unsigned char Cb2)
418{
419        unsigned char str[10];
420        unsigned long ulWait = 1000;
421
422        //open 2nd IIC channel 
423        if( !TunerDTT7612BeforeSendBytes())
424                return DTT7612_BEFORE_SEND_BYTES_FAILED;
425
426        str[0] = Db1;
427        str[1] = Db2;   
428        str[2] = Cb;
429        str[3] = Bb;
430        str[4]= '\0';
431        if (IicTransmit(DTT7612_DEVICE_ADDRESS_WRITE, str, 4)) {
432                return DTT7612_SEND_CONTROL_DATA_FAILED;
433        }
434
435        if(1 == uiAgcMode){
436                //wait
437                while(ulWait != 0)
438                        ulWait --;
439
440                str[0] = Cb2;
441                str[1] = Ab;   
442                str[2]= '\0';
443                if (IicTransmit(DTT7612_DEVICE_ADDRESS_WRITE, str, 2)) {
444                        return DTT7612_SEND_CONTROL_DATA_FAILED;
445                }
446        }
447
448        //Send data byte if internal analog AGC mode.
449        if(2 == uiAgcMode){
450                str[0] = 0x00;
451                str[1] = 0xD4; 
452
453                if (IicTransmit(DTT7612_DEVICE_ADDRESS_WRITE, str, 2)) {
454                        return DTT7612_SEND_CONTROL_DATA_FAILED;
455                }
456
457                str[0] = 0x01;
458                str[1] = 0x30; 
459                if (IicTransmit(DTT7612_DEVICE_ADDRESS_WRITE, str, 2)) {
460                        return DTT7612_SEND_CONTROL_DATA_FAILED;
461                }
462
463                str[0] = 0x02;
464                str[1] = 0x04; 
465                if (IicTransmit(DTT7612_DEVICE_ADDRESS_WRITE, str, 2)) {
466                        return DTT7612_SEND_CONTROL_DATA_FAILED;
467                }
468        }
469
470        //Send data byte if internal digital AGC mode.
471        if(1 == uiAgcMode){
472                str[0] = 0x00;
473                str[1] = 0xD4; 
474                if (IicTransmit(DTT7612_DEVICE_ADDRESS_WRITE, str, 2)) {
475                        return DTT7612_SEND_CONTROL_DATA_FAILED;
476                }
477
478                str[0] = 0x01;
479                str[1] = 0x30; 
480                if (IicTransmit(DTT7612_DEVICE_ADDRESS_WRITE, str, 2)) {
481                        return DTT7612_SEND_CONTROL_DATA_FAILED;
482                }
483
484                str[0] = 0x02;
485                str[1] = 0x24; 
486                if (IicTransmit(DTT7612_DEVICE_ADDRESS_WRITE, str, 2)) {
487                        return DTT7612_SEND_CONTROL_DATA_FAILED;
488                }
489        }
490        //close 2nd IIC channel
491        if( !TunerDTT7612AfterSendBytes())
492                return DTT7612_AFTER_SEND_BYTES_FAILED;
493        else
494                return DTT7612_SUCCESS;
495}
496
497void DTT7612InitBytes(unsigned char* pucDb1,unsigned char* pucDb2,unsigned char* pucCb,unsigned char* pucBb,unsigned char* pucAb,unsigned char* pucCb2)
498{
499        *pucDb1 = 0;
500        *pucDb2 = 0;
501        *pucCb = 0x88;
502        *pucBb = 0;
503        *pucAb = 0;
504        *pucCb2 = 0x98;
505}
506
507unsigned int DTT7612GetTunerStatusReg(unsigned char * pucStatusReg)
508{       
509       
510        unsigned int uiError;
511        unsigned long ulWait = 1000;
512
513        if(NULL == pucStatusReg)
514                return FUNCTION_RECEIVED_NULL_PARAMETER;
515
516        *pucStatusReg = 0;
517       
518        //open 2nd IIC channel 
519        if( !TunerDTT7612BeforeSendBytes()){
520                return DTT7612_BEFORE_SEND_BYTES_FAILED;
521        }
522
523        //wait
524        while(ulWait != 0)
525                ulWait --;
526
527       
528        *pucStatusReg = ReceiveByteOfDataFromAddress(DTT7612_DEVICE_ADDRESS_WRITE+1,&uiError);
529
530        //close 2nd IIC channel
531        if( !TunerDTT7612AfterSendBytes())
532                return DTT7612_AFTER_SEND_BYTES_FAILED;
533
534        return uiError;
535}
536
537#endif//#if NIMTN_TYPE==NIMTN_DTT7612
Note: See TracBrowser for help on using the repository browser.