source: svn/trunk/zas_dstar/devices/Tuner/Oren_Cascade2B/VP13HRTuner.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: 11.9 KB
Line 
1#include "VP13HRTuner.h"
2#include "Cas2BRoutines.h"
3#include "IicComm.h"
4
5#if SUPPORT_TUNER_VP13HR
6
7#define F_IF 44000 //in KHz
8#define N_MAX 32768 //15 bits
9
10
11int TunerVP13HRSendCenterFrequency(unsigned long ulFrequency,TYPE_TUNER_VP13HR_REF_DIVIDER_RATIO iReferenceDividerRatio, BOOLEAN bIsFMTrap){
12        unsigned char  ucaDataBytes[4];
13        unsigned long  ulMult,ulN;
14        int iVal = 0;
15
16        ucaDataBytes[0] = 0x00;
17        ucaDataBytes[1] = 0x00;
18        ucaDataBytes[2] = 0x80;
19        ucaDataBytes[3] = 0x00;
20
21
22        switch(iReferenceDividerRatio){
23        case TUNER_VP13HR_REF_DIVIDER_RATIO_50:
24                ulMult = 80;
25                break;
26        case TUNER_VP13HR_REF_DIVIDER_RATIO_31_25:
27                ulMult = 128;
28                break;
29        case TUNER_VP13HR_REF_DIVIDER_RATIO_62_5:
30                ulMult = 64;
31                break;
32        default:
33                return VP13HR_UNDEFINED_REFERENCE_DIVIDER_RATIO;
34        }
35
36
37        // calculate N
38        ulN = ((ulFrequency + 44000/*F_IF*/) * ulMult) / 4000;
39        if(ulN > 32768/*15 bits*/){ 
40                //max n in 14 bits
41                ulN = (ulN/2 * 10 + 5)/10;
42        }
43        if (ulN >= 32768)  //15 bits
44                return VP13HR_N_CALCULATION_FAILED;
45       
46    ucaDataBytes[0] = (unsigned  char)((ulN & 0x07f00) >> 8);
47    ucaDataBytes[1] = (unsigned  char)(ulN & 0xff);
48       
49        //CP auto       
50        ucaDataBytes[2] = 0x88;
51        if((ulFrequency > 150000 && ulFrequency <= 174000) ||
52                (ulFrequency > 402000 && ulFrequency <= 468000) ||
53                (ulFrequency > 758000 && ulFrequency <= 864000)){
54                ucaDataBytes[2] |= 0x40;
55        }
56       
57        //step size
58        iVal = iReferenceDividerRatio;
59        if(iReferenceDividerRatio == 2)//in case of 62.5 iReferenceDividerRatio sould be 3
60                iVal++;
61        ucaDataBytes[2] |= iVal << 1;
62       
63        //band switch byte
64        if(ulFrequency > 54000 && ulFrequency <= 174000)
65                ucaDataBytes[3] = 0x01;
66        else if(ulFrequency > 174000 && ulFrequency <= 468000)
67                ucaDataBytes[3] = 0x02;
68        else if(ulFrequency > 468000 && ulFrequency <= 864000)
69                ucaDataBytes[3] = 0x08;
70        else//like low band
71                ucaDataBytes[3] = 0x01;
72
73        if(bIsFMTrap)
74                ucaDataBytes[3] |= 0x04;
75
76
77        if(FALSE == BeforeTunerSendBytes())
78                return VP13HR_SEND_CONTROL_DATA_FAILED;
79
80        if (0 != IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), ucaDataBytes, 4)) {
81                return VP13HR_SEND_CONTROL_DATA_FAILED;
82        }
83
84        if(FALSE == AfterTunerSendBytes())
85                return VP13HR_SEND_CONTROL_DATA_FAILED;
86
87
88        return VP13HR_SUCCESS;
89
90}
91
92int TunerVP13HRAFT(unsigned long ulFrequency,TYPE_TUNER_VP13HR_REF_DIVIDER_RATIO iReferenceDividerRatio, BOOLEAN bIsFMTrap)
93{
94        /* F = F0 */
95        unsigned long ulF = ulFrequency;
96        unsigned int FirstTime=1;
97
98        /* Send to Tuner */
99        TunerVP13HRSendCenterFrequency(ulFrequency ,iReferenceDividerRatio, bIsFMTrap);
100        /* Delay by 300ms */
101        OS_mDelay(300);
102
103        /* Is the Tuner Locked ? */
104Step1:  if (TLSys_NTSC_LOCKED())
105                        goto Step2; /* Locked */
106                else
107                {
108                        ulF-=750; /* F = F - 750KHz */
109                        TunerVP13HRSendCenterFrequency(ulF ,iReferenceDividerRatio, bIsFMTrap); /* Send to Tuner */
110                        if (ulF<ulFrequency-2250)
111                        {
112                                ulF = ulFrequency;
113                                TunerVP13HRSendCenterFrequency(ulF ,iReferenceDividerRatio, bIsFMTrap); /* Send to Tuner */
114                                goto Step4;
115                        }
116                        else
117                        {
118                                OS_mDelay(100); /* Delay by 100ms */
119                                goto Step1;
120                        }
121                }
122
123        /* Is the Tuner Locked ? */
124Step2:  if (!TLSys_NTSC_LOCKED())
125                        goto Step5; /* Not Locked */
126                else
127                {
128                        if (TLSys_AFT_Read()==3) /* AFT > 2.04V */
129                                goto Step3;
130                        else
131                        {
132                                ulF-=125; /* F = F - 125KHz */
133                                TunerVP13HRSendCenterFrequency(ulF ,iReferenceDividerRatio, bIsFMTrap); /* Send to Tuner */
134                                if (ulF<ulFrequency-2250)
135                                {
136                                        ulF = ulFrequency;
137                                        TunerVP13HRSendCenterFrequency(ulF ,iReferenceDividerRatio, bIsFMTrap); /* Send to Tuner */
138                                        goto Step4;
139                                }
140                                else
141                                {
142                                        OS_mDelay(30);  /* Delay by 30ms */
143                                        goto Step2;
144                                }
145                        }
146                }
147
148        /* Is the Tuner Locked ? */
149Step3:  if (!TLSys_NTSC_LOCKED())
150                        goto Step6; /* Not Locked */
151                else
152                {
153                        if (TLSys_AFT_Read()==0) /* AFT < 1.47V */
154                                goto Step8;
155                        else
156                        {
157                                ulF+=62; /* F = F + 62.5KHz */
158                                TunerVP13HRSendCenterFrequency(ulF ,iReferenceDividerRatio, bIsFMTrap); /* Send to Tuner */
159                                if (ulF>ulFrequency+2250)/* Check if inside the frequency limits */
160                                        return TunerVP13HRSendCenterFrequency(ulFrequency ,iReferenceDividerRatio, bIsFMTrap); /* FINISH AFT */
161                                else
162                                {
163                                        OS_mDelay(30);  /* Delay by 30ms */
164                                        goto Step3;
165                                }
166                        }
167                }
168
169        /* Is the Tuner Locked ? */
170Step4:  OS_mDelay(100); /* Delay by 100ms */
171                if (TLSys_NTSC_LOCKED())
172                        goto Step5; /* Locked */
173                else
174                {
175                        ulF+=750; /* F = F + 750KHz */
176                        TunerVP13HRSendCenterFrequency(ulF ,iReferenceDividerRatio, bIsFMTrap); /* Send to Tuner */
177                        if (ulF>ulFrequency+2250) /* Check if inside the frequency limits */
178                                return TunerVP13HRSendCenterFrequency(ulFrequency ,iReferenceDividerRatio, bIsFMTrap); /* FINISH AFT */
179                        else
180                                goto Step4;
181                }
182
183Step5:  if (TLSys_AFT_Read()==3) /* AFT > 2.04V */
184                        goto Step3;
185                else
186                {
187                        ulF+=125; /* F = F + 125KHz */
188                        TunerVP13HRSendCenterFrequency(ulF ,iReferenceDividerRatio, bIsFMTrap); /* Send to Tuner */
189                        if (ulF>ulFrequency+2250)/* Check if inside the frequency limits */
190                                return TunerVP13HRSendCenterFrequency(ulFrequency ,iReferenceDividerRatio, bIsFMTrap); /* FINISH AFT */
191                        else
192                        {
193                                Demux_STCDelay(90 * 30);        /* Delay by 30ms */
194                                goto Step5;
195                        }
196                }
197
198Step6:  if (TLSys_AFT_Read()==0) /* AFT < 1.47V */
199                        goto Step8;
200                else
201                {
202                        ulF-=125; /* F = F - 125KHz */
203                        TunerVP13HRSendCenterFrequency(ulF ,iReferenceDividerRatio, bIsFMTrap); /* Send to Tuner */
204                        if (ulF<ulFrequency-2250)/* Check if inside the frequency limits */
205                                if (FirstTime)
206                                {
207                                        ulF=ulFrequency+2250; /* F = F0 + 2250KHz */
208                                        TunerVP13HRSendCenterFrequency(ulF ,iReferenceDividerRatio, bIsFMTrap); /* Send to Tuner */
209                                        FirstTime =0;
210                                        OS_mDelay(300); /* Delay by 300ms */
211                                        goto Step1;
212                                }
213                                else                                   
214                                        return TunerVP13HRSendCenterFrequency(ulFrequency ,iReferenceDividerRatio, bIsFMTrap); /* FINISH AFT */
215                        else
216                        {
217                                Demux_STCDelay(90 * 30);        /* Delay by 30ms */
218                                goto Step6;
219                        }
220                }
221
222Step7:  if (TLSys_AFT_Read()==0) /* AFT < 1.47V */
223                {
224                        ulF=ulF-62; /* F = F - 62.5KHz */
225                        return TunerVP13HRSendCenterFrequency(ulF ,iReferenceDividerRatio, bIsFMTrap); /* FINISH AFT */
226                }
227                else
228                {
229                        ulF+=62; /* F = F + 62.5KHz */
230                        TunerVP13HRSendCenterFrequency(ulF ,iReferenceDividerRatio, bIsFMTrap); /* Send to Tuner */
231                        if (ulF>ulFrequency+2250)/* Check if inside the frequency limits */
232                                return TunerVP13HRSendCenterFrequency(ulFrequency ,iReferenceDividerRatio, bIsFMTrap); /* FINISH AFT */
233                        else
234                        {
235                                Demux_STCDelay(90 * 30);        /* Delay by 30ms */
236                                goto Step7;
237                        }
238                }
239
240Step8:  if (TLSys_AFT_Read()==3) /* AFT > 2.04V */
241                        goto Step7;
242                else
243                {
244                        ulF-=62; /* F = F - 62.5KHz */
245                        TunerVP13HRSendCenterFrequency(ulF ,iReferenceDividerRatio, bIsFMTrap); /* Send to Tuner */
246                        if (ulF<ulFrequency-2250)/* Check if inside the frequency limits */
247                                if (FirstTime)
248                                {
249                                        ulF=ulFrequency+2250; /* F = F0 + 2250KHz */
250                                        TunerVP13HRSendCenterFrequency(ulF ,iReferenceDividerRatio, bIsFMTrap); /* Send to Tuner */
251                                        FirstTime =0;
252                                        OS_mDelay(300); /* Delay by 300ms */
253                                        goto Step1;
254                                }
255                                else                                   
256                                        return TunerVP13HRSendCenterFrequency(ulFrequency ,iReferenceDividerRatio, bIsFMTrap); /* FINISH AFT */
257                        else
258                        {
259                                Demux_STCDelay(90 * 30);        /* Delay by 30ms */
260                                goto Step8;
261                        }
262                }
263
264}
265
266
267int TunerVP13HRSendPicCarrier(unsigned long ulFrequency,TYPE_TUNER_VP13HR_REF_DIVIDER_RATIO iReferenceDividerRatio, BOOLEAN bIsFMTrap, BOOLEAN bIsAFTReq)
268{
269        if (bIsAFTReq)
270                return TunerVP13HRAFT(ulFrequency + 1750,iReferenceDividerRatio, bIsFMTrap);
271        else
272                return TunerVP13HRSendCenterFrequency(ulFrequency + 1750,iReferenceDividerRatio, bIsFMTrap);
273
274}
275
276int TunerVP13HRSendChannel(unsigned int uiChannel,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TUNER_VP13HR_REF_DIVIDER_RATIO iReferenceDividerRatio, BOOLEAN bIsFMTrap, BOOLEAN bIsAFTReq)
277{
278        unsigned long ulFrequency = TunerVP13HRGetFrequency(uiChannel, iChannelTable);
279        if(0 == ulFrequency)
280                return VP13HR_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY;
281
282        if (bIsAFTReq)
283                return TunerVP13HRAFT(ulFrequency ,iReferenceDividerRatio, bIsFMTrap);
284        else
285                return TunerVP13HRSendCenterFrequency(ulFrequency ,iReferenceDividerRatio, bIsFMTrap); 
286}
287
288
289unsigned long TunerVP13HRGetFrequency(unsigned int uiChannelNumber,CHANNEL_TABLE_TYPE iChannelTable)
290{
291        unsigned long ulFrequency = 0;
292
293        if(0 ==  iChannelTable){//terrestrial
294                if ((uiChannelNumber >= 2) && (uiChannelNumber <= 6)) {
295                        switch (uiChannelNumber) {
296                                case 2:
297                                        ulFrequency = 57;
298                                        break;
299                                case 3:
300                                        ulFrequency = 63;
301                                        break;
302                                case 4:
303                                        ulFrequency = 69;
304                                        break;
305                                case 5:
306                                        ulFrequency = 79;
307                                        break;
308                                case 6:
309                                        ulFrequency = 85;
310                                        break;
311                        }
312                }
313                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
314                        ulFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3; 
315                }
316                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 69)) {
317                        ulFrequency = 470 + ((uiChannelNumber - 14) * 6) + 3; 
318                }
319               
320                return ulFrequency * 1000;
321        }       
322        else if(1 ==  iChannelTable){//CATV
323                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
324                        switch (uiChannelNumber) {
325                                case 1:
326                                        ulFrequency = 75;
327                                        break;
328                                case 2:
329                                        ulFrequency = 57;
330                                        break;
331                                case 3:
332                                        ulFrequency = 63;
333                                        break;
334                                case 4:
335                                        ulFrequency = 69;
336                                        break;
337                                case 5:
338                                        ulFrequency = 79;
339                                        break;
340                                case 6:
341                                        ulFrequency = 85;
342                                        break;
343                        }
344                }
345                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
346                        ulFrequency = 90 + ((uiChannelNumber - 95) * 6) + 3; 
347                }
348                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
349                        ulFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3; 
350                }
351                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
352                        ulFrequency = 120 + ((uiChannelNumber - 14) * 6) + 3; 
353                }
354                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
355                        ulFrequency = 216 + ((uiChannelNumber - 23) * 6) + 3; 
356                }
357                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
358                        ulFrequency = 648 + ((uiChannelNumber - 100) * 6) + 3; 
359                }
360
361                return ulFrequency * 1000;
362        }
363        else if(2 ==  iChannelTable){//IRC
364                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
365                        switch (uiChannelNumber) {
366                                case 1:
367                                        ulFrequency = 75;
368                                        break;
369                                case 2:
370                                        ulFrequency = 57;
371                                        break;
372                                case 3:
373                                        ulFrequency = 63;
374                                        break;
375                                case 4:
376                                        ulFrequency = 69;
377                                        break;
378                                case 5:
379                                        ulFrequency = 81;
380                                        break;
381                                case 6:
382                                        ulFrequency = 87;
383                                        break;
384                        }
385                }
386                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
387                        ulFrequency = 90 + ((uiChannelNumber - 95) * 6) + 3; 
388                }
389                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
390                        ulFrequency = 174+ ((uiChannelNumber - 7) * 6) + 3; 
391                }
392                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
393                        ulFrequency = 120 + ((uiChannelNumber - 14) * 6) + 3; 
394                }
395                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
396                        ulFrequency = 216 + ((uiChannelNumber - 23) * 6) + 3; 
397                }
398                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
399                        ulFrequency = 648 + ((uiChannelNumber - 100) * 6) + 3; 
400                }
401
402                return ulFrequency * 1000;
403        }
404        else if(3 ==  iChannelTable){//HRC
405                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
406                        switch (uiChannelNumber) {
407                                case 1:
408                                        ulFrequency = 75000;
409                                        break;
410                                case 2:
411                                        ulFrequency = 55753;
412                                        break;
413                                case 3:
414                                        ulFrequency = 61753;
415                                        break;
416                                case 4:
417                                        ulFrequency = 66753;
418                                        break;
419                                case 5:
420                                        ulFrequency = 79754;
421                                        break;
422                                case 6:
423                                        ulFrequency = 85754;
424                                        break;
425                        }
426                }
427                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
428                        ulFrequency = (917545 + ((uiChannelNumber - 95) * 60003))/10; 
429                }
430                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
431                        ulFrequency = (1757587 + ((uiChannelNumber - 7) * 60003))/10; 
432                }
433                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
434                        ulFrequency = (1217560 + ((uiChannelNumber - 14) * 60003))/10; 
435                }
436                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
437                        ulFrequency = (2177608 + ((uiChannelNumber - 23) * 60003))/10; 
438                }
439                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
440                        ulFrequency = (6497824 + ((uiChannelNumber - 100) * 60003))/10; 
441                }
442                return ulFrequency ;
443        }
444        else
445                return 0;
446
447}
448
449#endif
Note: See TracBrowser for help on using the repository browser.