⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dib0700_devices.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Linux driver for devices based on the DiBcom DiB0700 USB bridge * *	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, version 2. * *  Copyright (C) 2005-7 DiBcom, SA */#include "dib0700.h"#include "dib3000mc.h"#include "dib7000m.h"#include "dib7000p.h"#include "mt2060.h"#include "mt2266.h"#include "dib0070.h"static int force_lna_activation;module_param(force_lna_activation, int, 0644);MODULE_PARM_DESC(force_lna_activation, "force the activation of Low-Noise-Amplifyer(s) (LNA), "		"if applicable for the device (default: 0=automatic/off).");struct dib0700_adapter_state {	int (*set_param_save) (struct dvb_frontend *, struct dvb_frontend_parameters *);};/* Hauppauge Nova-T 500 (aka Bristol) *  has a LNA on GPIO0 which is enabled by setting 1 */static struct mt2060_config bristol_mt2060_config[2] = {	{		.i2c_address = 0x60,		.clock_out   = 3,	}, {		.i2c_address = 0x61,	}};static struct dibx000_agc_config bristol_dib3000p_mt2060_agc_config = {	.band_caps = BAND_VHF | BAND_UHF,	.setup     = (1 << 8) | (5 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (2 << 0),	.agc1_max = 42598,	.agc1_min = 17694,	.agc2_max = 45875,	.agc2_min = 0,	.agc1_pt1 = 0,	.agc1_pt2 = 59,	.agc1_slope1 = 0,	.agc1_slope2 = 69,	.agc2_pt1 = 0,	.agc2_pt2 = 59,	.agc2_slope1 = 111,	.agc2_slope2 = 28,};static struct dib3000mc_config bristol_dib3000mc_config[2] = {	{	.agc          = &bristol_dib3000p_mt2060_agc_config,		.max_time     = 0x196,		.ln_adc_level = 0x1cc7,		.output_mpeg2_in_188_bytes = 1,	},	{	.agc          = &bristol_dib3000p_mt2060_agc_config,		.max_time     = 0x196,		.ln_adc_level = 0x1cc7,		.output_mpeg2_in_188_bytes = 1,	}};static int bristol_frontend_attach(struct dvb_usb_adapter *adap){	struct dib0700_state *st = adap->dev->priv;	if (adap->id == 0) {		dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 0); msleep(10);		dib0700_set_gpio(adap->dev, GPIO6,  GPIO_OUT, 1); msleep(10);		dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);		dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(10);		if (force_lna_activation)			dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);		else			dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);		if (dib3000mc_i2c_enumeration(&adap->dev->i2c_adap, 2, DEFAULT_DIB3000P_I2C_ADDRESS, bristol_dib3000mc_config) != 0) {			dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10);			return -ENODEV;		}	}	st->mt2060_if1[adap->id] = 1220;	return (adap->fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap,		(10 + adap->id) << 1, &bristol_dib3000mc_config[adap->id])) == NULL ? -ENODEV : 0;}static int bristol_tuner_attach(struct dvb_usb_adapter *adap){	struct dib0700_state *st = adap->dev->priv;	struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe, 1);	return dvb_attach(mt2060_attach,adap->fe, tun_i2c, &bristol_mt2060_config[adap->id],		st->mt2060_if1[adap->id]) == NULL ? -ENODEV : 0;}/* STK7700D: Pinnacle/Terratec/Hauppauge Dual DVB-T Diversity *//* MT226x */static struct dibx000_agc_config stk7700d_7000p_mt2266_agc_config[2] = {	{		BAND_UHF, // band_caps		/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=1, P_agc_inv_pwm2=1,		* P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */		(0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup		1130,  // inv_gain		21,  // time_stabiliz		0,  // alpha_level		118,  // thlock		0,     // wbd_inv		3530,  // wbd_ref		1,     // wbd_sel		0,     // wbd_alpha		65535,  // agc1_max		33770,  // agc1_min		65535,  // agc2_max		23592,  // agc2_min		0,    // agc1_pt1		62,   // agc1_pt2		255,  // agc1_pt3		64,   // agc1_slope1		64,   // agc1_slope2		132,  // agc2_pt1		192,  // agc2_pt2		80,   // agc2_slope1		80,   // agc2_slope2		17,  // alpha_mant		27,  // alpha_exp		23,  // beta_mant		51,  // beta_exp		1,  // perform_agc_softsplit	}, {		BAND_VHF | BAND_LBAND, // band_caps		/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=1, P_agc_inv_pwm2=1,		* P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */		(0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup		2372, // inv_gain		21,   // time_stabiliz		0,    // alpha_level		118,  // thlock		0,    // wbd_inv		3530, // wbd_ref		1,     // wbd_sel		0,    // wbd_alpha		65535, // agc1_max		0,     // agc1_min		65535, // agc2_max		23592, // agc2_min		0,    // agc1_pt1		128,  // agc1_pt2		128,  // agc1_pt3		128,  // agc1_slope1		0,    // agc1_slope2		128,  // agc2_pt1		253,  // agc2_pt2		81,   // agc2_slope1		0,    // agc2_slope2		17,  // alpha_mant		27,  // alpha_exp		23,  // beta_mant		51,  // beta_exp		1,  // perform_agc_softsplit	}};static struct dibx000_bandwidth_config stk7700d_mt2266_pll_config = {	60000, 30000, // internal, sampling	1, 8, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass	0, 0, 1, 1, 2, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo	(3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k	0, // ifreq	20452225, // timf};static struct dib7000p_config stk7700d_dib7000p_mt2266_config[] = {	{	.output_mpeg2_in_188_bytes = 1,		.hostbus_diversity = 1,		.tuner_is_baseband = 1,		.agc_config_count = 2,		.agc = stk7700d_7000p_mt2266_agc_config,		.bw  = &stk7700d_mt2266_pll_config,		.gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,		.gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,		.gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,	},	{	.output_mpeg2_in_188_bytes = 1,		.hostbus_diversity = 1,		.tuner_is_baseband = 1,		.agc_config_count = 2,		.agc = stk7700d_7000p_mt2266_agc_config,		.bw  = &stk7700d_mt2266_pll_config,		.gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,		.gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,		.gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,	}};static struct mt2266_config stk7700d_mt2266_config[2] = {	{	.i2c_address = 0x60	},	{	.i2c_address = 0x60	}};static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap){	if (adap->id == 0) {		dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);		msleep(10);		dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);		dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);		dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);		dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);		msleep(10);		dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);		msleep(10);		dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);		dib7000p_i2c_enumeration(&adap->dev->i2c_adap,2,18,stk7700d_dib7000p_mt2266_config);	}	adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),				&stk7700d_dib7000p_mt2266_config[adap->id]);	return adap->fe == NULL ? -ENODEV : 0;}static int stk7700d_tuner_attach(struct dvb_usb_adapter *adap){	struct i2c_adapter *tun_i2c;	tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);	return dvb_attach(mt2266_attach, adap->fe, tun_i2c,		&stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0;;}#define DEFAULT_RC_INTERVAL 150static u8 rc_request[] = { REQUEST_POLL_RC, 0 };static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state){	u8 key[4];	int i;	struct dvb_usb_rc_key *keymap = d->props.rc_key_map;	struct dib0700_state *st = d->priv;	*event = 0;	*state = REMOTE_NO_KEY_PRESSED;	i=dib0700_ctrl_rd(d,rc_request,2,key,4);	if (i<=0) {		err("RC Query Failed");		return -1;	}	if (key[0]==0 && key[1]==0 && key[2]==0 && key[3]==0) return 0;	if (key[3-1]!=st->rc_toggle) {		for (i=0;i<d->props.rc_key_map_size; i++) {			if (keymap[i].custom == key[3-2] && keymap[i].data == key[3-3]) {				*event = keymap[i].event;				*state = REMOTE_KEY_PRESSED;				st->rc_toggle=key[3-1];				return 0;			}		}		err("Unknown remote controller key : %2X %2X",(int)key[3-2],(int)key[3-3]);	}	return 0;}static struct dvb_usb_rc_key dib0700_rc_keys[] = {	/* Key codes for the tiny Pinnacle remote*/	{ 0x07, 0x00, KEY_MUTE },	{ 0x07, 0x01, KEY_MENU }, // Pinnacle logo	{ 0x07, 0x39, KEY_POWER },	{ 0x07, 0x03, KEY_VOLUMEUP },	{ 0x07, 0x09, KEY_VOLUMEDOWN },	{ 0x07, 0x06, KEY_CHANNELUP },	{ 0x07, 0x0c, KEY_CHANNELDOWN },	{ 0x07, 0x0f, KEY_1 },	{ 0x07, 0x15, KEY_2 },	{ 0x07, 0x10, KEY_3 },	{ 0x07, 0x18, KEY_4 },	{ 0x07, 0x1b, KEY_5 },	{ 0x07, 0x1e, KEY_6 },	{ 0x07, 0x11, KEY_7 },	{ 0x07, 0x21, KEY_8 },	{ 0x07, 0x12, KEY_9 },	{ 0x07, 0x27, KEY_0 },	{ 0x07, 0x24, KEY_SCREEN }, // 'Square' key	{ 0x07, 0x2a, KEY_TEXT },   // 'T' key	{ 0x07, 0x2d, KEY_REWIND },	{ 0x07, 0x30, KEY_PLAY },	{ 0x07, 0x33, KEY_FASTFORWARD },	{ 0x07, 0x36, KEY_RECORD },	{ 0x07, 0x3c, KEY_STOP },	{ 0x07, 0x3f, KEY_CANCEL }, // '?' key	/* Key codes for the Terratec Cinergy DT XS Diversity, similar to cinergyT2.c */	{ 0xeb, 0x01, KEY_POWER },	{ 0xeb, 0x02, KEY_1 },	{ 0xeb, 0x03, KEY_2 },	{ 0xeb, 0x04, KEY_3 },	{ 0xeb, 0x05, KEY_4 },	{ 0xeb, 0x06, KEY_5 },	{ 0xeb, 0x07, KEY_6 },	{ 0xeb, 0x08, KEY_7 },	{ 0xeb, 0x09, KEY_8 },	{ 0xeb, 0x0a, KEY_9 },	{ 0xeb, 0x0b, KEY_VIDEO },	{ 0xeb, 0x0c, KEY_0 },	{ 0xeb, 0x0d, KEY_REFRESH },	{ 0xeb, 0x0f, KEY_EPG },	{ 0xeb, 0x10, KEY_UP },	{ 0xeb, 0x11, KEY_LEFT },	{ 0xeb, 0x12, KEY_OK },	{ 0xeb, 0x13, KEY_RIGHT },	{ 0xeb, 0x14, KEY_DOWN },	{ 0xeb, 0x16, KEY_INFO },	{ 0xeb, 0x17, KEY_RED },	{ 0xeb, 0x18, KEY_GREEN },	{ 0xeb, 0x19, KEY_YELLOW },	{ 0xeb, 0x1a, KEY_BLUE },	{ 0xeb, 0x1b, KEY_CHANNELUP },	{ 0xeb, 0x1c, KEY_VOLUMEUP },	{ 0xeb, 0x1d, KEY_MUTE },	{ 0xeb, 0x1e, KEY_VOLUMEDOWN },	{ 0xeb, 0x1f, KEY_CHANNELDOWN },	{ 0xeb, 0x40, KEY_PAUSE },	{ 0xeb, 0x41, KEY_HOME },	{ 0xeb, 0x42, KEY_MENU }, /* DVD Menu */	{ 0xeb, 0x43, KEY_SUBTITLE },	{ 0xeb, 0x44, KEY_TEXT }, /* Teletext */	{ 0xeb, 0x45, KEY_DELETE },	{ 0xeb, 0x46, KEY_TV },	{ 0xeb, 0x47, KEY_DVD },	{ 0xeb, 0x48, KEY_STOP },	{ 0xeb, 0x49, KEY_VIDEO },	{ 0xeb, 0x4a, KEY_AUDIO }, /* Music */	{ 0xeb, 0x4b, KEY_SCREEN }, /* Pic */	{ 0xeb, 0x4c, KEY_PLAY },	{ 0xeb, 0x4d, KEY_BACK },	{ 0xeb, 0x4e, KEY_REWIND },	{ 0xeb, 0x4f, KEY_FASTFORWARD },	{ 0xeb, 0x54, KEY_PREVIOUS },	{ 0xeb, 0x58, KEY_RECORD },	{ 0xeb, 0x5c, KEY_NEXT },	/* Key codes for the Haupauge WinTV Nova-TD, copied from nova-t-usb2.c (Nova-T USB2) */	{ 0x1e, 0x00, KEY_0 },	{ 0x1e, 0x01, KEY_1 },	{ 0x1e, 0x02, KEY_2 },	{ 0x1e, 0x03, KEY_3 },	{ 0x1e, 0x04, KEY_4 },	{ 0x1e, 0x05, KEY_5 },	{ 0x1e, 0x06, KEY_6 },	{ 0x1e, 0x07, KEY_7 },	{ 0x1e, 0x08, KEY_8 },	{ 0x1e, 0x09, KEY_9 },	{ 0x1e, 0x0a, KEY_KPASTERISK },	{ 0x1e, 0x0b, KEY_RED },	{ 0x1e, 0x0c, KEY_RADIO },	{ 0x1e, 0x0d, KEY_MENU },	{ 0x1e, 0x0e, KEY_GRAVE }, /* # */	{ 0x1e, 0x0f, KEY_MUTE },	{ 0x1e, 0x10, KEY_VOLUMEUP },	{ 0x1e, 0x11, KEY_VOLUMEDOWN },	{ 0x1e, 0x12, KEY_CHANNEL },	{ 0x1e, 0x14, KEY_UP },	{ 0x1e, 0x15, KEY_DOWN },	{ 0x1e, 0x16, KEY_LEFT },	{ 0x1e, 0x17, KEY_RIGHT },	{ 0x1e, 0x18, KEY_VIDEO },	{ 0x1e, 0x19, KEY_AUDIO },	{ 0x1e, 0x1a, KEY_MEDIA },	{ 0x1e, 0x1b, KEY_EPG },	{ 0x1e, 0x1c, KEY_TV },	{ 0x1e, 0x1e, KEY_NEXT },	{ 0x1e, 0x1f, KEY_BACK },	{ 0x1e, 0x20, KEY_CHANNELUP },	{ 0x1e, 0x21, KEY_CHANNELDOWN },	{ 0x1e, 0x24, KEY_LAST }, /* Skip backwards */	{ 0x1e, 0x25, KEY_OK },	{ 0x1e, 0x29, KEY_BLUE},	{ 0x1e, 0x2e, KEY_GREEN },	{ 0x1e, 0x30, KEY_PAUSE },	{ 0x1e, 0x32, KEY_REWIND },	{ 0x1e, 0x34, KEY_FASTFORWARD },	{ 0x1e, 0x35, KEY_PLAY },	{ 0x1e, 0x36, KEY_STOP },	{ 0x1e, 0x37, KEY_RECORD },	{ 0x1e, 0x38, KEY_YELLOW },	{ 0x1e, 0x3b, KEY_GOTO },	{ 0x1e, 0x3d, KEY_POWER },};/* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */static struct dibx000_agc_config stk7700p_7000m_mt2060_agc_config = {	BAND_UHF | BAND_VHF,       // band_caps	/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,	 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */	(0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup	712,  // inv_gain	41,  // time_stabiliz	0,  // alpha_level	118,  // thlock	0,     // wbd_inv	4095,  // wbd_ref	0,     // wbd_sel	0,     // wbd_alpha	42598,  // agc1_max	17694,  // agc1_min	45875,  // agc2_max	2621,  // agc2_min	0,  // agc1_pt1	76,  // agc1_pt2	139,  // agc1_pt3	52,  // agc1_slope1	59,  // agc1_slope2	107,  // agc2_pt1	172,  // agc2_pt2	57,  // agc2_slope1	70,  // agc2_slope2	21,  // alpha_mant	25,  // alpha_exp	28,  // beta_mant	48,  // beta_exp	1,  // perform_agc_softsplit	{  0,     // split_min	   107,   // split_max	   51800, // global_split_min	   24700  // global_split_max	},};static struct dibx000_agc_config stk7700p_7000p_mt2060_agc_config = {	BAND_UHF | BAND_VHF,	/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,	 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */	(0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup	712, // inv_gain	41,  // time_stabiliz	0,   // alpha_level	118, // thlock	0,    // wbd_inv	4095, // wbd_ref	0,    // wbd_sel	0,    // wbd_alpha	42598, // agc1_max	16384, // agc1_min	42598, // agc2_max	    0, // agc2_min	  0,   // agc1_pt1	137,   // agc1_pt2	255,   // agc1_pt3	  0,   // agc1_slope1	255,   // agc1_slope2	0,     // agc2_pt1	0,     // agc2_pt2	 0,    // agc2_slope1	41,    // agc2_slope2	15, // alpha_mant	25, // alpha_exp	28, // beta_mant	48, // beta_exp	0, // perform_agc_softsplit};static struct dibx000_bandwidth_config stk7700p_pll_config = {	60000, 30000, // internal, sampling	1, 8, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass	0, 0, 1, 1, 0, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo	(3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k	60258167, // ifreq	20452225, // timf

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -