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

📄 or51132.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	int clock_mode;	/* Upload new firmware only if we need a different one */	if (modulation_fw_class(state->current_modulation) !=	    modulation_fw_class(param->u.vsb.modulation)) {		switch(modulation_fw_class(param->u.vsb.modulation)) {		case MOD_FWCLASS_VSB:			dprintk("set_parameters VSB MODE\n");			fwname = OR51132_VSB_FIRMWARE;			/* Set non-punctured clock for VSB */			clock_mode = 0;			break;		case MOD_FWCLASS_QAM:			dprintk("set_parameters QAM MODE\n");			fwname = OR51132_QAM_FIRMWARE;			/* Set punctured clock for QAM */			clock_mode = 1;			break;		default:			printk("or51132: Modulation type(%d) UNSUPPORTED\n",			       param->u.vsb.modulation);			return -1;		}		printk("or51132: Waiting for firmware upload(%s)...\n",		       fwname);		ret = request_firmware(&fw, fwname, &state->i2c->dev);		if (ret) {			printk(KERN_WARNING "or51132: No firmware up"			       "loaded(timeout or file not found?)\n");			return ret;		}		ret = or51132_load_firmware(fe, fw);		release_firmware(fw);		if (ret) {			printk(KERN_WARNING "or51132: Writing firmware to "			       "device failed!\n");			return ret;		}		printk("or51132: Firmware upload complete.\n");		state->config->set_ts_params(fe, clock_mode);	}	/* Change only if we are actually changing the modulation */	if (state->current_modulation != param->u.vsb.modulation) {		state->current_modulation = param->u.vsb.modulation;		or51132_setmode(fe);	}	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);	}	/* Set to current mode */	or51132_setmode(fe);	/* Update current frequency */	state->current_frequency = param->frequency;	return 0;}static int or51132_get_parameters(struct dvb_frontend* fe,				  struct dvb_frontend_parameters *param){	struct or51132_state* state = fe->demodulator_priv;	int status;	int retry = 1;start:	/* Receiver Status */	if ((status = or51132_readreg(state, 0x00)) < 0) {		printk(KERN_WARNING "or51132: get_parameters: error reading receiver status\n");		return -EREMOTEIO;	}	switch(status&0xff) {		case 0x06: param->u.vsb.modulation = VSB_8; break;		case 0x43: param->u.vsb.modulation = QAM_64; break;		case 0x45: param->u.vsb.modulation = QAM_256; break;		default:			if (retry--) goto start;			printk(KERN_WARNING "or51132: unknown status 0x%02x\n",			       status&0xff);			return -EREMOTEIO;	}	/* FIXME: Read frequency from frontend, take AFC into account */	param->frequency = state->current_frequency;	/* FIXME: How to read inversion setting? Receiver 6 register? */	param->inversion = INVERSION_AUTO;	return 0;}static int or51132_read_status(struct dvb_frontend* fe, fe_status_t* status){	struct or51132_state* state = fe->demodulator_priv;	int reg;	/* Receiver Status */	if ((reg = or51132_readreg(state, 0x00)) < 0) {		printk(KERN_WARNING "or51132: read_status: error reading receiver status: %d\n", reg);		*status = 0;		return -EREMOTEIO;	}	dprintk("%s: read_status %04x\n", __FUNCTION__, reg);	if (reg & 0x0100) /* Receiver Lock */		*status = FE_HAS_SIGNAL|FE_HAS_CARRIER|FE_HAS_VITERBI|			  FE_HAS_SYNC|FE_HAS_LOCK;	else		*status = 0;	return 0;}/* Calculate SNR estimation (scaled by 2^24)   8-VSB SNR and QAM equations from Oren datasheets   For 8-VSB:     SNR[dB] = 10 * log10(897152044.8282 / MSE^2 ) - K     Where K = 0 if NTSC rejection filter is OFF; and	   K = 3 if NTSC rejection filter is ON   For QAM64:     SNR[dB] = 10 * log10(897152044.8282 / MSE^2 )   For QAM256:     SNR[dB] = 10 * log10(907832426.314266  / MSE^2 )   We re-write the snr equation as:     SNR * 2^24 = 10*(c - 2*intlog10(MSE))   Where for QAM256, c = log10(907832426.314266) * 2^24   and for 8-VSB and QAM64, c = log10(897152044.8282) * 2^24 */static u32 calculate_snr(u32 mse, u32 c){	if (mse == 0) /* No signal */		return 0;	mse = 2*intlog10(mse);	if (mse > c) {		/* Negative SNR, which is possible, but realisticly the		demod will lose lock before the signal gets this bad.  The		API only allows for unsigned values, so just return 0 */		return 0;	}	return 10*(c - mse);}static int or51132_read_snr(struct dvb_frontend* fe, u16* snr){	struct or51132_state* state = fe->demodulator_priv;	int noise, reg;	u32 c, usK = 0;	int retry = 1;start:	/* SNR after Equalizer */	noise = or51132_readreg(state, 0x02);	if (noise < 0) {		printk(KERN_WARNING "or51132: read_snr: error reading equalizer\n");		return -EREMOTEIO;	}	dprintk("read_snr noise (%d)\n", noise);	/* Read status, contains modulation type for QAM_AUTO and	   NTSC filter for VSB */	reg = or51132_readreg(state, 0x00);	if (reg < 0) {		printk(KERN_WARNING "or51132: read_snr: error reading receiver status\n");		return -EREMOTEIO;	}	switch (reg&0xff) {	case 0x06:		if (reg & 0x1000) usK = 3 << 24;		/* Fall through to QAM64 case */	case 0x43:		c = 150204167;		break;	case 0x45:		c = 150290396;		break;	default:		printk(KERN_WARNING "or51132: unknown status 0x%02x\n", reg&0xff);		if (retry--) goto start;		return -EREMOTEIO;	}	dprintk("%s: modulation %02x, NTSC rej O%s\n", __FUNCTION__,		reg&0xff, reg&0x1000?"n":"ff");	/* Calculate SNR using noise, c, and NTSC rejection correction */	state->snr = calculate_snr(noise, c) - usK;	*snr = (state->snr) >> 16;	dprintk("%s: noise = 0x%08x, snr = %d.%02d dB\n", __FUNCTION__, noise,		state->snr >> 24, (((state->snr>>8) & 0xffff) * 100) >> 16);	return 0;}static int or51132_read_signal_strength(struct dvb_frontend* fe, u16* strength){	/* Calculate Strength from SNR up to 35dB */	/* Even though the SNR can go higher than 35dB, there is some comfort */	/* factor in having a range of strong signals that can show at 100%   */	struct or51132_state* state = (struct or51132_state*) fe->demodulator_priv;	u16 snr;	int ret;	ret = fe->ops.read_snr(fe, &snr);	if (ret != 0)		return ret;	/* Rather than use the 8.8 value snr, use state->snr which is 8.24 */	/* scale the range 0 - 35*2^24 into 0 - 65535 */	if (state->snr >= 8960 * 0x10000)		*strength = 0xffff;	else		*strength = state->snr / 8960;	return 0;}static int or51132_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fe_tune_settings){	fe_tune_settings->min_delay_ms = 500;	fe_tune_settings->step_size = 0;	fe_tune_settings->max_drift = 0;	return 0;}static void or51132_release(struct dvb_frontend* fe){	struct or51132_state* state = fe->demodulator_priv;	kfree(state);}static struct dvb_frontend_ops or51132_ops;struct dvb_frontend* or51132_attach(const struct or51132_config* config,				    struct i2c_adapter* i2c){	struct or51132_state* state = NULL;	/* Allocate memory for the internal state */	state = kmalloc(sizeof(struct or51132_state), GFP_KERNEL);	if (state == NULL)		goto error;	/* Setup the state */	state->config = config;	state->i2c = i2c;	state->current_frequency = -1;	state->current_modulation = -1;	/* Create dvb_frontend */	memcpy(&state->frontend.ops, &or51132_ops, sizeof(struct dvb_frontend_ops));	state->frontend.demodulator_priv = state;	return &state->frontend;error:	kfree(state);	return NULL;}static struct dvb_frontend_ops or51132_ops = {	.info = {		.name			= "Oren OR51132 VSB/QAM Frontend",		.type			= FE_ATSC,		.frequency_min		= 44000000,		.frequency_max		= 958000000,		.frequency_stepsize	= 166666,		.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_QAM_64 | FE_CAN_QAM_256 | FE_CAN_QAM_AUTO |			FE_CAN_8VSB	},	.release = or51132_release,	.init = or51132_init,	.sleep = or51132_sleep,	.set_frontend = or51132_set_parameters,	.get_frontend = or51132_get_parameters,	.get_tune_settings = or51132_get_tune_settings,	.read_status = or51132_read_status,	.read_ber = or51132_read_ber,	.read_signal_strength = or51132_read_signal_strength,	.read_snr = or51132_read_snr,	.read_ucblocks = or51132_read_ucblocks,};module_param(debug, int, 0644);MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");MODULE_DESCRIPTION("OR51132 ATSC [pcHDTV HD-3000] (8VSB & ITU J83 AnnexB FEC QAM64/256) Demodulator Driver");MODULE_AUTHOR("Kirk Lapray");MODULE_AUTHOR("Trent Piepho");MODULE_LICENSE("GPL");EXPORT_SYMBOL(or51132_attach);/* * Local variables: * c-basic-offset: 8 * End: */

⌨️ 快捷键说明

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