| 1 | /******************************************************************** |
|---|
| 2 | * SemcoMxL601.c |
|---|
| 3 | * MxL601 Functions |
|---|
| 4 | * By WillowAndi 2011/11/14 |
|---|
| 5 | *********************************************************************/ |
|---|
| 6 | |
|---|
| 7 | #include "UserDefinedIIC2.h" |
|---|
| 8 | #include "SemcoMxL601.h" |
|---|
| 9 | |
|---|
| 10 | static int nGlobalSelIF; |
|---|
| 11 | static int nGlobalMode; |
|---|
| 12 | static int nGlobalGainLevel; |
|---|
| 13 | |
|---|
| 14 | MXL_STATUS status; |
|---|
| 15 | MXL_COMMAND_T apiCmd; |
|---|
| 16 | |
|---|
| 17 | /* Initialize MxL601 */ |
|---|
| 18 | /* nMode : |
|---|
| 19 | ANA_NTSC_MODE = 0x0, |
|---|
| 20 | ANA_PAL_BG, |
|---|
| 21 | ANA_PAL_I, |
|---|
| 22 | ANA_PAL_D, |
|---|
| 23 | ANA_SECAM_I, |
|---|
| 24 | ANA_SECAM_L, |
|---|
| 25 | DIG_DVB_C, |
|---|
| 26 | DIG_ISDBT_ATSC, |
|---|
| 27 | DIG_DVB_T, |
|---|
| 28 | DIG_J83B |
|---|
| 29 | */ |
|---|
| 30 | /* nIF : |
|---|
| 31 | IF_3_65MHz = 0, |
|---|
| 32 | IF_4MHz = 1, |
|---|
| 33 | IF_4_1MHz = 2, |
|---|
| 34 | IF_4_15MHz = 3, |
|---|
| 35 | IF_4_5MHz = 4, |
|---|
| 36 | IF_4_57MHz = 5, |
|---|
| 37 | IF_5MHz = 6, |
|---|
| 38 | IF_5_38MHz = 7, |
|---|
| 39 | IF_6MHz = 8, |
|---|
| 40 | IF_6_28MHz = 9, |
|---|
| 41 | IF_7_2MHz = 10, |
|---|
| 42 | IF_8_25MHz = 11, |
|---|
| 43 | IF_35_25MHz = 12, |
|---|
| 44 | IF_36MHz = 13, |
|---|
| 45 | IF_36_15MHz = 14, |
|---|
| 46 | IF_36_65MHz = 15, |
|---|
| 47 | IF_44MHz = 16 |
|---|
| 48 | */ |
|---|
| 49 | int SemcoMxL601_Init(int nUnit, int nMode, int nXtalCap, int nIF, int nGainLevel) |
|---|
| 50 | { |
|---|
| 51 | |
|---|
| 52 | /* Soft Reset */ |
|---|
| 53 | SemcoMxL601_SoftReset(nUnit); |
|---|
| 54 | |
|---|
| 55 | /* Overwrite Default */ |
|---|
| 56 | apiCmd.commandId = MXL_DEV_OVERWRITE_DEFAULT_CFG; |
|---|
| 57 | apiCmd.MxLIf.cmdOverwriteDefault.I2cSlaveAddr = MXL601_ADDRESS; |
|---|
| 58 | apiCmd.MxLIf.cmdOverwriteDefault.SingleSupply_3_3V = MXL_ENABLE; |
|---|
| 59 | status = MxLWare601_API_ConfigDevice(&apiCmd); |
|---|
| 60 | if(status != MXL_TRUE) |
|---|
| 61 | return 1; |
|---|
| 62 | |
|---|
| 63 | /* Xtal Setting : 16MHz */ |
|---|
| 64 | apiCmd.commandId = MXL_DEV_XTAL_SET_CFG; |
|---|
| 65 | apiCmd.MxLIf.cmdXtalCfg.I2cSlaveAddr = MXL601_ADDRESS; |
|---|
| 66 | apiCmd.MxLIf.cmdXtalCfg.XtalFreqSel = XTAL_16MHz; |
|---|
| 67 | apiCmd.MxLIf.cmdXtalCfg.XtalCap = nXtalCap; |
|---|
| 68 | apiCmd.MxLIf.cmdXtalCfg.ClkOutEnable = MXL_ENABLE; |
|---|
| 69 | apiCmd.MxLIf.cmdXtalCfg.ClkOutDiv = MXL_DISABLE; |
|---|
| 70 | apiCmd.MxLIf.cmdXtalCfg.SingleSupply_3_3V = MXL_ENABLE; //MXL_DISABLE => 1.8v |
|---|
| 71 | apiCmd.MxLIf.cmdXtalCfg.XtalSharingMode = MXL_DISABLE; |
|---|
| 72 | status = MxLWare601_API_ConfigDevice(&apiCmd); |
|---|
| 73 | |
|---|
| 74 | /* Power up setting */ |
|---|
| 75 | apiCmd.commandId = MXL_TUNER_POWER_UP_CFG; |
|---|
| 76 | apiCmd.MxLIf.cmdTunerPoweUpCfg.I2cSlaveAddr = MXL601_ADDRESS; |
|---|
| 77 | apiCmd.MxLIf.cmdTunerPoweUpCfg.Enable = MXL_ENABLE; |
|---|
| 78 | status = MxLWare601_API_ConfigTuner(&apiCmd); |
|---|
| 79 | if(status != MXL_TRUE) |
|---|
| 80 | return 1; |
|---|
| 81 | |
|---|
| 82 | |
|---|
| 83 | // Set IF |
|---|
| 84 | if(SemcoMxL601_SetIF(nUnit,nIF, nGainLevel)) // IF 6MHz |
|---|
| 85 | return 1; |
|---|
| 86 | |
|---|
| 87 | // Set AGC |
|---|
| 88 | //if(SemcoMxL601_SetAGC(nUnit, AGC_EXTERNAL, nMode)) //AGC_SELF |
|---|
| 89 | // return 1; |
|---|
| 90 | |
|---|
| 91 | // Set Mode |
|---|
| 92 | if(SemcoMxL601_SetMode(nUnit,nMode)) |
|---|
| 93 | return 1; |
|---|
| 94 | |
|---|
| 95 | |
|---|
| 96 | // Set AGC for test |
|---|
| 97 | if(SemcoMxL601_SetAGC(nUnit, AGC_EXTERNAL, nMode)) //AGC_SELF |
|---|
| 98 | return 1; |
|---|
| 99 | return 0; |
|---|
| 100 | |
|---|
| 101 | } |
|---|
| 102 | |
|---|
| 103 | /* Soft Reset */ |
|---|
| 104 | void SemcoMxL601_SoftReset(int nUnit) |
|---|
| 105 | { |
|---|
| 106 | |
|---|
| 107 | /* Soft Reset MxL601 */ |
|---|
| 108 | apiCmd.commandId = MXL_DEV_SOFT_RESET_CFG; |
|---|
| 109 | apiCmd.MxLIf.cmdResetCfg.I2cSlaveAddr = MXL601_ADDRESS; |
|---|
| 110 | MxLWare601_API_ConfigDevice(&apiCmd); |
|---|
| 111 | } |
|---|
| 112 | |
|---|
| 113 | /* Set IF */ |
|---|
| 114 | /* |
|---|
| 115 | nSelIF : |
|---|
| 116 | IF_3_65MHz = 0, |
|---|
| 117 | IF_4MHz = 1, |
|---|
| 118 | IF_4_1MHz = 2, |
|---|
| 119 | IF_4_15MHz = 3, |
|---|
| 120 | IF_4_5MHz = 4, |
|---|
| 121 | IF_4_57MHz = 5, |
|---|
| 122 | IF_5MHz = 6, |
|---|
| 123 | IF_5_38MHz = 7, |
|---|
| 124 | IF_6MHz = 8, |
|---|
| 125 | IF_6_28MHz = 9, |
|---|
| 126 | IF_7_2MHz = 10, |
|---|
| 127 | IF_8_25MHz = 11, |
|---|
| 128 | IF_35_25MHz = 12, |
|---|
| 129 | IF_36MHz = 13, |
|---|
| 130 | IF_36_15MHz = 14, |
|---|
| 131 | IF_36_65MHz = 15, |
|---|
| 132 | IF_44MHz = 16 |
|---|
| 133 | */ |
|---|
| 134 | int SemcoMxL601_SetIF(int nUnit, int nSelIF, int nGainLevel) |
|---|
| 135 | { |
|---|
| 136 | /* IF Out setting */ |
|---|
| 137 | apiCmd.commandId = MXL_DEV_IF_OUT_CFG; |
|---|
| 138 | apiCmd.MxLIf.cmdIfOutCfg.I2cSlaveAddr = MXL601_ADDRESS; |
|---|
| 139 | apiCmd.MxLIf.cmdIfOutCfg.IFOutFreq = nSelIF; |
|---|
| 140 | apiCmd.MxLIf.cmdIfOutCfg.ManualFreqSet = MXL_DISABLE; |
|---|
| 141 | apiCmd.MxLIf.cmdIfOutCfg.IFInversion = MXL_ENABLE; //MXL_DISABLE; |
|---|
| 142 | apiCmd.MxLIf.cmdIfOutCfg.GainLevel = nGainLevel; |
|---|
| 143 | apiCmd.MxLIf.cmdIfOutCfg.PathSel = IF_PATH1; |
|---|
| 144 | status = MxLWare601_API_ConfigDevice(&apiCmd); |
|---|
| 145 | |
|---|
| 146 | nGlobalSelIF = SemcoMxL601_SelIF(nSelIF); |
|---|
| 147 | |
|---|
| 148 | nGlobalGainLevel = nGainLevel; |
|---|
| 149 | |
|---|
| 150 | if(status != MXL_TRUE) |
|---|
| 151 | return 1; |
|---|
| 152 | |
|---|
| 153 | return 0; |
|---|
| 154 | } |
|---|
| 155 | |
|---|
| 156 | //Return IF |
|---|
| 157 | int SemcoMxL601_SelIF(int nSelIF) |
|---|
| 158 | { |
|---|
| 159 | int nIF = 0; //Unit: KHz |
|---|
| 160 | if(nSelIF == IF_3_65MHz) // IF_3_65MHz = 0, |
|---|
| 161 | nIF = 3650; |
|---|
| 162 | else if(nSelIF == IF_4MHz) // IF_4MHz = 1, |
|---|
| 163 | nIF = 4000; |
|---|
| 164 | else if(nSelIF == IF_4_1MHz) // IF_4_1MHz = 2, |
|---|
| 165 | nIF = 4100; |
|---|
| 166 | else if(nSelIF == IF_4_15MHz) // IF_4_15MHz = 3, |
|---|
| 167 | nIF = 4150; |
|---|
| 168 | else if(nSelIF == IF_4_5MHz) // IF_4_5MHz = 4, |
|---|
| 169 | nIF = 4500; |
|---|
| 170 | else if(nSelIF == IF_4_57MHz) // IF_4_57MHz = 5, |
|---|
| 171 | nIF = 4570; |
|---|
| 172 | else if(nSelIF == IF_5MHz) // IF_5MHz = 6, |
|---|
| 173 | nIF = 5000; |
|---|
| 174 | else if(nSelIF == IF_5_38MHz) // IF_5_38MHz = 7, |
|---|
| 175 | nIF = 5380; |
|---|
| 176 | else if(nSelIF == IF_6MHz) // IF_6MHz = 8, |
|---|
| 177 | nIF = 6000; |
|---|
| 178 | else if(nSelIF == IF_6_28MHz) // IF_6_28MHz = 9, |
|---|
| 179 | nIF = 6280; |
|---|
| 180 | else if(nSelIF == IF_7_2MHz) // IF_7_2MHz = 10, |
|---|
| 181 | nIF = 7200; |
|---|
| 182 | else if(nSelIF == IF_8_25MHz) // IF_8_25MHz = 11, |
|---|
| 183 | nIF = 8250; |
|---|
| 184 | else if(nSelIF == IF_35_25MHz) // IF_35_25MHz = 12, |
|---|
| 185 | nIF = 35250; |
|---|
| 186 | else if(nSelIF == IF_36MHz) // IF_36MHz = 13, |
|---|
| 187 | nIF = 36000; |
|---|
| 188 | else if(nSelIF == IF_36_15MHz) // IF_36_15MHz = 14, |
|---|
| 189 | nIF = 36150; |
|---|
| 190 | else if(nSelIF == IF_36_65MHz) // IF_36_65MHz = 15, |
|---|
| 191 | nIF = 36650; |
|---|
| 192 | else if(nSelIF == IF_44MHz) // IF_44MHz = 16, |
|---|
| 193 | nIF = 44000; |
|---|
| 194 | else |
|---|
| 195 | nIF = 5000; |
|---|
| 196 | return nIF; |
|---|
| 197 | } |
|---|
| 198 | |
|---|
| 199 | /* Set AGC */ |
|---|
| 200 | /* nType : AGC_SELF = 0, AGC_EXTERNAL = 1 */ |
|---|
| 201 | int SemcoMxL601_SetAGC(int nUnit,int nType, int nMode) |
|---|
| 202 | { |
|---|
| 203 | /* AGC Setting */ |
|---|
| 204 | apiCmd.commandId = MXL_TUNER_AGC_CFG; |
|---|
| 205 | apiCmd.MxLIf.cmdAgcSetCfg.I2cSlaveAddr = MXL601_ADDRESS; |
|---|
| 206 | apiCmd.MxLIf.cmdAgcSetCfg.AgcSel = AGC1; |
|---|
| 207 | |
|---|
| 208 | apiCmd.MxLIf.cmdAgcSetCfg.AgcType = nType; |
|---|
| 209 | |
|---|
| 210 | if(nMode == DIG_DVB_C)//20120614 CSM change |
|---|
| 211 | apiCmd.MxLIf.cmdAgcSetCfg.SetPoint = 58; // DVB_C AGC TOP |
|---|
| 212 | else |
|---|
| 213 | apiCmd.MxLIf.cmdAgcSetCfg.SetPoint = 66; // DVB_T, ATSC, J83B AGC TOP |
|---|
| 214 | |
|---|
| 215 | apiCmd.MxLIf.cmdAgcSetCfg.AgcPolarityInverstion = MXL_DISABLE; //MXL_DISABLE; // New Added in V2 - 2011.12.27 |
|---|
| 216 | |
|---|
| 217 | status = MxLWare601_API_ConfigTuner(&apiCmd); |
|---|
| 218 | |
|---|
| 219 | if(status != MXL_TRUE) |
|---|
| 220 | return 1; |
|---|
| 221 | |
|---|
| 222 | return 0; |
|---|
| 223 | } |
|---|
| 224 | |
|---|
| 225 | /* Set Application Mode */ |
|---|
| 226 | /* nMode : |
|---|
| 227 | ANA_NTSC_MODE = 0x0, |
|---|
| 228 | ANA_PAL_BG, |
|---|
| 229 | ANA_PAL_I, |
|---|
| 230 | ANA_PAL_D, |
|---|
| 231 | ANA_SECAM_I, |
|---|
| 232 | ANA_SECAM_L, |
|---|
| 233 | DIG_DVB_C, |
|---|
| 234 | DIG_ISDBT_ATSC, |
|---|
| 235 | DIG_DVB_T, |
|---|
| 236 | DIG_J83B |
|---|
| 237 | */ |
|---|
| 238 | int SemcoMxL601_SetMode(int nUnit,int nMode) |
|---|
| 239 | { |
|---|
| 240 | /* Application Mode setting */ |
|---|
| 241 | apiCmd.commandId = MXL_TUNER_MODE_CFG; |
|---|
| 242 | apiCmd.MxLIf.cmdModeCfg.I2cSlaveAddr = MXL601_ADDRESS; |
|---|
| 243 | apiCmd.MxLIf.cmdModeCfg.SignalMode = nMode; |
|---|
| 244 | apiCmd.MxLIf.cmdModeCfg.IFOutFreqinKHz = nGlobalSelIF;//unsigned int °ª ÇÊ¿ä. |
|---|
| 245 | apiCmd.MxLIf.cmdModeCfg.XtalFreqSel = XTAL_16MHz; // New Added in V2 - 2011.12.27 |
|---|
| 246 | apiCmd.MxLIf.cmdModeCfg.IFOutGainLevel = nGlobalGainLevel; // New Added in V2 - 2011.12.27 |
|---|
| 247 | status = MxLWare601_API_ConfigTuner(&apiCmd); |
|---|
| 248 | |
|---|
| 249 | nGlobalMode = nMode; |
|---|
| 250 | |
|---|
| 251 | if(status != MXL_TRUE) |
|---|
| 252 | return 1; |
|---|
| 253 | |
|---|
| 254 | return 0; |
|---|
| 255 | } |
|---|
| 256 | |
|---|
| 257 | /* Set Frequency */ |
|---|
| 258 | /* nBandWidth : |
|---|
| 259 | ANA_TV_DIG_CABLE_BW_6MHz = 0x00, // Analog TV and Digital Cable Mode 6MHz |
|---|
| 260 | ANA_TV_DIG_CABLE_BW_7MHz = 0x01, // Analog TV and Digital Cable Mode 7MHz |
|---|
| 261 | ANA_TV_DIG_CABLE_BW_8MHz = 0x02, // Analog TV and Digital Cable Mode 8MHz |
|---|
| 262 | DIG_TERR_BW_6MHz = 0x20, // Digital Terrestrial Mode 6MHz |
|---|
| 263 | DIG_TERR_BW_7MHz = 0x21, // Digital Terrestrial Mode 7MHz |
|---|
| 264 | DIG_TERR_BW_8MHz = 0x22 // Digital Terrestrial Mode 8MHz |
|---|
| 265 | */ |
|---|
| 266 | int SemcoMxL601_SetFrequency(int nUnit, unsigned int nFreq_Hz, int nBandWidth) |
|---|
| 267 | { |
|---|
| 268 | /* Channel frequency & bandwidth setting */ |
|---|
| 269 | apiCmd.commandId = MXL_TUNER_CHAN_TUNE_CFG; |
|---|
| 270 | apiCmd.MxLIf.cmdChanTuneCfg.I2cSlaveAddr = MXL601_ADDRESS; |
|---|
| 271 | apiCmd.MxLIf.cmdChanTuneCfg.TuneType = VIEW_MODE; |
|---|
| 272 | apiCmd.MxLIf.cmdChanTuneCfg.BandWidth = nBandWidth; |
|---|
| 273 | apiCmd.MxLIf.cmdChanTuneCfg.FreqInHz = nFreq_Hz; |
|---|
| 274 | apiCmd.MxLIf.cmdChanTuneCfg.SignalMode = nGlobalMode; |
|---|
| 275 | apiCmd.MxLIf.cmdChanTuneCfg.XtalFreqSel = XTAL_16MHz; |
|---|
| 276 | apiCmd.MxLIf.cmdChanTuneCfg.IFOutFreqinKHz = nGlobalSelIF;//csm add |
|---|
| 277 | status = MxLWare601_API_ConfigTuner(&apiCmd); |
|---|
| 278 | if(status != MXL_TRUE) |
|---|
| 279 | return 1; |
|---|
| 280 | /* |
|---|
| 281 | // Sequencer setting |
|---|
| 282 | apiCmd.commandId = MXL_TUNER_START_TUNE_CFG; |
|---|
| 283 | apiCmd.MxLIf.cmdStartTuneCfg.I2cSlaveAddr = MXL601_ADDRESS; |
|---|
| 284 | apiCmd.MxLIf.cmdStartTuneCfg.StartTune = MXL_DISABLE; |
|---|
| 285 | status = MxLWare601_API_ConfigTuner(&apiCmd); |
|---|
| 286 | if(status != MXL_TRUE) |
|---|
| 287 | return 1; |
|---|
| 288 | */ |
|---|
| 289 | // Sequencer setting |
|---|
| 290 | apiCmd.commandId = MXL_TUNER_START_TUNE_CFG; |
|---|
| 291 | apiCmd.MxLIf.cmdStartTuneCfg.I2cSlaveAddr = MXL601_ADDRESS; |
|---|
| 292 | apiCmd.MxLIf.cmdStartTuneCfg.StartTune = MXL_ENABLE; |
|---|
| 293 | status = MxLWare601_API_ConfigTuner(&apiCmd); |
|---|
| 294 | if(status != MXL_TRUE) |
|---|
| 295 | return 1; |
|---|
| 296 | |
|---|
| 297 | // Wait 100ms |
|---|
| 298 | MxL_Sleep(100); |
|---|
| 299 | |
|---|
| 300 | return 0; |
|---|
| 301 | |
|---|
| 302 | } |
|---|
| 303 | |
|---|
| 304 | |
|---|
| 305 | /* Get Lock Status */ |
|---|
| 306 | /* return : 1-lock, 0-unlock */ |
|---|
| 307 | unsigned char SemcoMxL601_GetLock(int nUnit) |
|---|
| 308 | { |
|---|
| 309 | unsigned char bLock; |
|---|
| 310 | |
|---|
| 311 | bLock = 0; |
|---|
| 312 | |
|---|
| 313 | // Read back Tuner lock status |
|---|
| 314 | apiCmd.commandId = MXL_TUNER_LOCK_STATUS_REQ; |
|---|
| 315 | apiCmd.MxLIf.cmdTunerLockReq.I2cSlaveAddr = MXL601_ADDRESS; |
|---|
| 316 | if (MXL_TRUE == MxLWare601_API_GetTunerStatus(&apiCmd)) |
|---|
| 317 | { |
|---|
| 318 | if (MXL_LOCKED == apiCmd.MxLIf.cmdTunerLockReq.RfSynLock && MXL_LOCKED == apiCmd.MxLIf.cmdTunerLockReq.RefSynLock) |
|---|
| 319 | { |
|---|
| 320 | bLock = 1; |
|---|
| 321 | } |
|---|
| 322 | } |
|---|
| 323 | |
|---|
| 324 | return bLock; |
|---|
| 325 | |
|---|
| 326 | } |
|---|
| 327 | |
|---|
| 328 | /* Get Power Level */ |
|---|
| 329 | float SemcoMxL601_GetPowerLevel(int nUnit) |
|---|
| 330 | { |
|---|
| 331 | float nPowerLevel; |
|---|
| 332 | |
|---|
| 333 | // Read back Tuner lock status |
|---|
| 334 | apiCmd.commandId = MXL_TUNER_LOCK_STATUS_REQ; |
|---|
| 335 | apiCmd.MxLIf.cmdTunerLockReq.I2cSlaveAddr = MXL601_ADDRESS; |
|---|
| 336 | if(MXL_TRUE == MxLWare601_API_GetTunerStatus(&apiCmd)) |
|---|
| 337 | { |
|---|
| 338 | nPowerLevel = apiCmd.MxLIf.cmdTunerPwrReq.RxPwr; |
|---|
| 339 | }else{ |
|---|
| 340 | return 1; |
|---|
| 341 | } |
|---|
| 342 | |
|---|
| 343 | return nPowerLevel; |
|---|
| 344 | |
|---|
| 345 | } |
|---|
| 346 | |
|---|
| 347 | /* Get Chip Information */ |
|---|
| 348 | void SemcoMxL601_GetChipInfo(int nUnit, int *lpChipId, int *lpChipVer) |
|---|
| 349 | { |
|---|
| 350 | apiCmd.commandId = MXL_DEV_ID_VERSION_REQ; |
|---|
| 351 | apiCmd.MxLIf.cmdTunerLockReq.I2cSlaveAddr = MXL601_ADDRESS; |
|---|
| 352 | |
|---|
| 353 | MxLWare601_API_GetDeviceStatus(&apiCmd); |
|---|
| 354 | |
|---|
| 355 | *lpChipId = (int)apiCmd.MxLIf.cmdDevInfoReq.ChipId; |
|---|
| 356 | *lpChipVer = (int)apiCmd.MxLIf.cmdDevInfoReq.ChipVersion; |
|---|
| 357 | } |
|---|