📄 mxl5005s.c
字号:
state->IF_OUT_LOAD = IF_OUT_LOAD; state->CLOCK_OUT = CLOCK_OUT; state->DIV_OUT = DIV_OUT; state->CAPSELECT = CAPSELECT; state->EN_RSSI = EN_RSSI; state->Mod_Type = Mod_Type; state->TF_Type = TF_Type; /* Initialize all the controls and registers */ InitTunerControls(fe); /* Synthesizer LO frequency calculation */ MXL_SynthIFLO_Calc(fe); return status;}static void MXL_SynthIFLO_Calc(struct dvb_frontend *fe){ struct mxl5005s_state *state = fe->tuner_priv; if (state->Mode == 1) /* Digital Mode */ state->IF_LO = state->IF_OUT; else /* Analog Mode */ { if (state->IF_Mode == 0) /* Analog Zero IF mode */ state->IF_LO = state->IF_OUT + 400000; else /* Analog Low IF mode */ state->IF_LO = state->IF_OUT + state->Chan_Bandwidth/2; }}static void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe){ struct mxl5005s_state *state = fe->tuner_priv; if (state->Mode == 1) /* Digital Mode */ { /* remove 20.48MHz setting for 2.6.10 */ state->RF_LO = state->RF_IN; /* change for 2.6.6 */ state->TG_LO = state->RF_IN - 750000; } else /* Analog Mode */ { if (state->IF_Mode == 0) /* Analog Zero IF mode */ { state->RF_LO = state->RF_IN - 400000; state->TG_LO = state->RF_IN - 1750000; } else /* Analog Low IF mode */ { state->RF_LO = state->RF_IN - state->Chan_Bandwidth/2; state->TG_LO = state->RF_IN - state->Chan_Bandwidth + 500000; } }}static u16 MXL_OverwriteICDefault(struct dvb_frontend *fe){ u16 status = 0; status += MXL_ControlWrite(fe, OVERRIDE_1, 1); status += MXL_ControlWrite(fe, OVERRIDE_2, 1); status += MXL_ControlWrite(fe, OVERRIDE_3, 1); status += MXL_ControlWrite(fe, OVERRIDE_4, 1); return status;}static u16 MXL_BlockInit(struct dvb_frontend *fe){ struct mxl5005s_state *state = fe->tuner_priv; u16 status = 0; status += MXL_OverwriteICDefault(fe); /* Downconverter Control Dig Ana */ status += MXL_ControlWrite(fe, DN_IQTN_AMP_CUT, state->Mode ? 1 : 0); /* Filter Control Dig Ana */ status += MXL_ControlWrite(fe, BB_MODE, state->Mode ? 0 : 1); status += MXL_ControlWrite(fe, BB_BUF, state->Mode ? 3 : 2); status += MXL_ControlWrite(fe, BB_BUF_OA, state->Mode ? 1 : 0); status += MXL_ControlWrite(fe, BB_IQSWAP, state->Mode ? 0 : 1); status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 0); /* Initialize Low-Pass Filter */ if (state->Mode) { /* Digital Mode */ switch (state->Chan_Bandwidth) { case 8000000: status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 0); break; case 7000000: status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 2); break; case 6000000: status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 3); break; } } else { /* Analog Mode */ switch (state->Chan_Bandwidth) { case 8000000: /* Low Zero */ status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT, (state->IF_Mode ? 0 : 3)); break; case 7000000: status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT, (state->IF_Mode ? 1 : 4)); break; case 6000000: status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT, (state->IF_Mode ? 2 : 5)); break; } } /* Charge Pump Control Dig Ana */ status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, state->Mode ? 5 : 8); status += MXL_ControlWrite(fe, RFSYN_EN_CHP_HIGAIN, state->Mode ? 1 : 1); status += MXL_ControlWrite(fe, EN_CHP_LIN_B, state->Mode ? 0 : 0); /* AGC TOP Control */ if (state->AGC_Mode == 0) /* Dual AGC */ { status += MXL_ControlWrite(fe, AGC_IF, 15); status += MXL_ControlWrite(fe, AGC_RF, 15); } else /* Single AGC Mode Dig Ana */ status += MXL_ControlWrite(fe, AGC_RF, state->Mode ? 15 : 12); if (state->TOP == 55) /* TOP == 5.5 */ status += MXL_ControlWrite(fe, AGC_IF, 0x0); if (state->TOP == 72) /* TOP == 7.2 */ status += MXL_ControlWrite(fe, AGC_IF, 0x1); if (state->TOP == 92) /* TOP == 9.2 */ status += MXL_ControlWrite(fe, AGC_IF, 0x2); if (state->TOP == 110) /* TOP == 11.0 */ status += MXL_ControlWrite(fe, AGC_IF, 0x3); if (state->TOP == 129) /* TOP == 12.9 */ status += MXL_ControlWrite(fe, AGC_IF, 0x4); if (state->TOP == 147) /* TOP == 14.7 */ status += MXL_ControlWrite(fe, AGC_IF, 0x5); if (state->TOP == 168) /* TOP == 16.8 */ status += MXL_ControlWrite(fe, AGC_IF, 0x6); if (state->TOP == 194) /* TOP == 19.4 */ status += MXL_ControlWrite(fe, AGC_IF, 0x7); if (state->TOP == 212) /* TOP == 21.2 */ status += MXL_ControlWrite(fe, AGC_IF, 0x9); if (state->TOP == 232) /* TOP == 23.2 */ status += MXL_ControlWrite(fe, AGC_IF, 0xA); if (state->TOP == 252) /* TOP == 25.2 */ status += MXL_ControlWrite(fe, AGC_IF, 0xB); if (state->TOP == 271) /* TOP == 27.1 */ status += MXL_ControlWrite(fe, AGC_IF, 0xC); if (state->TOP == 292) /* TOP == 29.2 */ status += MXL_ControlWrite(fe, AGC_IF, 0xD); if (state->TOP == 317) /* TOP == 31.7 */ status += MXL_ControlWrite(fe, AGC_IF, 0xE); if (state->TOP == 349) /* TOP == 34.9 */ status += MXL_ControlWrite(fe, AGC_IF, 0xF); /* IF Synthesizer Control */ status += MXL_IFSynthInit(fe); /* IF UpConverter Control */ if (state->IF_OUT_LOAD == 200) { status += MXL_ControlWrite(fe, DRV_RES_SEL, 6); status += MXL_ControlWrite(fe, I_DRIVER, 2); } if (state->IF_OUT_LOAD == 300) { status += MXL_ControlWrite(fe, DRV_RES_SEL, 4); status += MXL_ControlWrite(fe, I_DRIVER, 1); } /* Anti-Alias Filtering Control * initialise Anti-Aliasing Filter */ if (state->Mode) { /* Digital Mode */ if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 6280000UL) { status += MXL_ControlWrite(fe, EN_AAF, 1); status += MXL_ControlWrite(fe, EN_3P, 1); status += MXL_ControlWrite(fe, EN_AUX_3P, 1); status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0); } if ((state->IF_OUT == 36125000UL) || (state->IF_OUT == 36150000UL)) { status += MXL_ControlWrite(fe, EN_AAF, 1); status += MXL_ControlWrite(fe, EN_3P, 1); status += MXL_ControlWrite(fe, EN_AUX_3P, 1); status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1); } if (state->IF_OUT > 36150000UL) { status += MXL_ControlWrite(fe, EN_AAF, 0); status += MXL_ControlWrite(fe, EN_3P, 1); status += MXL_ControlWrite(fe, EN_AUX_3P, 1); status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1); } } else { /* Analog Mode */ if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 5000000UL) { status += MXL_ControlWrite(fe, EN_AAF, 1); status += MXL_ControlWrite(fe, EN_3P, 1); status += MXL_ControlWrite(fe, EN_AUX_3P, 1); status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0); } if (state->IF_OUT > 5000000UL) { status += MXL_ControlWrite(fe, EN_AAF, 0); status += MXL_ControlWrite(fe, EN_3P, 0); status += MXL_ControlWrite(fe, EN_AUX_3P, 0); status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0); } } /* Demod Clock Out */ if (state->CLOCK_OUT) status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 1); else status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 0); if (state->DIV_OUT == 1) status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 1); if (state->DIV_OUT == 0) status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 0); /* Crystal Control */ if (state->CAPSELECT) status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 1); else status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 0); if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL) status += MXL_ControlWrite(fe, IF_SEL_DBL, 1); if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL) status += MXL_ControlWrite(fe, IF_SEL_DBL, 0); if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL) status += MXL_ControlWrite(fe, RFSYN_R_DIV, 3); if (state->Fxtal > 22000000UL && state->Fxtal <= 32000000UL) status += MXL_ControlWrite(fe, RFSYN_R_DIV, 0); /* Misc Controls */ if (state->Mode == 0 && state->IF_Mode == 1) /* Analog LowIF mode */ status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 0); else status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 1); /* status += MXL_ControlRead(fe, IF_DIVVAL, &IF_DIVVAL_Val); */ /* Set TG_R_DIV */ status += MXL_ControlWrite(fe, TG_R_DIV, MXL_Ceiling(state->Fxtal, 1000000)); /* Apply Default value to BB_INITSTATE_DLPF_TUNE */ /* RSSI Control */ if (state->EN_RSSI) { status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1); status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1); status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1); status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1); /* RSSI reference point */ status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2); status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 3); status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1); /* TOP point */ status += MXL_ControlWrite(fe, RFA_FLR, 0); status += MXL_ControlWrite(fe, RFA_CEIL, 12); } /* Modulation type bit settings * Override the control values preset */ if (state->Mod_Type == MXL_DVBT) /* DVB-T Mode */ { state->AGC_Mode = 1; /* Single AGC Mode */ /* Enable RSSI */ status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1); status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1); status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1); status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1); /* RSSI reference point */ status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3); status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5); status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1); /* TOP point */ status += MXL_ControlWrite(fe, RFA_FLR, 2); status += MXL_ControlWrite(fe, RFA_CEIL, 13); if (state->IF_OUT <= 6280000UL) /* Low IF */ status += MXL_ControlWrite(fe, BB_IQSWAP, 0); else /* High IF */ status += MXL_ControlWrite(fe, BB_IQSWAP, 1); } if (state->Mod_Type == MXL_ATSC) /* ATSC Mode */ { state->AGC_Mode = 1; /* Single AGC Mode */ /* Enable RSSI */ status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1); status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1); status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1); status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1); /* RSSI reference point */ status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2); status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 4); status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1); /* TOP point */ status += MXL_ControlWrite(fe, RFA_FLR, 2); status += MXL_ControlWrite(fe, RFA_CEIL, 13); status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 1); /* Low Zero */ status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5); if (state->IF_OUT <= 6280000UL) /* Low IF */ status += MXL_ControlWrite(fe, BB_IQSWAP, 0); else /* High IF */ status += MXL_ControlWrite(fe, BB_IQSWAP, 1); } if (state->Mod_Type == MXL_QAM) /* QAM Mode */ { state->Mode = MXL_DIGITAL_MODE; /* state->AGC_Mode = 1; */ /* Single AGC Mode */ /* Disable RSSI */ /* change here for v2.6.5 */ status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1); status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1); status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0); status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1); /* RSSI reference point */ status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5); status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3); status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2); /* change here for v2.6.5 */ status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3); if (state->IF_OUT <= 6280000UL) /* Low IF */ status += MXL_ControlWrite(fe, BB_IQSWAP, 0); else /* High IF */ status += MXL_ControlWrite(fe, BB_IQSWAP, 1);#if 1 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2);#endif } if (state->Mod_Type == MXL_ANALOG_CABLE) { /* Analog Cable Mode */ /* state->Mode = MXL_DIGITAL_MODE; */ state->AGC_Mode = 1; /* Single AGC Mode */ /* Disable RSSI */ status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1); status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1); status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0); status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1); /* change for 2.6.3 */ status += MXL_ControlWrite(fe, AGC_IF, 1); status += MXL_ControlWrite(fe, AGC_RF, 15); status += MXL_ControlWrite(fe, BB_IQSWAP, 1); } if (state->Mod_Type == MXL_ANALOG_OTA) { /* Analog OTA Terrestrial mode add for 2.6.7 */ /* state->Mode = MXL_ANALOG_MODE; */ /* Enable RSSI */ status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1); status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1); status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1); status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1); /* RSSI reference point */ status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5); status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3); status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2); status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3); status += MXL_ControlWrite(fe, BB_IQSWAP, 1); } /* RSSI disable */ if (state->EN_RSSI == 0) { status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1); status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1); status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0); status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1); } return status;}static u16 MXL_IFSynthInit(struct dvb_frontend *fe){ struct mxl5005s_state *state = fe->tuner_priv; u16 status = 0 ; u32 Fref = 0 ; u32 Kdbl, intModVal ; u32 fracModVal ; Kdbl = 2 ; if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL) Kdbl = 2 ; if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL) Kdbl = 1 ; /* IF Synthesizer Control */ if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF mode */ { if (state->IF_LO == 41000000UL) { status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08); status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C); Fref = 328000000UL ; } if (state->IF_LO == 47000000UL) { status += M
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -