if (freq >= 45000) { /* From divided value (XDIV) determined the FA and FP value */
xdiv = (unsignedshort)(f_vco / xtal_freq_khz_2); if ((f_vco - xdiv * xtal_freq_khz_2) >= (xtal_freq_khz_2 / 2))
xdiv++;
if (am < 2) {
reg[1] = am + 8;
reg[2] = pm - 1;
} else {
reg[1] = am;
reg[2] = pm;
}
} else { /* fix for frequency less than 45 MHz */
reg[1] = 0x06;
reg[2] = 0x11;
}
/* fix clock out */
reg[6] |= 0x20;
/* From VCO frequency determines the XIN ( fractional part of Delta
Sigma PLL) and divided value (XDIV) */
xin = (unsignedshort)(f_vco - (f_vco / xtal_freq_khz_2) * xtal_freq_khz_2);
xin = (xin << 15) / xtal_freq_khz_2; if (xin >= 16384)
xin += 32768;
reg[3] = xin >> 8; /* xin with 9 bit resolution */
reg[4] = xin & 0xff;
if (delsys == SYS_DVBT) {
reg[6] &= 0x3f; /* bits 6 and 7 describe the bandwidth */ switch (p->bandwidth_hz) { case6000000:
reg[6] |= 0x80; break; case7000000:
reg[6] |= 0x40; break; case8000000: default: break;
}
} else {
dev_err(&priv->i2c->dev, "%s: modulation type not supported!\n",
KBUILD_MODNAME); return -EINVAL;
}
/* modified for Realtek demod */
reg[5] |= 0x07;
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1); /* open I2C-gate */
for (i = 1; i <= 6; i++) {
ret = fc0012_writereg(priv, i, reg[i]); if (ret) gotoexit;
}
/* VCO Calibration */
ret = fc0012_writereg(priv, 0x0e, 0x80); if (!ret)
ret = fc0012_writereg(priv, 0x0e, 0x00);
/* VCO Re-Calibration if needed */ if (!ret)
ret = fc0012_writereg(priv, 0x0e, 0x00);
if (!ret) {
msleep(10);
ret = fc0012_readreg(priv, 0x0e, &tmp);
} if (ret) gotoexit;
/* vco selection */
tmp &= 0x3f;
if (vco_select) { if (tmp > 0x3c) {
reg[6] &= ~0x08;
ret = fc0012_writereg(priv, 0x06, reg[6]); if (!ret)
ret = fc0012_writereg(priv, 0x0e, 0x80); if (!ret)
ret = fc0012_writereg(priv, 0x0e, 0x00);
}
} else { if (tmp < 0x02) {
reg[6] |= 0x08;
ret = fc0012_writereg(priv, 0x06, reg[6]); if (!ret)
ret = fc0012_writereg(priv, 0x0e, 0x80); if (!ret)
ret = fc0012_writereg(priv, 0x0e, 0x00);
}
}
if (priv->cfg->loop_through) {
ret = fc0012_writereg(priv, 0x09, 0x6f); if (ret < 0) goto err;
}
/* * TODO: Clock out en or div? * For dual tuner configuration clearing bit [0] is required.
*/ if (priv->cfg->clock_out) {
ret = fc0012_writereg(priv, 0x0b, 0x82); if (ret < 0) goto err;
}
¤ 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.0.2Bemerkung:
(vorverarbeitet am 2026-06-06)
¤
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.