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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? at76c651.c

?? linux環(huán)境下的dvb驅(qū)動(dòng)程序
?? C
字號(hào):
/* * at76c651.c *  * Atmel DVB-C Frontend Driver (at76c651/dat7021) * * Copyright (C) 2001 fnbrd <fnbrd@gmx.de> *             & 2002 Andreas Oberritter <obi@linuxtv.org> *             & 2003 Wolfram Joost <dbox2@frokaschwei.de> * * 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/module.h>#include <linux/kernel.h>#include <linux/string.h>#include <linux/slab.h>#if defined(__powerpc__)#include <asm/bitops.h>#endif#include "dvb_frontend.h"#include "dvb_i2c.h"#include "dvb_functions.h"static int debug = 0;static u8 at76c651_qam;static u8 at76c651_revision;#define dprintk	if (debug) printk/* * DAT7021 * ------- * Input Frequency Range (RF): 48.25 MHz to 863.25 MHz * Band Width: 8 MHz * Level Input (Range for Digital Signals): -61 dBm to -41 dBm * Output Frequency (IF): 36 MHz * * (see http://www.atmel.com/atmel/acrobat/doc1320.pdf) */static struct dvb_frontend_info at76c651_info = {	.name = "Atmel AT76C651(B) with DAT7021",	.type = FE_QAM,	.frequency_min = 48250000,	.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,	.notifier_delay = 0,	.caps = FE_CAN_INVERSION_AUTO |	    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_32 | FE_CAN_QAM_64 | FE_CAN_QAM_128 |	    FE_CAN_QAM_256 /* | FE_CAN_QAM_512 | FE_CAN_QAM_1024 */ |	    FE_CAN_RECOVER | FE_CAN_CLEAN_SETUP | FE_CAN_MUTE_TS};#if ! defined(__powerpc__)static __inline__ int __ilog2(unsigned long x){	int i;	if (x == 0)		return -1;	for (i = 0; x != 0; i++)		x >>= 1;	return i - 1;}#endifstatic int at76c651_writereg(struct dvb_i2c_bus *i2c, u8 reg, u8 data){	int ret;	u8 buf[] = { reg, data };	struct i2c_msg msg = { .addr = 0x1a >> 1, .flags = 0, .buf = buf, .len = 2 };	ret = i2c->xfer(i2c, &msg, 1);	if (ret != 1)		dprintk("%s: writereg error "			"(reg == 0x%02x, val == 0x%02x, ret == %i)\n",			__FUNCTION__, reg, data, ret);	dvb_delay(10);	return (ret != 1) ? -EREMOTEIO : 0;}static u8 at76c651_readreg(struct dvb_i2c_bus *i2c, u8 reg){	int ret;	u8 b0[] = { reg };	u8 b1[] = { 0 };	struct i2c_msg msg[] = { {.addr =  0x1a >> 1, .flags =  0, .buf =  b0, .len = 1},			  {.addr =  0x1a >> 1, .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 at76c651_reset(struct dvb_i2c_bus *i2c){	return at76c651_writereg(i2c, 0x07, 0x01);}static int at76c651_disable_interrupts(struct dvb_i2c_bus *i2c){	return at76c651_writereg(i2c, 0x0b, 0x00);}static int at76c651_set_auto_config(struct dvb_i2c_bus *i2c){	/*	 * Autoconfig	 */	at76c651_writereg(i2c, 0x06, 0x01);	/*	 * Performance optimizations, should be done after autoconfig	 */	at76c651_writereg(i2c, 0x10, 0x06);	at76c651_writereg(i2c, 0x11, ((at76c651_qam == 5) || (at76c651_qam == 7)) ? 0x12 : 0x10);	at76c651_writereg(i2c, 0x15, 0x28);	at76c651_writereg(i2c, 0x20, 0x09);	at76c651_writereg(i2c, 0x24, ((at76c651_qam == 5) || (at76c651_qam == 7)) ? 0xC0 : 0x90);	at76c651_writereg(i2c, 0x30, 0x90);	if (at76c651_qam == 5)		at76c651_writereg(i2c, 0x35, 0x2A);	/*	 * Initialize A/D-converter	 */	if (at76c651_revision == 0x11) {		at76c651_writereg(i2c, 0x2E, 0x38);		at76c651_writereg(i2c, 0x2F, 0x13);	}	at76c651_disable_interrupts(i2c);	/*	 * Restart operation	 */	at76c651_reset(i2c);	return 0;}static int at76c651_set_bbfreq(struct dvb_i2c_bus *i2c){	at76c651_writereg(i2c, 0x04, 0x3f);	at76c651_writereg(i2c, 0x05, 0xee);	return 0;}static int at76c651_switch_tuner_i2c(struct dvb_i2c_bus *i2c, u8 enable){	if (enable)		return at76c651_writereg(i2c, 0x0c, 0xc2 | 0x01);	else		return at76c651_writereg(i2c, 0x0c, 0xc2);}static int dat7021_write(struct dvb_i2c_bus *i2c, u32 tw){	int ret;	struct i2c_msg msg =	    { .addr = 0xc2 >> 1, .flags = 0, .buf = (u8 *) & tw, .len = sizeof (tw) };#ifdef __LITTLE_ENDIAN	tw = __cpu_to_be32(tw);#endif	at76c651_switch_tuner_i2c(i2c, 1);	ret = i2c->xfer(i2c, &msg, 1);	at76c651_switch_tuner_i2c(i2c, 0);	if (ret != 4)		return -EFAULT;	at76c651_reset(i2c);	return 0;}static int dat7021_set_tv_freq(struct dvb_i2c_bus *i2c, u32 freq){	u32 dw;	freq /= 1000;	if ((freq < 48250) || (freq > 863250))		return -EINVAL;	/*	 * formula: dw=0x17e28e06+(freq-346000UL)/8000UL*0x800000	 *      or: dw=0x4E28E06+(freq-42000) / 125 * 0x20000	 */	dw = (freq - 42000) * 4096;	dw = dw / 125;	dw = dw * 32;	if (freq > 394000)		dw += 0x4E28E85;	else		dw += 0x4E28E06;	return dat7021_write(i2c, dw);}static int at76c651_set_symbolrate(struct dvb_i2c_bus *i2c, u32 symbolrate){	u8 exponent;	u32 mantissa;	if (symbolrate > 9360000)		return -EINVAL;	/*	 * FREF = 57800 kHz	 * exponent = 10 + floor ( log2 ( symbolrate / FREF ) )	 * mantissa = ( symbolrate / FREF) * ( 1 << ( 30 - exponent ) )	 */	exponent = __ilog2((symbolrate << 4) / 903125);	mantissa = ((symbolrate / 3125) * (1 << (24 - exponent))) / 289;	at76c651_writereg(i2c, 0x00, mantissa >> 13);	at76c651_writereg(i2c, 0x01, mantissa >> 5);	at76c651_writereg(i2c, 0x02, (mantissa << 3) | exponent);	return 0;}static int at76c651_set_qam(struct dvb_i2c_bus *i2c, fe_modulation_t qam){	switch (qam) {	case QPSK:		at76c651_qam = 0x02;		break;	case QAM_16:		at76c651_qam = 0x04;		break;	case QAM_32:		at76c651_qam = 0x05;		break;	case QAM_64:		at76c651_qam = 0x06;		break;	case QAM_128:		at76c651_qam = 0x07;		break;	case QAM_256:		at76c651_qam = 0x08;		break;#if 0	case QAM_512:		at76c651_qam = 0x09;		break;	case QAM_1024:		at76c651_qam = 0x0A;		break;#endif	default:		return -EINVAL;	}	return at76c651_writereg(i2c, 0x03, at76c651_qam);}static int at76c651_set_inversion(struct dvb_i2c_bus *i2c,		       fe_spectral_inversion_t inversion){	u8 feciqinv = at76c651_readreg(i2c, 0x60);	switch (inversion) {	case INVERSION_OFF:		feciqinv |= 0x02;		feciqinv &= 0xFE;		break;	case INVERSION_ON:		feciqinv |= 0x03;		break;	case INVERSION_AUTO:		feciqinv &= 0xFC;		break;	default:		return -EINVAL;	}	return at76c651_writereg(i2c, 0x60, feciqinv);}static int at76c651_set_parameters(struct dvb_i2c_bus *i2c,			struct dvb_frontend_parameters *p){	dat7021_set_tv_freq(i2c, p->frequency);	at76c651_set_symbolrate(i2c, p->u.qam.symbol_rate);	at76c651_set_inversion(i2c, p->inversion);	at76c651_set_auto_config(i2c);	return 0;}static int at76c651_set_defaults(struct dvb_i2c_bus *i2c){	at76c651_set_symbolrate(i2c, 6900000);	at76c651_set_qam(i2c, QAM_64);	at76c651_set_bbfreq(i2c);	at76c651_set_auto_config(i2c);	return 0;}static int at76c651_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg){	switch (cmd) {	case FE_GET_INFO:		memcpy(arg, &at76c651_info, sizeof (struct dvb_frontend_info));		break;	case FE_READ_STATUS:		{			fe_status_t *status = (fe_status_t *) arg;			u8 sync;			/*			 * Bits: FEC, CAR, EQU, TIM, AGC2, AGC1, ADC, PLL (PLL=0) 			 */			sync = at76c651_readreg(fe->i2c, 0x80);			*status = 0;			if (sync & (0x04 | 0x10))	/* AGC1 || TIM */				*status |= FE_HAS_SIGNAL;			if (sync & 0x10)	/* TIM */				*status |= FE_HAS_CARRIER;			if (sync & 0x80)	/* FEC */				*status |= FE_HAS_VITERBI;			if (sync & 0x40)	/* CAR */				*status |= FE_HAS_SYNC;			if ((sync & 0xF0) == 0xF0)	/* TIM && EQU && CAR && FEC */				*status |= FE_HAS_LOCK;			break;		}	case FE_READ_BER:		{			u32 *ber = (u32 *) arg;			*ber = (at76c651_readreg(fe->i2c, 0x81) & 0x0F) << 16;			*ber |= at76c651_readreg(fe->i2c, 0x82) << 8;			*ber |= at76c651_readreg(fe->i2c, 0x83);			*ber *= 10;			break;		}	case FE_READ_SIGNAL_STRENGTH:		{			u8 gain = ~at76c651_readreg(fe->i2c, 0x91);			*(u16 *) arg = (gain << 8) | gain;			break;		}	case FE_READ_SNR:		*(u16 *) arg =		    0xFFFF -		    ((at76c651_readreg(fe->i2c, 0x8F) << 8) |		     at76c651_readreg(fe->i2c, 0x90));		break;	case FE_READ_UNCORRECTED_BLOCKS:		*(u32 *) arg = at76c651_readreg(fe->i2c, 0x82);		break;	case FE_SET_FRONTEND:		return at76c651_set_parameters(fe->i2c, arg);	case FE_GET_FRONTEND:		break;	case FE_SLEEP:		break;	case FE_INIT:		return at76c651_set_defaults(fe->i2c);	case FE_RESET:		return at76c651_reset(fe->i2c);	default:		return -ENOIOCTLCMD;	}	return 0;}static int at76c651_attach(struct dvb_i2c_bus *i2c, void **data){	if ( (at76c651_readreg(i2c, 0x0E) != 0x65) ||	     ( ( (at76c651_revision = at76c651_readreg(i2c, 0x0F)) & 0xFE) != 0x10) )	{		dprintk("no AT76C651(B) found\n");		return -ENODEV;	}	if (at76c651_revision == 0x10)	{		dprintk("AT76C651A found\n");		strcpy(at76c651_info.name,"Atmel AT76C651A with DAT7021");	}	else	{		strcpy(at76c651_info.name,"Atmel AT76C651B with DAT7021");		dprintk("AT76C651B found\n");	}	at76c651_set_defaults(i2c);	return dvb_register_frontend(at76c651_ioctl, i2c, NULL, &at76c651_info);}static void at76c651_detach(struct dvb_i2c_bus *i2c, void *data){	dvb_unregister_frontend(at76c651_ioctl, i2c);}static int __init at76c651_init(void){	return dvb_register_i2c_device(THIS_MODULE, at76c651_attach,				       at76c651_detach);}static void __exit at76c651_exit(void){	dvb_unregister_i2c_device(at76c651_attach);}module_init(at76c651_init);module_exit(at76c651_exit);MODULE_DESCRIPTION("at76c651/dat7021 dvb-c frontend driver");MODULE_AUTHOR("Andreas Oberritter <obi@linuxtv.org>");MODULE_LICENSE("GPL");MODULE_PARM(debug, "i");

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜视频在线观看一区二区三区| 日韩成人免费电影| 欧美一二三四在线| av在线一区二区三区| 日韩成人一级大片| 亚洲人成亚洲人成在线观看图片 | 亚洲乱码中文字幕| 日韩在线播放一区二区| 久久久国产综合精品女国产盗摄| 欧美日韩精品一区二区三区蜜桃| 成人免费视频网站在线观看| 美女视频黄 久久| 亚洲午夜激情av| 国产精品久久久久久久久动漫 | 久久亚洲欧美国产精品乐播| 精品污污网站免费看| 99久久er热在这里只有精品66| 黄色资源网久久资源365| 丝袜诱惑亚洲看片| 一区av在线播放| 亚洲同性gay激情无套| 欧美激情艳妇裸体舞| www精品美女久久久tv| 日韩亚洲欧美中文三级| 欧美日韩在线播放三区四区| 色综合视频在线观看| 成人午夜av电影| 国产成人8x视频一区二区| 久久er99热精品一区二区| 偷拍一区二区三区四区| 亚洲国产精品一区二区久久恐怖片| 国产精品久久久久久久久果冻传媒| ww久久中文字幕| wwwwxxxxx欧美| 精品美女一区二区| 日韩精品一区二区三区四区视频| 在线播放欧美女士性生活| 一区二区三区欧美亚洲| 一区在线中文字幕| 国产精品进线69影院| 国产精品国产精品国产专区不片| 国产精品每日更新在线播放网址| 国产日韩精品一区二区浪潮av| 国产婷婷一区二区| 中文字幕乱码亚洲精品一区| 欧美激情在线一区二区| 国产精品二区一区二区aⅴ污介绍| 国产精品久久网站| 亚洲蜜臀av乱码久久精品| 亚洲理论在线观看| 亚洲不卡在线观看| 日本三级亚洲精品| 精品亚洲aⅴ乱码一区二区三区| 国产自产2019最新不卡| 风流少妇一区二区| 色香蕉成人二区免费| 欧美日韩午夜影院| 亚洲精品在线观| 国产精品午夜在线| 伊人婷婷欧美激情| 视频一区二区三区在线| 韩国av一区二区三区在线观看| 国产成人久久精品77777最新版本| 不卡一区在线观看| 欧美三级视频在线播放| 日韩欧美激情一区| 国产精品久久久久久久久动漫 | 亚洲精选一二三| 日韩中文字幕91| 国产一区二区三区在线观看精品| av电影天堂一区二区在线观看| 在线免费观看不卡av| 91精选在线观看| 中文一区在线播放| 亚洲大片在线观看| 国产精品996| 欧美性猛交xxxx乱大交退制版| 欧美一级久久久久久久大片| 欧美国产日产图区| 五月激情综合婷婷| 国产精品一区2区| 欧美日韩综合不卡| 国产女人18毛片水真多成人如厕| 一区二区日韩电影| 国产一区二区美女诱惑| 日本韩国欧美三级| 久久精品一区二区三区不卡 | 色婷婷国产精品| 欧美不卡激情三级在线观看| 综合欧美一区二区三区| 麻豆精品久久久| 93久久精品日日躁夜夜躁欧美| 在线不卡a资源高清| 中文字幕一区二区三区不卡在线| 蜜臀久久久99精品久久久久久| 不卡高清视频专区| 精品国产一区二区精华| 亚洲精品乱码久久久久久| 国产又黄又大久久| 制服丝袜中文字幕一区| 亚洲毛片av在线| 国产成人免费视频网站高清观看视频| 精品视频一区三区九区| 国产精品成人免费在线| 国内精品第一页| 日韩一区二区三区av| 夜夜嗨av一区二区三区四季av | 麻豆成人综合网| 欧美在线你懂得| 亚洲欧美中日韩| 国产成人啪免费观看软件| 欧美精品自拍偷拍| 亚洲在线一区二区三区| 成人18视频日本| 欧美国产激情二区三区| 精品中文av资源站在线观看| 欧美高清精品3d| 亚洲综合自拍偷拍| 色哟哟一区二区在线观看| 国产精品久久久99| 成人av在线资源| 中文字幕高清不卡| 国产成人超碰人人澡人人澡| 精品国精品国产尤物美女| 美女mm1313爽爽久久久蜜臀| 欧美男同性恋视频网站| 亚洲成人av电影在线| 欧美性xxxxxx少妇| 亚洲一区二区三区影院| 精品视频在线视频| 亚洲成a人片在线观看中文| 色综合天天综合网国产成人综合天 | 精品一二三四在线| 精品日韩在线观看| 精品系列免费在线观看| 精品电影一区二区| 国产suv精品一区二区883| 国产午夜精品一区二区三区四区| 国产精品亚洲一区二区三区在线| 2024国产精品| 国产成人欧美日韩在线电影| 日本一区二区三区国色天香 | 日本一区二区电影| 国产精品影视网| 国产日产欧产精品推荐色 | 91蜜桃视频在线| 一区二区在线电影| 欧美视频一二三区| 日韩高清在线观看| 日韩欧美黄色影院| 国产成人免费在线观看不卡| 国产精品毛片久久久久久| 91黄色激情网站| 日日夜夜一区二区| 久久综合99re88久久爱| 丰满白嫩尤物一区二区| 亚洲精选免费视频| 日韩一区二区在线观看| 国产精品香蕉一区二区三区| 国产精品激情偷乱一区二区∴| 色老综合老女人久久久| 婷婷激情综合网| 久久五月婷婷丁香社区| 99re6这里只有精品视频在线观看| 一区二区三区91| 精品久久人人做人人爱| av电影在线观看一区| 午夜精品一区在线观看| 2021久久国产精品不只是精品| av亚洲精华国产精华| 亚洲一区二区三区四区中文字幕| 日韩欧美亚洲一区二区| 成人av电影在线| 日韩精品亚洲专区| 中文字幕第一区综合| 欧美狂野另类xxxxoooo| 国产不卡在线一区| 亚洲成va人在线观看| 久久青草欧美一区二区三区| 色狠狠av一区二区三区| 激情小说欧美图片| 9色porny自拍视频一区二区| 亚洲大型综合色站| 国产偷v国产偷v亚洲高清| 欧美日韩国产片| 成人一道本在线| 男人的天堂久久精品| 国产精品久久福利| 日韩午夜av电影| 色婷婷av一区二区三区之一色屋| 久久精品国产精品亚洲精品| 一区二区三区不卡视频在线观看| 2023国产精品| 欧美电影一区二区三区| av亚洲精华国产精华精华| 九色综合国产一区二区三区| 亚洲午夜在线电影| 一区免费观看视频| 久久久99精品久久| 欧美一区二区福利在线|