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

📄 ves1x93.c

📁 Linux Kernel 2.6.9 for OMAP1710
💻 C
📖 第 1 页 / 共 2 页
字号:
			XIN = 96000000UL;		else			return -EINVAL;		break;	case BOARD_SAGEM_DBOX2:		XIN = 92160000UL;		break;	default:		return -EINVAL;	}	if (srate > XIN/2)		srate = XIN/2;	if (srate < 500000)		srate = 500000;#define MUL (1UL<<26)	FIN = (XIN + 6000) >> 4;	tmp = srate << 6;	ratio = tmp / FIN;	tmp = (tmp % FIN) << 8;	ratio = (ratio << 8) + tmp / FIN;	tmp = (tmp % FIN) << 8;	ratio = (ratio << 8) + tmp / FIN;	FNR = 0xff;	if (ratio < MUL/3)           FNR = 0;	if (ratio < (MUL*11)/50)     FNR = 1;	if (ratio < MUL/6)           FNR = 2;	if (ratio < MUL/9)           FNR = 3;	if (ratio < MUL/12)          FNR = 4;	if (ratio < (MUL*11)/200)    FNR = 5;	if (ratio < MUL/24)          FNR = 6;	if (ratio < (MUL*27)/1000)   FNR = 7;	if (ratio < MUL/48)          FNR = 8;	if (ratio < (MUL*137)/10000) FNR = 9;	if (FNR == 0xff) {		ADCONF = 0x89;		FCONF  = 0x80;		FNR	= 0;	} else {		ADCONF = 0x81;		FCONF  = 0x88 | (FNR >> 1) | ((FNR & 0x01) << 5);		/*FCONF  = 0x80 | ((FNR & 0x01) << 5) | (((FNR > 1) & 0x03) << 3) | ((FNR >> 1) & 0x07);*/	}	BDR = (( (ratio << (FNR >> 1)) >> 4) + 1) >> 1;	BDRI = ( ((FIN << 8) / ((srate << (FNR >> 1)) >> 2)) + 1) >> 1;        dprintk("FNR= %d\n", FNR);        dprintk("ratio= %08x\n", (unsigned int) ratio);        dprintk("BDR= %08x\n", (unsigned int) BDR);        dprintk("BDRI= %02x\n", (unsigned int) BDRI);	if (BDRI > 0xff)		BDRI = 0xff;	ves1x93_writereg (i2c, 0x06, 0xff & BDR);	ves1x93_writereg (i2c, 0x07, 0xff & (BDR >> 8));	ves1x93_writereg (i2c, 0x08, 0x0f & (BDR >> 16));	ves1x93_writereg (i2c, 0x09, BDRI);	ves1x93_writereg (i2c, 0x20, ADCONF);	ves1x93_writereg (i2c, 0x21, FCONF);	if (srate < 6000000) 		ves1x93_writereg (i2c, 0x05, init_1x93_tab[0x05] | 0x80);	else		ves1x93_writereg (i2c, 0x05, init_1x93_tab[0x05] & 0x7f);	/* ves1993 hates this, will lose lock */	if (demod_type != DEMOD_VES1993)		ves1x93_clr_bit (i2c);	return 0;}static int ves1x93_afc (struct dvb_i2c_bus *i2c, u32 freq, u32 srate){	int afc;	afc = ((int)((ves1x93_readreg (i2c, 0x0a) << 1) & 0xff))/2;	afc = (afc * (int)(srate/1000/8))/16;    	if (afc) {			freq -= afc;		tuner_set_tv_freq (i2c, freq, 0);		ves1x93_init_aquire (i2c);	}       	return 0;}static int ves1x93_set_voltage (struct dvb_i2c_bus *i2c, fe_sec_voltage_t voltage){	switch (voltage) {	case SEC_VOLTAGE_13:		return ves1x93_writereg (i2c, 0x1f, 0x20);	case SEC_VOLTAGE_18:		return ves1x93_writereg (i2c, 0x1f, 0x30);	case SEC_VOLTAGE_OFF:		return ves1x93_writereg (i2c, 0x1f, 0x00);	default:		return -EINVAL;	}}static int ves1x93_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg){	struct dvb_i2c_bus *i2c = fe->i2c;	struct ves1x93_state *state = (struct ves1x93_state*) fe->data;        switch (cmd) {        case FE_GET_INFO:		memcpy (arg, &ves1x93_info, sizeof(struct dvb_frontend_info));		break;        case FE_READ_STATUS:	{		fe_status_t *status = arg;		u8 sync = ves1x93_readreg (i2c, 0x0e);		*status = 0;		if (sync & 1)			*status |= FE_HAS_SIGNAL;		if (sync & 2)			*status |= FE_HAS_CARRIER;		if (sync & 4)			*status |= FE_HAS_VITERBI;		if (sync & 8)			*status |= FE_HAS_SYNC;		if ((sync & 0x1f) == 0x1f)			*status |= FE_HAS_LOCK;		break;	}        case FE_READ_BER:	{		u32 *ber = (u32 *) arg;		*ber = ves1x93_readreg (i2c, 0x15);                *ber |= (ves1x93_readreg (i2c, 0x16) << 8);                *ber |= ((ves1x93_readreg (i2c, 0x17) & 0x0F) << 16);		*ber *= 10;		break;	}        case FE_READ_SIGNAL_STRENGTH:	{		u8 signal = ~ves1x93_readreg (i2c, 0x0b);		*((u16*) arg) = (signal << 8) | signal;		break;	}        case FE_READ_SNR:	{		u8 snr = ~ves1x93_readreg (i2c, 0x1c);		*(u16*) arg = (snr << 8) | snr;		break;	}	case FE_READ_UNCORRECTED_BLOCKS: 	{		*(u32*) arg = ves1x93_readreg (i2c, 0x18) & 0x7f;		if (*(u32*) arg == 0x7f)			*(u32*) arg = 0xffffffff;   /* counter overflow... */				ves1x93_writereg (i2c, 0x18, 0x00);  /* reset the counter */		ves1x93_writereg (i2c, 0x18, 0x80);  /* dto. */		break;	}        case FE_SET_FRONTEND:        {		struct dvb_frontend_parameters *p = arg;		tuner_set_tv_freq (i2c, p->frequency, 0);		ves1x93_set_inversion (i2c, p->inversion);		ves1x93_set_fec (i2c, p->u.qpsk.fec_inner);		ves1x93_set_symbolrate (i2c, p->u.qpsk.symbol_rate);		ves1x93_afc (i2c, p->frequency, p->u.qpsk.symbol_rate);	    		state->inversion = p->inversion;                break;        }	case FE_GET_FRONTEND:	{		struct dvb_frontend_parameters *p = arg;		int afc;		afc = ((int)((char)(ves1x93_readreg (i2c, 0x0a) << 1)))/2;		afc = (afc * (int)(p->u.qpsk.symbol_rate/1000/8))/16;		p->frequency -= afc;		/*		 * inversion indicator is only valid		 * if auto inversion was used		 */		if (state->inversion == INVERSION_AUTO)			p->inversion = (ves1x93_readreg (i2c, 0x0f) & 2) ? 					INVERSION_OFF : INVERSION_ON;		p->u.qpsk.fec_inner = ves1x93_get_fec (i2c);	/*  XXX FIXME: timing offset !! */		break;	}        case FE_SLEEP:		if (board_type == BOARD_SIEMENS_PCI)			ves1x93_writereg (i2c, 0x1f, 0x00);    /*  LNB power off  */		return ves1x93_writereg (i2c, 0x00, 0x08);        case FE_INIT:		return ves1x93_init (i2c);	case FE_SET_TONE:		return -EOPNOTSUPP;  /* the ves1893 can generate the 22k */		                     /* let's implement this when we have */		                     /* a box that uses the 22K_0 pin... */	case FE_SET_VOLTAGE:		return ves1x93_set_voltage (i2c, (fe_sec_voltage_t) arg);	default:		return -EOPNOTSUPP;        };                return 0;} static int ves1x93_attach (struct dvb_i2c_bus *i2c, void **data){	u8 identity = ves1x93_readreg(i2c, 0x1e);	struct ves1x93_state* state;	switch (identity) {	case 0xdc: /* VES1893A rev1 */		printk("ves1x93: Detected ves1893a rev1\n");		demod_type = DEMOD_VES1893;		ves1x93_info.name[4] = '8';		break;	case 0xdd: /* VES1893A rev2 */		printk("ves1x93: Detected ves1893a rev2\n");		demod_type = DEMOD_VES1893;		ves1x93_info.name[4] = '8';		break;	case 0xde: /* VES1993 */		printk("ves1x93: Detected ves1993\n");		demod_type = DEMOD_VES1993;		ves1x93_info.name[4] = '9';		break;	default:		dprintk("VES1x93 not found (identity %02x)\n", identity);		return -ENODEV;	}	if ((state = kmalloc(sizeof(struct ves1x93_state), GFP_KERNEL)) == NULL) {		return -ENOMEM;	}	state->inversion = INVERSION_OFF;	*data = state;	return dvb_register_frontend (ves1x93_ioctl, i2c, (void*) state, &ves1x93_info);}static void ves1x93_detach (struct dvb_i2c_bus *i2c, void *data){	kfree(data);	dvb_unregister_frontend (ves1x93_ioctl, i2c);}static int __init init_ves1x93 (void){	switch (board_type) {	case BOARD_NOKIA_DBOX2:		dprintk("%s: NOKIA_DBOX2\n", __FILE__);		break;	case BOARD_SAGEM_DBOX2:		dprintk("%s: SAGEM_DBOX2\n", __FILE__);		break;	case BOARD_SIEMENS_PCI:		dprintk("%s: SIEMENS_PCI\n", __FILE__);		break;	default:		return -EIO;	}	return dvb_register_i2c_device (THIS_MODULE, ves1x93_attach, ves1x93_detach);}static void __exit exit_ves1x93 (void){	dvb_unregister_i2c_device (ves1x93_attach);}module_init(init_ves1x93);module_exit(exit_ves1x93);MODULE_DESCRIPTION("VES1x93 DVB-S Frontend");MODULE_AUTHOR("Ralph Metzler");MODULE_LICENSE("GPL");MODULE_PARM(debug,"i");MODULE_PARM(board_type,"i");

⌨️ 快捷键说明

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