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

📄 dib0700_devices.c

📁 trident tm5600的linux驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
/* 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 "tuner-xc2028.h"#include "xc5000.h"#include "s5h1411.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 eeprom_read(struct i2c_adapter *adap,u8 adrs,u8 *pval){	struct i2c_msg msg[2] = {		{ .addr = 0x50, .flags = 0,        .buf = &adrs, .len = 1 },		{ .addr = 0x50, .flags = I2C_M_RD, .buf = pval,  .len = 1 },	};	if (i2c_transfer(adap, msg, 2) != 2) return -EREMOTEIO;	return 0;}static int bristol_tuner_attach(struct dvb_usb_adapter *adap){	struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;	struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe, 1);	s8 a;	int if1=1220;	if (adap->dev->udev->descriptor.idVendor  == cpu_to_le16(USB_VID_HAUPPAUGE) &&		adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_500_2)) {		if (!eeprom_read(prim_i2c,0x59 + adap->id,&a)) if1=1220+a;	}	return dvb_attach(mt2060_attach,adap->fe, tun_i2c,&bristol_mt2060_config[adap->id],		if1) == 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 stk7700P2_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);		dib7000p_i2c_enumeration(&adap->dev->i2c_adap,1,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_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;;}/* STK7700-PH: Digital/Analog Hybrid Tuner, e.h. Cinergy HT USB HE */static struct dibx000_agc_config xc3028_agc_config = {	BAND_VHF | BAND_UHF,       /* band_caps */	/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0,	 * 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) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) |	(3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), /* setup */	712,	/* inv_gain */	21,	/* time_stabiliz */	0,	/* alpha_level */	118,	/* thlock */	0,	/* wbd_inv */	2867,	/* wbd_ref */	0,	/* wbd_sel */	2,	/* wbd_alpha */	0,	/* agc1_max */	0,	/* agc1_min */	39718,	/* agc2_max */	9930,	/* agc2_min */	0,	/* agc1_pt1 */	0,	/* agc1_pt2 */	0,	/* agc1_pt3 */	0,	/* agc1_slope1 */	0,	/* agc1_slope2 */	0,	/* agc2_pt1 */	128,	/* agc2_pt2 */	29,	/* agc2_slope1 */	29,	/* agc2_slope2 */	17,	/* alpha_mant */	27,	/* alpha_exp */	23,	/* beta_mant */	51,	/* beta_exp */	1,	/* perform_agc_softsplit */};/* PLL Configuration for COFDM BW_MHz = 8.00 with external clock = 30.00 */static struct dibx000_bandwidth_config xc3028_bw_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 */	(1 << 25) | 5816102, /* ifreq = 5.200000 MHz */	20452225, /* timf */	30000000, /* xtal_hz */};static struct dib7000p_config stk7700ph_dib7700_xc3028_config = {	.output_mpeg2_in_188_bytes = 1,	.tuner_is_baseband = 1,	.agc_config_count = 1,	.agc = &xc3028_agc_config,	.bw  = &xc3028_bw_config,	.gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,	.gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,	.gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,};static int stk7700ph_xc3028_callback(void *ptr, int component,				     int command, int arg){	struct dvb_usb_adapter *adap = ptr;	switch (command) {	case XC2028_TUNER_RESET:		/* Send the tuner in then out of reset */		dib7000p_set_gpio(adap->fe, 8, 0, 0); msleep(10);		dib7000p_set_gpio(adap->fe, 8, 0, 1);		break;	case XC2028_RESET_CLK:		break;	default:		err("%s: unknown command %d, arg %d\n", __func__,			command, arg);		return -EINVAL;	}	return 0;}static struct xc2028_ctrl stk7700ph_xc3028_ctrl = {	.fname = XC2028_DEFAULT_FIRMWARE,	.max_len = 64,	.demod = XC3028_FE_DIBCOM52,};static struct xc2028_config stk7700ph_xc3028_config = {	.i2c_addr = 0x61,	.ctrl = &stk7700ph_xc3028_ctrl,};static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap){	struct usb_device_descriptor *desc = &adap->dev->udev->descriptor;

⌨️ 快捷键说明

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