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

📄 nxt6000.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
	case 0x06:		printk(" CoreState: MONITOR_TPS,");		break;	default:		printk(" CoreState: Reserved,");	}	val = nxt6000_readreg(state, OFDM_SYR_STAT);	printk(" SYRLock: %d,", (val >> 4) & 0x01);	printk(" SYRMode: %s,", (val >> 2) & 0x01 ? "8K" : "2K");	switch ((val >> 4) & 0x03) {	case 0x00:		printk(" SYRGuard: 1/32,");		break;	case 0x01:		printk(" SYRGuard: 1/16,");		break;	case 0x02:		printk(" SYRGuard: 1/8,");		break;	case 0x03:		printk(" SYRGuard: 1/4,");		break;	}	val = nxt6000_readreg(state, OFDM_TPS_RCVD_3);	switch ((val >> 4) & 0x07) {	case 0x00:		printk(" TPSLP: 1/2,");		break;	case 0x01:		printk(" TPSLP: 2/3,");		break;	case 0x02:		printk(" TPSLP: 3/4,");		break;	case 0x03:		printk(" TPSLP: 5/6,");		break;	case 0x04:		printk(" TPSLP: 7/8,");		break;	default:		printk(" TPSLP: Reserved,");	}	switch (val & 0x07) {	case 0x00:		printk(" TPSHP: 1/2,");		break;	case 0x01:		printk(" TPSHP: 2/3,");		break;	case 0x02:		printk(" TPSHP: 3/4,");		break;	case 0x03:		printk(" TPSHP: 5/6,");		break;	case 0x04:		printk(" TPSHP: 7/8,");		break;	default:		printk(" TPSHP: Reserved,");	}	val = nxt6000_readreg(state, OFDM_TPS_RCVD_4);	printk(" TPSMode: %s,", val & 0x01 ? "8K" : "2K");	switch ((val >> 4) & 0x03) {	case 0x00:		printk(" TPSGuard: 1/32,");		break;	case 0x01:		printk(" TPSGuard: 1/16,");		break;	case 0x02:		printk(" TPSGuard: 1/8,");		break;	case 0x03:		printk(" TPSGuard: 1/4,");		break;	}	/* Strange magic required to gain access to RF_AGC_STATUS */	nxt6000_readreg(state, RF_AGC_VAL_1);	val = nxt6000_readreg(state, RF_AGC_STATUS);	val = nxt6000_readreg(state, RF_AGC_STATUS);	printk(" RF AGC LOCK: %d,", (val >> 4) & 0x01);	printk("\n");}static int nxt6000_read_status(struct dvb_frontend* fe, fe_status_t* status){	u8 core_status;	struct nxt6000_state* state = fe->demodulator_priv;	*status = 0;	core_status = nxt6000_readreg(state, OFDM_COR_STAT);	if (core_status & AGCLOCKED)		*status |= FE_HAS_SIGNAL;	if (nxt6000_readreg(state, OFDM_SYR_STAT) & GI14_SYR_LOCK)		*status |= FE_HAS_CARRIER;	if (nxt6000_readreg(state, VIT_SYNC_STATUS) & VITINSYNC)		*status |= FE_HAS_VITERBI;	if (nxt6000_readreg(state, RS_COR_STAT) & RSCORESTATUS)		*status |= FE_HAS_SYNC;	if ((core_status & TPSLOCKED) && (*status == (FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC)))		*status |= FE_HAS_LOCK;	if (debug)		nxt6000_dump_status(state);	return 0;}static int nxt6000_init(struct dvb_frontend* fe){	struct nxt6000_state* state = fe->demodulator_priv;	nxt6000_reset(state);	nxt6000_setup(fe);	return 0;}static int nxt6000_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *param){	struct nxt6000_state* state = fe->demodulator_priv;	int result;	nxt6000_writereg(state, ENABLE_TUNER_IIC, 0x01);	/* open i2c bus switch */	state->config->pll_set(fe, param);	nxt6000_writereg(state, ENABLE_TUNER_IIC, 0x00);	/* close i2c bus switch */	if ((result = nxt6000_set_bandwidth(state, param->u.ofdm.bandwidth)) < 0)		return result;	if ((result = nxt6000_set_guard_interval(state, param->u.ofdm.guard_interval)) < 0)		return result;	if ((result = nxt6000_set_transmission_mode(state, param->u.ofdm.transmission_mode)) < 0)		return result;	if ((result = nxt6000_set_inversion(state, param->inversion)) < 0)		return result;	msleep(500);	return 0;}static void nxt6000_release(struct dvb_frontend* fe){	struct nxt6000_state* state = fe->demodulator_priv;	kfree(state);}static int nxt6000_read_snr(struct dvb_frontend* fe, u16* snr){	struct nxt6000_state* state = fe->demodulator_priv;	*snr = nxt6000_readreg( state, OFDM_CHC_SNR) / 8;	return 0;}static int nxt6000_read_ber(struct dvb_frontend* fe, u32* ber){	struct nxt6000_state* state = fe->demodulator_priv;	nxt6000_writereg( state, VIT_COR_INTSTAT, 0x18 );	*ber = (nxt6000_readreg( state, VIT_BER_1 ) << 8 ) |		nxt6000_readreg( state, VIT_BER_0 );	nxt6000_writereg( state, VIT_COR_INTSTAT, 0x18); // Clear BER Done interrupts	return 0;}static int nxt6000_read_signal_strength(struct dvb_frontend* fe, u16* signal_strength){	struct nxt6000_state* state = fe->demodulator_priv;	*signal_strength = (short) (511 -		(nxt6000_readreg(state, AGC_GAIN_1) +		((nxt6000_readreg(state, AGC_GAIN_2) & 0x03) << 8)));	return 0;}static int nxt6000_fe_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings *tune){	tune->min_delay_ms = 500;	return 0;}static struct dvb_frontend_ops nxt6000_ops;struct dvb_frontend* nxt6000_attach(const struct nxt6000_config* config,				    struct i2c_adapter* i2c){	struct nxt6000_state* state = NULL;	/* allocate memory for the internal state */	state = kmalloc(sizeof(struct nxt6000_state), GFP_KERNEL);	if (state == NULL) goto error;	/* setup the state */	state->config = config;	state->i2c = i2c;	memcpy(&state->ops, &nxt6000_ops, sizeof(struct dvb_frontend_ops));	/* check if the demod is there */	if (nxt6000_readreg(state, OFDM_MSC_REV) != NXT6000ASICDEVICE) goto error;	/* create dvb_frontend */	state->frontend.ops = &state->ops;	state->frontend.demodulator_priv = state;	return &state->frontend;error:	kfree(state);	return NULL;}static struct dvb_frontend_ops nxt6000_ops = {	.info = {		.name = "NxtWave NXT6000 DVB-T",		.type = FE_OFDM,		.frequency_min = 0,		.frequency_max = 863250000,		.frequency_stepsize = 62500,		/*.frequency_tolerance = *//* FIXME: 12% of SR */		.symbol_rate_min = 0,	/* FIXME */		.symbol_rate_max = 9360000,	/* FIXME */		.symbol_rate_tolerance = 4000,		.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |		        FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |		        FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |		        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,	},	.release = nxt6000_release,	.init = nxt6000_init,	.get_tune_settings = nxt6000_fe_get_tune_settings,	.set_frontend = nxt6000_set_frontend,	.read_status = nxt6000_read_status,	.read_ber = nxt6000_read_ber,	.read_signal_strength = nxt6000_read_signal_strength,	.read_snr = nxt6000_read_snr,};module_param(debug, int, 0644);MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");MODULE_DESCRIPTION("NxtWave NXT6000 DVB-T demodulator driver");MODULE_AUTHOR("Florian Schirmer");MODULE_LICENSE("GPL");EXPORT_SYMBOL(nxt6000_attach);

⌨️ 快捷键说明

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