/******************************************************************** * SemcoMxL601.c * MxL601 Functions * By WillowAndi 2011/11/14 *********************************************************************/ #include "UserDefinedIIC2.h" #include "SemcoMxL601.h" static int nGlobalSelIF; static int nGlobalMode; static int nGlobalGainLevel; MXL_STATUS status; MXL_COMMAND_T apiCmd; /* Initialize MxL601 */ /* nMode : ANA_NTSC_MODE = 0x0, ANA_PAL_BG, ANA_PAL_I, ANA_PAL_D, ANA_SECAM_I, ANA_SECAM_L, DIG_DVB_C, DIG_ISDBT_ATSC, DIG_DVB_T, DIG_J83B */ /* nIF : IF_3_65MHz = 0, IF_4MHz = 1, IF_4_1MHz = 2, IF_4_15MHz = 3, IF_4_5MHz = 4, IF_4_57MHz = 5, IF_5MHz = 6, IF_5_38MHz = 7, IF_6MHz = 8, IF_6_28MHz = 9, IF_7_2MHz = 10, IF_8_25MHz = 11, IF_35_25MHz = 12, IF_36MHz = 13, IF_36_15MHz = 14, IF_36_65MHz = 15, IF_44MHz = 16 */ int SemcoMxL601_Init(int nUnit, int nMode, int nXtalCap, int nIF, int nGainLevel) { /* Soft Reset */ SemcoMxL601_SoftReset(nUnit); /* Overwrite Default */ apiCmd.commandId = MXL_DEV_OVERWRITE_DEFAULT_CFG; apiCmd.MxLIf.cmdOverwriteDefault.I2cSlaveAddr = MXL601_ADDRESS; apiCmd.MxLIf.cmdOverwriteDefault.SingleSupply_3_3V = MXL_ENABLE; status = MxLWare601_API_ConfigDevice(&apiCmd); if(status != MXL_TRUE) return 1; /* Xtal Setting : 16MHz */ apiCmd.commandId = MXL_DEV_XTAL_SET_CFG; apiCmd.MxLIf.cmdXtalCfg.I2cSlaveAddr = MXL601_ADDRESS; apiCmd.MxLIf.cmdXtalCfg.XtalFreqSel = XTAL_16MHz; apiCmd.MxLIf.cmdXtalCfg.XtalCap = nXtalCap; apiCmd.MxLIf.cmdXtalCfg.ClkOutEnable = MXL_ENABLE; apiCmd.MxLIf.cmdXtalCfg.ClkOutDiv = MXL_DISABLE; apiCmd.MxLIf.cmdXtalCfg.SingleSupply_3_3V = MXL_ENABLE; //MXL_DISABLE => 1.8v apiCmd.MxLIf.cmdXtalCfg.XtalSharingMode = MXL_DISABLE; status = MxLWare601_API_ConfigDevice(&apiCmd); /* Power up setting */ apiCmd.commandId = MXL_TUNER_POWER_UP_CFG; apiCmd.MxLIf.cmdTunerPoweUpCfg.I2cSlaveAddr = MXL601_ADDRESS; apiCmd.MxLIf.cmdTunerPoweUpCfg.Enable = MXL_ENABLE; status = MxLWare601_API_ConfigTuner(&apiCmd); if(status != MXL_TRUE) return 1; // Set IF if(SemcoMxL601_SetIF(nUnit,nIF, nGainLevel)) // IF 6MHz return 1; // Set AGC //if(SemcoMxL601_SetAGC(nUnit, AGC_EXTERNAL, nMode)) //AGC_SELF // return 1; // Set Mode if(SemcoMxL601_SetMode(nUnit,nMode)) return 1; // Set AGC for test if(SemcoMxL601_SetAGC(nUnit, AGC_EXTERNAL, nMode)) //AGC_SELF return 1; return 0; } /* Soft Reset */ void SemcoMxL601_SoftReset(int nUnit) { /* Soft Reset MxL601 */ apiCmd.commandId = MXL_DEV_SOFT_RESET_CFG; apiCmd.MxLIf.cmdResetCfg.I2cSlaveAddr = MXL601_ADDRESS; MxLWare601_API_ConfigDevice(&apiCmd); } /* Set IF */ /* nSelIF : IF_3_65MHz = 0, IF_4MHz = 1, IF_4_1MHz = 2, IF_4_15MHz = 3, IF_4_5MHz = 4, IF_4_57MHz = 5, IF_5MHz = 6, IF_5_38MHz = 7, IF_6MHz = 8, IF_6_28MHz = 9, IF_7_2MHz = 10, IF_8_25MHz = 11, IF_35_25MHz = 12, IF_36MHz = 13, IF_36_15MHz = 14, IF_36_65MHz = 15, IF_44MHz = 16 */ int SemcoMxL601_SetIF(int nUnit, int nSelIF, int nGainLevel) { /* IF Out setting */ apiCmd.commandId = MXL_DEV_IF_OUT_CFG; apiCmd.MxLIf.cmdIfOutCfg.I2cSlaveAddr = MXL601_ADDRESS; apiCmd.MxLIf.cmdIfOutCfg.IFOutFreq = nSelIF; apiCmd.MxLIf.cmdIfOutCfg.ManualFreqSet = MXL_DISABLE; apiCmd.MxLIf.cmdIfOutCfg.IFInversion = MXL_ENABLE; //MXL_DISABLE; apiCmd.MxLIf.cmdIfOutCfg.GainLevel = nGainLevel; apiCmd.MxLIf.cmdIfOutCfg.PathSel = IF_PATH1; status = MxLWare601_API_ConfigDevice(&apiCmd); nGlobalSelIF = SemcoMxL601_SelIF(nSelIF); nGlobalGainLevel = nGainLevel; if(status != MXL_TRUE) return 1; return 0; } //Return IF int SemcoMxL601_SelIF(int nSelIF) { int nIF = 0; //Unit: KHz if(nSelIF == IF_3_65MHz) // IF_3_65MHz = 0, nIF = 3650; else if(nSelIF == IF_4MHz) // IF_4MHz = 1, nIF = 4000; else if(nSelIF == IF_4_1MHz) // IF_4_1MHz = 2, nIF = 4100; else if(nSelIF == IF_4_15MHz) // IF_4_15MHz = 3, nIF = 4150; else if(nSelIF == IF_4_5MHz) // IF_4_5MHz = 4, nIF = 4500; else if(nSelIF == IF_4_57MHz) // IF_4_57MHz = 5, nIF = 4570; else if(nSelIF == IF_5MHz) // IF_5MHz = 6, nIF = 5000; else if(nSelIF == IF_5_38MHz) // IF_5_38MHz = 7, nIF = 5380; else if(nSelIF == IF_6MHz) // IF_6MHz = 8, nIF = 6000; else if(nSelIF == IF_6_28MHz) // IF_6_28MHz = 9, nIF = 6280; else if(nSelIF == IF_7_2MHz) // IF_7_2MHz = 10, nIF = 7200; else if(nSelIF == IF_8_25MHz) // IF_8_25MHz = 11, nIF = 8250; else if(nSelIF == IF_35_25MHz) // IF_35_25MHz = 12, nIF = 35250; else if(nSelIF == IF_36MHz) // IF_36MHz = 13, nIF = 36000; else if(nSelIF == IF_36_15MHz) // IF_36_15MHz = 14, nIF = 36150; else if(nSelIF == IF_36_65MHz) // IF_36_65MHz = 15, nIF = 36650; else if(nSelIF == IF_44MHz) // IF_44MHz = 16, nIF = 44000; else nIF = 5000; return nIF; } /* Set AGC */ /* nType : AGC_SELF = 0, AGC_EXTERNAL = 1 */ int SemcoMxL601_SetAGC(int nUnit,int nType, int nMode) { /* AGC Setting */ apiCmd.commandId = MXL_TUNER_AGC_CFG; apiCmd.MxLIf.cmdAgcSetCfg.I2cSlaveAddr = MXL601_ADDRESS; apiCmd.MxLIf.cmdAgcSetCfg.AgcSel = AGC1; apiCmd.MxLIf.cmdAgcSetCfg.AgcType = nType; if(nMode == DIG_DVB_C)//20120614 CSM change apiCmd.MxLIf.cmdAgcSetCfg.SetPoint = 58; // DVB_C AGC TOP else apiCmd.MxLIf.cmdAgcSetCfg.SetPoint = 66; // DVB_T, ATSC, J83B AGC TOP apiCmd.MxLIf.cmdAgcSetCfg.AgcPolarityInverstion = MXL_DISABLE; //MXL_DISABLE; // New Added in V2 - 2011.12.27 status = MxLWare601_API_ConfigTuner(&apiCmd); if(status != MXL_TRUE) return 1; return 0; } /* Set Application Mode */ /* nMode : ANA_NTSC_MODE = 0x0, ANA_PAL_BG, ANA_PAL_I, ANA_PAL_D, ANA_SECAM_I, ANA_SECAM_L, DIG_DVB_C, DIG_ISDBT_ATSC, DIG_DVB_T, DIG_J83B */ int SemcoMxL601_SetMode(int nUnit,int nMode) { /* Application Mode setting */ apiCmd.commandId = MXL_TUNER_MODE_CFG; apiCmd.MxLIf.cmdModeCfg.I2cSlaveAddr = MXL601_ADDRESS; apiCmd.MxLIf.cmdModeCfg.SignalMode = nMode; apiCmd.MxLIf.cmdModeCfg.IFOutFreqinKHz = nGlobalSelIF;//unsigned int °ª ÇÊ¿ä. apiCmd.MxLIf.cmdModeCfg.XtalFreqSel = XTAL_16MHz; // New Added in V2 - 2011.12.27 apiCmd.MxLIf.cmdModeCfg.IFOutGainLevel = nGlobalGainLevel; // New Added in V2 - 2011.12.27 status = MxLWare601_API_ConfigTuner(&apiCmd); nGlobalMode = nMode; if(status != MXL_TRUE) return 1; return 0; } /* Set Frequency */ /* nBandWidth : ANA_TV_DIG_CABLE_BW_6MHz = 0x00, // Analog TV and Digital Cable Mode 6MHz ANA_TV_DIG_CABLE_BW_7MHz = 0x01, // Analog TV and Digital Cable Mode 7MHz ANA_TV_DIG_CABLE_BW_8MHz = 0x02, // Analog TV and Digital Cable Mode 8MHz DIG_TERR_BW_6MHz = 0x20, // Digital Terrestrial Mode 6MHz DIG_TERR_BW_7MHz = 0x21, // Digital Terrestrial Mode 7MHz DIG_TERR_BW_8MHz = 0x22 // Digital Terrestrial Mode 8MHz */ int SemcoMxL601_SetFrequency(int nUnit, unsigned int nFreq_Hz, int nBandWidth) { /* Channel frequency & bandwidth setting */ apiCmd.commandId = MXL_TUNER_CHAN_TUNE_CFG; apiCmd.MxLIf.cmdChanTuneCfg.I2cSlaveAddr = MXL601_ADDRESS; apiCmd.MxLIf.cmdChanTuneCfg.TuneType = VIEW_MODE; apiCmd.MxLIf.cmdChanTuneCfg.BandWidth = nBandWidth; apiCmd.MxLIf.cmdChanTuneCfg.FreqInHz = nFreq_Hz; apiCmd.MxLIf.cmdChanTuneCfg.SignalMode = nGlobalMode; apiCmd.MxLIf.cmdChanTuneCfg.XtalFreqSel = XTAL_16MHz; apiCmd.MxLIf.cmdChanTuneCfg.IFOutFreqinKHz = nGlobalSelIF;//csm add status = MxLWare601_API_ConfigTuner(&apiCmd); if(status != MXL_TRUE) return 1; /* // Sequencer setting apiCmd.commandId = MXL_TUNER_START_TUNE_CFG; apiCmd.MxLIf.cmdStartTuneCfg.I2cSlaveAddr = MXL601_ADDRESS; apiCmd.MxLIf.cmdStartTuneCfg.StartTune = MXL_DISABLE; status = MxLWare601_API_ConfigTuner(&apiCmd); if(status != MXL_TRUE) return 1; */ // Sequencer setting apiCmd.commandId = MXL_TUNER_START_TUNE_CFG; apiCmd.MxLIf.cmdStartTuneCfg.I2cSlaveAddr = MXL601_ADDRESS; apiCmd.MxLIf.cmdStartTuneCfg.StartTune = MXL_ENABLE; status = MxLWare601_API_ConfigTuner(&apiCmd); if(status != MXL_TRUE) return 1; // Wait 100ms MxL_Sleep(100); return 0; } /* Get Lock Status */ /* return : 1-lock, 0-unlock */ unsigned char SemcoMxL601_GetLock(int nUnit) { unsigned char bLock; bLock = 0; // Read back Tuner lock status apiCmd.commandId = MXL_TUNER_LOCK_STATUS_REQ; apiCmd.MxLIf.cmdTunerLockReq.I2cSlaveAddr = MXL601_ADDRESS; if (MXL_TRUE == MxLWare601_API_GetTunerStatus(&apiCmd)) { if (MXL_LOCKED == apiCmd.MxLIf.cmdTunerLockReq.RfSynLock && MXL_LOCKED == apiCmd.MxLIf.cmdTunerLockReq.RefSynLock) { bLock = 1; } } return bLock; } /* Get Power Level */ float SemcoMxL601_GetPowerLevel(int nUnit) { float nPowerLevel; // Read back Tuner lock status apiCmd.commandId = MXL_TUNER_LOCK_STATUS_REQ; apiCmd.MxLIf.cmdTunerLockReq.I2cSlaveAddr = MXL601_ADDRESS; if(MXL_TRUE == MxLWare601_API_GetTunerStatus(&apiCmd)) { nPowerLevel = apiCmd.MxLIf.cmdTunerPwrReq.RxPwr; }else{ return 1; } return nPowerLevel; } /* Get Chip Information */ void SemcoMxL601_GetChipInfo(int nUnit, int *lpChipId, int *lpChipVer) { apiCmd.commandId = MXL_DEV_ID_VERSION_REQ; apiCmd.MxLIf.cmdTunerLockReq.I2cSlaveAddr = MXL601_ADDRESS; MxLWare601_API_GetDeviceStatus(&apiCmd); *lpChipId = (int)apiCmd.MxLIf.cmdDevInfoReq.ChipId; *lpChipVer = (int)apiCmd.MxLIf.cmdDevInfoReq.ChipVersion; }