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

📄 zl10353.c

📁 trident tm5600的linux驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
	case HIERARCHY_4:		tps |= (3 << 10);		break;	default:		return -EINVAL;	}	zl10353_single_write(fe, TPS_GIVEN_1, msb(tps));	zl10353_single_write(fe, TPS_GIVEN_0, lsb(tps));	if (fe->ops.i2c_gate_ctrl)		fe->ops.i2c_gate_ctrl(fe, 0);	/*	 * If there is no tuner attached to the secondary I2C bus, we call	 * set_params to program a potential tuner attached somewhere else.	 * Otherwise, we update the PLL registers via calc_regs.	 */	if (state->config.no_tuner) {		if (fe->ops.tuner_ops.set_params) {			fe->ops.tuner_ops.set_params(fe, param);			if (fe->ops.i2c_gate_ctrl)				fe->ops.i2c_gate_ctrl(fe, 0);		}	} else if (fe->ops.tuner_ops.calc_regs) {		fe->ops.tuner_ops.calc_regs(fe, param, pllbuf + 1, 5);		pllbuf[1] <<= 1;		zl10353_write(fe, pllbuf, sizeof(pllbuf));	}	zl10353_single_write(fe, 0x5F, 0x13);	/* If no attached tuner or invalid PLL registers, just start the FSM. */	if (state->config.no_tuner || fe->ops.tuner_ops.calc_regs == NULL)		zl10353_single_write(fe, FSM_GO, 0x01);	else		zl10353_single_write(fe, TUNER_GO, 0x01);	return 0;}static int zl10353_get_parameters(struct dvb_frontend *fe,				  struct dvb_frontend_parameters *param){	struct zl10353_state *state = fe->demodulator_priv;	struct dvb_ofdm_parameters *op = &param->u.ofdm;	int s6, s9;	u16 tps;	static const u8 tps_fec_to_api[8] = {		FEC_1_2,		FEC_2_3,		FEC_3_4,		FEC_5_6,		FEC_7_8,		FEC_AUTO,		FEC_AUTO,		FEC_AUTO	};	s6 = zl10353_read_register(state, STATUS_6);	s9 = zl10353_read_register(state, STATUS_9);	if (s6 < 0 || s9 < 0)		return -EREMOTEIO;	if ((s6 & (1 << 5)) == 0 || (s9 & (1 << 4)) == 0)		return -EINVAL;	/* no FE or TPS lock */	tps = zl10353_read_register(state, TPS_RECEIVED_1) << 8 |	      zl10353_read_register(state, TPS_RECEIVED_0);	op->code_rate_HP = tps_fec_to_api[(tps >> 7) & 7];	op->code_rate_LP = tps_fec_to_api[(tps >> 4) & 7];	switch ((tps >> 13) & 3) {	case 0:		op->constellation = QPSK;		break;	case 1:		op->constellation = QAM_16;		break;	case 2:		op->constellation = QAM_64;		break;	default:		op->constellation = QAM_AUTO;		break;	}	op->transmission_mode = (tps & 0x01) ? TRANSMISSION_MODE_8K :					       TRANSMISSION_MODE_2K;	switch ((tps >> 2) & 3) {	case 0:		op->guard_interval = GUARD_INTERVAL_1_32;		break;	case 1:		op->guard_interval = GUARD_INTERVAL_1_16;		break;	case 2:		op->guard_interval = GUARD_INTERVAL_1_8;		break;	case 3:		op->guard_interval = GUARD_INTERVAL_1_4;		break;	default:		op->guard_interval = GUARD_INTERVAL_AUTO;		break;	}	switch ((tps >> 10) & 7) {	case 0:		op->hierarchy_information = HIERARCHY_NONE;		break;	case 1:		op->hierarchy_information = HIERARCHY_1;		break;	case 2:		op->hierarchy_information = HIERARCHY_2;		break;	case 3:		op->hierarchy_information = HIERARCHY_4;		break;	default:		op->hierarchy_information = HIERARCHY_AUTO;		break;	}	param->frequency = 0;	op->bandwidth = state->bandwidth;	param->inversion = INVERSION_AUTO;	return 0;}static int zl10353_read_status(struct dvb_frontend *fe, fe_status_t *status){	struct zl10353_state *state = fe->demodulator_priv;	int s6, s7, s8;	if ((s6 = zl10353_read_register(state, STATUS_6)) < 0)		return -EREMOTEIO;	if ((s7 = zl10353_read_register(state, STATUS_7)) < 0)		return -EREMOTEIO;	if ((s8 = zl10353_read_register(state, STATUS_8)) < 0)		return -EREMOTEIO;	*status = 0;	if (s6 & (1 << 2))		*status |= FE_HAS_CARRIER;	if (s6 & (1 << 1))		*status |= FE_HAS_VITERBI;	if (s6 & (1 << 5))		*status |= FE_HAS_LOCK;	if (s7 & (1 << 4))		*status |= FE_HAS_SYNC;	if (s8 & (1 << 6))		*status |= FE_HAS_SIGNAL;	if ((*status & (FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC)) !=	    (FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC))		*status &= ~FE_HAS_LOCK;	return 0;}static int zl10353_read_ber(struct dvb_frontend *fe, u32 *ber){	struct zl10353_state *state = fe->demodulator_priv;	*ber = zl10353_read_register(state, RS_ERR_CNT_2) << 16 |	       zl10353_read_register(state, RS_ERR_CNT_1) << 8 |	       zl10353_read_register(state, RS_ERR_CNT_0);	return 0;}static int zl10353_read_signal_strength(struct dvb_frontend *fe, u16 *strength){	struct zl10353_state *state = fe->demodulator_priv;	u16 signal = zl10353_read_register(state, AGC_GAIN_1) << 10 |		     zl10353_read_register(state, AGC_GAIN_0) << 2 | 3;	*strength = ~signal;	return 0;}static int zl10353_read_snr(struct dvb_frontend *fe, u16 *snr){	struct zl10353_state *state = fe->demodulator_priv;	u8 _snr;#if 1	if (debug_regs)		zl10353_dump_regs(fe);#endif	_snr = zl10353_read_register(state, SNR);	*snr = (_snr << 8) | _snr;	return 0;}static int zl10353_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks){	struct zl10353_state *state = fe->demodulator_priv;	*ucblocks = zl10353_read_register(state, RS_UBC_1) << 8 |		    zl10353_read_register(state, RS_UBC_0);	return 0;}static int zl10353_get_tune_settings(struct dvb_frontend *fe,				     struct dvb_frontend_tune_settings					 *fe_tune_settings){	fe_tune_settings->min_delay_ms = 1000;	fe_tune_settings->step_size = 0;	fe_tune_settings->max_drift = 0;	return 0;}static int zl10353_init(struct dvb_frontend *fe){	struct zl10353_state *state = fe->demodulator_priv;	u8 zl10353_reset_attach[6] = { 0x50, 0x03, 0x64, 0x46, 0x15, 0x0F };	int rc = 0;#if 1	if (debug_regs)		zl10353_dump_regs(fe);#endif	if (state->config.parallel_ts)		zl10353_reset_attach[2] &= ~0x20;	/* Do a "hard" reset if not already done */	if (zl10353_read_register(state, 0x50) != zl10353_reset_attach[1] ||	    zl10353_read_register(state, 0x51) != zl10353_reset_attach[2]) {		rc = zl10353_write(fe, zl10353_reset_attach,				   sizeof(zl10353_reset_attach));#if 1		if (debug_regs)			zl10353_dump_regs(fe);#endif	}	return 0;}static int zl10353_i2c_gate_ctrl(struct dvb_frontend* fe, int enable){	u8 val = 0x0a;	if (enable)		val |= 0x10;	return zl10353_single_write(fe, 0x62, val);}static void zl10353_release(struct dvb_frontend *fe){	struct zl10353_state *state = fe->demodulator_priv;	kfree(state);}static struct dvb_frontend_ops zl10353_ops;struct dvb_frontend *zl10353_attach(const struct zl10353_config *config,				    struct i2c_adapter *i2c){	struct zl10353_state *state = NULL;	/* allocate memory for the internal state */	state = kzalloc(sizeof(struct zl10353_state), GFP_KERNEL);	if (state == NULL)		goto error;	/* setup the state */	state->i2c = i2c;	memcpy(&state->config, config, sizeof(struct zl10353_config));	/* check if the demod is there */	if (zl10353_read_register(state, CHIP_ID) != ID_ZL10353)		goto error;	/* create dvb_frontend */	memcpy(&state->frontend.ops, &zl10353_ops, sizeof(struct dvb_frontend_ops));	state->frontend.demodulator_priv = state;	return &state->frontend;error:	kfree(state);	return NULL;}static struct dvb_frontend_ops zl10353_ops = {	.info = {		.name			= "Zarlink ZL10353 DVB-T",		.type			= FE_OFDM,		.frequency_min		= 174000000,		.frequency_max		= 862000000,		.frequency_stepsize	= 166667,		.frequency_tolerance	= 0,		.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |			FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |			FE_CAN_FEC_AUTO |			FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |			FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |			FE_CAN_HIERARCHY_AUTO | FE_CAN_RECOVER |			FE_CAN_MUTE_TS	},	.release = zl10353_release,	.init = zl10353_init,	.sleep = zl10353_sleep,	.i2c_gate_ctrl = zl10353_i2c_gate_ctrl,	.write = zl10353_write,	.set_frontend = zl10353_set_parameters,	.get_frontend = zl10353_get_parameters,	.get_tune_settings = zl10353_get_tune_settings,	.read_status = zl10353_read_status,	.read_ber = zl10353_read_ber,	.read_signal_strength = zl10353_read_signal_strength,	.read_snr = zl10353_read_snr,	.read_ucblocks = zl10353_read_ucblocks,};module_param(debug, int, 0644);MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");#if 1module_param(debug_regs, int, 0644);MODULE_PARM_DESC(debug_regs, "Turn on/off frontend register dumps (default:off).");#endifMODULE_DESCRIPTION("Zarlink ZL10353 DVB-T demodulator driver");MODULE_AUTHOR("Chris Pascoe");MODULE_LICENSE("GPL");EXPORT_SYMBOL(zl10353_attach);

⌨️ 快捷键说明

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