| 1 | #include <stdio.h> |
|---|
| 2 | #include "SN761662Tuner.h" |
|---|
| 3 | #include "IicComm.h" |
|---|
| 4 | |
|---|
| 5 | |
|---|
| 6 | int TunerSN761662SendChannel(unsigned int uiChannel, CHANNEL_TABLE_TYPE iChannelTable, TYPE_SN761662TUNER_REF_DIVIDER_RATIO iRefDividerRatio,TYPE_SN761662TUNER_ATC iATC, TYPE_SN761662TUNER_CP iCP,TYPE_SN761662TUNER_IFOSW iIFOSW,TYPE_SN761662TUNER_AGC_TOP_LEVEL_0_LEVEL_1 iAGCTop, TYPE_SN761662TUNER_RFAGC_SHIFT_XTALOUT_CONTROL iRFAGCShiftXtalOut) |
|---|
| 7 | { |
|---|
| 8 | unsigned long ulFrequency = TunerSN761662GetFrequency(uiChannel,iChannelTable); |
|---|
| 9 | if(0 == ulFrequency) |
|---|
| 10 | return SN761662_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY; |
|---|
| 11 | |
|---|
| 12 | return TunerSN761662SendFreq(ulFrequency, iRefDividerRatio, iATC, iCP, iIFOSW, iAGCTop, iRFAGCShiftXtalOut); |
|---|
| 13 | |
|---|
| 14 | |
|---|
| 15 | } |
|---|
| 16 | |
|---|
| 17 | |
|---|
| 18 | int TunerSN761662SendFreq(unsigned long ulFrequency, TYPE_SN761662TUNER_REF_DIVIDER_RATIO iRefDividerRatio,TYPE_SN761662TUNER_ATC iATC, TYPE_SN761662TUNER_CP iCP,TYPE_SN761662TUNER_IFOSW iIFOSW,TYPE_SN761662TUNER_AGC_TOP_LEVEL_0_LEVEL_1 iAGCTop, TYPE_SN761662TUNER_RFAGC_SHIFT_XTALOUT_CONTROL iRFAGCShiftXtalOut) |
|---|
| 19 | { |
|---|
| 20 | int iMult; |
|---|
| 21 | unsigned char ucaBytesToSend[5]; |
|---|
| 22 | unsigned short usTmp; |
|---|
| 23 | int iBand; |
|---|
| 24 | ucaBytesToSend[0] = 0; |
|---|
| 25 | ucaBytesToSend[1] = 0; |
|---|
| 26 | ucaBytesToSend[2] = 0x80; |
|---|
| 27 | ucaBytesToSend[3] = 0xCC; |
|---|
| 28 | ucaBytesToSend[4] = 0xC0; |
|---|
| 29 | |
|---|
| 30 | if(iRefDividerRatio < SN761662TUNER_REF_DIVIDER_RATIO_24 || iRefDividerRatio > SN761662TUNER_REF_DIVIDER_RATIO_80) |
|---|
| 31 | return SN761662_INCORRECT_REF_DIVIDER_RATIO; |
|---|
| 32 | |
|---|
| 33 | if(iIFOSW != TYPE_SN761662TUNER_IFOSW_IFOUT1_ENABLE_IFOUT2_DISABLE && iIFOSW != TYPE_SN761662TUNER_IFOSW_IFOUT1_DISABLE_IFOUT2_ENABLE) |
|---|
| 34 | return SN761662_INCORRECT_IFOSW; |
|---|
| 35 | |
|---|
| 36 | if(iRFAGCShiftXtalOut < TYPE_SN761662TUNER_RFAGC_SHIFT_XTALOUT_CONTROL_IFOUT_0_OUTPUT_ENABLE || iRFAGCShiftXtalOut > TYPE_SN761662TUNER_RFAGC_SHIFT_XTALOUT_CONTROL_IFOUT_1_OUTPUT_DISABLE) |
|---|
| 37 | return SN761662_INCORRECT_RFAGC_SHIFT_XTALOUT_CONTROL; |
|---|
| 38 | |
|---|
| 39 | switch(iRefDividerRatio){ |
|---|
| 40 | case SN761662TUNER_REF_DIVIDER_RATIO_24: |
|---|
| 41 | iMult = 24; |
|---|
| 42 | break; |
|---|
| 43 | case SN761662TUNER_REF_DIVIDER_RATIO_28: |
|---|
| 44 | iMult = 28; |
|---|
| 45 | break; |
|---|
| 46 | case SN761662TUNER_REF_DIVIDER_RATIO_50: |
|---|
| 47 | iMult = 50; |
|---|
| 48 | break; |
|---|
| 49 | case SN761662TUNER_REF_DIVIDER_RATIO_64: |
|---|
| 50 | iMult = 64; |
|---|
| 51 | break; |
|---|
| 52 | case SN761662TUNER_REF_DIVIDER_RATIO_128: |
|---|
| 53 | iMult = 128; |
|---|
| 54 | break; |
|---|
| 55 | case SN761662TUNER_REF_DIVIDER_RATIO_80: |
|---|
| 56 | iMult = 80; |
|---|
| 57 | break; |
|---|
| 58 | } |
|---|
| 59 | usTmp = (unsigned short)((ulFrequency + 44000)* iMult / 4000); |
|---|
| 60 | if (usTmp == 0 || usTmp >= SN761662_N_MAX) { //15 bits |
|---|
| 61 | return SN761662_FREQUENCY_VALUE_OUT_OF_RANGE; |
|---|
| 62 | } |
|---|
| 63 | ucaBytesToSend[0] = usTmp >> 8; |
|---|
| 64 | ucaBytesToSend[1] = usTmp & 0xff; |
|---|
| 65 | |
|---|
| 66 | //ATC |
|---|
| 67 | if(iATC == 0) |
|---|
| 68 | ucaBytesToSend[4] &= ~0x20; |
|---|
| 69 | else if(iATC == 1) |
|---|
| 70 | ucaBytesToSend[4] |= 0x20; |
|---|
| 71 | else |
|---|
| 72 | return SN761662_INCORRECT_ATC; |
|---|
| 73 | //CP |
|---|
| 74 | //first set bits 6,7 to 0 |
|---|
| 75 | ucaBytesToSend[3] &= ~0xC0; |
|---|
| 76 | ucaBytesToSend[3] |= (iCP << 6); |
|---|
| 77 | |
|---|
| 78 | //BS |
|---|
| 79 | ucaBytesToSend[3] &= ~0x0F; |
|---|
| 80 | |
|---|
| 81 | if(ulFrequency > 54000 && ulFrequency <= 174000) |
|---|
| 82 | iBand = 0x01; |
|---|
| 83 | else if(ulFrequency > 174000 && ulFrequency <= 468000) |
|---|
| 84 | iBand = 0x02; |
|---|
| 85 | else if(ulFrequency > 468000 && ulFrequency <= 864000) |
|---|
| 86 | iBand = 0x08; |
|---|
| 87 | else |
|---|
| 88 | iBand = 0x03; |
|---|
| 89 | |
|---|
| 90 | ucaBytesToSend[3] |= iBand; |
|---|
| 91 | |
|---|
| 92 | ucaBytesToSend[3] |= (iIFOSW << 5); |
|---|
| 93 | |
|---|
| 94 | ucaBytesToSend[2] |= (iAGCTop << 3); |
|---|
| 95 | ucaBytesToSend[2] |= iRefDividerRatio; |
|---|
| 96 | |
|---|
| 97 | ucaBytesToSend[4] |= iRFAGCShiftXtalOut; |
|---|
| 98 | |
|---|
| 99 | |
|---|
| 100 | //open 2nd IIC channel |
|---|
| 101 | if( !TunerSN761662BeforeSendBytes()) |
|---|
| 102 | return SN761662_BEFORE_SEND_BYTES_FAILED; |
|---|
| 103 | |
|---|
| 104 | if (IicTransmit((unsigned char)SN761662_DEVICE_ADDRESS_WRITE, ucaBytesToSend, 5)) { |
|---|
| 105 | return SN761662_SEND_CONTROL_DATA_FAILED; |
|---|
| 106 | } |
|---|
| 107 | |
|---|
| 108 | //close 2nd IIC channel |
|---|
| 109 | if( !TunerSN761662AfterSendBytes()) |
|---|
| 110 | return SN761662_AFTER_SEND_BYTES_FAILED; |
|---|
| 111 | else |
|---|
| 112 | return SN761662_SUCCESS; |
|---|
| 113 | |
|---|
| 114 | //return TRUE; |
|---|
| 115 | |
|---|
| 116 | } |
|---|
| 117 | |
|---|
| 118 | |
|---|
| 119 | int TunerSN761662SendPicCarrier(unsigned long ulFrequency, TYPE_SN761662TUNER_REF_DIVIDER_RATIO iRefDividerRatio,TYPE_SN761662TUNER_ATC iATC, TYPE_SN761662TUNER_CP iCP,TYPE_SN761662TUNER_IFOSW iIFOSW,TYPE_SN761662TUNER_AGC_TOP_LEVEL_0_LEVEL_1 iAGCTop, TYPE_SN761662TUNER_RFAGC_SHIFT_XTALOUT_CONTROL iRFAGCShiftXtalOut) |
|---|
| 120 | { |
|---|
| 121 | return TunerSN761662SendFreq(ulFrequency + 1750, iRefDividerRatio, iATC, iCP, iIFOSW, iAGCTop, iRFAGCShiftXtalOut); |
|---|
| 122 | } |
|---|
| 123 | |
|---|
| 124 | BOOLEAN TunerSN761662BeforeSendBytes() |
|---|
| 125 | { |
|---|
| 126 | if(IIC_COM_SUCCESS != SendHostControl(0, 0)) |
|---|
| 127 | return FALSE; |
|---|
| 128 | else |
|---|
| 129 | return TRUE; |
|---|
| 130 | } |
|---|
| 131 | |
|---|
| 132 | BOOLEAN TunerSN761662AfterSendBytes() |
|---|
| 133 | { |
|---|
| 134 | if(IIC_COM_SUCCESS != SendHostControl(0x80, 0)) |
|---|
| 135 | return FALSE; |
|---|
| 136 | else |
|---|
| 137 | return TRUE; |
|---|
| 138 | } |
|---|
| 139 | |
|---|
| 140 | |
|---|
| 141 | unsigned long TunerSN761662GetFrequency(unsigned int uiChannelNumber,CHANNEL_TABLE_TYPE iChannelTable) |
|---|
| 142 | { |
|---|
| 143 | unsigned long ulFrequency = 0; |
|---|
| 144 | |
|---|
| 145 | if(0 == iChannelTable){//terrestrial |
|---|
| 146 | if ((uiChannelNumber >= 2) && (uiChannelNumber <= 6)) { |
|---|
| 147 | switch (uiChannelNumber) { |
|---|
| 148 | case 2: |
|---|
| 149 | ulFrequency = 57; |
|---|
| 150 | break; |
|---|
| 151 | case 3: |
|---|
| 152 | ulFrequency = 63; |
|---|
| 153 | break; |
|---|
| 154 | case 4: |
|---|
| 155 | ulFrequency = 69; |
|---|
| 156 | break; |
|---|
| 157 | case 5: |
|---|
| 158 | ulFrequency = 79; |
|---|
| 159 | break; |
|---|
| 160 | case 6: |
|---|
| 161 | ulFrequency = 85; |
|---|
| 162 | break; |
|---|
| 163 | } |
|---|
| 164 | } |
|---|
| 165 | else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) { |
|---|
| 166 | ulFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3; |
|---|
| 167 | } |
|---|
| 168 | else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 69)) { |
|---|
| 169 | ulFrequency = 470 + ((uiChannelNumber - 14) * 6) + 3; |
|---|
| 170 | } |
|---|
| 171 | |
|---|
| 172 | return ulFrequency * 1000; |
|---|
| 173 | } |
|---|
| 174 | else if(1 == iChannelTable){//CATV |
|---|
| 175 | if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) { |
|---|
| 176 | switch (uiChannelNumber) { |
|---|
| 177 | case 1: |
|---|
| 178 | ulFrequency = 75; |
|---|
| 179 | break; |
|---|
| 180 | case 2: |
|---|
| 181 | ulFrequency = 57; |
|---|
| 182 | break; |
|---|
| 183 | case 3: |
|---|
| 184 | ulFrequency = 63; |
|---|
| 185 | break; |
|---|
| 186 | case 4: |
|---|
| 187 | ulFrequency = 69; |
|---|
| 188 | break; |
|---|
| 189 | case 5: |
|---|
| 190 | ulFrequency = 79; |
|---|
| 191 | break; |
|---|
| 192 | case 6: |
|---|
| 193 | ulFrequency = 85; |
|---|
| 194 | break; |
|---|
| 195 | } |
|---|
| 196 | } |
|---|
| 197 | else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) { |
|---|
| 198 | ulFrequency = 90 + ((uiChannelNumber - 95) * 6) + 3; |
|---|
| 199 | } |
|---|
| 200 | else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) { |
|---|
| 201 | ulFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3; |
|---|
| 202 | } |
|---|
| 203 | else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) { |
|---|
| 204 | ulFrequency = 120 + ((uiChannelNumber - 14) * 6) + 3; |
|---|
| 205 | } |
|---|
| 206 | else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) { |
|---|
| 207 | ulFrequency = 216 + ((uiChannelNumber - 23) * 6) + 3; |
|---|
| 208 | } |
|---|
| 209 | else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) { |
|---|
| 210 | ulFrequency = 648 + ((uiChannelNumber - 100) * 6) + 3; |
|---|
| 211 | } |
|---|
| 212 | |
|---|
| 213 | return ulFrequency * 1000; |
|---|
| 214 | } |
|---|
| 215 | else if(2 == iChannelTable){//IRC |
|---|
| 216 | if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) { |
|---|
| 217 | switch (uiChannelNumber) { |
|---|
| 218 | case 1: |
|---|
| 219 | ulFrequency = 75; |
|---|
| 220 | break; |
|---|
| 221 | case 2: |
|---|
| 222 | ulFrequency = 57; |
|---|
| 223 | break; |
|---|
| 224 | case 3: |
|---|
| 225 | ulFrequency = 63; |
|---|
| 226 | break; |
|---|
| 227 | case 4: |
|---|
| 228 | ulFrequency = 69; |
|---|
| 229 | break; |
|---|
| 230 | case 5: |
|---|
| 231 | ulFrequency = 81; |
|---|
| 232 | break; |
|---|
| 233 | case 6: |
|---|
| 234 | ulFrequency = 87; |
|---|
| 235 | break; |
|---|
| 236 | } |
|---|
| 237 | } |
|---|
| 238 | else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) { |
|---|
| 239 | ulFrequency = 90 + ((uiChannelNumber - 95) * 6) + 3; |
|---|
| 240 | } |
|---|
| 241 | else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) { |
|---|
| 242 | ulFrequency = 174+ ((uiChannelNumber - 7) * 6) + 3; |
|---|
| 243 | } |
|---|
| 244 | else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) { |
|---|
| 245 | ulFrequency = 120 + ((uiChannelNumber - 14) * 6) + 3; |
|---|
| 246 | } |
|---|
| 247 | else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) { |
|---|
| 248 | ulFrequency = 216 + ((uiChannelNumber - 23) * 6) + 3; |
|---|
| 249 | } |
|---|
| 250 | else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) { |
|---|
| 251 | ulFrequency = 648 + ((uiChannelNumber - 100) * 6) + 3; |
|---|
| 252 | } |
|---|
| 253 | |
|---|
| 254 | return ulFrequency * 1000; |
|---|
| 255 | } |
|---|
| 256 | else if(3 == iChannelTable){//HRC |
|---|
| 257 | if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) { |
|---|
| 258 | switch (uiChannelNumber) { |
|---|
| 259 | case 1: |
|---|
| 260 | ulFrequency = 75000; |
|---|
| 261 | break; |
|---|
| 262 | case 2: |
|---|
| 263 | ulFrequency = 55753; |
|---|
| 264 | break; |
|---|
| 265 | case 3: |
|---|
| 266 | ulFrequency = 61753; |
|---|
| 267 | break; |
|---|
| 268 | case 4: |
|---|
| 269 | ulFrequency = 66753; |
|---|
| 270 | break; |
|---|
| 271 | case 5: |
|---|
| 272 | ulFrequency = 79754; |
|---|
| 273 | break; |
|---|
| 274 | case 6: |
|---|
| 275 | ulFrequency = 85754; |
|---|
| 276 | break; |
|---|
| 277 | } |
|---|
| 278 | } |
|---|
| 279 | else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) { |
|---|
| 280 | ulFrequency = (917545 + ((uiChannelNumber - 95) * 60003))/10; |
|---|
| 281 | } |
|---|
| 282 | else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) { |
|---|
| 283 | ulFrequency = (1757587 + ((uiChannelNumber - 7) * 60003))/10; |
|---|
| 284 | } |
|---|
| 285 | else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) { |
|---|
| 286 | ulFrequency = (1217560 + ((uiChannelNumber - 14) * 60003))/10; |
|---|
| 287 | } |
|---|
| 288 | else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) { |
|---|
| 289 | ulFrequency = (2177608 + ((uiChannelNumber - 23) * 60003))/10; |
|---|
| 290 | } |
|---|
| 291 | else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) { |
|---|
| 292 | ulFrequency = (6497824 + ((uiChannelNumber - 100) * 60003))/10; |
|---|
| 293 | } |
|---|
| 294 | return ulFrequency ; |
|---|
| 295 | } |
|---|
| 296 | else |
|---|
| 297 | return 0; |
|---|
| 298 | |
|---|
| 299 | } |
|---|