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

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

?? tea5767.c

?? linux 內(nèi)核源代碼
?? C
字號(hào):
/* * For Philips TEA5767 FM Chip used on some TV Cards like Prolink Pixelview * I2C address is allways 0xC0. * * * Copyright (c) 2005 Mauro Carvalho Chehab (mchehab@infradead.org) * This code is placed under the terms of the GNU General Public License * * tea5767 autodetection thanks to Torsten Seeboth and Atsushi Nakagawa * from their contributions on DScaler. */#include <linux/i2c.h>#include <linux/delay.h>#include <linux/videodev.h>#include "tuner-i2c.h"#include "tea5767.h"static int debug = 0;module_param(debug, int, 0644);MODULE_PARM_DESC(debug, "enable verbose debug messages");#define PREFIX "tea5767 "struct tea5767_priv {	struct tuner_i2c_props i2c_props;	u32 frequency;};/*****************************************************************************//****************************** * Write mode register values * ******************************//* First register */#define TEA5767_MUTE		0x80	/* Mutes output */#define TEA5767_SEARCH		0x40	/* Activates station search *//* Bits 0-5 for divider MSB *//* Second register *//* Bits 0-7 for divider LSB *//* Third register *//* Station search from botton to up */#define TEA5767_SEARCH_UP	0x80/* Searches with ADC output = 10 */#define TEA5767_SRCH_HIGH_LVL	0x60/* Searches with ADC output = 10 */#define TEA5767_SRCH_MID_LVL	0x40/* Searches with ADC output = 5 */#define TEA5767_SRCH_LOW_LVL	0x20/* if on, div=4*(Frf+Fif)/Fref otherwise, div=4*(Frf-Fif)/Freq) */#define TEA5767_HIGH_LO_INJECT	0x10/* Disable stereo */#define TEA5767_MONO		0x08/* Disable right channel and turns to mono */#define TEA5767_MUTE_RIGHT	0x04/* Disable left channel and turns to mono */#define TEA5767_MUTE_LEFT	0x02#define TEA5767_PORT1_HIGH	0x01/* Fourth register */#define TEA5767_PORT2_HIGH	0x80/* Chips stops working. Only I2C bus remains on */#define TEA5767_STDBY		0x40/* Japan freq (76-108 MHz. If disabled, 87.5-108 MHz */#define TEA5767_JAPAN_BAND	0x20/* Unselected means 32.768 KHz freq as reference. Otherwise Xtal at 13 MHz */#define TEA5767_XTAL_32768	0x10/* Cuts weak signals */#define TEA5767_SOFT_MUTE	0x08/* Activates high cut control */#define TEA5767_HIGH_CUT_CTRL	0x04/* Activates stereo noise control */#define TEA5767_ST_NOISE_CTL	0x02/* If activate PORT 1 indicates SEARCH or else it is used as PORT1 */#define TEA5767_SRCH_IND	0x01/* Fifth register *//* By activating, it will use Xtal at 13 MHz as reference for divider */#define TEA5767_PLLREF_ENABLE	0x80/* By activating, deemphasis=50, or else, deemphasis of 50us */#define TEA5767_DEEMPH_75	0X40/***************************** * Read mode register values * *****************************//* First register */#define TEA5767_READY_FLAG_MASK	0x80#define TEA5767_BAND_LIMIT_MASK	0X40/* Bits 0-5 for divider MSB after search or preset *//* Second register *//* Bits 0-7 for divider LSB after search or preset *//* Third register */#define TEA5767_STEREO_MASK	0x80#define TEA5767_IF_CNTR_MASK	0x7f/* Fourth register */#define TEA5767_ADC_LEVEL_MASK	0xf0/* should be 0 */#define TEA5767_CHIP_ID_MASK	0x0f/* Fifth register *//* Reserved for future extensions */#define TEA5767_RESERVED_MASK	0xffenum tea5767_xtal_freq {	TEA5767_LOW_LO_32768    = 0,	TEA5767_HIGH_LO_32768   = 1,	TEA5767_LOW_LO_13MHz    = 2,	TEA5767_HIGH_LO_13MHz   = 3,};/*****************************************************************************/static void tea5767_status_dump(unsigned char *buffer){	unsigned int div, frq;	if (TEA5767_READY_FLAG_MASK & buffer[0])		printk(PREFIX "Ready Flag ON\n");	else		printk(PREFIX "Ready Flag OFF\n");	if (TEA5767_BAND_LIMIT_MASK & buffer[0])		printk(PREFIX "Tuner at band limit\n");	else		printk(PREFIX "Tuner not at band limit\n");	div = ((buffer[0] & 0x3f) << 8) | buffer[1];	switch (TEA5767_HIGH_LO_32768) {	case TEA5767_HIGH_LO_13MHz:		frq = (div * 50000 - 700000 - 225000) / 4;	/* Freq in KHz */		break;	case TEA5767_LOW_LO_13MHz:		frq = (div * 50000 + 700000 + 225000) / 4;	/* Freq in KHz */		break;	case TEA5767_LOW_LO_32768:		frq = (div * 32768 + 700000 + 225000) / 4;	/* Freq in KHz */		break;	case TEA5767_HIGH_LO_32768:	default:		frq = (div * 32768 - 700000 - 225000) / 4;	/* Freq in KHz */		break;	}	buffer[0] = (div >> 8) & 0x3f;	buffer[1] = div & 0xff;	printk(PREFIX "Frequency %d.%03d KHz (divider = 0x%04x)\n",	       frq / 1000, frq % 1000, div);	if (TEA5767_STEREO_MASK & buffer[2])		printk(PREFIX "Stereo\n");	else		printk(PREFIX "Mono\n");	printk(PREFIX "IF Counter = %d\n", buffer[2] & TEA5767_IF_CNTR_MASK);	printk(PREFIX "ADC Level = %d\n",	       (buffer[3] & TEA5767_ADC_LEVEL_MASK) >> 4);	printk(PREFIX "Chip ID = %d\n", (buffer[3] & TEA5767_CHIP_ID_MASK));	printk(PREFIX "Reserved = 0x%02x\n",	       (buffer[4] & TEA5767_RESERVED_MASK));}/* Freq should be specifyed at 62.5 Hz */static int set_radio_freq(struct dvb_frontend *fe,			  struct analog_parameters *params){	struct tea5767_priv *priv = fe->tuner_priv;	unsigned int frq = params->frequency;	unsigned char buffer[5];	unsigned div;	int rc;	tuner_dbg("radio freq = %d.%03d MHz\n", frq/16000,(frq/16)%1000);	/* Rounds freq to next decimal value - for 62.5 KHz step */	/* frq = 20*(frq/16)+radio_frq[frq%16]; */	buffer[2] = TEA5767_PORT1_HIGH;	buffer[3] = TEA5767_PORT2_HIGH | TEA5767_HIGH_CUT_CTRL |		    TEA5767_ST_NOISE_CTL | TEA5767_JAPAN_BAND;	buffer[4] = 0;	if (params->audmode == V4L2_TUNER_MODE_MONO) {		tuner_dbg("TEA5767 set to mono\n");		buffer[2] |= TEA5767_MONO;	} else {		tuner_dbg("TEA5767 set to stereo\n");	}	/* Should be replaced */	switch (TEA5767_HIGH_LO_32768) {	case TEA5767_HIGH_LO_13MHz:		tuner_dbg("radio HIGH LO inject xtal @ 13 MHz\n");		buffer[2] |= TEA5767_HIGH_LO_INJECT;		buffer[4] |= TEA5767_PLLREF_ENABLE;		div = (frq * (4000 / 16) + 700000 + 225000 + 25000) / 50000;		break;	case TEA5767_LOW_LO_13MHz:		tuner_dbg("radio LOW LO inject xtal @ 13 MHz\n");		buffer[4] |= TEA5767_PLLREF_ENABLE;		div = (frq * (4000 / 16) - 700000 - 225000 + 25000) / 50000;		break;	case TEA5767_LOW_LO_32768:		tuner_dbg("radio LOW LO inject xtal @ 32,768 MHz\n");		buffer[3] |= TEA5767_XTAL_32768;		/* const 700=4000*175 Khz - to adjust freq to right value */		div = ((frq * (4000 / 16) - 700000 - 225000) + 16384) >> 15;		break;	case TEA5767_HIGH_LO_32768:	default:		tuner_dbg("radio HIGH LO inject xtal @ 32,768 MHz\n");		buffer[2] |= TEA5767_HIGH_LO_INJECT;		buffer[3] |= TEA5767_XTAL_32768;		div = ((frq * (4000 / 16) + 700000 + 225000) + 16384) >> 15;		break;	}	buffer[0] = (div >> 8) & 0x3f;	buffer[1] = div & 0xff;	if (5 != (rc = tuner_i2c_xfer_send(&priv->i2c_props, buffer, 5)))		tuner_warn("i2c i/o error: rc == %d (should be 5)\n", rc);	if (debug) {		if (5 != (rc = tuner_i2c_xfer_recv(&priv->i2c_props, buffer, 5)))			tuner_warn("i2c i/o error: rc == %d (should be 5)\n", rc);		else			tea5767_status_dump(buffer);	}	priv->frequency = frq * 125 / 2;	return 0;}static int tea5767_read_status(struct dvb_frontend *fe, char *buffer){	struct tea5767_priv *priv = fe->tuner_priv;	int rc;	memset(buffer, 0, 5);	if (5 != (rc = tuner_i2c_xfer_recv(&priv->i2c_props, buffer, 5))) {		tuner_warn("i2c i/o error: rc == %d (should be 5)\n", rc);		return -EREMOTEIO;	}	return 0;}static inline int tea5767_signal(struct dvb_frontend *fe, const char *buffer){	struct tea5767_priv *priv = fe->tuner_priv;	int signal = ((buffer[3] & TEA5767_ADC_LEVEL_MASK) << 8);	tuner_dbg("Signal strength: %d\n", signal);	return signal;}static inline int tea5767_stereo(struct dvb_frontend *fe, const char *buffer){	struct tea5767_priv *priv = fe->tuner_priv;	int stereo = buffer[2] & TEA5767_STEREO_MASK;	tuner_dbg("Radio ST GET = %02x\n", stereo);	return (stereo ? V4L2_TUNER_SUB_STEREO : 0);}static int tea5767_get_status(struct dvb_frontend *fe, u32 *status){	unsigned char buffer[5];	*status = 0;	if (0 == tea5767_read_status(fe, buffer)) {		if (tea5767_signal(fe, buffer))			*status = TUNER_STATUS_LOCKED;		if (tea5767_stereo(fe, buffer))			*status |= TUNER_STATUS_STEREO;	}	return 0;}static int tea5767_get_rf_strength(struct dvb_frontend *fe, u16 *strength){	unsigned char buffer[5];	*strength = 0;	if (0 == tea5767_read_status(fe, buffer))		*strength = tea5767_signal(fe, buffer);	return 0;}static int tea5767_standby(struct dvb_frontend *fe){	unsigned char buffer[5];	struct tea5767_priv *priv = fe->tuner_priv;	unsigned div, rc;	div = (87500 * 4 + 700 + 225 + 25) / 50; /* Set frequency to 87.5 MHz */	buffer[0] = (div >> 8) & 0x3f;	buffer[1] = div & 0xff;	buffer[2] = TEA5767_PORT1_HIGH;	buffer[3] = TEA5767_PORT2_HIGH | TEA5767_HIGH_CUT_CTRL |		    TEA5767_ST_NOISE_CTL | TEA5767_JAPAN_BAND | TEA5767_STDBY;	buffer[4] = 0;	if (5 != (rc = tuner_i2c_xfer_send(&priv->i2c_props, buffer, 5)))		tuner_warn("i2c i/o error: rc == %d (should be 5)\n", rc);	return 0;}int tea5767_autodetection(struct i2c_adapter* i2c_adap, u8 i2c_addr){	struct tuner_i2c_props i2c = { .adap = i2c_adap, .addr = i2c_addr };	unsigned char buffer[7] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };	int rc;	if ((rc = tuner_i2c_xfer_recv(&i2c, buffer, 7))< 5) {		printk(KERN_WARNING "It is not a TEA5767. Received %i bytes.\n", rc);		return EINVAL;	}	/* If all bytes are the same then it's a TV tuner and not a tea5767 */	if (buffer[0] == buffer[1] && buffer[0] == buffer[2] &&	    buffer[0] == buffer[3] && buffer[0] == buffer[4]) {		printk(KERN_WARNING "All bytes are equal. It is not a TEA5767\n");		return EINVAL;	}	/*  Status bytes:	 *  Byte 4: bit 3:1 : CI (Chip Identification) == 0	 *          bit 0   : internally set to 0	 *  Byte 5: bit 7:0 : == 0	 */	if (((buffer[3] & 0x0f) != 0x00) || (buffer[4] != 0x00)) {		printk(KERN_WARNING "Chip ID is not zero. It is not a TEA5767\n");		return EINVAL;	}	/* It seems that tea5767 returns 0xff after the 5th byte */	if ((buffer[5] != 0xff) || (buffer[6] != 0xff)) {		printk(KERN_WARNING "Returned more than 5 bytes. It is not a TEA5767\n");		return EINVAL;	}	printk(KERN_WARNING "TEA5767 detected.\n");	return 0;}static int tea5767_release(struct dvb_frontend *fe){	kfree(fe->tuner_priv);	fe->tuner_priv = NULL;	return 0;}static int tea5767_get_frequency(struct dvb_frontend *fe, u32 *frequency){	struct tea5767_priv *priv = fe->tuner_priv;	*frequency = priv->frequency;	return 0;}static struct dvb_tuner_ops tea5767_tuner_ops = {	.info = {		.name           = "tea5767", // Philips TEA5767HN FM Radio	},	.set_analog_params = set_radio_freq,	.sleep             = tea5767_standby,	.release           = tea5767_release,	.get_frequency     = tea5767_get_frequency,	.get_status        = tea5767_get_status,	.get_rf_strength   = tea5767_get_rf_strength,};struct dvb_frontend *tea5767_attach(struct dvb_frontend *fe,				    struct i2c_adapter* i2c_adap,				    u8 i2c_addr){	struct tea5767_priv *priv = NULL;	priv = kzalloc(sizeof(struct tea5767_priv), GFP_KERNEL);	if (priv == NULL)		return NULL;	fe->tuner_priv = priv;	priv->i2c_props.addr = i2c_addr;	priv->i2c_props.adap = i2c_adap;	memcpy(&fe->ops.tuner_ops, &tea5767_tuner_ops,	       sizeof(struct dvb_tuner_ops));	tuner_info("type set to %s\n", "Philips TEA5767HN FM Radio");	return fe;}EXPORT_SYMBOL_GPL(tea5767_attach);EXPORT_SYMBOL_GPL(tea5767_autodetection);MODULE_DESCRIPTION("Philips TEA5767 FM tuner driver");MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");MODULE_LICENSE("GPL");

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91亚洲永久精品| 6080午夜不卡| 久草中文综合在线| 亚洲欧美激情小说另类| 日韩午夜av一区| 在线亚洲人成电影网站色www| 美国欧美日韩国产在线播放| 亚洲天堂2016| 久久亚洲欧美国产精品乐播| 欧美性色黄大片| 东方aⅴ免费观看久久av| 午夜欧美一区二区三区在线播放| 国产精品成人午夜| 国产视频一区在线观看| 欧美福利电影网| 在线一区二区三区四区五区| 成人免费视频播放| 激情六月婷婷综合| 免费欧美日韩国产三级电影| 亚洲一区二区av在线| 亚洲欧美在线高清| 国产精品全国免费观看高清| 欧美一级黄色录像| 337p亚洲精品色噜噜狠狠| 色av成人天堂桃色av| 成人精品在线视频观看| 国产剧情av麻豆香蕉精品| 裸体一区二区三区| 蜜臀精品久久久久久蜜臀| 一卡二卡欧美日韩| 一区二区激情视频| 亚洲人成人一区二区在线观看 | 亚洲一区二区三区四区的| 日本一区二区三区高清不卡| 久久综合九色综合欧美就去吻| 日韩欧美在线不卡| 日韩女优电影在线观看| 日韩视频一区二区三区| 日韩一区二区三区精品视频| 欧美日韩精品久久久| 欧美精品 日韩| 欧美一区二区三区日韩视频| 制服丝袜国产精品| 日韩色视频在线观看| 日韩一区二区电影网| 日韩视频一区二区| 26uuu久久天堂性欧美| 国产亚洲一区二区在线观看| 国产亚洲欧洲一区高清在线观看| 久久久久亚洲综合| 国产精品欧美极品| 亚洲女同一区二区| 亚洲第一会所有码转帖| 视频一区免费在线观看| 天天射综合影视| 久久精品国产99| 成人黄色电影在线| 日本伦理一区二区| 欧美精品第1页| 欧美mv日韩mv国产网站app| 久久久久久久性| 成人欧美一区二区三区白人| 一区二区三区av电影| 天堂成人免费av电影一区| 蜜桃在线一区二区三区| 国产美女视频一区| 91小视频在线观看| 91精选在线观看| 国产喂奶挤奶一区二区三区| 国产精品女主播av| 亚洲成人激情综合网| 久久国产综合精品| 99久久免费国产| 在线不卡欧美精品一区二区三区| 精品国产亚洲在线| 亚洲情趣在线观看| 免费在线观看一区| eeuss鲁一区二区三区| 在线观看一区不卡| 久久久久久夜精品精品免费| 亚洲精品国产一区二区精华液 | 成人午夜视频福利| 在线播放欧美女士性生活| 久久先锋影音av鲁色资源网| 亚洲日本va午夜在线电影| 日韩国产欧美三级| av在线一区二区| 欧美一级理论片| 亚洲同性gay激情无套| 免费欧美在线视频| 色综合久久六月婷婷中文字幕| 日韩一区二区三区观看| 亚洲日本乱码在线观看| 精品一区二区三区视频| 91精品1区2区| 国产色综合一区| 青青国产91久久久久久| av综合在线播放| 精品国产sm最大网站| 亚洲精品高清在线| 国产乱码精品一区二区三区av | 1024成人网色www| 久久精品国产网站| 欧美三级中文字幕| 中文字幕中文字幕一区| 九九九久久久精品| 91精品婷婷国产综合久久性色| 亚洲天堂网中文字| 国产成人在线视频网站| 欧美成人vr18sexvr| 亚洲第一精品在线| 色天使色偷偷av一区二区| 久久亚洲一区二区三区四区| 日av在线不卡| 欧美伊人精品成人久久综合97| 中文字幕一区在线| 国产69精品久久久久毛片| 精品日韩在线观看| 看电视剧不卡顿的网站| 91精品国产一区二区三区| 亚洲综合自拍偷拍| 色婷婷av一区二区三区软件| 久久精品亚洲乱码伦伦中文| 美女精品自拍一二三四| 欧美精品日韩综合在线| 亚洲一区二区在线视频| 色网综合在线观看| 亚洲男人都懂的| 色老综合老女人久久久| 亚洲色图清纯唯美| 色狠狠一区二区三区香蕉| 综合久久久久综合| 99久久精品国产导航| 国产精品少妇自拍| 成人的网站免费观看| 欧美国产日韩精品免费观看| 国产精品一区二区你懂的| 国产亚洲视频系列| 成人av电影在线播放| 一区在线观看视频| 色噜噜夜夜夜综合网| 一区二区三区成人在线视频| 色老综合老女人久久久| 亚洲国产精品久久久久婷婷884| 精品视频1区2区3区| 亚洲成av人片| 日韩色在线观看| 国产毛片精品视频| 国产精品青草久久| 色哟哟一区二区在线观看| 夜夜亚洲天天久久| 欧美年轻男男videosbes| 日韩成人午夜电影| 精品久久久久久久久久久久包黑料| 日韩电影在线免费观看| 精品久久国产字幕高潮| 粉嫩一区二区三区性色av| 亚洲欧美综合另类在线卡通| 在线观看www91| 蜜臀av一级做a爰片久久| 久久综合国产精品| 99国产精品一区| 亚洲va欧美va人人爽| 日韩欧美国产小视频| 国产传媒久久文化传媒| 亚洲免费高清视频在线| 91精品国产91久久久久久一区二区| 韩国av一区二区三区四区| 国产精品欧美经典| 欧美日本国产一区| 国产精品自拍av| 亚洲精品水蜜桃| 欧美一级欧美三级| 不卡一卡二卡三乱码免费网站| 一区av在线播放| 久久久精品日韩欧美| 欧美最新大片在线看 | 91福利资源站| 免费成人av在线播放| 国产精品久久久久久一区二区三区| 在线观看成人免费视频| 国产一区二区三区免费看| 亚洲综合成人在线视频| 精品国产一区二区三区四区四| 色中色一区二区| 精品在线观看视频| 一区二区三区在线影院| 精品国产污污免费网站入口 | 日韩电影免费一区| 国产精品国产精品国产专区不蜜 | 99视频一区二区| 日韩国产欧美在线播放| 亚洲视频一区在线观看| 日韩三级在线免费观看| 一本大道综合伊人精品热热| 久久99精品久久久久久动态图 | 国产九色sp调教91| 日韩专区中文字幕一区二区| 国产精品乱码妇女bbbb| 日韩免费高清电影|