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

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

?? mt2266.c

?? linux內核源碼
?? C
字號:
/* *  Driver for Microtune MT2266 "Direct conversion low power broadband tuner" * *  Copyright (c) 2007 Olivier DANET <odanet@caramail.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. */#include <linux/module.h>#include <linux/delay.h>#include <linux/dvb/frontend.h>#include <linux/i2c.h>#include "dvb_frontend.h"#include "mt2266.h"#define I2C_ADDRESS 0x60#define REG_PART_REV   0#define REG_TUNE       1#define REG_BAND       6#define REG_BANDWIDTH  8#define REG_LOCK       0x12#define PART_REV 0x85struct mt2266_priv {	struct mt2266_config *cfg;	struct i2c_adapter   *i2c;	u32 frequency;	u32 bandwidth;};/* Here, frequencies are expressed in kiloHertz to avoid 32 bits overflows */static int debug;module_param(debug, int, 0644);MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");#define dprintk(args...) do { if (debug) {printk(KERN_DEBUG "MT2266: " args); printk("\n"); }} while (0)// Reads a single registerstatic int mt2266_readreg(struct mt2266_priv *priv, u8 reg, u8 *val){	struct i2c_msg msg[2] = {		{ .addr = priv->cfg->i2c_address, .flags = 0,        .buf = &reg, .len = 1 },		{ .addr = priv->cfg->i2c_address, .flags = I2C_M_RD, .buf = val,  .len = 1 },	};	if (i2c_transfer(priv->i2c, msg, 2) != 2) {		printk(KERN_WARNING "MT2266 I2C read failed\n");		return -EREMOTEIO;	}	return 0;}// Writes a single registerstatic int mt2266_writereg(struct mt2266_priv *priv, u8 reg, u8 val){	u8 buf[2] = { reg, val };	struct i2c_msg msg = {		.addr = priv->cfg->i2c_address, .flags = 0, .buf = buf, .len = 2	};	if (i2c_transfer(priv->i2c, &msg, 1) != 1) {		printk(KERN_WARNING "MT2266 I2C write failed\n");		return -EREMOTEIO;	}	return 0;}// Writes a set of consecutive registersstatic int mt2266_writeregs(struct mt2266_priv *priv,u8 *buf, u8 len){	struct i2c_msg msg = {		.addr = priv->cfg->i2c_address, .flags = 0, .buf = buf, .len = len	};	if (i2c_transfer(priv->i2c, &msg, 1) != 1) {		printk(KERN_WARNING "MT2266 I2C write failed (len=%i)\n",(int)len);		return -EREMOTEIO;	}	return 0;}// Initialisation sequencesstatic u8 mt2266_init1[] = {	REG_TUNE,	0x00, 0x00, 0x28, 0x00, 0x52, 0x99, 0x3f };static u8 mt2266_init2[] = {	0x17,                                     0x6d, 0x71, 0x61, 0xc0, 0xbf, 0xff, 0xdc, 0x00, 0x0a,	0xd4, 0x03, 0x64, 0x64, 0x64, 0x64, 0x22, 0xaa, 0xf2, 0x1e, 0x80, 0x14, 0x01, 0x01, 0x01, 0x01,	0x01, 0x01, 0x7f, 0x5e, 0x3f, 0xff, 0xff, 0xff, 0x00, 0x77, 0x0f, 0x2d };static u8 mt2266_init_8mhz[] = {	REG_BANDWIDTH,	0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 };static u8 mt2266_init_7mhz[] = {	REG_BANDWIDTH,	0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32 };static u8 mt2266_init_6mhz[] = {	REG_BANDWIDTH,	0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7 };#define FREF 30000       // Quartz oscillator 30 MHzstatic int mt2266_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params){	struct mt2266_priv *priv;	int ret=0;	u32 freq;	u32 tune;	u8  lnaband;	u8  b[10];	int i;	priv = fe->tuner_priv;	mt2266_writereg(priv,0x17,0x6d);	mt2266_writereg(priv,0x1c,0xff);	freq = params->frequency / 1000; // Hz -> kHz	priv->bandwidth = (fe->ops.info.type == FE_OFDM) ? params->u.ofdm.bandwidth : 0;	priv->frequency = freq * 1000;	tune=2 * freq * (8192/16) / (FREF/16);	if (freq <= 495000) lnaband = 0xEE; else	if (freq <= 525000) lnaband = 0xDD; else	if (freq <= 550000) lnaband = 0xCC; else	if (freq <= 580000) lnaband = 0xBB; else	if (freq <= 605000) lnaband = 0xAA; else	if (freq <= 630000) lnaband = 0x99; else	if (freq <= 655000) lnaband = 0x88; else	if (freq <= 685000) lnaband = 0x77; else	if (freq <= 710000) lnaband = 0x66; else	if (freq <= 735000) lnaband = 0x55; else	if (freq <= 765000) lnaband = 0x44; else	if (freq <= 802000) lnaband = 0x33; else	if (freq <= 840000) lnaband = 0x22; else lnaband = 0x11;	msleep(100);	mt2266_writeregs(priv,(params->u.ofdm.bandwidth==BANDWIDTH_6_MHZ)?mt2266_init_6mhz:				(params->u.ofdm.bandwidth==BANDWIDTH_7_MHZ)?mt2266_init_7mhz:				mt2266_init_8mhz,sizeof(mt2266_init_8mhz));	b[0] = REG_TUNE;	b[1] = (tune >> 8) & 0x1F;	b[2] = tune & 0xFF;	b[3] = tune >> 13;	mt2266_writeregs(priv,b,4);	dprintk("set_parms: tune=%d band=%d",(int)tune,(int)lnaband);	dprintk("set_parms: [1..3]: %2x %2x %2x",(int)b[1],(int)b[2],(int)b[3]);	b[0] = 0x05;	b[1] = 0x62;	b[2] = lnaband;	mt2266_writeregs(priv,b,3);	//Waits for pll lock or timeout	i = 0;	do {		mt2266_readreg(priv,REG_LOCK,b);		if ((b[0] & 0x40)==0x40)			break;		msleep(10);		i++;	} while (i<10);	dprintk("Lock when i=%i",(int)i);	return ret;}static void mt2266_calibrate(struct mt2266_priv *priv){	mt2266_writereg(priv,0x11,0x03);	mt2266_writereg(priv,0x11,0x01);	mt2266_writeregs(priv,mt2266_init1,sizeof(mt2266_init1));	mt2266_writeregs(priv,mt2266_init2,sizeof(mt2266_init2));	mt2266_writereg(priv,0x33,0x5e);	mt2266_writereg(priv,0x10,0x10);	mt2266_writereg(priv,0x10,0x00);	mt2266_writeregs(priv,mt2266_init_8mhz,sizeof(mt2266_init_8mhz));	msleep(25);	mt2266_writereg(priv,0x17,0x6d);	mt2266_writereg(priv,0x1c,0x00);	msleep(75);	mt2266_writereg(priv,0x17,0x6d);	mt2266_writereg(priv,0x1c,0xff);}static int mt2266_get_frequency(struct dvb_frontend *fe, u32 *frequency){	struct mt2266_priv *priv = fe->tuner_priv;	*frequency = priv->frequency;	return 0;}static int mt2266_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth){	struct mt2266_priv *priv = fe->tuner_priv;	*bandwidth = priv->bandwidth;	return 0;}static int mt2266_init(struct dvb_frontend *fe){	struct mt2266_priv *priv = fe->tuner_priv;	mt2266_writereg(priv,0x17,0x6d);	mt2266_writereg(priv,0x1c,0xff);	return 0;}static int mt2266_sleep(struct dvb_frontend *fe){	struct mt2266_priv *priv = fe->tuner_priv;	mt2266_writereg(priv,0x17,0x6d);	mt2266_writereg(priv,0x1c,0x00);	return 0;}static int mt2266_release(struct dvb_frontend *fe){	kfree(fe->tuner_priv);	fe->tuner_priv = NULL;	return 0;}static const struct dvb_tuner_ops mt2266_tuner_ops = {	.info = {		.name           = "Microtune MT2266",		.frequency_min  = 470000000,		.frequency_max  = 860000000,		.frequency_step =     50000,	},	.release       = mt2266_release,	.init          = mt2266_init,	.sleep         = mt2266_sleep,	.set_params    = mt2266_set_params,	.get_frequency = mt2266_get_frequency,	.get_bandwidth = mt2266_get_bandwidth};struct dvb_frontend * mt2266_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct mt2266_config *cfg){	struct mt2266_priv *priv = NULL;	u8 id = 0;	priv = kzalloc(sizeof(struct mt2266_priv), GFP_KERNEL);	if (priv == NULL)		return NULL;	priv->cfg      = cfg;	priv->i2c      = i2c;	if (mt2266_readreg(priv,0,&id) != 0) {		kfree(priv);		return NULL;	}	if (id != PART_REV) {		kfree(priv);		return NULL;	}	printk(KERN_INFO "MT2266: successfully identified\n");	memcpy(&fe->ops.tuner_ops, &mt2266_tuner_ops, sizeof(struct dvb_tuner_ops));	fe->tuner_priv = priv;	mt2266_calibrate(priv);	return fe;}EXPORT_SYMBOL(mt2266_attach);MODULE_AUTHOR("Olivier DANET");MODULE_DESCRIPTION("Microtune MT2266 silicon tuner driver");MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品日韩一| 日韩中文字幕不卡| 亚洲综合另类小说| 日韩制服丝袜av| 日本韩国欧美三级| 中文字幕欧美区| 日本sm残虐另类| 精品视频色一区| 国产精品网站在线观看| 久久av中文字幕片| 欧美日韩国产a| 亚洲欧美一区二区在线观看| 国产乱国产乱300精品| 欧美日韩国产高清一区二区| 国产精品久久久久影院| 精品在线观看视频| 日韩小视频在线观看专区| 一区二区不卡在线视频 午夜欧美不卡在| 久久99精品国产.久久久久久| 欧美亚洲日本国产| 亚洲女人小视频在线观看| 成人精品视频一区二区三区| 久久亚洲综合色| 激情六月婷婷久久| 欧美精品一区二区三区一线天视频 | 国精品**一区二区三区在线蜜桃| 欧美性色综合网| |精品福利一区二区三区| 国产高清不卡二三区| 欧美成人精品高清在线播放| 日本视频一区二区三区| 欧美剧情电影在线观看完整版免费励志电影 | 日韩国产欧美三级| 欧美精品1区2区| 日韩精品国产精品| 欧美一区二区三区视频| 日韩1区2区3区| 日韩精品一区二区三区在线播放 | 一区二区三区在线观看视频| 欧洲人成人精品| 石原莉奈一区二区三区在线观看| 精品视频123区在线观看| 视频一区二区国产| 精品久久久久久久久久久久久久久| 久久99热这里只有精品| 精品国产乱码久久久久久1区2区| 久国产精品韩国三级视频| 精品成人在线观看| 丁香亚洲综合激情啪啪综合| 亚洲欧美自拍偷拍| 欧美三级日韩三级| 精品一区二区三区在线播放视频| 久久久精品国产免费观看同学| 国产在线精品一区在线观看麻豆| 91麻豆精品国产自产在线观看一区 | 精品少妇一区二区三区日产乱码 | 精品久久人人做人人爰| 欧美日韩一区精品| 免费成人在线观看| 欧美激情中文字幕一区二区| 欧美性受极品xxxx喷水| 日韩成人一级大片| 国产精品久久久久久久久免费丝袜 | 九色porny丨国产精品| 精品在线观看免费| 国产成人免费网站| 成人不卡免费av| 日韩欧美久久一区| 亚洲色图制服诱惑| 狠狠色综合日日| 91麻豆国产精品久久| 日韩欧美中文字幕制服| 日韩成人免费电影| 99re66热这里只有精品3直播| 欧美喷潮久久久xxxxx| 日韩欧美专区在线| 亚洲制服丝袜av| 91小宝寻花一区二区三区| 日韩精品中文字幕在线不卡尤物 | 成人动漫中文字幕| 成人动漫中文字幕| 2021国产精品久久精品| 色婷婷一区二区三区四区| 538在线一区二区精品国产| 国内久久婷婷综合| 亚洲欧美一区二区三区孕妇| 国产ts人妖一区二区| 欧美日韩高清影院| 中文字幕日韩一区| 美女国产一区二区三区| 在线观看91av| 午夜日韩在线观看| 中文字幕在线观看不卡| 国产精品欧美一区喷水| 春色校园综合激情亚洲| 日韩午夜在线观看| 欧美中文字幕一二三区视频| 国产成人av电影免费在线观看| 首页综合国产亚洲丝袜| 一区二区三区成人| √…a在线天堂一区| 欧美激情在线一区二区三区| 精品久久久三级丝袜| 欧美色大人视频| 日本午夜一区二区| 亚洲素人一区二区| 欧美无人高清视频在线观看| 另类专区欧美蜜桃臀第一页| 久久精品人人做人人综合| 成人黄色av电影| 亚洲国产成人av| 欧美一区二区三区系列电影| 日本91福利区| 1区2区3区欧美| 亚洲精品在线免费播放| 99视频热这里只有精品免费| 亚洲成a人v欧美综合天堂下载| 日韩视频中午一区| 欧美日韩免费高清一区色橹橹| 麻豆一区二区三| 国产精品成人一区二区艾草| 日韩欧美国产一区在线观看| 在线观看一区日韩| 高清视频一区二区| 蜜臀99久久精品久久久久久软件| 亚洲丝袜另类动漫二区| 欧美成人精品福利| 日韩小视频在线观看专区| 欧美无砖砖区免费| 欧美视频在线一区| 国产麻豆精品95视频| 91色综合久久久久婷婷| 懂色一区二区三区免费观看| 免费欧美日韩国产三级电影| 精品无人码麻豆乱码1区2区| 高清国产一区二区| 久久精品视频在线看| 国产suv一区二区三区88区| 一区二区三区四区av| 日韩伦理电影网| 亚洲欧美另类小说| 国产69精品久久久久777| 欧美国产1区2区| 自拍av一区二区三区| 国产91精品一区二区麻豆亚洲| 欧美日韩一卡二卡三卡 | 国产精品一卡二卡在线观看| 国产91露脸合集magnet | 欧美xxxxx裸体时装秀| 久久精品夜色噜噜亚洲a∨ | 色综合天天综合网天天狠天天 | 日日夜夜一区二区| 韩国v欧美v亚洲v日本v| 99国产精品国产精品毛片| 99re成人在线| 日韩免费观看2025年上映的电影| 日韩精品在线看片z| 中文字幕在线免费不卡| 日韩国产精品大片| 成人精品免费看| 欧美一区二区国产| 18成人在线视频| 蜜臀av一级做a爰片久久| 成人免费av网站| 久久精品夜夜夜夜久久| 亚洲一区二区三区自拍| 国产福利不卡视频| 日韩欧美亚洲一区二区| 亚洲与欧洲av电影| 成人av在线看| 精品99久久久久久| 午夜国产精品一区| 99精品视频一区二区三区| 欧美一级一级性生活免费录像| 樱花草国产18久久久久| 99久久久国产精品免费蜜臀| 国产精品理论片| 国产乱子轮精品视频| 亚洲精品国产品国语在线app| 成人在线综合网| 中文字幕第一区综合| 91在线精品秘密一区二区| 欧美va在线播放| 亚洲综合无码一区二区| 国产麻豆9l精品三级站| 欧美一区二区三区四区高清| 五月综合激情网| 经典三级一区二区| 91老师片黄在线观看| 91精品视频网| 精品粉嫩aⅴ一区二区三区四区| 亚洲不卡一区二区三区| 欧美性三三影院| 亚洲综合色噜噜狠狠| 91浏览器在线视频| 成人免费在线视频| 91麻豆国产自产在线观看| 亚洲男女一区二区三区| 99精品国产视频| 亚洲永久精品大片|