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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? mt312.c

?? linux環(huán)境下的dvb驅(qū)動(dòng)程序
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/*     Driver for Zarlink MT312 Satellite Channel Decoder    Copyright (C) 2003 Andreas Oberritter <obi@linuxtv.org>    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.    References:    http://products.zarlink.com/product_profiles/MT312.htm    http://products.zarlink.com/product_profiles/SL1935.htm*/#include <linux/delay.h>#include <linux/errno.h>#include <linux/init.h>#include <linux/kernel.h>#include <linux/module.h>#include "dvb_frontend.h"#include "mt312.h"#define I2C_ADDR_MT312		0x0e#define I2C_ADDR_SL1935		0x61#define I2C_ADDR_TSA5059	0x61#define MT312_DEBUG		0#define MT312_SYS_CLK		90000000UL	/* 90 MHz */#define MT312_LPOWER_SYS_CLK	60000000UL	/* 60 MHz */#define MT312_PLL_CLK		10000000UL	/* 10 MHz *//* number of active frontends */static int mt312_count = 0;#if MT312_DEBUG == 0#define dprintk(x...)#elsestatic int debug = 0;#define dprintk if(debug == 1) printk#endifstatic struct dvb_frontend_info mt312_info = {	.name = "Zarlink MT312",	.type = FE_QPSK,	.frequency_min = 950000,	.frequency_max = 2150000,	.frequency_stepsize = (MT312_PLL_CLK / 1000) / 128,	/*.frequency_tolerance = 29500,         FIXME: binary compatibility waste? */	.symbol_rate_min = MT312_SYS_CLK / 128,	.symbol_rate_max = MT312_SYS_CLK / 2,	/*.symbol_rate_tolerance = 500,         FIXME: binary compatibility waste? 2% */	.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_5_6 | FE_CAN_FEC_7_8 |	    FE_CAN_FEC_AUTO | FE_CAN_QPSK | FE_CAN_RECOVER |	    FE_CAN_CLEAN_SETUP | FE_CAN_MUTE_TS};static int mt312_read(struct dvb_i2c_bus *i2c,		      const enum mt312_reg_addr reg, void *buf,		      const size_t count){	int ret;	struct i2c_msg msg[2];	u8 regbuf[1] = { reg };	msg[0].addr = I2C_ADDR_MT312;	msg[0].flags = 0;	msg[0].buf = regbuf;	msg[0].len = 1;	msg[1].addr = I2C_ADDR_MT312;	msg[1].flags = I2C_M_RD;	msg[1].buf = buf;	msg[1].len = count;	ret = i2c->xfer(i2c, msg, 2);	if ((ret != 2) && (mt312_count != 0)) {		printk(KERN_ERR "%s: ret == %d\n", __FUNCTION__, ret);		return -EREMOTEIO;	}#if MT312_DEBUG	if(debug) {		int i;		printk(KERN_INFO "R(%d):", reg & 0x7f);		for (i = 0; i < count; i++)			printk(" %02x", ((const u8 *) buf)[i]);		printk("\n");	}#endif	return 0;}static int mt312_write(struct dvb_i2c_bus *i2c,		       const enum mt312_reg_addr reg, const void *src,		       const size_t count){	int ret;	u8 buf[count + 1];	struct i2c_msg msg;#if MT312_DEBUG	if(debug) {		int i;		printk(KERN_INFO "W(%d):", reg & 0x7f);		for (i = 0; i < count; i++)			printk(" %02x", ((const u8 *) src)[i]);		printk("\n");	}#endif	buf[0] = reg;	memcpy(&buf[1], src, count);	msg.addr = I2C_ADDR_MT312;	msg.flags = 0;	msg.buf = buf;	msg.len = count + 1;	ret = i2c->xfer(i2c, &msg, 1);	if (ret != 1) {		printk(KERN_ERR "%s: ret == %d\n", __FUNCTION__, ret);		return -EREMOTEIO;	}	return 0;}static inline int mt312_readreg(struct dvb_i2c_bus *i2c,				const enum mt312_reg_addr reg, u8 *val){	return mt312_read(i2c, reg, val, 1);}static inline int mt312_writereg(struct dvb_i2c_bus *i2c,				 const enum mt312_reg_addr reg, const u8 val){	return mt312_write(i2c, reg, &val, 1);}static int mt312_pll_write(struct dvb_i2c_bus *i2c, const u8 addr,			   u8 * buf, const u8 len){	int ret;	struct i2c_msg msg;	msg.addr = addr;	msg.flags = 0;	msg.buf = buf;	msg.len = len;	if ((ret = mt312_writereg(i2c, GPP_CTRL, 0x40)) < 0)		return ret;	if ((ret = i2c->xfer(i2c, &msg, 1)) != 1)		printk(KERN_ERR "%s: i/o error (ret == %d)\n", __FUNCTION__, ret);	if ((ret = mt312_writereg(i2c, GPP_CTRL, 0x00)) < 0)		return ret;	return 0;}static inline u32 mt312_div(u32 a, u32 b){	return (a + (b / 2)) / b;}static int sl1935_set_tv_freq(struct dvb_i2c_bus *i2c, u32 freq, u32 sr){	/* 155 uA, Baseband Path B */	u8 buf[4] = { 0x00, 0x00, 0x80, 0x00 };	u8 exp;	u32 ref;	u32 div;	if (sr < 10000000) {	/* 1-10 MSym/s: ratio 2 ^ 3 */		exp = 3;		buf[2] |= 0x40;	/* 690 uA */	} else if (sr < 15000000) {	/* 10-15 MSym/s: ratio 2 ^ 4 */		exp = 4;		buf[2] |= 0x20;	/* 330 uA */	} else {		/* 15-45 MSym/s: ratio 2 ^ 7 */		exp = 7;		buf[3] |= 0x08;	/* Baseband Path A */	}	div = mt312_div(MT312_PLL_CLK, 1 << exp);	ref = mt312_div(freq * 1000, div);	mt312_info.frequency_stepsize = mt312_div(div, 1000);	buf[0] = (ref >> 8) & 0x7f;	buf[1] = (ref >> 0) & 0xff;	buf[2] |= (exp - 1);	if (freq < 1550000)		buf[3] |= 0x10;	dprintk(KERN_INFO "synth dword = %02x%02x%02x%02x\n", buf[0],	       buf[1], buf[2], buf[3]);	return mt312_pll_write(i2c, I2C_ADDR_SL1935, buf, sizeof(buf));}static int tsa5059_set_tv_freq(struct dvb_i2c_bus *i2c, u32 freq, u32 sr){	u8 buf[4];	u32 ref = mt312_div(freq, 125);	buf[0] = (ref >> 8) & 0x7f;	buf[1] = (ref >> 0) & 0xff;	buf[2] = 0x84 | ((ref >> 10) & 0x60);	buf[3] = 0x80;		if (freq < 1550000)		buf[3] |= 0x02;	dprintk(KERN_INFO "synth dword = %02x%02x%02x%02x\n", buf[0],	       buf[1], buf[2], buf[3]);	return mt312_pll_write(i2c, I2C_ADDR_TSA5059, buf, sizeof(buf));}static int mt312_reset(struct dvb_i2c_bus *i2c, const u8 full){	return mt312_writereg(i2c, RESET, full ? 0x80 : 0x40);}static int mt312_init(struct dvb_i2c_bus *i2c, const long id, u8 pll){	int ret;	u8 buf[2];	/* wake up */	if ((ret = mt312_writereg(i2c, CONFIG, (pll == 60 ? 0x88 : 0x8c))) < 0)		return ret;	/* wait at least 150 usec */	udelay(150);	/* full reset */	if ((ret = mt312_reset(i2c, 1)) < 0)		return ret;// Per datasheet, write correct values. 09/28/03 ACCJr.// If we don't do this, we won't get FE_HAS_VITERBI in the VP310.	{		u8 buf_def[8]={0x14, 0x12, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00};		if ((ret = mt312_write(i2c, VIT_SETUP, buf_def, sizeof(buf_def))) < 0)			return ret;	}	/* SYS_CLK */	buf[0] = mt312_div((pll == 60 ? MT312_LPOWER_SYS_CLK : MT312_SYS_CLK) * 2, 1000000);	/* DISEQC_RATIO */	buf[1] = mt312_div(MT312_PLL_CLK, 15000 * 4);	if ((ret = mt312_write(i2c, SYS_CLK, buf, sizeof(buf))) < 0)		return ret;	if ((ret = mt312_writereg(i2c, SNR_THS_HIGH, 0x32)) < 0)		return ret;	if ((ret = mt312_writereg(i2c, OP_CTRL, 0x53)) < 0)		return ret;	/* TS_SW_LIM */	buf[0] = 0x8c;	buf[1] = 0x98;	if ((ret = mt312_write(i2c, TS_SW_LIM_L, buf, sizeof(buf))) < 0)		return ret;	if ((ret = mt312_writereg(i2c, CS_SW_LIM, 0x69)) < 0)		return ret;	return 0;}static int mt312_send_master_cmd(struct dvb_i2c_bus *i2c,				 const struct dvb_diseqc_master_cmd *c){	int ret;	u8 diseqc_mode;	if ((c->msg_len == 0) || (c->msg_len > sizeof(c->msg)))		return -EINVAL;	if ((ret = mt312_readreg(i2c, DISEQC_MODE, &diseqc_mode)) < 0)		return ret;	if ((ret =	     mt312_write(i2c, (0x80 | DISEQC_INSTR), c->msg, c->msg_len)) < 0)		return ret;	if ((ret =	     mt312_writereg(i2c, DISEQC_MODE,			    (diseqc_mode & 0x40) | ((c->msg_len - 1) << 3)			    | 0x04)) < 0)		return ret;	/* set DISEQC_MODE[2:0] to zero if a return message is expected */	if (c->msg[0] & 0x02)		if ((ret =		     mt312_writereg(i2c, DISEQC_MODE, (diseqc_mode & 0x40))) < 0)			return ret;	return 0;}static int mt312_recv_slave_reply(struct dvb_i2c_bus *i2c,				  struct dvb_diseqc_slave_reply *r){	/* TODO */	return -EOPNOTSUPP;}static int mt312_send_burst(struct dvb_i2c_bus *i2c, const fe_sec_mini_cmd_t c){	const u8 mini_tab[2] = { 0x02, 0x03 };	int ret;	u8 diseqc_mode;	if (c > SEC_MINI_B)		return -EINVAL;	if ((ret = mt312_readreg(i2c, DISEQC_MODE, &diseqc_mode)) < 0)		return ret;	if ((ret =	     mt312_writereg(i2c, DISEQC_MODE,			    (diseqc_mode & 0x40) | mini_tab[c])) < 0)		return ret;	return 0;}static int mt312_set_tone(struct dvb_i2c_bus *i2c, const fe_sec_tone_mode_t t){	const u8 tone_tab[2] = { 0x01, 0x00 };	int ret;	u8 diseqc_mode;	if (t > SEC_TONE_OFF)		return -EINVAL;	if ((ret = mt312_readreg(i2c, DISEQC_MODE, &diseqc_mode)) < 0)		return ret;	if ((ret =	     mt312_writereg(i2c, DISEQC_MODE,			    (diseqc_mode & 0x40) | tone_tab[t])) < 0)		return ret;	return 0;}static int mt312_set_voltage(struct dvb_i2c_bus *i2c, const fe_sec_voltage_t v){	const u8 volt_tab[3] = { 0x00, 0x40, 0x00 };	if (v > SEC_VOLTAGE_OFF)		return -EINVAL;	return mt312_writereg(i2c, DISEQC_MODE, volt_tab[v]);}static int mt312_read_status(struct dvb_i2c_bus *i2c, fe_status_t *s, const long id){	int ret;	u8 status[3], vit_mode;	*s = 0;	if ((ret = mt312_read(i2c, QPSK_STAT_H, status, sizeof(status))) < 0)		return ret;	dprintk(KERN_DEBUG "QPSK_STAT_H: 0x%02x, QPSK_STAT_L: 0x%02x, FEC_STATUS: 0x%02x\n", status[0], status[1], status[2]);	if (status[0] & 0xc0)		*s |= FE_HAS_SIGNAL;	/* signal noise ratio */	if (status[0] & 0x04)		*s |= FE_HAS_CARRIER;	/* qpsk carrier lock */	if (status[2] & 0x02)		*s |= FE_HAS_VITERBI;	/* viterbi lock */	if (status[2] & 0x04)		*s |= FE_HAS_SYNC;	/* byte align lock */

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
奇米影视在线99精品| 日韩av在线免费观看不卡| 欧美日本精品一区二区三区| 国产综合色在线视频区| 亚洲一区二区视频在线观看| 久久欧美一区二区| 欧美日韩日本视频| 成人av电影免费在线播放| 美女视频网站黄色亚洲| 亚洲美女电影在线| 国产清纯白嫩初高生在线观看91 | 五月婷婷另类国产| 中文字幕一区三区| 久久久蜜臀国产一区二区| 欧美一区在线视频| 欧美午夜电影网| 97aⅴ精品视频一二三区| 国产一区二区三区高清播放| 日韩经典一区二区| 亚洲不卡在线观看| 一区二区三区加勒比av| 国产精品五月天| 久久久.com| 久久综合丝袜日本网| 欧美一级一区二区| 欧美精品三级在线观看| 欧美在线看片a免费观看| 91网站在线播放| 懂色av中文字幕一区二区三区| 美女任你摸久久| 日本美女一区二区三区视频| 午夜av一区二区| 亚洲va在线va天堂| 午夜精品视频一区| 亚洲成人高清在线| 亚洲国产cao| 亚洲国产成人91porn| 亚洲国产欧美一区二区三区丁香婷| 亚洲免费电影在线| 一片黄亚洲嫩模| 精品一二三四区| 天堂午夜影视日韩欧美一区二区| 一区二区三区在线观看国产| 亚洲另类春色国产| 一二三四社区欧美黄| 亚洲精品免费一二三区| 一区二区三区 在线观看视频| 亚洲欧美日韩精品久久久久| 亚洲精品日日夜夜| 亚洲午夜在线电影| 日本美女视频一区二区| 91小视频免费观看| 99久久综合99久久综合网站| 99久久免费精品高清特色大片| 成人高清在线视频| 色偷偷久久一区二区三区| 欧美亚洲动漫另类| 欧美一区二区成人6969| 欧美成人午夜电影| 国产欧美日韩在线| 亚洲日本中文字幕区| 一区av在线播放| 另类小说图片综合网| 国产一区二区导航在线播放| 成人精品视频一区二区三区| 91浏览器入口在线观看| 欧美日韩的一区二区| 精品卡一卡二卡三卡四在线| 亚洲国产精品成人综合色在线婷婷| 国产精品久久久久久户外露出 | 日韩av电影免费观看高清完整版在线观看| 日本中文字幕一区二区视频| 国产精品综合二区| 日本韩国精品一区二区在线观看| 69久久99精品久久久久婷婷 | 成人免费视频视频在线观看免费| a4yy欧美一区二区三区| 欧美巨大另类极品videosbest| 欧美成人精精品一区二区频| 国产精品久久毛片a| 亚洲制服丝袜在线| 国内精品嫩模私拍在线| 一本久道久久综合中文字幕| 欧美精品粉嫩高潮一区二区| 欧美激情在线免费观看| 亚洲va天堂va国产va久| 高清国产一区二区| 欧美猛男gaygay网站| 国产欧美视频一区二区三区| 同产精品九九九| 成人精品免费看| 亚洲国产日韩精品| 精品一区二区免费看| 欧美亚一区二区| 国产欧美一区二区精品秋霞影院 | 国产精品高潮呻吟久久| 日韩国产精品久久| 岛国av在线一区| 日韩午夜激情免费电影| 亚洲日本成人在线观看| 国产一区二区三区黄视频| 欧美视频在线播放| 中文字幕不卡在线| 蓝色福利精品导航| 欧美色综合影院| 国产精品色呦呦| 另类综合日韩欧美亚洲| 欧美日韩一区精品| 亚洲三级理论片| 国产盗摄女厕一区二区三区| 51精品国自产在线| 一区二区三区中文字幕| 国产盗摄一区二区| 精品国产乱码久久久久久1区2区| 亚洲精品视频自拍| 成人国产精品免费| 久久人人超碰精品| 精品一二三四在线| 69久久夜色精品国产69蝌蚪网| 亚洲男人的天堂一区二区| 成人性生交大片免费看中文网站| 日韩欧美一区二区免费| 亚洲成av人片在线观看无码| 色综合久久中文综合久久牛| 久久精品水蜜桃av综合天堂| 久久国产麻豆精品| 欧美一二三在线| 日本最新不卡在线| 欧美丰满高潮xxxx喷水动漫| 亚洲国产日产av| 91黄色激情网站| 亚洲自拍与偷拍| 欧美无砖专区一中文字| 一区二区三区中文字幕电影 | 国产一区二区在线看| 日韩精品资源二区在线| 免费xxxx性欧美18vr| 日韩欧美国产1| 精品无码三级在线观看视频| 日韩女优毛片在线| 韩国理伦片一区二区三区在线播放 | 国产精品午夜免费| 99精品视频在线观看| 国产精品久久久久久一区二区三区 | 久久99久久99精品免视看婷婷| 欧美成人女星排行榜| 精品亚洲成a人| 国产亚洲欧洲一区高清在线观看| 国产精品一区二区在线观看网站| 久久久精品tv| 成人激情av网| 一区二区三区四区在线免费观看 | 亚洲精品一线二线三线| 国产精品主播直播| 中文字幕一区二区5566日韩| 91国偷自产一区二区三区成为亚洲经典| 亚洲欧美aⅴ...| 欧美精品久久天天躁| 免费亚洲电影在线| 久久精品水蜜桃av综合天堂| 成人精品国产一区二区4080| 亚洲日本丝袜连裤袜办公室| 欧美日韩在线观看一区二区 | 国产激情视频一区二区三区欧美| 国产亚洲美州欧州综合国| 成人爱爱电影网址| 亚洲最大成人网4388xx| 91麻豆精品国产自产在线| 国产伦理精品不卡| 亚洲色图在线视频| 日韩午夜电影av| 国产不卡在线一区| 午夜精品国产更新| 日本一区二区免费在线| 欧美性做爰猛烈叫床潮| 国产精品自拍在线| 亚洲免费观看高清完整版在线观看| 欧美日韩久久久| 国产福利一区二区三区视频| 亚洲精品老司机| 久久综合久久99| 色狠狠桃花综合| 国产在线播放一区| 亚洲一区在线电影| 久久久久久电影| 欧美片网站yy| 成人毛片视频在线观看| 日韩av高清在线观看| 中文字幕亚洲精品在线观看| 欧美一区二区啪啪| 91久久一区二区| 福利视频网站一区二区三区| 香蕉成人啪国产精品视频综合网| 国产欧美精品一区二区色综合 | 91看片淫黄大片一级| 蜜臀久久久久久久| 亚洲精品国产视频| 国产亚洲欧美一级| 欧美一级欧美三级| 欧美性xxxxxxxx|