亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? grundig_29504-401.c

?? linux_dvb的驅動程序:linuxtv-dvb-1.1.1.rar
?? C
字號:
/*     driver for Grundig 29504-401 DVB-T Frontends based on    LSI L64781 COFDM demodulator as used in Technotrend DVB-T cards    Copyright (C) 2001 Holger Waechtler <holger@convergence.de>                       for Convergence Integrated Media GmbH                       Marko Kohtala <marko.kohtala@nokia.com>    This program is free software; you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation; either version 2 of the License, or    (at your option) any later version.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.    You should have received a copy of the GNU General Public License    along with this program; if not, write to the Free Software    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/    #include <linux/init.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/string.h>#include <linux/slab.h>#include "dvb_frontend.h"#include "dvb_functions.h"static int debug = 0;#define dprintk	if (debug) printkstruct dvb_frontend_info grundig_29504_401_info = {	.name = "Grundig 29504-401",	.type = FE_OFDM,/*	.frequency_min = ???,*//*	.frequency_max = ???,*/	.frequency_stepsize = 166666,/*      .frequency_tolerance = ???,*//*      .symbol_rate_tolerance = ???,*/	.notifier_delay = 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_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |	      FE_CAN_MUTE_TS /*| FE_CAN_CLEAN_SETUP*/};static int l64781_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data){	int ret;	u8 buf [] = { reg, data };	struct i2c_msg msg = { .addr = 0x55, .flags = 0, .buf = buf, .len = 2 };	if ((ret = i2c->xfer (i2c, &msg, 1)) != 1)		dprintk ("%s: write_reg error (reg == %02x) = %02x!\n",			 __FUNCTION__, reg, ret);	return (ret != 1) ? -1 : 0;}static u8 l64781_readreg (struct dvb_i2c_bus *i2c, u8 reg){	int ret;	u8 b0 [] = { reg };	u8 b1 [] = { 0 };	struct i2c_msg msg [] = { { .addr = 0x55, .flags = 0, .buf = b0, .len = 1 },			   { .addr = 0x55, .flags = I2C_M_RD, .buf = b1, .len = 1 } };	ret = i2c->xfer (i2c, msg, 2);	if (ret != 2)		dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret);	return b1[0];}static int tsa5060_write (struct dvb_i2c_bus *i2c, u8 data [4]){	int ret;	struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = 4 };	if ((ret = i2c->xfer (i2c, &msg, 1)) != 1)		dprintk ("%s: write_reg error == %02x!\n", __FUNCTION__, ret);	return (ret != 1) ? -1 : 0;}/** *   set up the downconverter frequency divisor for a *   reference clock comparision frequency of 166666 Hz. *   frequency offset is 36125000 Hz. */static int tsa5060_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq){#if 1	u32 div;	u8 buf [4];	u8 cfg, cpump, band_select;	div = (36125000 + freq) / 166666;	cfg = 0x88;	cpump = freq < 175000000 ? 2 : freq < 390000000 ? 1 :		freq < 470000000 ? 2 : freq < 750000000 ? 1 : 3;	band_select = freq < 175000000 ? 0x0e : freq < 470000000 ? 0x05 : 0x03;	buf [0] = (div >> 8) & 0x7f;	buf [1] = div & 0xff;	buf [2] = ((div >> 10) & 0x60) | cfg;	buf [3] = (cpump << 6) | band_select;#else	/* old code which seems to work better for at least one person */        u32 div;        u8 buf [4];        u8 cfg;        div = (36000000 + freq) / 166666;        cfg = 0x88;        buf [0] = (div >> 8) & 0x7f;        buf [1] = div & 0xff;        buf [2] = ((div >> 10) & 0x60) | cfg;        buf [3] = 0xc0;#endif	return tsa5060_write(i2c, buf);}static void apply_tps (struct dvb_i2c_bus *i2c){	l64781_writereg (i2c, 0x2a, 0x00);	l64781_writereg (i2c, 0x2a, 0x01);	/* This here is a little bit questionable because it enables	   the automatic update of TPS registers. I think we'd need to	   handle the IRQ from FE to update some other registers as	   well, or at least implement some magic to tuning to correct	   to the TPS received from transmission. */	l64781_writereg (i2c, 0x2a, 0x02);}static void reset_afc (struct dvb_i2c_bus *i2c){	/* Set AFC stall for the AFC_INIT_FRQ setting, TIM_STALL for	   timing offset */	l64781_writereg (i2c, 0x07, 0x9e); /* stall AFC */	l64781_writereg (i2c, 0x08, 0);    /* AFC INIT FREQ */	l64781_writereg (i2c, 0x09, 0);	l64781_writereg (i2c, 0x0a, 0);	l64781_writereg (i2c, 0x07, 0x8e);	l64781_writereg (i2c, 0x0e, 0);    /* AGC gain to zero in beginning */	l64781_writereg (i2c, 0x11, 0x80); /* stall TIM */	l64781_writereg (i2c, 0x10, 0);    /* TIM_OFFSET_LSB */	l64781_writereg (i2c, 0x12, 0);	l64781_writereg (i2c, 0x13, 0);	l64781_writereg (i2c, 0x11, 0x00);}static int apply_frontend_param (struct dvb_i2c_bus *i2c,			  struct dvb_frontend_parameters *param){	/* The coderates for FEC_NONE, FEC_4_5 and FEC_FEC_6_7 are arbitrary */	static const u8 fec_tab[] = { 7, 0, 1, 2, 9, 3, 10, 4 };	/* QPSK, QAM_16, QAM_64 */	static const u8 qam_tab [] = { 2, 4, 0, 6 };	static const u8 bw_tab [] = { 8, 7, 6 };  /* 8Mhz, 7MHz, 6MHz */	static const u8 guard_tab [] = { 1, 2, 4, 8 };	/* The Grundig 29504-401.04 Tuner comes with 18.432MHz crystal. */	static const u32 ppm = 8000;	struct dvb_ofdm_parameters *p = &param->u.ofdm;	u32 ddfs_offset_fixed;/*	u32 ddfs_offset_variable = 0x6000-((1000000UL+ppm)/ *//*			bw_tab[p->bandWidth]<<10)/15625; */	u32 init_freq;	u32 spi_bias;	u8 val0x04;	u8 val0x05;	u8 val0x06;	int bw = p->bandwidth - BANDWIDTH_8_MHZ;	if (param->inversion != INVERSION_ON &&	    param->inversion != INVERSION_OFF)		return -EINVAL;	if (bw < 0 || bw > 2)		return -EINVAL;		if (p->code_rate_HP != FEC_1_2 && p->code_rate_HP != FEC_2_3 &&	    p->code_rate_HP != FEC_3_4 && p->code_rate_HP != FEC_5_6 &&	    p->code_rate_HP != FEC_7_8)		return -EINVAL;	if (p->hierarchy_information != HIERARCHY_NONE &&	    (p->code_rate_LP != FEC_1_2 && p->code_rate_LP != FEC_2_3 &&	     p->code_rate_LP != FEC_3_4 && p->code_rate_LP != FEC_5_6 &&	     p->code_rate_LP != FEC_7_8))		return -EINVAL;	if (p->constellation != QPSK && p->constellation != QAM_16 &&	    p->constellation != QAM_64)		return -EINVAL;	if (p->transmission_mode != TRANSMISSION_MODE_2K &&	    p->transmission_mode != TRANSMISSION_MODE_8K)		return -EINVAL;	if (p->guard_interval < GUARD_INTERVAL_1_32 ||	    p->guard_interval > GUARD_INTERVAL_1_4)		return -EINVAL;	if (p->hierarchy_information < HIERARCHY_NONE ||	    p->hierarchy_information > HIERARCHY_4)		return -EINVAL;	ddfs_offset_fixed = 0x4000-(ppm<<16)/bw_tab[p->bandwidth]/1000000;	/* This works up to 20000 ppm, it overflows if too large ppm! */	init_freq = (((8UL<<25) + (8UL<<19) / 25*ppm / (15625/25)) /			bw_tab[p->bandwidth] & 0xFFFFFF);	/* SPI bias calculation is slightly modified to fit in 32bit */	/* will work for high ppm only... */	spi_bias = 378 * (1 << 10);	spi_bias *= 16;	spi_bias *= bw_tab[p->bandwidth];	spi_bias *= qam_tab[p->constellation];	spi_bias /= p->code_rate_HP + 1;	spi_bias /= (guard_tab[p->guard_interval] + 32);	spi_bias *= 1000ULL;	spi_bias /= 1000ULL + ppm/1000;	spi_bias *= p->code_rate_HP;	val0x04 = (p->transmission_mode << 2) | p->guard_interval;	val0x05 = fec_tab[p->code_rate_HP];	if (p->hierarchy_information != HIERARCHY_NONE)		val0x05 |= (p->code_rate_LP - FEC_1_2) << 3;	val0x06 = (p->hierarchy_information << 2) | p->constellation;	l64781_writereg (i2c, 0x04, val0x04);	l64781_writereg (i2c, 0x05, val0x05);	l64781_writereg (i2c, 0x06, val0x06);	reset_afc (i2c);	/* Technical manual section 2.6.1, TIM_IIR_GAIN optimal values */	l64781_writereg (i2c, 0x15,			 p->transmission_mode == TRANSMISSION_MODE_2K ? 1 : 3);	l64781_writereg (i2c, 0x16, init_freq & 0xff);	l64781_writereg (i2c, 0x17, (init_freq >> 8) & 0xff);	l64781_writereg (i2c, 0x18, (init_freq >> 16) & 0xff);	l64781_writereg (i2c, 0x1b, spi_bias & 0xff);	l64781_writereg (i2c, 0x1c, (spi_bias >> 8) & 0xff);	l64781_writereg (i2c, 0x1d, ((spi_bias >> 16) & 0x7f) |		(param->inversion == INVERSION_ON ? 0x80 : 0x00));	l64781_writereg (i2c, 0x22, ddfs_offset_fixed & 0xff);	l64781_writereg (i2c, 0x23, (ddfs_offset_fixed >> 8) & 0x3f);	l64781_readreg (i2c, 0x00);  /*  clear interrupt registers... */	l64781_readreg (i2c, 0x01);  /*  dto. */	apply_tps (i2c);	return 0;}static int reset_and_configure (struct dvb_i2c_bus *i2c){	u8 buf [] = { 0x06 };	struct i2c_msg msg = { .addr = 0x00, .flags = 0, .buf = buf, .len = 1 };	return (i2c->xfer (i2c, &msg, 1) == 1) ? 0 : -ENODEV;}static int init (struct dvb_i2c_bus *i2c){        reset_and_configure (i2c);	/* Power up */	l64781_writereg (i2c, 0x3e, 0xa5);	/* Reset hard */	l64781_writereg (i2c, 0x2a, 0x04);	l64781_writereg (i2c, 0x2a, 0x00);	/* Set tuner specific things */	/* AFC_POL, set also in reset_afc */	l64781_writereg (i2c, 0x07, 0x8e);	/* Use internal ADC */	l64781_writereg (i2c, 0x0b, 0x81);	/* AGC loop gain, and polarity is positive */	l64781_writereg (i2c, 0x0c, 0x84);	/* Internal ADC outputs two's complement */	l64781_writereg (i2c, 0x0d, 0x8c);	/* With ppm=8000, it seems the DTR_SENSITIVITY will result in           value of 2 with all possible bandwidths and guard           intervals, which is the initial value anyway. */        /*l64781_writereg (i2c, 0x19, 0x92);*/	/* Everything is two's complement, soft bit and CSI_OUT too */	l64781_writereg (i2c, 0x1e, 0x09);	return 0;}static int grundig_29504_401_ioctl (struct dvb_frontend *fe,			     unsigned int cmd, void *arg){	struct dvb_i2c_bus *i2c = fe->i2c;        switch (cmd) {        case FE_GET_INFO:		memcpy (arg, &grundig_29504_401_info,			sizeof(struct dvb_frontend_info));                break;	case FE_READ_STATUS:	{		fe_status_t *status = (fe_status_t *) arg;		int sync = l64781_readreg (i2c, 0x32);		int gain = l64781_readreg (i2c, 0x0e);		l64781_readreg (i2c, 0x00);  /*  clear interrupt registers... */		l64781_readreg (i2c, 0x01);  /*  dto. */		*status = 0;		if (gain > 5)			*status |= FE_HAS_SIGNAL;		if (sync & 0x02) /* VCXO locked, this criteria should be ok */			*status |= FE_HAS_CARRIER;		if (sync & 0x20)			*status |= FE_HAS_VITERBI;		if (sync & 0x40)			*status |= FE_HAS_SYNC;		if (sync == 0x7f)			*status |= FE_HAS_LOCK;		break;	}        case FE_READ_BER:	{		/*   XXX FIXME: set up counting period (reg 0x26...0x28)		 */		u32 *ber = (u32 *) arg;		*ber = l64781_readreg (i2c, 0x39)		    | (l64781_readreg (i2c, 0x3a) << 8);		break;	}        case FE_READ_SIGNAL_STRENGTH:	{		u8 gain = l64781_readreg (i2c, 0x0e);		*(u16 *) arg = (gain << 8) | gain;		break;	}        case FE_READ_SNR:	{		u16 *snr = (u16 *) arg;		u8 avg_quality = 0xff - l64781_readreg (i2c, 0x33);		*snr = (avg_quality << 8) | avg_quality; /* not exact, but...*/ 		break;	}	case FE_READ_UNCORRECTED_BLOCKS: 	{		u32 *ub = (u32 *) arg;		*ub = l64781_readreg (i2c, 0x37)		   | (l64781_readreg (i2c, 0x38) << 8);		break;	}        case FE_SET_FRONTEND:	{		struct dvb_frontend_parameters *p = arg;		tsa5060_set_tv_freq (i2c, p->frequency);		return apply_frontend_param (i2c, p);	}        case FE_GET_FRONTEND:		/*  we could correct the frequency here, but...		 *  (...do you want to implement this?;)		 */		return 0;	case FE_SLEEP:		/* Power down */		return l64781_writereg (i2c, 0x3e, 0x5a);	case FE_INIT:		return init (i2c);        default:		dprintk ("%s: unknown command !!!\n", __FUNCTION__);		return -EINVAL;        };                return 0;} static int l64781_attach (struct dvb_i2c_bus *i2c, void **data){	u8 reg0x3e;	u8 b0 [] = { 0x1a };	u8 b1 [] = { 0x00 };	struct i2c_msg msg [] = { { .addr = 0x55, .flags = 0, .buf = b0, .len = 1 },			   { .addr = 0x55, .flags = I2C_M_RD, .buf = b1, .len = 1 } };	/**	 *  the L64781 won't show up before we send the reset_and_configure()	 *  broadcast. If nothing responds there is no L64781 on the bus...	 */	if (reset_and_configure(i2c) < 0) {		dprintk("no response on reset_and_configure() broadcast, bailing out...\n");		return -ENODEV;	}	/* The chip always responds to reads */	if (i2c->xfer(i2c, msg, 2) != 2) {  	        dprintk("no response to read on I2C bus\n");		return -ENODEV;	}	/* Save current register contents for bailout */	reg0x3e = l64781_readreg(i2c, 0x3e);	/* Reading the POWER_DOWN register always returns 0 */	if (reg0x3e != 0) {	        dprintk("Device doesn't look like L64781\n");		return -ENODEV;	}	/* Turn the chip off */	l64781_writereg (i2c, 0x3e, 0x5a);	/* Responds to all reads with 0 */	if (l64781_readreg(i2c, 0x1a) != 0) { 	        dprintk("Read 1 returned unexpcted value\n");	        goto bailout;	}	  	/* Turn the chip on */	l64781_writereg (i2c, 0x3e, 0xa5);		/* Responds with register default value */	if (l64781_readreg(i2c, 0x1a) != 0xa1) {  	        dprintk("Read 2 returned unexpcted value\n");	        goto bailout;	}	return dvb_register_frontend (grundig_29504_401_ioctl, i2c, NULL,			       &grundig_29504_401_info); bailout:	l64781_writereg (i2c, 0x3e, reg0x3e);  /* restore reg 0x3e */	return -ENODEV;}static void l64781_detach (struct dvb_i2c_bus *i2c, void *data){	dvb_unregister_frontend (grundig_29504_401_ioctl, i2c);}static int __init init_grundig_29504_401 (void){	return dvb_register_i2c_device (THIS_MODULE,					l64781_attach, l64781_detach);}static void __exit exit_grundig_29504_401 (void){	dvb_unregister_i2c_device (l64781_attach);}module_init(init_grundig_29504_401);module_exit(exit_grundig_29504_401);MODULE_PARM(debug,"i");MODULE_PARM_DESC(debug, "enable verbose debug messages");MODULE_DESCRIPTION("Grundig 29504-401 DVB-T Frontend");MODULE_AUTHOR("Holger Waechtler, Marko Kohtala");MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91久久免费观看| 精品国产欧美一区二区| 欧美一区二区在线视频| 国产精品视频线看| 七七婷婷婷婷精品国产| 91在线观看地址| 精品精品欲导航| 亚洲视频资源在线| 激情图片小说一区| 欧美视频自拍偷拍| 中文字幕精品综合| 黄色日韩网站视频| 欧美一区二区三区在| 一区二区三区精品久久久| 国内精品嫩模私拍在线| 欧美午夜片在线观看| 国产精品久久久久久户外露出| 日韩不卡手机在线v区| 在线亚洲+欧美+日本专区| 国产日韩欧美在线一区| 久久精品国产秦先生| 欧美久久久久久久久久| 亚洲最大成人综合| 一本一道波多野结衣一区二区| 国产午夜精品一区二区三区视频 | 色婷婷综合久久| 久久人人爽人人爽| 久久精品久久99精品久久| 欧美老人xxxx18| 亚洲h动漫在线| 欧美性生交片4| 亚洲一区二区三区视频在线播放 | 天天综合色天天综合色h| 99re8在线精品视频免费播放| 欧美激情中文不卡| 国产成人一级电影| 国产欧美一区二区在线观看| 国产成人综合在线播放| 国产欧美日韩三级| 国产91综合网| 一区在线观看视频| 91视频国产资源| 亚洲精品自拍动漫在线| 日本福利一区二区| 亚洲第一狼人社区| 6080国产精品一区二区| 91丨九色丨尤物| 亚洲免费观看高清在线观看| 色综合视频在线观看| 亚洲午夜日本在线观看| 欧美精三区欧美精三区| 麻豆精品一区二区三区| 亚洲精品一区二区三区香蕉| 国产成+人+日韩+欧美+亚洲| 日韩毛片高清在线播放| 在线视频亚洲一区| 青娱乐精品视频| 久久看人人爽人人| 成人av网址在线观看| 亚洲综合一区在线| 日韩欧美国产一区二区在线播放| 极品尤物av久久免费看| 国产精品久久久久久亚洲毛片 | 国产福利91精品一区| 国产精品色在线观看| 在线观看视频91| 免费高清在线视频一区·| 久久人人爽爽爽人久久久| 色综合天天在线| 奇米影视7777精品一区二区| 国产日韩欧美一区二区三区乱码| 99视频一区二区三区| 午夜欧美电影在线观看| 久久精品欧美一区二区三区不卡 | 精品91自产拍在线观看一区| 波波电影院一区二区三区| 天堂在线亚洲视频| 久久精品视频免费观看| 欧美日韩国产免费一区二区| 国产麻豆视频一区二区| 亚洲一区二区成人在线观看| 精品入口麻豆88视频| 色网综合在线观看| 激情另类小说区图片区视频区| 亚洲欧美另类综合偷拍| 欧美sm极限捆绑bd| 在线观看日韩精品| 国产成人av电影在线观看| 日韩激情在线观看| 日韩伦理电影网| 久久亚洲捆绑美女| 91.成人天堂一区| 91在线视频免费91| 加勒比av一区二区| 日韩专区在线视频| 一区二区三区视频在线看| 国产婷婷精品av在线| 欧美一区二区三区在线电影| 欧美亚日韩国产aⅴ精品中极品| 国产成人免费在线视频| 日本亚洲三级在线| 亚洲国产裸拍裸体视频在线观看乱了| 欧美经典一区二区| 欧美精品一区二| 欧美一级专区免费大片| 欧美在线观看一区二区| 99国产精品久| 成人爱爱电影网址| 高清久久久久久| 国产美女在线精品| 国产在线精品视频| 精品无码三级在线观看视频| 免费一区二区视频| 日本午夜精品一区二区三区电影| 亚洲国产精品麻豆| 亚洲国产视频a| 国产黄人亚洲片| 国产精品一区二区三区网站| 精品一二三四区| 国产一区日韩二区欧美三区| 韩国精品主播一区二区在线观看 | 天堂蜜桃91精品| 偷拍日韩校园综合在线| 婷婷综合在线观看| 青青草成人在线观看| 久久国产精品99精品国产| 久久99精品一区二区三区| 精品一区二区三区免费观看 | 欧美一区日韩一区| 日韩欧美国产一区在线观看| 欧美精品一区二区蜜臀亚洲| 久久蜜桃一区二区| 国产精品久久久久久久第一福利| 国产精品久久久久久久久搜平片 | 国产91露脸合集magnet| 不卡的av网站| 欧美性猛片xxxx免费看久爱| 91精品国产综合久久久久久久久久 | 激情综合五月婷婷| 国产美女av一区二区三区| 成人精品免费网站| 日韩一区二区精品在线观看| 欧美一区二区视频观看视频| 久久久久国产精品免费免费搜索 | 777a∨成人精品桃花网| 欧美成人猛片aaaaaaa| 国产亚洲污的网站| 亚洲免费观看高清完整版在线观看熊| 亚洲国产精品一区二区久久| 精品一区在线看| 99国产精品久久久久久久久久久 | 欧美日本不卡视频| 2023国产精华国产精品| 自拍av一区二区三区| 日本亚洲视频在线| 粉嫩嫩av羞羞动漫久久久| 欧美亚洲综合网| 精品久久久网站| 亚洲欧美一区二区三区孕妇| 久久99久久99小草精品免视看| 99在线热播精品免费| 欧美一区二区三区日韩| 国产精品伦一区| 日本不卡中文字幕| 91首页免费视频| 欧美大肚乱孕交hd孕妇| 亚洲精品伦理在线| 国产一区高清在线| 欧美日韩欧美一区二区| 国产欧美在线观看一区| 免费人成黄页网站在线一区二区 | 国产麻豆成人精品| 欧美日韩亚州综合| 国产精品国产三级国产普通话蜜臀 | 亚洲免费电影在线| 国产中文字幕一区| 精品视频免费看| 亚洲四区在线观看| 激情另类小说区图片区视频区| 欧美少妇一区二区| 成人欧美一区二区三区白人| 国内成人精品2018免费看| 欧美精三区欧美精三区| 亚洲免费av高清| 成人福利视频网站| 精品国产不卡一区二区三区| 日韩精品国产欧美| 欧美性xxxxxxxx| 亚洲免费观看视频| 99视频热这里只有精品免费| 久久久久久久久久电影| 奇米影视一区二区三区小说| 欧美日韩第一区日日骚| 亚洲一区二区三区美女| 色av一区二区| 一区二区三区四区国产精品| 91浏览器打开| 亚洲视频在线一区二区| 91麻豆免费视频| 一区二区三区久久久|