tda18271-common.c

来自「trident tm5600的linux驱动」· C语言 代码 · 共 741 行 · 第 1/2 页

C
741
字号
	tda18271_write_regs(fe, R_EP3, 11);	if ((priv->id) == TDA18271HDC2) {		/* main pll cp source on */		tda18271_charge_pump_source(fe, TDA18271_MAIN_PLL, 1);		msleep(1);		/* main pll cp source off */		tda18271_charge_pump_source(fe, TDA18271_MAIN_PLL, 0);	}	msleep(5); /* pll locking */	/* launch detector */#if 0	regs[R_EP1] = 0xc6; /* already set */#endif	tda18271_write_regs(fe, R_EP1, 1);	msleep(5); /* wanted low measurement */#if 0	regs[R_EP3] = 0x1f; /* already set */	regs[R_EP4] = 0x66; /* already set */#endif	regs[R_EP5] = 0x85;	regs[R_CPD] = 0xcb;	regs[R_CD1] = 0x66;	regs[R_CD2] = 0x70;#if 0	regs[R_CD3] = 0x00; /* already set */#endif	tda18271_write_regs(fe, R_EP3, 7);	msleep(5); /* pll locking */	/* launch optimization algorithm */#if 0	regs[R_EP2] = 0xdf; /* already set */#endif	tda18271_write_regs(fe, R_EP2, 1);	msleep(30); /* image low optimization completion */	/* mid-band */#if 0	regs[R_EP3] = 0x1f; /* already set */	regs[R_EP4] = 0x66; /* already set */#endif	regs[R_EP5] = 0x82;	regs[R_CPD] = 0xa8;#if 0	regs[R_CD1] = 0x66; /* already set */#endif	regs[R_CD2] = 0x00;#if 0	regs[R_CD3] = 0x00; /* already set */#endif	regs[R_MPD] = 0xa9;	regs[R_MD1] = 0x73;	regs[R_MD2] = 0x1a;#if 0	regs[R_MD3] = 0x00; /* already set */#endif	tda18271_write_regs(fe, R_EP3, 11);	msleep(5); /* pll locking */	/* launch detector */#if 0	regs[R_EP1] = 0xc6; /* already set */#endif	tda18271_write_regs(fe, R_EP1, 1);	msleep(5); /* wanted mid measurement */#if 0	regs[R_EP3] = 0x1f; /* already set */	regs[R_EP4] = 0x66; /* already set */#endif	regs[R_EP5] = 0x86;	regs[R_CPD] = 0xa8;	regs[R_CD1] = 0x66;	regs[R_CD2] = 0xa0;#if 0	regs[R_CD3] = 0x00; /* already set */#endif	tda18271_write_regs(fe, R_EP3, 7);	msleep(5); /* pll locking */	/* launch optimization algorithm */#if 0	regs[R_EP2] = 0xdf; /* already set */#endif	tda18271_write_regs(fe, R_EP2, 1);	msleep(30); /* image mid optimization completion */	/* high-band */#if 0	regs[R_EP3] = 0x1f; /* already set */	regs[R_EP4] = 0x66; /* already set */#endif	regs[R_EP5] = 0x83;	regs[R_CPD] = 0x98;	regs[R_CD1] = 0x65;	regs[R_CD2] = 0x00;#if 0	regs[R_CD3] = 0x00; /* already set */#endif	regs[R_MPD] = 0x99;	regs[R_MD1] = 0x71;	regs[R_MD2] = 0xcd;#if 0	regs[R_MD3] = 0x00; /* already set */#endif	tda18271_write_regs(fe, R_EP3, 11);	msleep(5); /* pll locking */	/* launch detector */#if 0	regs[R_EP1] = 0xc6; /* already set */#endif	tda18271_write_regs(fe, R_EP1, 1);	msleep(5); /* wanted high measurement */#if 0	regs[R_EP3] = 0x1f; /* already set */	regs[R_EP4] = 0x66; /* already set */#endif	regs[R_EP5] = 0x87;#if 0	regs[R_CPD] = 0x98; /* already set */#endif	regs[R_CD1] = 0x65;	regs[R_CD2] = 0x50;#if 0	regs[R_CD3] = 0x00; /* already set */#endif	tda18271_write_regs(fe, R_EP3, 7);	msleep(5); /* pll locking */	/* launch optimization algorithm */#if 0	regs[R_EP2] = 0xdf; /* already set */#endif	tda18271_write_regs(fe, R_EP2, 1);	msleep(30); /* image high optimization completion */	/* return to normal mode */	regs[R_EP4] = 0x64;	tda18271_write_regs(fe, R_EP4, 1);	/* synchronize */#if 0	regs[R_EP1] = 0xc6; /* already set */#endif	tda18271_write_regs(fe, R_EP1, 1);	return 0;}/*---------------------------------------------------------------------*//* *  Standby modes, EP3 [7:5] * *  | SM  || SM_LT || SM_XT || mode description *  |=====\\=======\\=======\\=================================== *  |  0  ||   0   ||   0   || normal mode *  |-----||-------||-------||----------------------------------- *  |     ||       ||       || standby mode w/ slave tuner output *  |  1  ||   0   ||   0   || & loop thru & xtal oscillator on *  |-----||-------||-------||----------------------------------- *  |  1  ||   1   ||   0   || standby mode w/ xtal oscillator on *  |-----||-------||-------||----------------------------------- *  |  1  ||   1   ||   1   || power off * */int tda18271_set_standby_mode(struct dvb_frontend *fe,			      int sm, int sm_lt, int sm_xt){	struct tda18271_priv *priv = fe->tuner_priv;	unsigned char *regs = priv->tda18271_regs;	if (tda18271_debug & DBG_ADV)		tda_dbg("sm = %d, sm_lt = %d, sm_xt = %d\n", sm, sm_lt, sm_xt);	regs[R_EP3]  &= ~0xe0; /* clear sm, sm_lt, sm_xt */	regs[R_EP3]  |= sm    ? (1 << 7) : 0 |			sm_lt ? (1 << 6) : 0 |			sm_xt ? (1 << 5) : 0;	return tda18271_write_regs(fe, R_EP3, 1);}/*---------------------------------------------------------------------*/int tda18271_calc_main_pll(struct dvb_frontend *fe, u32 freq){	/* sets main post divider & divider bytes, but does not write them */	struct tda18271_priv *priv = fe->tuner_priv;	unsigned char *regs = priv->tda18271_regs;	u8 d, pd;	u32 div;	int ret = tda18271_lookup_pll_map(fe, MAIN_PLL, &freq, &pd, &d);	if (tda_fail(ret))		goto fail;	regs[R_MPD]   = (0x77 & pd);	switch (priv->mode) {	case TDA18271_ANALOG:		regs[R_MPD]  &= ~0x08;		break;	case TDA18271_DIGITAL:		regs[R_MPD]  |=  0x08;		break;	}	div =  ((d * (freq / 1000)) << 7) / 125;	regs[R_MD1]   = 0x7f & (div >> 16);	regs[R_MD2]   = 0xff & (div >> 8);	regs[R_MD3]   = 0xff & div;fail:	return ret;}int tda18271_calc_cal_pll(struct dvb_frontend *fe, u32 freq){	/* sets cal post divider & divider bytes, but does not write them */	struct tda18271_priv *priv = fe->tuner_priv;	unsigned char *regs = priv->tda18271_regs;	u8 d, pd;	u32 div;	int ret = tda18271_lookup_pll_map(fe, CAL_PLL, &freq, &pd, &d);	if (tda_fail(ret))		goto fail;	regs[R_CPD]   = pd;	div =  ((d * (freq / 1000)) << 7) / 125;	regs[R_CD1]   = 0x7f & (div >> 16);	regs[R_CD2]   = 0xff & (div >> 8);	regs[R_CD3]   = 0xff & div;fail:	return ret;}/*---------------------------------------------------------------------*/int tda18271_calc_bp_filter(struct dvb_frontend *fe, u32 *freq){	/* sets bp filter bits, but does not write them */	struct tda18271_priv *priv = fe->tuner_priv;	unsigned char *regs = priv->tda18271_regs;	u8 val;	int ret = tda18271_lookup_map(fe, BP_FILTER, freq, &val);	if (tda_fail(ret))		goto fail;	regs[R_EP1]  &= ~0x07; /* clear bp filter bits */	regs[R_EP1]  |= (0x07 & val);fail:	return ret;}int tda18271_calc_km(struct dvb_frontend *fe, u32 *freq){	/* sets K & M bits, but does not write them */	struct tda18271_priv *priv = fe->tuner_priv;	unsigned char *regs = priv->tda18271_regs;	u8 val;	int ret = tda18271_lookup_map(fe, RF_CAL_KMCO, freq, &val);	if (tda_fail(ret))		goto fail;	regs[R_EB13] &= ~0x7c; /* clear k & m bits */	regs[R_EB13] |= (0x7c & val);fail:	return ret;}int tda18271_calc_rf_band(struct dvb_frontend *fe, u32 *freq){	/* sets rf band bits, but does not write them */	struct tda18271_priv *priv = fe->tuner_priv;	unsigned char *regs = priv->tda18271_regs;	u8 val;	int ret = tda18271_lookup_map(fe, RF_BAND, freq, &val);	if (tda_fail(ret))		goto fail;	regs[R_EP2]  &= ~0xe0; /* clear rf band bits */	regs[R_EP2]  |= (0xe0 & (val << 5));fail:	return ret;}int tda18271_calc_gain_taper(struct dvb_frontend *fe, u32 *freq){	/* sets gain taper bits, but does not write them */	struct tda18271_priv *priv = fe->tuner_priv;	unsigned char *regs = priv->tda18271_regs;	u8 val;	int ret = tda18271_lookup_map(fe, GAIN_TAPER, freq, &val);	if (tda_fail(ret))		goto fail;	regs[R_EP2]  &= ~0x1f; /* clear gain taper bits */	regs[R_EP2]  |= (0x1f & val);fail:	return ret;}int tda18271_calc_ir_measure(struct dvb_frontend *fe, u32 *freq){	/* sets IR Meas bits, but does not write them */	struct tda18271_priv *priv = fe->tuner_priv;	unsigned char *regs = priv->tda18271_regs;	u8 val;	int ret = tda18271_lookup_map(fe, IR_MEASURE, freq, &val);	if (tda_fail(ret))		goto fail;	regs[R_EP5] &= ~0x07;	regs[R_EP5] |= (0x07 & val);fail:	return ret;}int tda18271_calc_rf_cal(struct dvb_frontend *fe, u32 *freq){	/* sets rf cal byte (RFC_Cprog), but does not write it */	struct tda18271_priv *priv = fe->tuner_priv;	unsigned char *regs = priv->tda18271_regs;	u8 val;	int ret = tda18271_lookup_map(fe, RF_CAL, freq, &val);	/* The TDA18271HD/C1 rf_cal map lookup is expected to go out of range	 * for frequencies above 61.1 MHz.  In these cases, the internal RF	 * tracking filters calibration mechanism is used.	 *	 * There is no need to warn the user about this.	 */	if (ret < 0)		goto fail;	regs[R_EB14] = val;fail:	return ret;}/* * Overrides for Emacs so that we follow Linus's tabbing style. * --------------------------------------------------------------------------- * Local variables: * c-basic-offset: 8 * End: */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?