/* MXL5005 Tuner Control Struct */ struct TunerControl {
u16 Ctrl_Num; /* Control Number */
u16 size; /* Number of bits to represent Value */
u16 addr[25]; /* Array of Tuner Register Address for each bit pos */
u16 bit[25]; /* Array of bit pos in Reg Addr for each bit pos */
u16 val[25]; /* Binary representation of Value */
};
/* MXL5005 Tuner Struct */ struct mxl5005s_state {
u8 Mode; /* 0: Analog Mode ; 1: Digital Mode */
u8 IF_Mode; /* for Analog Mode, 0: zero IF; 1: low IF */
u32 Chan_Bandwidth; /* filter channel bandwidth (6, 7, 8) */
u32 IF_OUT; /* Desired IF Out Frequency */
u16 IF_OUT_LOAD; /* IF Out Load Resistor (200/300 Ohms) */
u32 RF_IN; /* RF Input Frequency */
u32 Fxtal; /* XTAL Frequency */
u8 AGC_Mode; /* AGC Mode 0: Dual AGC; 1: Single AGC */
u16 TOP; /* Value: take over point */
u8 CLOCK_OUT; /* 0: turn off clk out; 1: turn on clock out */
u8 DIV_OUT; /* 4MHz or 16MHz */
u8 CAPSELECT; /* 0: disable On-Chip pulling cap; 1: enable */
u8 EN_RSSI; /* 0: disable RSSI; 1: enable RSSI */
/* Tracking Filter Type */ /* 0 - Default; 1 - Off; 2 - Type C; 3 - Type C-H */
u8 TF_Type;
/* Calculated Settings */
u32 RF_LO; /* Synth RF LO Frequency */
u32 IF_LO; /* Synth IF LO Frequency */
u32 TG_LO; /* Synth TG_LO Frequency */
/* Pointers to ControlName Arrays */
u16 Init_Ctrl_Num; /* Number of INIT Control Names */ struct TunerControl
Init_Ctrl[INITCTRL_NUM]; /* INIT Control Names Array Pointer */
u16 CH_Ctrl_Num; /* Number of CH Control Names */ struct TunerControl
CH_Ctrl[CHCTRL_NUM]; /* CH Control Name Array Pointer */
u16 MXL_Ctrl_Num; /* Number of MXL Control Names */ struct TunerControl
MXL_Ctrl[MXLCTRL_NUM]; /* MXL Control Name Array Pointer */
/* Pointer to Tuner Register Array */
u16 TunerRegs_Num; /* Number of Tuner Registers */ struct TunerReg
TunerRegs[TUNER_REGS_NUM]; /* Tuner Register Array Pointer */
/* Linux driver framework specific */ struct mxl5005s_config *config; struct dvb_frontend *frontend; struct i2c_adapter *i2c;
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);
/* 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) { case8000000:
status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 0); break; case7000000:
status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 2); break; case6000000:
status += MXL_ControlWrite(fe,
BB_DLPF_BANDSEL, 3); break;
}
} else { /* Analog Mode */ switch (state->Chan_Bandwidth) { case8000000: /* Low Zero */
status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT,
(state->IF_Mode ? 0 : 3)); break; case7000000:
status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT,
(state->IF_Mode ? 1 : 4)); break; case6000000:
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 *initialiseAnti-AliasingFilter
*/ 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 *Overridethecontrolvaluespreset
*/ 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);
status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2);
} 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);
}
/* below equation is same as above but much harder to debug. * *staticu32MXL_GetXtalInt(u32Xtal_Freq) *{ *if((Xtal_Freq%1000000)==0) *return(Xtal_Freq/10000); *else *return(((Xtal_Freq/1000000)+1)*100); *} * *u32Xtal_Int=MXL_GetXtalInt(state->Fxtal); *tg_lo=(((Fmax/10000*Xtal_Int)/100)- *((state->TG_LO/10000)*divider_val* *(state->Fxtal/10000)/100))*32/((Fmax-Fmin)/10000* *Xtal_Int/100)+8;
*/
status += MXL_ControlWrite(fe, TG_VCO_BIAS , tg_lo);
/* add for 2.6.5 Special setting for QAM */ if (state->Mod_Type == MXL_QAM) { if (state->config->qam_gain != 0)
status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN,
state->config->qam_gain); elseif (state->RF_IN < 680000000)
status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3); else
status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2);
}
/* Off Chip Tracking Filter Control */ if (state->TF_Type == MXL_TF_OFF) { /* Tracking Filter Off State; turn off all the banks */
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 3, 1); /* Bank1 Off */
status += MXL_SetGPIO(fe, 1, 1); /* Bank2 Off */
status += MXL_SetGPIO(fe, 4, 1); /* Bank3 Off */
}
if (state->TF_Type == MXL_TF_C) /* Tracking Filter type C */ {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
status += MXL_ControlWrite(fe, DAC_DIN_A, 0);
if (state->RF_IN >= 43000000 && state->RF_IN < 150000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
status += MXL_SetGPIO(fe, 3, 0);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 4, 1);
} if (state->RF_IN >= 150000000 && state->RF_IN < 280000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
status += MXL_SetGPIO(fe, 3, 1);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 4, 1);
} if (state->RF_IN >= 280000000 && state->RF_IN < 360000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
status += MXL_SetGPIO(fe, 3, 1);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 4, 0);
} if (state->RF_IN >= 360000000 && state->RF_IN < 560000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
status += MXL_SetGPIO(fe, 3, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 4, 0);
} if (state->RF_IN >= 560000000 && state->RF_IN < 580000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
status += MXL_ControlWrite(fe, DAC_DIN_B, 29);
status += MXL_SetGPIO(fe, 3, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 4, 0);
} if (state->RF_IN >= 580000000 && state->RF_IN < 630000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
status += MXL_SetGPIO(fe, 3, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 4, 0);
} if (state->RF_IN >= 630000000 && state->RF_IN < 700000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
status += MXL_ControlWrite(fe, DAC_DIN_B, 16);
status += MXL_SetGPIO(fe, 3, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 4, 1);
} if (state->RF_IN >= 700000000 && state->RF_IN < 760000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
status += MXL_ControlWrite(fe, DAC_DIN_B, 7);
status += MXL_SetGPIO(fe, 3, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 4, 1);
} if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
status += MXL_SetGPIO(fe, 3, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 4, 1);
}
}
if (state->TF_Type == MXL_TF_C_H) {
/* Tracking Filter type C-H for Hauppauge only */
status += MXL_ControlWrite(fe, DAC_DIN_A, 0);
if (state->RF_IN >= 43000000 && state->RF_IN < 150000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 0);
status += MXL_SetGPIO(fe, 3, 1);
status += MXL_SetGPIO(fe, 1, 1);
} if (state->RF_IN >= 150000000 && state->RF_IN < 280000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 3, 0);
status += MXL_SetGPIO(fe, 1, 1);
} if (state->RF_IN >= 280000000 && state->RF_IN < 360000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 3, 0);
status += MXL_SetGPIO(fe, 1, 0);
} if (state->RF_IN >= 360000000 && state->RF_IN < 560000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 3, 1);
status += MXL_SetGPIO(fe, 1, 0);
} if (state->RF_IN >= 560000000 && state->RF_IN < 580000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 3, 1);
status += MXL_SetGPIO(fe, 1, 0);
} if (state->RF_IN >= 580000000 && state->RF_IN < 630000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 3, 1);
status += MXL_SetGPIO(fe, 1, 0);
} if (state->RF_IN >= 630000000 && state->RF_IN < 700000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 3, 1);
status += MXL_SetGPIO(fe, 1, 1);
} if (state->RF_IN >= 700000000 && state->RF_IN < 760000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 3, 1);
status += MXL_SetGPIO(fe, 1, 1);
} if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 3, 1);
status += MXL_SetGPIO(fe, 1, 1);
}
}
if (state->TF_Type == MXL_TF_D) { /* Tracking Filter type D */
status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 0);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 1);
} if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 0);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 1);
} if (state->RF_IN >= 250000000 && state->RF_IN < 310000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 1);
} if (state->RF_IN >= 310000000 && state->RF_IN < 360000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 0);
} if (state->RF_IN >= 360000000 && state->RF_IN < 470000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 0);
} if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 0);
} if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 1);
}
}
if (state->TF_Type == MXL_TF_D_L) {
/* Tracking Filter type D-L for Lumanate ONLY change 2.6.3 */
status += MXL_ControlWrite(fe, DAC_DIN_A, 0);
/* if UHF and terrestrial => Turn off Tracking Filter */ if (state->RF_IN >= 471000000 &&
(state->RF_IN - 471000000)%6000000 != 0) { /* Turn off all the banks */
status += MXL_SetGPIO(fe, 3, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
status += MXL_ControlWrite(fe, AGC_IF, 10);
} else { /* if VHF or cable => Turn on Tracking Filter */ if (state->RF_IN >= 43000000 &&
state->RF_IN < 140000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 0);
} if (state->RF_IN >= 140000000 &&
state->RF_IN < 240000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 0);
} if (state->RF_IN >= 240000000 &&
state->RF_IN < 340000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 0);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 0);
} if (state->RF_IN >= 340000000 &&
state->RF_IN < 430000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 0);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 1);
} if (state->RF_IN >= 430000000 &&
state->RF_IN < 470000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 1);
} if (state->RF_IN >= 470000000 &&
state->RF_IN < 570000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 0);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 1);
} if (state->RF_IN >= 570000000 &&
state->RF_IN < 620000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 0);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 1);
} if (state->RF_IN >= 620000000 &&
state->RF_IN < 760000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 0);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 1);
} if (state->RF_IN >= 760000000 &&
state->RF_IN <= 900000000) {
status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 1);
}
}
}
if (state->TF_Type == MXL_TF_E) /* Tracking Filter type E */ {
status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 0);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 1);
} if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 0);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 1);
} if (state->RF_IN >= 250000000 && state->RF_IN < 310000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 1);
} if (state->RF_IN >= 310000000 && state->RF_IN < 360000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 0);
} if (state->RF_IN >= 360000000 && state->RF_IN < 470000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 0);
} if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 0);
} if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 1);
}
}
if (state->TF_Type == MXL_TF_F) {
/* Tracking Filter type F */
status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
if (state->RF_IN >= 43000000 && state->RF_IN < 160000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 0);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 1);
} if (state->RF_IN >= 160000000 && state->RF_IN < 210000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 0);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 1);
} if (state->RF_IN >= 210000000 && state->RF_IN < 300000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 1);
}
if (state->RF_IN >= 300000000 && state->RF_IN < 390000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 0);
}
if (state->RF_IN >= 390000000 && state->RF_IN < 515000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 0);
}
if (state->RF_IN >= 515000000 && state->RF_IN < 650000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 0);
}
if (state->RF_IN >= 650000000 && state->RF_IN <= 900000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 1);
}
}
if (state->TF_Type == MXL_TF_E_2) {
/* Tracking Filter type E_2 */
status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 0);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 1);
}
if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 0);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 1);
}
if (state->RF_IN >= 250000000 && state->RF_IN < 350000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 1);
}
if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 0);
}
if (state->RF_IN >= 400000000 && state->RF_IN < 570000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 0);
}
if (state->RF_IN >= 570000000 && state->RF_IN < 770000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 0);
}
if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 1);
}
}
if (state->TF_Type == MXL_TF_G) {
/* Tracking Filter type G add for v2.6.8 */
status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
if (state->RF_IN >= 50000000 && state->RF_IN < 190000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 0);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 1);
}
if (state->RF_IN >= 190000000 && state->RF_IN < 280000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 0);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 1);
}
if (state->RF_IN >= 280000000 && state->RF_IN < 350000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 1);
}
if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 0);
}
if (state->RF_IN >= 400000000 && state->RF_IN < 470000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 1);
}
if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 0);
}
if (state->RF_IN >= 640000000 && state->RF_IN < 820000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 0);
}
if (state->RF_IN >= 820000000 && state->RF_IN <= 900000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 1);
}
}
if (state->TF_Type == MXL_TF_E_NA) {
/* Tracking Filter type E-NA for Empia ONLY change for 2.6.8 */
status += MXL_ControlWrite(fe, DAC_DIN_B, 0);
/* if UHF and terrestrial=> Turn off Tracking Filter */
if (state->RF_IN >= 471000000 &&
(state->RF_IN - 471000000)%6000000 != 0) {
/* Turn off all the banks */
status += MXL_SetGPIO(fe, 3, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
/* 2.6.12 Turn on 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);
/* following parameter is from analog OTA mode,
* can be change to seek better performance */
status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
} else {
/* if VHF or Cable => Turn on Tracking Filter */
/* 2.6.12 Turn off RSSI */
status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
/* change back from above condition */
status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5);
if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 0);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 1);
}
if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 0);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 1);
}
if (state->RF_IN >= 250000000 && state->RF_IN < 350000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 1);
}
if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 0);
status += MXL_SetGPIO(fe, 3, 0);
}
if (state->RF_IN >= 400000000 && state->RF_IN < 570000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 0);
}
if (state->RF_IN >= 570000000 && state->RF_IN < 770000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 0);
}
if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000) {
status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1);
status += MXL_SetGPIO(fe, 4, 1);
status += MXL_SetGPIO(fe, 1, 1);
status += MXL_SetGPIO(fe, 3, 1);
}
}
}
return status ;
}
/* Will write ALL Matching Control Name */
/* Write Matching INIT Control */
status += MXL_ControlWrite_Group(fe, ControlNum, value, 1);
/* Write Matching CH Control */
status += MXL_ControlWrite_Group(fe, ControlNum, value, 2);
#ifdef _MXL_INTERNAL
/* Write Matching MXL Control */
status += MXL_ControlWrite_Group(fe, ControlNum, value, 3);
#endif
return status;
}
/* Retrieve the Initialization Registers */
static u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 *RegNum,
u8 *RegVal, int *count)
{
u16 status = 0;
int i ;
for (i = 0 ; i < *count; i++) {
RegNum[i] = RegAddr[i];
status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
}
return status;
}
static u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 *RegNum,
u8 *RegVal, int *count)
{
u16 status = 0;
int i;
static const u8 RegAddr[] = {43, 136};
*count = ARRAY_SIZE(RegAddr);
for (i = 0; i < *count; i++) {
RegNum[i] = RegAddr[i];
status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
}
return status;
}
static u16 MXL_GetMasterControl(u8 *MasterReg, int state)
{
if (state == 1) /* Load_Start */
*MasterReg = 0xF3;
if (state == 2) /* Power_Down */
*MasterReg = 0x41;
if (state == 3) /* Synth_Reset */
*MasterReg = 0xB1;
if (state == 4) /* Seq_Off */
*MasterReg = 0xF1;
return 0;
}
#ifdef _MXL_PRODUCTION
static u16 MXL_VCORange_Test(struct dvb_frontend *fe, int VCO_Range)
{
struct mxl5005s_state *state = fe->tuner_priv;
u16 status = 0 ;
if (VCO_Range == 1) {
status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
if (state->Mode == 0 && state->IF_Mode == 1) {
/* Analog Low IF Mode */
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
status += MXL_ControlWrite(fe,
CHCAL_FRAC_MOD_RF, 180224);
}
if (state->Mode == 0 && state->IF_Mode == 0) {
/* Analog Zero IF Mode */
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
status += MXL_ControlWrite(fe,
CHCAL_FRAC_MOD_RF, 222822);
}
if (state->Mode == 1) /* Digital Mode */ {
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
status += MXL_ControlWrite(fe,
CHCAL_FRAC_MOD_RF, 229376);
}
}
if (VCO_Range == 2) {
status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41);
if (state->Mode == 0 && state->IF_Mode == 1) {
/* Analog Low IF Mode */
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
status += MXL_ControlWrite(fe,
CHCAL_FRAC_MOD_RF, 206438);
}
if (state->Mode == 0 && state->IF_Mode == 0) {
/* Analog Zero IF Mode */
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
status += MXL_ControlWrite(fe,
CHCAL_FRAC_MOD_RF, 206438);
}
if (state->Mode == 1) /* Digital Mode */ {
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41);
status += MXL_ControlWrite(fe,
CHCAL_FRAC_MOD_RF, 16384);
}
}
if (VCO_Range == 3) {
status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
if (state->Mode == 0 && state->IF_Mode == 1) {
/* Analog Low IF Mode */
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44);
status += MXL_ControlWrite(fe,
CHCAL_FRAC_MOD_RF, 173670);
}
if (state->Mode == 0 && state->IF_Mode == 0) {
/* Analog Zero IF Mode */
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44);
status += MXL_ControlWrite(fe,
CHCAL_FRAC_MOD_RF, 173670);
}
if (state->Mode == 1) /* Digital Mode */ {
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
status += MXL_ControlWrite(fe,
CHCAL_FRAC_MOD_RF, 245760);
}
}
if (VCO_Range == 4) {
status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
if (state->Mode == 0 && state->IF_Mode == 1) {
/* Analog Low IF Mode */
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
status += MXL_ControlWrite(fe,
CHCAL_FRAC_MOD_RF, 206438);
}
if (state->Mode == 0 && state->IF_Mode == 0) {
/* Analog Zero IF Mode */
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
status += MXL_ControlWrite(fe,
CHCAL_FRAC_MOD_RF, 206438);
}
if (state->Mode == 1) /* Digital Mode */ {
status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
status += MXL_ControlWrite(fe,
CHCAL_FRAC_MOD_RF, 212992);
}
}
return status;
}
static u16 MXL_Hystersis_Test(struct dvb_frontend *fe, int Hystersis)
{
struct mxl5005s_state *state = fe->tuner_priv;
u16 status = 0;
if (Hystersis == 1)
status += MXL_ControlWrite(fe, DN_BYPASS_AGC_I2C, 1);
return status;
}
#endif
/* End: Reference driver code found in the Realtek driver that
* is copyright MaxLinear */
/* ----------------------------------------------------------------
* Begin: Everything after here is new code to adapt the
* proprietary Realtek driver into a Linux API tuner.
* Copyright (C) 2008 Steven Toth <stoth@linuxtv.org>
*/
static int mxl5005s_reset(struct dvb_frontend *fe)
{
struct mxl5005s_state *state = fe->tuner_priv;
int ret = 0;
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1);
if (i2c_transfer(state->i2c, &msg, 1) != 1) {
printk(KERN_WARNING "mxl5005s I2C reset failed\n");
ret = -EREMOTEIO;
}
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 0);
return ret;
}
/* Write a single byte to a single reg, latch the value if required by
* following the transaction with the latch byte.
*/
static int mxl5005s_writereg(struct dvb_frontend *fe, u8 reg, u8 val, int latch)
{
struct mxl5005s_state *state = fe->tuner_priv;
u8 buf[3] = { reg, val, MXL5005S_LATCH_BYTE };
struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0,
.buf = buf, .len = 3 };
switch (delsys) {
case SYS_ATSC:
req_mode = MXL_ATSC;
req_bw = MXL5005S_BANDWIDTH_6MHZ;
break;
case SYS_DVBC_ANNEX_B:
req_mode = MXL_QAM;
req_bw = MXL5005S_BANDWIDTH_6MHZ;
break;
default: /* Assume DVB-T */
req_mode = MXL_DVBT;
switch (bw) {
case 6000000:
req_bw = MXL5005S_BANDWIDTH_6MHZ;
break;
case 7000000:
req_bw = MXL5005S_BANDWIDTH_7MHZ;
break;
case 8000000:
case 0:
req_bw = MXL5005S_BANDWIDTH_8MHZ;
break;
default:
return -EINVAL;
}
}
/* Change tuner for new modulation type if reqd */
if (req_mode != state->current_mode ||
req_bw != state->Chan_Bandwidth) {
state->current_mode = req_mode;
ret = mxl5005s_reconfigure(fe, req_mode, req_bw);
} else
ret = 0;
if (ret == 0) {
dprintk(1, "%s() freq=%d\n", __func__, c->frequency);
ret = mxl5005s_SetRfFreqHz(fe, c->frequency);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.