source: svn/trunk/zas_dstar/devices/Tuner/Oren_Cascade2B/TD6650TTuner.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: 9.6 KB
Line 
1
2#include "TD6650TTuner.h"
3#include "IicComm.h"
4
5#if NIMTN_TYPE==NIMTN_TD6650T
6int TD6650TSendFreq(unsigned long ulFrequency,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TD6650T_REF_DIVIDER_RATIO iReferenceDividerRatio,TYPE_TD6650T_AGC_TOP iAGCTakeOverPoint, TYPE_TD6650T_ATC iAtc)
7{
8        unsigned char Db1=0;
9        unsigned char Db2=0;
10        unsigned char Cb1b=0xc0;
11        unsigned char Cb1a=0x80;
12        unsigned char Cb2=0;
13       
14
15
16        if(FALSE == TD6650TSetN(ulFrequency,iReferenceDividerRatio,&Db1,&Db2))
17                return TD6650T_FREQUENCY_VALUE_OUT_OF_RANGE;
18
19        TD6650TSetCB2(ulFrequency,&Cb2) ;
20        TD6650TSetStepSize(iReferenceDividerRatio,&Cb1b) ;
21        TD6650TSetAGCTop(iAGCTakeOverPoint,&Cb1a) ;
22        TD6650TSetATC( iAtc,&Cb1a ); 
23        return TD6650TSendControlData(Db1,Db2,Cb1b,Cb2,Cb1a);
24}
25
26
27int TD6650TSendPicCarrier(unsigned long ulFrequency,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TD6650T_REF_DIVIDER_RATIO iReferenceDividerRatio,TYPE_TD6650T_AGC_TOP iAGCTakeOverPoint, TYPE_TD6650T_ATC iAtc)
28{
29        return TD6650TSendFreq(ulFrequency  + 1750,iChannelTable,iReferenceDividerRatio,iAGCTakeOverPoint,iAtc);
30}
31
32int TD6650TSendChannel(unsigned int uiChannel,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TD6650T_REF_DIVIDER_RATIO iReferenceDividerRatio,TYPE_TD6650T_AGC_TOP iAGCTakeOverPoint, TYPE_TD6650T_ATC iAtc)
33{
34        unsigned long ulFrequency = TunerTD6650TGetFrequency(uiChannel,iChannelTable);
35        if(0 == ulFrequency)
36                return TD6650T_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY;
37       
38        return TD6650TSendFreq(ulFrequency,iChannelTable,iReferenceDividerRatio,iAGCTakeOverPoint,iAtc);
39}
40
41
42
43
44unsigned int TD6650TSendControlData(unsigned char Db1,unsigned char Db2,unsigned char Cb1b,unsigned char Cb2,unsigned char Cb1a)
45{
46        unsigned char str[10];
47
48        //open 2nd IIC channel 
49        if( !TD6650TBeforeSendBytes())
50                return TD6650T_BEFORE_SEND_BYTES_FAILED;
51
52        str[0] = Db1;
53        str[1] = Db2;   
54        str[2] = Cb1b;
55        str[3] = Cb2;
56        str[4] = Cb1a;
57       
58        if (IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), str, 5)) {
59                return TD6650T_SEND_CONTROL_DATA_FAILED;
60        }
61       
62       
63        //close 2nd IIC channel
64        if( !TD6650TAfterSendBytes())
65                return TD6650T_AFTER_SEND_BYTES_FAILED;
66        else
67                return TD6650T_SUCCESS;
68
69}
70
71
72unsigned long TunerTD6650TGetFrequency(unsigned int uiChannelNumber,CHANNEL_TABLE_TYPE iChannelTable)
73{
74        unsigned long ulCenterFrequency = 0;
75        if(NA_TERRESTRIAL ==  iChannelTable){//terrestrial
76                if ((uiChannelNumber >= 2) && (uiChannelNumber <= 6)) {
77                        switch (uiChannelNumber) {
78                                case 2:
79                                        ulCenterFrequency = 57;
80                                        break;
81                                case 3:
82                                        ulCenterFrequency = 63;
83                                        break;
84                                case 4:
85                                        ulCenterFrequency = 69;
86                                        break;
87                                case 5:
88                                        ulCenterFrequency = 79;
89                                        break;
90                                case 6:
91                                        ulCenterFrequency = 85;
92                                        break;
93                        }
94                }
95                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
96                        ulCenterFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3; 
97                }
98                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 69)) {
99                        ulCenterFrequency = 470 + ((uiChannelNumber - 14) * 6) + 3; 
100                }
101                else{
102                        return 0;
103                }
104                return ulCenterFrequency*1000;
105        }       
106        else if(NA_CATV ==  iChannelTable){//CATV
107                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
108                        switch (uiChannelNumber) {
109                                case 1:
110                                        ulCenterFrequency = 75;
111                                        break;
112                                case 2:
113                                        ulCenterFrequency = 57;
114                                        break;
115                                case 3:
116                                        ulCenterFrequency = 63;
117                                        break;
118                                case 4:
119                                        ulCenterFrequency = 69;
120                                        break;
121                                case 5:
122                                        ulCenterFrequency = 79;
123                                        break;
124                                case 6:
125                                        ulCenterFrequency = 85;
126                                        break;
127                        }
128                }
129                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
130                        ulCenterFrequency = 90 + ((uiChannelNumber - 95) * 6) + 3; 
131                }
132                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
133                        ulCenterFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3; 
134                }
135                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
136                        ulCenterFrequency = 120 + ((uiChannelNumber - 14) * 6) + 3; 
137                }
138                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
139                        ulCenterFrequency = 216 + ((uiChannelNumber - 23) * 6) + 3; 
140                }
141                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
142                        ulCenterFrequency = 648 + ((uiChannelNumber - 100) * 6) + 3; 
143                }
144                else{
145                        return 0;
146                }
147                return ulCenterFrequency*1000;
148        }
149        else if(IRC ==  iChannelTable){//IRC
150                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
151                        switch (uiChannelNumber) {
152                                case 1:
153                                        ulCenterFrequency = 75;
154                                        break;
155                                case 2:
156                                        ulCenterFrequency = 57;
157                                        break;
158                                case 3:
159                                        ulCenterFrequency = 63;
160                                        break;
161                                case 4:
162                                        ulCenterFrequency = 69;
163                                        break;
164                                case 5:
165                                        ulCenterFrequency = 81;
166                                        break;
167                                case 6:
168                                        ulCenterFrequency = 87;
169                                        break;
170                        }
171                }
172                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
173                        ulCenterFrequency = 90 + ((uiChannelNumber - 95) * 6) + 3; 
174                }
175                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
176                        ulCenterFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3; 
177                }
178                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
179                        ulCenterFrequency = 120 + ((uiChannelNumber - 14) * 6) + 3; 
180                }
181                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
182                        ulCenterFrequency = 216 + ((uiChannelNumber - 23) * 6) + 3; 
183                }
184                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
185                        ulCenterFrequency = 648 + ((uiChannelNumber - 100) * 6) + 3; 
186                }
187                else{
188                        return 0;
189                }
190                return ulCenterFrequency * 1000;
191        }
192
193        else if(HRC ==  iChannelTable){//HRC
194                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
195                        switch (uiChannelNumber) {
196                                case 1:
197                                        ulCenterFrequency = 75000;
198                                        break;
199                                case 2:
200                                        ulCenterFrequency = 55753;
201                                        break;
202                                case 3:
203                                        ulCenterFrequency = 61753;
204                                        break;
205                                case 4:
206                                        ulCenterFrequency = 66753;
207                                        break;
208                                case 5:
209                                        ulCenterFrequency = 79754;
210                                        break;
211                                case 6:
212                                        ulCenterFrequency = 85754;
213                                        break;
214                        }
215                }
216                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
217                        ulCenterFrequency = (917545 + ((uiChannelNumber - 95) * 60003))/10; 
218                }
219                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
220                        ulCenterFrequency = (1757587 + ((uiChannelNumber - 7) * 60003))/10; 
221                }
222                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
223                        ulCenterFrequency = (1217560 + ((uiChannelNumber - 14) * 60003))/10; 
224                }
225                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
226                        ulCenterFrequency = (2177608 + ((uiChannelNumber - 23) * 60003))/10; 
227                }
228                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
229                        ulCenterFrequency = (6497824 + ((uiChannelNumber - 100) * 60003))/10; 
230                }
231                else{
232                        return 0;
233                }
234
235                return ulCenterFrequency;
236        }
237        else
238                return 0;
239
240
241}
242
243
244void TD6650TSetStepSize(TYPE_TD6650T_REF_DIVIDER_RATIO iReferenceDividerRatio,unsigned char* pucCb1b) 
245{
246        if (TD6650T_REF_DIVIDER_RATIO_62_5 == iReferenceDividerRatio) {
247                *pucCb1b |= 0;
248        }
249        else if (TD6650T_REF_DIVIDER_RATIO_142_86 == iReferenceDividerRatio) {
250                *pucCb1b |= 1;
251        }
252        else if (TD6650T_REF_DIVIDER_RATIO_166_67 == iReferenceDividerRatio) {
253                *pucCb1b |= 2;
254        }
255        else if (TD6650T_REF_DIVIDER_RATIO_50 == iReferenceDividerRatio) {
256                *pucCb1b |= 3;
257        }
258        else if (TD6650T_REF_DIVIDER_RATIO_125 == iReferenceDividerRatio) {
259                *pucCb1b |= 4;
260        }
261}
262
263
264void TD6650TSetAGCTop(TYPE_TD6650T_AGC_TOP iAGCTakeOverPoint,unsigned char* pucCb1a) 
265{
266        if (TD6650T_AGC_TOP_124 == iAGCTakeOverPoint) {
267                *pucCb1a |= 0;
268        }
269        else if (TD6650T_AGC_TOP_121 == iAGCTakeOverPoint) {
270                *pucCb1a |= 1;
271        }
272        else if (TD6650T_AGC_TOP_118 == iAGCTakeOverPoint) {
273                *pucCb1a |= 2;
274        }
275        else if (TD6650T_AGC_TOP_115 == iAGCTakeOverPoint) {
276                *pucCb1a |= 3;
277        }
278        else if (TD6650T_AGC_TOP_112 == iAGCTakeOverPoint) {
279                *pucCb1a |= 4;
280        }
281        else if (TD6650T_AGC_TOP_109 == iAGCTakeOverPoint) {
282                *pucCb1a |= 5;
283        }
284}
285
286void TD6650TSetATC(TYPE_TD6650T_ATC iAtc,unsigned char* pucCb1a ) 
287{
288        if (TD6650T_ATC_2_SEC == iAtc) {
289                *pucCb1a &= 0xf7;
290        }
291        else if (TD6650T_ATC_50_MSEC == iAtc) {
292                *pucCb1a |= 0x8;
293        }
294}
295
296
297
298
299BOOLEAN TD6650TSetN(unsigned long ulFrequency,TYPE_TD6650T_REF_DIVIDER_RATIO iReferenceDividerRatio,    unsigned char* pucDb1,unsigned char* pucDb2)
300{       
301        unsigned short usNval,usMultiplier;
302       
303        switch(iReferenceDividerRatio){
304        case TD6650T_REF_DIVIDER_RATIO_62_5:
305                usMultiplier = 64;
306                break;
307        case TD6650T_REF_DIVIDER_RATIO_142_86:
308                usMultiplier = 28;
309                break;
310        case TD6650T_REF_DIVIDER_RATIO_166_67:
311                usMultiplier = 24;
312                break;
313        case TD6650T_REF_DIVIDER_RATIO_50:
314                usMultiplier = 80;
315                break;
316        case TD6650T_REF_DIVIDER_RATIO_125:
317                usMultiplier = 32;
318                break;
319        }
320       
321       
322        // calc N
323        usNval = (unsigned short)(((ulFrequency + TD6650T_F_IF)*usMultiplier)/4000);
324        if(usNval > TD6650T_N_MAX){ 
325                //max n in 14 bits
326                usNval = usNval/2 ;
327        }
328       
329        if (usNval == 0 || usNval >= TD6650T_N_MAX) { //15 bits
330        return FALSE;
331    }
332       
333        // clear N bits
334        *pucDb1 = 0x00;
335        *pucDb2 = 0x00;
336
337        *pucDb2 = usNval & 0x00ff;
338    *pucDb1 = (usNval & 0x07f00) >> 8;
339
340        return TRUE;
341}
342
343void TD6650TSetCB2(unsigned long ulFrequency,unsigned char* pucCb2) 
344{
345        //Set CB2 Automatically according to the frequency
346        //low
347        *pucCb2 = 0;
348        if(ulFrequency > 57000 && ulFrequency <= 120000){
349                *pucCb2 = 0x41;
350        }
351        if(ulFrequency > 120000 && ulFrequency <= 150000){
352                *pucCb2 = 0x61;
353        }
354        if(ulFrequency > 150000 && ulFrequency <= 174000){
355                *pucCb2 = 0x81;
356        }
357        //Mid
358        if(ulFrequency > 174000 && ulFrequency <= 350000){
359                *pucCb2 = 0x62;
360        }
361        if(ulFrequency > 350000 && ulFrequency <= 470000){
362                *pucCb2 = 0x82;
363        }
364        //high
365        if(ulFrequency > 470000 && ulFrequency <= 650000){
366                *pucCb2 = 0xa8;
367        }
368        if(ulFrequency > 650000 && ulFrequency <= 8644000){
369                *pucCb2 = 0xc8;
370        }
371}
372
373
374
375
376BOOLEAN TD6650TBeforeSendBytes()
377{
378        if(IIC_COM_SUCCESS != SendHostControl(0, 0))
379                return FALSE;
380        else
381                return TRUE;
382}
383
384BOOLEAN TD6650TAfterSendBytes()
385{
386        if(IIC_COM_SUCCESS != SendHostControl(0x80, 0))
387                return FALSE;
388        else
389                return TRUE;
390}
391
392#endif//#if NIMTN_TYPE==NIMTN_TD6650T
Note: See TracBrowser for help on using the repository browser.