source: svn/trunk/zas_dstar/devices/Tuner/Oren_Cascade2B/TdquTuner.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: 10.8 KB
Line 
1/*
2 * $Id: TdquTuner.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 "TdquTuner.h"
10#include "Cas2BRoutines.h"
11#include "IicComm.h"
12#include <stdio.h>
13
14#define TDQU_DBG
15
16#if NIMTN_TYPE==NIMTN_TDQU
17
18#define F_IF 44000 //in KHz
19#define N_MAX 32768 //15 bits
20
21
22#define BitAtPosition(pos) ((unsigned char)1 << (pos))
23#define GetBitMacro(bitfield, index) ((bitfield) & BitAtPosition(index))
24#define SetBitMacro(bitfield, index) ((bitfield) |= BitAtPosition(index))
25#define RemoveBitMacro(bitfield, index) ((bitfield) &= ~BitAtPosition(index))
26
27
28int TunerTdquSendCenterFrequency(unsigned long ulFrequency,TYPE_TUNER_TDQU_REF_DIVIDER_RATIO iReferenceDividerRatio,TYPE_TUNER_TDQU_CHARGE_PUMP iChargePump,TYPE_TUNER_TDQU_AGST iAgst)
29{
30        unsigned char  ucaDataBytes[5];
31        unsigned long  ulMult,ulN;
32
33        ucaDataBytes[0] = 0x20;//0x00;
34        ucaDataBytes[1] = 0x50;//0x00;
35        ucaDataBytes[2] = 0x8B;//0x80;
36        ucaDataBytes[3] = 0xAA;//0x20;          /* byte5 bit5, 4 = 1, 0 */
37        ucaDataBytes[4] = 0xC6;//0xE6;          /* byte6 IFBW2, IFBW1 = 1,0 XLO1,XLO0 = 1, 1 */
38
39        switch(iReferenceDividerRatio){
40        case TUNER_TDQU_REF_DIVIDER_RATIO_166_666:
41                ulMult = 24;
42                RemoveBitMacro(ucaDataBytes[2],0);
43                RemoveBitMacro(ucaDataBytes[2],1);
44                RemoveBitMacro(ucaDataBytes[2],2);
45                break;
46        case TUNER_TDQU_REF_DIVIDER_RATIO_142_857:
47                ulMult = 28;
48                SetBitMacro(ucaDataBytes[2],0);
49                RemoveBitMacro(ucaDataBytes[2],1);
50                RemoveBitMacro(ucaDataBytes[2],2);
51                break;
52        case TUNER_TDQU_REF_DIVIDER_RATIO_80:
53                ulMult = 50;
54                RemoveBitMacro(ucaDataBytes[2],0);
55                SetBitMacro(ucaDataBytes[2],1);
56                RemoveBitMacro(ucaDataBytes[2],2);
57                break;
58        case TUNER_TDQU_REF_DIVIDER_RATIO_62_5:
59                ulMult = 64;
60                SetBitMacro(ucaDataBytes[2],0);
61                SetBitMacro(ucaDataBytes[2],1);
62                RemoveBitMacro(ucaDataBytes[2],2);
63                break;
64        case TUNER_TDQU_REF_DIVIDER_RATIO_31_25:
65                ulMult = 128;
66                RemoveBitMacro(ucaDataBytes[2],0);
67                RemoveBitMacro(ucaDataBytes[2],1);
68                SetBitMacro(ucaDataBytes[2],2);
69                break;
70        default:
71                return TDQU_UNDEFINED_REFERENCE_DIVIDER_RATIO;
72        }
73
74
75        switch(iAgst)
76        {
77        case TUNER_TDQU_AGST_RF_AGC_DISABLE :
78                RemoveBitMacro(ucaDataBytes[2],3);
79                RemoveBitMacro(ucaDataBytes[2],4);
80                RemoveBitMacro(ucaDataBytes[2],5);
81                break; 
82        case TUNER_TDQU_AGST_MINUS_6:
83                SetBitMacro(ucaDataBytes[2],3);
84                RemoveBitMacro(ucaDataBytes[2],4);
85                RemoveBitMacro(ucaDataBytes[2],5);
86                break; 
87        case TUNER_TDQU_AGST_MINUS_4:
88                RemoveBitMacro(ucaDataBytes[2],3);
89                SetBitMacro(ucaDataBytes[2],4);
90                RemoveBitMacro(ucaDataBytes[2],5);
91                break; 
92        case TUNER_TDQU_AGST_MINUS_2:
93                SetBitMacro(ucaDataBytes[2],3);
94                SetBitMacro(ucaDataBytes[2],4);
95                RemoveBitMacro(ucaDataBytes[2],5);
96                break;
97        case TUNER_TDQU_AGST_0:
98                RemoveBitMacro(ucaDataBytes[2],3);
99                RemoveBitMacro(ucaDataBytes[2],4);
100                SetBitMacro(ucaDataBytes[2],5);
101                break;
102        case TUNER_TDQU_AGST_2:
103                SetBitMacro(ucaDataBytes[2],3);
104                RemoveBitMacro(ucaDataBytes[2],4);
105                SetBitMacro(ucaDataBytes[2],5);
106                break;
107        case TUNER_TDQU_AGST_4:
108                RemoveBitMacro(ucaDataBytes[2],3);
109                SetBitMacro(ucaDataBytes[2],4);
110                SetBitMacro(ucaDataBytes[2],5);
111                break;
112        case TUNER_TDQU_AGST_6:
113                SetBitMacro(ucaDataBytes[2],3);
114                SetBitMacro(ucaDataBytes[2],4);
115                SetBitMacro(ucaDataBytes[2],5);
116                break;
117        }
118
119
120
121
122        if(iAgst > TUNER_TDQU_AGST_6)
123                return TDQU_UNDEFINED_AGST;
124
125        // calculate N
126        ulN = ((ulFrequency + 44000/*F_IF*/) * ulMult) / 4000;
127
128
129
130       
131#if 0   /* This doesn't make sense */
132        if(ulN > 32768/*15 bits*/){
133                //max n in 14 bits
134                ulN = (ulN/2 * 10 + 5)/10;
135        }
136#endif
137        if (ulN >= 32768)  //15 bits
138                return TDQU_N_CALCULATION_FAILED;
139       
140    ucaDataBytes[0] = (unsigned  char)((ulN & 0x07f00) >> 8);
141    ucaDataBytes[1] = (unsigned  char)(ulN & 0xff);
142        //ucaDataBytes[2] |= (unsigned  char)iReferenceDividerRatio; /* R2, R1, R0 */
143        //ucaDataBytes[2] |= (unsigned  char)(iAgst << 3);
144
145        if(ulFrequency >= 54000 && ulFrequency < 82000)
146                ucaDataBytes[3] = 0x60;
147        else if(ulFrequency >= 82000 && ulFrequency < 88000)
148                ucaDataBytes[3] = 0x61;
149        else if(ulFrequency >= 88000 && ulFrequency < 162000)
150                ucaDataBytes[3] = 0x60;
151        else if(ulFrequency >= 162000 && ulFrequency < 426000)
152                ucaDataBytes[3] = 0x62;
153        else if(ulFrequency >= 426000 && ulFrequency < 782000)
154                ucaDataBytes[3] = 0xAA;//0xAB;
155        else if(ulFrequency >= 782000 && ulFrequency < 864000)
156                ucaDataBytes[3] = 0x2A;//0xEB;
157        else//like low band
158                ucaDataBytes[3] = 0x60;
159
160#if 0   /* Charge pump is now implied by frequency band */
161        if(iChargePump > TUNER_TDQU_CHARGE_PUMP_1_2_MA)
162                return TDQU_UNDEFINED_CHURGE_PUMP;
163
164        switch(iChargePump) {
165                case TUNER_TDQU_CHARGE_PUMP_70:         /* CP1=x CP0=x CP2=1 */
166                        ucaDataBytes[4] |= 0x8 ;
167                        break; 
168                case TUNER_TDQU_CHARGE_PUMP_150:        /* CP1=0 CP0=1 CP2=0 */
169                        ucaDataBytes[3] |= 0x40 ;
170                        break;
171                case TUNER_TDQU_CHARGE_PUMP_300:        /* CP1=1 CP0=0 CP2=0 */
172                        ucaDataBytes[3] |= 0x80 ;
173                        break;
174                case TUNER_TDQU_CHARGE_PUMP_700:        /* CP1=1 CP0=1 CP2=0 */
175                        ucaDataBytes[3] |= 0xC0 ;
176                        break;
177                case TUNER_TDQU_CHARGE_PUMP_1_2_MA:     /* CP1=0 CP0=0 CP2=0 */
178                        break;
179                default:
180                        return TDQU_UNDEFINED_CHURGE_PUMP;
181        }
182#endif
183
184        if(FALSE == BeforeTunerSendBytes())
185                return TDQU_SEND_CONTROL_DATA_FAILED;
186
187        if(0!=DHL_SYS_I2cWrite(I2C_TDQU_WRITE_ADDR, FALSE, 0, ucaDataBytes, 5)){
188        //if (0 != IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), ucaDataBytes, 5)) {
189                return TDQU_SEND_CONTROL_DATA_FAILED;
190        }
191
192        if(FALSE == AfterTunerSendBytes())
193                return TDQU_SEND_CONTROL_DATA_FAILED;
194
195
196        return TDQU_SUCCESS;
197
198
199
200}
201
202int TunerTdquSendPicCarrier(unsigned long ulFrequency,TYPE_TUNER_TDQU_REF_DIVIDER_RATIO iReferenceDividerRatio,TYPE_TUNER_TDQU_CHARGE_PUMP iChargePump,TYPE_TUNER_TDQU_AGST iAgst)
203{
204        #ifdef TDQU_DBG
205        printf("Tdqu send pic carrier\n");
206        #endif
207
208        return TunerTdquSendCenterFrequency(ulFrequency + 1750,iReferenceDividerRatio,iChargePump,iAgst); 
209}
210
211int TunerTdquSendChannel(unsigned int uiChannel,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TUNER_TDQU_REF_DIVIDER_RATIO iReferenceDividerRatio,TYPE_TUNER_TDQU_CHARGE_PUMP iChargePump,TYPE_TUNER_TDQU_AGST iAgst)
212{
213        unsigned long ulFrequency = TunerTdquGetFrequency(uiChannel,iChannelTable);
214
215        #ifdef TDQU_DBG
216        printf("Tdqu send Channel\n");
217        #endif
218
219
220        if(0 == ulFrequency)
221                return TDQU_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY;
222
223        return TunerTdquSendCenterFrequency(ulFrequency ,iReferenceDividerRatio,iChargePump,iAgst); 
224}
225
226unsigned long TunerTdquGetFrequency(unsigned int uiChannelNumber,CHANNEL_TABLE_TYPE iChannelTable)
227{
228        unsigned long ulFrequency = 0;
229
230        if(0 ==  iChannelTable){//terrestrial
231                if ((uiChannelNumber >= 2) && (uiChannelNumber <= 6)) {
232                        switch (uiChannelNumber) {
233                                case 2:
234                                        ulFrequency = 57;
235                                        break;
236                                case 3:
237                                        ulFrequency = 63;
238                                        break;
239                                case 4:
240                                        ulFrequency = 69;
241                                        break;
242                                case 5:
243                                        ulFrequency = 79;
244                                        break;
245                                case 6:
246                                        ulFrequency = 85;
247                                        break;
248                        }
249                }
250                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
251                        ulFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3; 
252                }
253                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 69)) {
254                        ulFrequency = 470 + ((uiChannelNumber - 14) * 6) + 3; 
255                }
256               
257                return ulFrequency * 1000;
258        }       
259        else if(1 ==  iChannelTable){//CATV
260                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
261                        switch (uiChannelNumber) {
262                                case 1:
263                                        ulFrequency = 75;
264                                        break;
265                                case 2:
266                                        ulFrequency = 57;
267                                        break;
268                                case 3:
269                                        ulFrequency = 63;
270                                        break;
271                                case 4:
272                                        ulFrequency = 69;
273                                        break;
274                                case 5:
275                                        ulFrequency = 79;
276                                        break;
277                                case 6:
278                                        ulFrequency = 85;
279                                        break;
280                        }
281                }
282                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
283                        ulFrequency = 90 + ((uiChannelNumber - 95) * 6) + 3; 
284                }
285                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
286                        ulFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3; 
287                }
288                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
289                        ulFrequency = 120 + ((uiChannelNumber - 14) * 6) + 3; 
290                }
291                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
292                        ulFrequency = 216 + ((uiChannelNumber - 23) * 6) + 3; 
293                }
294                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
295                        ulFrequency = 648 + ((uiChannelNumber - 100) * 6) + 3; 
296                }
297
298                return ulFrequency * 1000;
299        }
300        else if(2 ==  iChannelTable){//IRC
301                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
302                        switch (uiChannelNumber) {
303                                case 1:
304                                        ulFrequency = 75;
305                                        break;
306                                case 2:
307                                        ulFrequency = 57;
308                                        break;
309                                case 3:
310                                        ulFrequency = 63;
311                                        break;
312                                case 4:
313                                        ulFrequency = 69;
314                                        break;
315                                case 5:
316                                        ulFrequency = 81;
317                                        break;
318                                case 6:
319                                        ulFrequency = 87;
320                                        break;
321                        }
322                }
323                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
324                        ulFrequency = 90 + ((uiChannelNumber - 95) * 6) + 3; 
325                }
326                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
327                        ulFrequency = 174+ ((uiChannelNumber - 7) * 6) + 3; 
328                }
329                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
330                        ulFrequency = 120 + ((uiChannelNumber - 14) * 6) + 3; 
331                }
332                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
333                        ulFrequency = 216 + ((uiChannelNumber - 23) * 6) + 3; 
334                }
335                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
336                        ulFrequency = 648 + ((uiChannelNumber - 100) * 6) + 3; 
337                }
338
339                return ulFrequency * 1000;
340        }
341        else if(3 ==  iChannelTable){//HRC
342                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
343                        switch (uiChannelNumber) {
344                                case 1:
345                                        ulFrequency = 75000;
346                                        break;
347                                case 2:
348                                        ulFrequency = 55753;
349                                        break;
350                                case 3:
351                                        ulFrequency = 61753;
352                                        break;
353                                case 4:
354                                        ulFrequency = 66753;
355                                        break;
356                                case 5:
357                                        ulFrequency = 79754;
358                                        break;
359                                case 6:
360                                        ulFrequency = 85754;
361                                        break;
362                        }
363                }
364                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
365                        ulFrequency = (917545 + ((uiChannelNumber - 95) * 60003))/10; 
366                }
367                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
368                        ulFrequency = (1757587 + ((uiChannelNumber - 7) * 60003))/10; 
369                }
370                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
371                        ulFrequency = (1217560 + ((uiChannelNumber - 14) * 60003))/10; 
372                }
373                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
374                        ulFrequency = (2177608 + ((uiChannelNumber - 23) * 60003))/10; 
375                }
376                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
377                        ulFrequency = (6497824 + ((uiChannelNumber - 100) * 60003))/10; 
378                }
379                return ulFrequency ;
380        }
381        else
382                return 0;
383
384}
385
386int TunerTdquPrintLockStatus()
387{
388        unsigned char  ucaDataBytes;
389
390
391        if(FALSE == BeforeTunerSendBytes())
392                return TDQU_SEND_CONTROL_DATA_FAILED;
393
394        if(0!=DHL_SYS_I2cRead(I2C_TDQU_READ_ADDR, FALSE, 0, &ucaDataBytes, 5)){
395        //if (0 != IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), ucaDataBytes, 5)) {
396                return TDQU_SEND_CONTROL_DATA_FAILED;
397        }
398
399        if(FALSE == AfterTunerSendBytes())
400                return TDQU_SEND_CONTROL_DATA_FAILED;
401
402        if(GetBitMacro(ucaDataBytes,6))
403                printf("Tuner TDQU PLL locked!\n");
404        else
405                printf("Tuner TDQU PLL NOT locked!\n");
406               
407        return TDQU_SUCCESS;
408
409}
410
411
412
413#endif//#if NIMTN_TYPE==NIMTN_TDQU
414
Note: See TracBrowser for help on using the repository browser.