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 + -
显示快捷键?