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

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

?? alps_tdlb7.c

?? linux dvb的文件
?? C
字號:
/*    Driver for Alps TDLB7 Frontend    Copyright (C) 1999 Juergen Peitz <peitz@snafu.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.*//*         Wrote this code mainly to get my own card running. It's working for me, but I    hope somebody who knows more about linux programming and the DVB driver can     improve it.        Reused a lot from the existing driver and tuner code.    Thanks to everybody who worked on it!        This driver needs a copy of the microcode file 'Sc_main.mc' from the Haupauge     windows driver in the 'usr/lib/DVB/driver/frontends' directory.      You can also pass the complete file name with the module parameter 'mcfile'.        The code only needs to be loaded once after a power on. Because loading the     microcode to the card takes some time, you can use the 'loadcode=0' module     parameter, if you only want to reload the dvb driver.              Juergen Peitz    */  #define __KERNEL_SYSCALLS__#include <linux/module.h>#include <linux/init.h>#include <linux/vmalloc.h>#include <linux/fs.h>#include <linux/unistd.h>#include "compat.h"#include "dvb_frontend.h"static int debug = 0;static int loadcode = 1;static char * mcfile = "/usr/lib/DVB/driver/frontends/Sc_main.mc";#define dprintk	if (debug) printk/* microcode size for sp8870 */#define SP8870_CODE_SIZE 16382/* starting point for microcode in file 'Sc_main.mc' */#define SP8870_CODE_OFFSET 0x0Astatic int errno;staticstruct dvb_frontend_info tdlb7_info = {	name: "Alps TDLB7",	type: FE_OFDM,	frequency_min: 470000000,	frequency_max: 860000000,	frequency_stepsize: 166666,#if 0    	frequency_tolerance: ???,	symbol_rate_min: ???,	symbol_rate_max: ???,	symbol_rate_tolerance: ???,	notifier_delay: 0,#endif	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_FEC_AUTO |	      FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64};staticint sp8870_writereg (struct dvb_i2c_bus *i2c, u16 reg, u16 data){        u8 buf [] = { reg >> 8, reg & 0xff, data >> 8, data & 0xff };	struct i2c_msg msg = { addr: 0x71, flags: 0, buf: buf, len: 4 };	int err;        if ((err = i2c->xfer (i2c, &msg, 1)) != 1) {		dprintk ("%s: writereg error (err == %i, reg == 0x%02x, data == 0x%02x)\n", __FUNCTION__, err, reg, data);		return -EREMOTEIO;	}        return 0;}staticu16 sp8870_readreg (struct dvb_i2c_bus *i2c, u16 reg){	int ret;	u8 b0 [] = { reg >> 8 , reg & 0xff };	u8 b1 [] = { 0, 0 };	struct i2c_msg msg [] = { { addr: 0x71, flags: 0, buf: b0, len: 2 },			   { addr: 0x71, flags: I2C_M_RD, buf: b1, len: 2 } };	ret = i2c->xfer (i2c, msg, 2);	if (ret != 2)		dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret);	return (b1[0] << 8 | b1[1]);}staticint sp5659_write (struct dvb_i2c_bus *i2c, u8 data [4]){        int ret;        struct i2c_msg msg = { addr: 0x60, flags: 0, buf: data, len: 4 };        ret = i2c->xfer (i2c, &msg, 1);        if (ret != 1)                printk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret);        return (ret != 1) ? -1 : 0;}staticint sp5659_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq, u8 pwr){        u32 div = (freq + 36200000) / 166666;        u8 buf [4] = { (div >> 8) & 0x7f, div & 0xff, 0x85, (pwr << 6)};	return sp5659_write (i2c, buf);}staticint sp8870_read_code(const char *fn, char **fp){        int fd;	loff_t l;	char *dp;	fd = open(fn, 0, 0);	if (fd == -1) {                printk(KERN_INFO "%s: Unable to load '%s'.\n", __FUNCTION__, fn);		return -1;	}	l = lseek(fd, 0L, 2);	if (l <= 0 || l < SP8870_CODE_OFFSET+SP8870_CODE_SIZE) {	        printk(KERN_INFO "%s: code file too small '%s'\n", __FUNCTION__, fn);		sys_close(fd);		return -1;	}	lseek(fd, SP8870_CODE_OFFSET, 0);	*fp= dp = vmalloc(SP8870_CODE_SIZE);	if (dp == NULL)	{		printk(KERN_INFO "%s: Out of memory loading '%s'.\n", __FUNCTION__, fn);		sys_close(fd);		return -1;	}	if (read(fd, dp, SP8870_CODE_SIZE) != SP8870_CODE_SIZE) {		printk(KERN_INFO "%s: Failed to read '%s'.\n",__FUNCTION__, fn);		vfree(dp);		sys_close(fd);		return -1;	}	sys_close(fd);	*fp = dp;	return 0;}static int sp8870_load_code(struct dvb_i2c_bus *i2c){	/* this takes a long time. is there a way to do it faster? */	char *lcode;	struct i2c_msg msg;	unsigned char buf[255];	int err;	int p=0;	int c;	mm_segment_t fs = get_fs();	// system controller stop 	sp8870_writereg(i2c,0x0F00,0x0000);	// instruction RAM register hiword	sp8870_writereg(i2c,0x8F08,((SP8870_CODE_SIZE/2) & 0xFFFF));	// instruction RAM MWR	sp8870_writereg(i2c,0x8F0A,((SP8870_CODE_SIZE/2) >> 16));	set_fs(get_ds());        if (sp8870_read_code(mcfile,(char**) &lcode)<0) return -1;	set_fs(fs);	while (p<SP8870_CODE_SIZE){		c = (p<=SP8870_CODE_SIZE-252) ? 252 : SP8870_CODE_SIZE-p;		buf[0]=0xCF;		buf[1]=0x0A;		memcpy(&buf[2],lcode+p,c);		c+=2;		msg.addr=0x71;		msg.flags=0;		msg.buf=buf;		msg.len=c;        	if ((err = i2c->xfer (i2c, &msg, 1)) != 1) {			dprintk ("%s: i2c error (err == %i)\n",				 __FUNCTION__, err);        		vfree(lcode);			return -EREMOTEIO;		}		p+=252;	}        vfree(lcode);	return 0;};staticint sp8870_init (struct dvb_i2c_bus *i2c){	dprintk ("%s\n", __FUNCTION__);	// system controller stop 	sp8870_writereg(i2c,0x0F00,0x0000);	// ADC mode: 2 for MT8872, 3 for MT8870/8871 	sp8870_writereg(i2c,0x0301,0x0003);	// Reed Solomon parity bytes passed to output	sp8870_writereg(i2c,0x0C13,0x0001);	// MPEG clock is suppressed if no valid data	sp8870_writereg(i2c,0x0C14,0x0001);	// sample rate correction bit [23..17]	sp8870_writereg(i2c,0x0319,0x000A);	// sample rate correction bit [16..0]	sp8870_writereg(i2c,0x031A,0x0AAB);	// integer carrier offset	sp8870_writereg(i2c,0x0309,0x0400);	// fractional carrier offset	sp8870_writereg(i2c,0x030A,0x0000);	// filter for 8 Mhz channel 	sp8870_writereg(i2c,0x0311,0x0000);	// scan order: 2k first = 0x0000, 8k first = 0x0001 	sp8870_writereg(i2c,0x0338,0x0000);	return 0;}staticint tdlb7_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, &tdlb7_info, sizeof(struct dvb_frontend_info));		break;        case FE_READ_STATUS:	{		fe_status_t *status = arg;		int sync = sp8870_readreg (i2c, 0x0200);		int signal = 0xff-sp8870_readreg (i2c, 0x303);		*status=0;		if (signal>10) // FIXME: is 10 the right value ?			*status |= FE_HAS_SIGNAL;		if (sync&0x04) // FIXME: find criteria			*status |= FE_HAS_CARRIER;		if (sync&0x04) // FIXME			*status |= FE_HAS_VITERBI;		if (sync&0x08) // FIXME			*status |= FE_HAS_SYNC;		if (sync&0x04)			*status |= FE_HAS_LOCK;		break;	}        case FE_READ_BER:	{		u32 *ber=(u32 *) arg;		// bit error rate before Viterbi		*ber=sp8870_readreg(i2c,0x0C07);		break;	}        case FE_READ_SIGNAL_STRENGTH:		// FIXME: correct registers ?	{		*((u16*) arg) = 0xffff-((sp8870_readreg (i2c, 0x306) << 8) | sp8870_readreg (i2c, 0x303));		break;	}        case FE_READ_SNR:			// not supported by hardware?	{		s32 *snr=(s32 *) arg;                *snr=0;  		return -EOPNOTSUPP;	}	case FE_READ_UNCORRECTED_BLOCKS: 	// not supported by hardware?	{		u32 *ublocks=(u32 *) arg;		*ublocks=0;  		return -EOPNOTSUPP;	}        case FE_SET_FRONTEND:        {		struct dvb_frontend_parameters *p = arg;		// system controller stop 		sp8870_writereg(i2c,0x0F00,0x0000);				sp5659_set_tv_freq (i2c, p->frequency, 0);				// sample rate correction bit [23..17]		sp8870_writereg(i2c,0x0319,0x000A);				// sample rate correction bit [16..0]		sp8870_writereg(i2c,0x031A,0x0AAB);		// integer carrier offset 		sp8870_writereg(i2c,0x0309,0x0400);		// fractional carrier offset		sp8870_writereg(i2c,0x030A,0x0000);		// filter for 6/7/8 Mhz channel		if (p->u.ofdm.bandwidth == BANDWIDTH_6_MHZ)			sp8870_writereg(i2c,0x0311,0x0002);		else if (p->u.ofdm.bandwidth == BANDWIDTH_7_MHZ)			sp8870_writereg(i2c,0x0311,0x0001);		else			sp8870_writereg(i2c,0x0311,0x0000);		// scan order: 2k first = 0x0000, 8k first = 0x0001 		if (p->u.ofdm.transmission_mode == TRANSMISSION_MODE_2K)			sp8870_writereg(i2c,0x0338,0x0000);		else			sp8870_writereg(i2c,0x0338,0x0001);		// instruction RAM register loword		sp8870_writereg(i2c,0x0F09,0x0000);		// instruction RAM register hiword		sp8870_writereg(i2c,0x0F08,0x0000);		// system controller start		sp8870_writereg(i2c,0x0F00,0x0001);		break;        }	case FE_GET_FRONTEND:  // FIXME: read known values back from Hardware...	{		break;	}        case FE_SLEEP:			// is this supported by hardware?		return -EOPNOTSUPP;        case FE_INIT:		return sp8870_init (i2c);	default:		return -EOPNOTSUPP;        };        return 0;}staticint tdlb7_attach (struct dvb_i2c_bus *i2c){	struct i2c_msg msg = { addr: 0x71, flags: 0, buf: NULL, len: 0 };	dprintk ("%s\n", __FUNCTION__);	if (i2c->xfer (i2c, &msg, 1) != 1)                return -ENODEV;	if (loadcode) {		dprintk("%s: loading mcfile '%s' !\n", __FUNCTION__, mcfile);		if (sp8870_load_code(i2c)==0)		    dprintk("%s: microcode loaded!\n", __FUNCTION__);	}else{		dprintk("%s: without loading mcfile!\n", __FUNCTION__);	}	dvb_register_frontend (tdlb7_ioctl, i2c, NULL, &tdlb7_info);	return 0;}staticvoid tdlb7_detach (struct dvb_i2c_bus *i2c){	dprintk ("%s\n", __FUNCTION__);	dvb_unregister_frontend (tdlb7_ioctl, i2c);}staticint __init init_tdlb7 (void){	dprintk ("%s\n", __FUNCTION__);	return dvb_register_i2c_device (THIS_MODULE, tdlb7_attach, tdlb7_detach);}staticvoid __exit exit_tdlb7 (void){	dprintk ("%s\n", __FUNCTION__);	dvb_unregister_i2c_device (tdlb7_attach);}module_init(init_tdlb7);module_exit(exit_tdlb7);MODULE_PARM(debug,"i");MODULE_PARM_DESC(debug, "enable verbose debug messages");MODULE_PARM(loadcode,"i");MODULE_PARM_DESC(loadcode, "load tuner microcode");MODULE_PARM(mcfile,"s");MODULE_PARM_DESC(mcfile, "where to find the microcode file");MODULE_DESCRIPTION("TDLB7 DVB-T Frontend");MODULE_AUTHOR("Juergen Peitz");MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区二区av在线| fc2成人免费人成在线观看播放| 国内精品久久久久影院薰衣草| av亚洲精华国产精华精华| 日韩欧美色综合| 亚洲一区二区三区精品在线| 国产a视频精品免费观看| 欧美日韩不卡一区二区| 亚洲美女淫视频| 风流少妇一区二区| 久久女同互慰一区二区三区| 天天色天天爱天天射综合| 色悠久久久久综合欧美99| 国产精品亲子乱子伦xxxx裸| 国产在线精品不卡| 日韩欧美色电影| 蜜臀av性久久久久蜜臀aⅴ流畅| 日本久久电影网| 亚洲天堂网中文字| 成人久久18免费网站麻豆| 国产视频一区在线观看| 国产一区二区三区精品欧美日韩一区二区三区 | 久久毛片高清国产| 久久99国产精品免费| 欧美一区二区久久| 免费在线看成人av| 日韩欧美国产三级| 精品一区二区三区欧美| 日韩欧美在线综合网| 久久电影网电视剧免费观看| 欧美肥妇bbw| 麻豆freexxxx性91精品| 日韩精品专区在线影院重磅| 精品一区二区免费看| 欧美精品一区二区高清在线观看| 久久精品国产999大香线蕉| 日韩午夜激情av| 免费在线观看一区| 久久色在线观看| 国产精品1区二区.| 综合久久久久综合| 日本韩国欧美一区二区三区| 亚洲一区二区欧美| 欧美一区二区三区男人的天堂| 蜜桃视频一区二区| 精品国产1区2区3区| 懂色av一区二区三区蜜臀| 夜夜夜精品看看| 欧美在线观看一二区| 首页国产欧美久久| 久久嫩草精品久久久久| 成av人片一区二区| 午夜视频一区在线观看| 欧美不卡一区二区三区| 成人综合婷婷国产精品久久免费| 中文av一区特黄| 欧美影片第一页| 久久精品999| 国产精品久久久久久妇女6080 | 欧美精品v日韩精品v韩国精品v| 五月天国产精品| 国产人成亚洲第一网站在线播放| aaa亚洲精品一二三区| 亚洲一区二区三区视频在线| 日韩精品一区二区三区在线| eeuss国产一区二区三区| 亚洲一区在线免费观看| wwwwxxxxx欧美| 欧美亚洲另类激情小说| 国产一区二区影院| 亚洲国产视频一区| 国产清纯白嫩初高生在线观看91| 在线欧美日韩精品| 国产99久久久久| 日韩不卡一区二区三区| 中文字幕日韩一区| 精品噜噜噜噜久久久久久久久试看| 91麻豆国产在线观看| 激情图区综合网| 五月开心婷婷久久| 亚洲日本一区二区三区| 国产亚洲精品aa| 在线成人av影院| 色综合久久九月婷婷色综合| 激情综合网av| 日日噜噜夜夜狠狠视频欧美人| 亚洲va韩国va欧美va| 国产亚洲精品aa午夜观看| 欧美老年两性高潮| 色久优优欧美色久优优| 国产成人精品亚洲777人妖| 蜜臀久久99精品久久久久宅男| 亚洲精品videosex极品| 久久香蕉国产线看观看99| 欧美精品乱码久久久久久按摩| 99视频精品全部免费在线| 国产黄色精品视频| 国产一区二区在线电影| 久久精品国产秦先生| 婷婷一区二区三区| 亚洲图片欧美色图| 亚洲精品你懂的| 中文字幕一区二区三区av | 91麻豆精品国产91久久久使用方法| 成人av网址在线| 国产91精品精华液一区二区三区| 久久爱www久久做| 日本视频一区二区| 蜜臀久久久久久久| 日韩成人av影视| 男人的天堂亚洲一区| 青草国产精品久久久久久| 亚洲丶国产丶欧美一区二区三区| 亚洲欧美激情小说另类| 一区二区三区在线视频播放| 一区二区三区在线免费观看| 一区二区三区蜜桃| 亚洲高清在线精品| 丝瓜av网站精品一区二区| 日韩精品每日更新| 麻豆国产精品视频| 国产精品18久久久| 99久久精品国产一区二区三区| jizzjizzjizz欧美| 在线观看亚洲成人| 欧美一区在线视频| 2023国产精华国产精品| 久久九九全国免费| 亚洲男人的天堂一区二区| 亚洲精品国产a久久久久久 | 成人app下载| 91福利资源站| 国产精品免费丝袜| 亚洲精品中文字幕乱码三区| 一区二区三区在线免费播放| 亚洲成av人片在线观看| 麻豆久久久久久| 成人午夜看片网址| 欧美视频在线一区| 精品剧情在线观看| 国产精品不卡视频| 亚洲成人精品一区| 国产一区在线观看麻豆| aaa国产一区| 在线不卡一区二区| 国产女同互慰高潮91漫画| 亚洲精品久久嫩草网站秘色| 裸体在线国模精品偷拍| 成人午夜电影小说| 宅男噜噜噜66一区二区66| 国产精品毛片高清在线完整版| 亚洲国产毛片aaaaa无费看| 久久国产精品区| 91在线看国产| 欧美成人精品3d动漫h| 亚洲欧洲精品一区二区精品久久久 | 日韩电影在线观看电影| 高清国产一区二区| 制服.丝袜.亚洲.中文.综合| 国产日本亚洲高清| 天堂在线一区二区| av在线一区二区三区| 欧美一个色资源| 欧美性一区二区| 亚洲综合在线观看视频| 欧美高清视频在线高清观看mv色露露十八| 国产精品资源网站| 亚洲超碰精品一区二区| 美洲天堂一区二卡三卡四卡视频 | 欧美精品一二三| 欧美日韩电影在线播放| 日韩精品一区二区在线| 久久这里只有精品首页| 国产精品午夜免费| 亚洲6080在线| 国产在线播放一区三区四| 成人午夜av电影| 欧美日韩一级片网站| 精品国产一区二区三区久久影院 | 天堂av在线一区| 韩国在线一区二区| 色综合久久久久网| 日韩欧美激情在线| 亚洲欧洲制服丝袜| 免费观看在线综合| hitomi一区二区三区精品| 91麻豆精品国产| 国产精品三级久久久久三级| 五月天网站亚洲| 成人精品电影在线观看| 欧美卡1卡2卡| 日韩一区中文字幕| 九九九精品视频| 91黄色激情网站| 国产日韩影视精品| 日av在线不卡| 精品视频一区三区九区| 欧美国产精品v| 激情综合色丁香一区二区| 91黄色免费看|