source: svn/trunk/zas_dstar/devices/Tuner/Oren_Cascade2B/Mt2121Tuner.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: 8.5 KB
Line 
1#include "Mt2121Tuner.h"
2#include "IicComm.h"
3#if NIMTN_TYPE==NIMTN_MT2121
4
5
6unsigned long TunerMt2121GetFrequency(unsigned int uiChannelNumber,CHANNEL_TABLE_TYPE iChannelTable)
7{
8        unsigned long ulFrequency = 0;
9
10        if(0 ==  iChannelTable){//terrestrial
11                if ((uiChannelNumber >= 2) && (uiChannelNumber <= 6)) {
12                        switch (uiChannelNumber) {
13                                case 2:
14                                        ulFrequency = 57;
15                                        break;
16                                case 3:
17                                        ulFrequency = 63;
18                                        break;
19                                case 4:
20                                        ulFrequency = 69;
21                                        break;
22                                case 5:
23                                        ulFrequency = 79;
24                                        break;
25                                case 6:
26                                        ulFrequency = 85;
27                                        break;
28                        }
29                }
30                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
31                        ulFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3; 
32                }
33                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 69)) {
34                        ulFrequency = 470 + ((uiChannelNumber - 14) * 6) + 3; 
35                }
36               
37                return ulFrequency * 1000;
38        }       
39        else if(1 ==  iChannelTable){//CATV
40                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
41                        switch (uiChannelNumber) {
42                                case 1:
43                                        ulFrequency = 75;
44                                        break;
45                                case 2:
46                                        ulFrequency = 57;
47                                        break;
48                                case 3:
49                                        ulFrequency = 63;
50                                        break;
51                                case 4:
52                                        ulFrequency = 69;
53                                        break;
54                                case 5:
55                                        ulFrequency = 79;
56                                        break;
57                                case 6:
58                                        ulFrequency = 85;
59                                        break;
60                        }
61                }
62                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
63                        ulFrequency = 90 + ((uiChannelNumber - 95) * 6) + 3; 
64                }
65                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
66                        ulFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3; 
67                }
68                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
69                        ulFrequency = 120 + ((uiChannelNumber - 14) * 6) + 3; 
70                }
71                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
72                        ulFrequency = 216 + ((uiChannelNumber - 23) * 6) + 3; 
73                }
74                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
75                        ulFrequency = 648 + ((uiChannelNumber - 100) * 6) + 3; 
76                }
77
78                return ulFrequency * 1000;
79        }
80        else if(2 ==  iChannelTable){//IRC
81                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
82                        switch (uiChannelNumber) {
83                                case 1:
84                                        ulFrequency = 75;
85                                        break;
86                                case 2:
87                                        ulFrequency = 57;
88                                        break;
89                                case 3:
90                                        ulFrequency = 63;
91                                        break;
92                                case 4:
93                                        ulFrequency = 69;
94                                        break;
95                                case 5:
96                                        ulFrequency = 81;
97                                        break;
98                                case 6:
99                                        ulFrequency = 87;
100                                        break;
101                        }
102                }
103                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
104                        ulFrequency = 90 + ((uiChannelNumber - 95) * 6) + 3; 
105                }
106                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
107                        ulFrequency = 174+ ((uiChannelNumber - 7) * 6) + 3; 
108                }
109                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
110                        ulFrequency = 120 + ((uiChannelNumber - 14) * 6) + 3; 
111                }
112                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
113                        ulFrequency = 216 + ((uiChannelNumber - 23) * 6) + 3; 
114                }
115                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
116                        ulFrequency = 648 + ((uiChannelNumber - 100) * 6) + 3; 
117                }
118
119                return ulFrequency * 1000;
120        }
121        else if(3 ==  iChannelTable){//HRC
122                if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) {
123                        switch (uiChannelNumber) {
124                                case 1:
125                                        ulFrequency = 75000;
126                                        break;
127                                case 2:
128                                        ulFrequency = 55753;
129                                        break;
130                                case 3:
131                                        ulFrequency = 61753;
132                                        break;
133                                case 4:
134                                        ulFrequency = 66753;
135                                        break;
136                                case 5:
137                                        ulFrequency = 79754;
138                                        break;
139                                case 6:
140                                        ulFrequency = 85754;
141                                        break;
142                        }
143                }
144                else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) {
145                        ulFrequency = (917545 + ((uiChannelNumber - 95) * 60003))/10; 
146                }
147                else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) {
148                        ulFrequency = (1757587 + ((uiChannelNumber - 7) * 60003))/10; 
149                }
150                else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) {
151                        ulFrequency = (1217560 + ((uiChannelNumber - 14) * 60003))/10; 
152                }
153                else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) {
154                        ulFrequency = (2177608 + ((uiChannelNumber - 23) * 60003))/10; 
155                }
156                else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) {
157                        ulFrequency = (6497824 + ((uiChannelNumber - 100) * 60003))/10; 
158                }
159                return ulFrequency ;
160        }
161        else
162                return 0;
163
164}
165
166
167int TunerMt2121SendChannel(unsigned int uiChannel,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TUNER_MT2121_REF_DIVIDER_RATIO iRefDividerRatio)
168{
169        unsigned long ulFrequency;
170
171        ulFrequency = TunerMt2121GetFrequency(uiChannel,iChannelTable);
172        if(0 == ulFrequency)
173                return MT2121_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY;
174
175        return TunerMt2121SendDataToTuner(ulFrequency,iChannelTable,iRefDividerRatio);
176
177}
178
179int TunerMt2121SendCenterFrequency(unsigned long ulFrequency,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TUNER_MT2121_REF_DIVIDER_RATIO iRefDividerRatio)
180{
181        return TunerMt2121SendDataToTuner( ulFrequency,iChannelTable,iRefDividerRatio);
182}
183
184int TunerMt2121SendPicCarrier(unsigned long ulFrequency,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TUNER_MT2121_REF_DIVIDER_RATIO iRefDividerRatio)
185{
186
187        return TunerMt2121SendCenterFrequency(ulFrequency + 1750,iChannelTable,iRefDividerRatio);
188
189}
190
191int TunerMt2121SendDataToTuner(unsigned long ulFrequency,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TUNER_MT2121_REF_DIVIDER_RATIO iRefDividerRatio)
192{
193        unsigned long ulMult,ulFlo1InKHZ,ulFlo2InKHZ,ulDiv1,ulNUM1,ulDiv2,ulNUM2;
194        unsigned char ucaSendBytes[2];
195
196        switch (iRefDividerRatio)
197        {
198        case TUNER_MT2121_REF_DIVIDER_RATIO_31_25:
199                ulMult = 31250;
200                break;
201        case TUNER_MT2121_REF_DIVIDER_RATIO_50:
202                ulMult = 50000;
203                break;
204        case TUNER_MT2121_REF_DIVIDER_RATIO_62_5:
205                ulMult = 62500;
206                break;
207        default:
208                ulMult = 62500;
209        }
210       
211        ulFlo1InKHZ = ulFrequency + GetFifAccordingToChannelTable(iChannelTable);
212        //Round FLo1 with 250KHz
213        ulFlo1InKHZ = (unsigned long)((ulFlo1InKHZ + 125)/250) * 250;
214        ulFlo2InKHZ = ulFlo1InKHZ - ulFrequency - 44000;
215        //check if the value divides in the reference divider ratio
216        ulFlo2InKHZ = (unsigned long)((unsigned long)((1000*ulFlo2InKHZ + ulMult/2)/ulMult) * ulMult);
217        ulFlo2InKHZ /= 1000;
218
219        ulDiv1 = (unsigned long)ulFlo1InKHZ / 16000; 
220        //the calculation needs to be (8191 * (uiFlo1InKHZ / 16000.0 - floor(uiFlo1InKHZ / 16000.0)) + 0.5)
221        //we play with the numbers because we dont have floating point numbers to use
222        ulNUM1 = (ulFlo1InKHZ*100) / 16 - ulDiv1*100000;
223        ulNUM1 = ((ulNUM1*8191)/10000 + 5)/10;
224       
225        ulDiv2 = (unsigned long)ulFlo2InKHZ / 16000; 
226        //the calculation needs to be (8191 * (uiFlo1InKHZ / 16000.0 - floor(uiFlo1InKHZ / 16000.0)) + 0.5)
227        //we play with the numbers because we dont have floating point numbers to use
228        ulNUM2 = (ulFlo2InKHZ*100) / 16 - ulDiv2*100000;
229        ulNUM2 = ((ulNUM2*8191)/10000 + 5)/10;
230
231        //open 2nd IIC channel 
232        if( !TunerMt2121BeforeSendBytes())
233                return MT2121_BEFORE_SEND_BYTES_FAILED;
234
235        //send to tuner
236        ucaSendBytes[0] = 0x01;//reg address
237        ucaSendBytes[1] = (unsigned char) (ulNUM1 >> 8);
238
239        if (IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), ucaSendBytes, 2)) {
240                return MT2121_SEND_CONTROL_DATA_FAILED;
241        }
242
243        ucaSendBytes[0] = 0x02;//reg address
244        ucaSendBytes[1] = (unsigned char) (ulNUM1 & 0xff);
245        if (IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), ucaSendBytes, 2)) {
246                return MT2121_SEND_CONTROL_DATA_FAILED;
247        }
248
249        ucaSendBytes[0] = 0x03;//reg address
250        ucaSendBytes[1] = (unsigned char) (ulDiv1 & 0xff);
251        if (IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), ucaSendBytes, 2)) {
252                return MT2121_SEND_CONTROL_DATA_FAILED;
253        }
254
255        ucaSendBytes[0] = 0x04;//reg address
256        ucaSendBytes[1] = (unsigned char) (ulNUM2 >> 8);
257        if (IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), ucaSendBytes, 2)) {
258                return MT2121_SEND_CONTROL_DATA_FAILED;
259        }
260
261        ucaSendBytes[0] = 0x05;//reg address
262        ucaSendBytes[1] = (unsigned char) (ulNUM2 & 0xff);
263        if (IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), ucaSendBytes, 2)) {
264                return MT2121_SEND_CONTROL_DATA_FAILED;
265        }
266
267        ucaSendBytes[0] = 0x06;//reg address
268        ucaSendBytes[1] = (unsigned char) (ulDiv2 & 0xff);
269        if (IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), ucaSendBytes, 2)) {
270                return MT2121_SEND_CONTROL_DATA_FAILED;
271        }
272
273        //close 2nd IIC channel
274        if( !TunerMt2121AfterSendBytes())
275                return MT2121_AFTER_SEND_BYTES_FAILED;
276        else
277                return MT2121_SUCCESS;
278
279}
280
281
282unsigned long GetFifAccordingToChannelTable(CHANNEL_TABLE_TYPE iChannelTable)
283{
284        switch(iChannelTable){
285        case NA_TERRESTRIAL:
286                return 1221500;
287        case NA_CATV:
288                return 1217500;
289        case IRC:
290                return 1217525;
291        case HRC:
292                return 1218560;
293        default:
294                return 1217500;
295        }
296}
297
298BOOLEAN TunerMt2121BeforeSendBytes()
299{
300        if(IIC_COM_SUCCESS != SendHostControl(0, 0))
301                return FALSE;
302        else
303                return TRUE;
304}
305
306BOOLEAN TunerMt2121AfterSendBytes()
307{
308        if(IIC_COM_SUCCESS != SendHostControl(0x80, 0))
309                return FALSE;
310        else
311                return TRUE;
312}
313
314#endif//#if NIMTN_TYPE==NIMTN_MT2121
315
Note: See TracBrowser for help on using the repository browser.