⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mxl5005s.c

📁 trident tm5600的linux驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -