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

📄 saa7134-dvb.c

📁 trident tm5600的linux驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
}static int philips_tda827x_tuner_init(struct dvb_frontend *fe){	struct saa7134_dev *dev = fe->dvb->priv;	struct tda1004x_state *state = fe->demodulator_priv;	switch (state->config->antenna_switch) {	case 0: break;	case 1:	dprintk("setting GPIO21 to 0 (TV antenna?)\n");		saa7134_set_gpio(dev, 21, 0);		break;	case 2: dprintk("setting GPIO21 to 1 (Radio antenna?)\n");		saa7134_set_gpio(dev, 21, 1);		break;	}	return 0;}static int philips_tda827x_tuner_sleep(struct dvb_frontend *fe){	struct saa7134_dev *dev = fe->dvb->priv;	struct tda1004x_state *state = fe->demodulator_priv;	switch (state->config->antenna_switch) {	case 0: break;	case 1: dprintk("setting GPIO21 to 1 (Radio antenna?)\n");		saa7134_set_gpio(dev, 21, 1);		break;	case 2:	dprintk("setting GPIO21 to 0 (TV antenna?)\n");		saa7134_set_gpio(dev, 21, 0);		break;	}	return 0;}static int configure_tda827x_fe(struct saa7134_dev *dev,				struct tda1004x_config *cdec_conf,				struct tda827x_config *tuner_conf){	struct videobuf_dvb_frontend *fe0;	/* Get the first frontend */	fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);	fe0->dvb.frontend = dvb_attach(tda10046_attach, cdec_conf, &dev->i2c_adap);	if (fe0->dvb.frontend) {		if (cdec_conf->i2c_gate)			fe0->dvb.frontend->ops.i2c_gate_ctrl = tda8290_i2c_gate_ctrl;		if (dvb_attach(tda827x_attach, fe0->dvb.frontend,			       cdec_conf->tuner_address,			       &dev->i2c_adap, tuner_conf))			return 0;		wprintk("no tda827x tuner found at addr: %02x\n",				cdec_conf->tuner_address);	}	return -EINVAL;}/* ------------------------------------------------------------------ */static struct tda827x_config tda827x_cfg_0 = {	.init = philips_tda827x_tuner_init,	.sleep = philips_tda827x_tuner_sleep,	.config = 0,	.switch_addr = 0};static struct tda827x_config tda827x_cfg_1 = {	.init = philips_tda827x_tuner_init,	.sleep = philips_tda827x_tuner_sleep,	.config = 1,	.switch_addr = 0x4b};static struct tda827x_config tda827x_cfg_2 = {	.init = philips_tda827x_tuner_init,	.sleep = philips_tda827x_tuner_sleep,	.config = 2,	.switch_addr = 0x4b};static struct tda827x_config tda827x_cfg_2_sw42 = {	.init = philips_tda827x_tuner_init,	.sleep = philips_tda827x_tuner_sleep,	.config = 2,	.switch_addr = 0x42};/* ------------------------------------------------------------------ */static struct tda1004x_config tda827x_lifeview_config = {	.demod_address = 0x08,	.invert        = 1,	.invert_oclk   = 0,	.xtal_freq     = TDA10046_XTAL_16M,	.agc_config    = TDA10046_AGC_TDA827X,	.gpio_config   = TDA10046_GP11_I,	.if_freq       = TDA10046_FREQ_045,	.tuner_address = 0x60,	.request_firmware = philips_tda1004x_request_firmware};static struct tda1004x_config philips_tiger_config = {	.demod_address = 0x08,	.invert        = 1,	.invert_oclk   = 0,	.xtal_freq     = TDA10046_XTAL_16M,	.agc_config    = TDA10046_AGC_TDA827X,	.gpio_config   = TDA10046_GP11_I,	.if_freq       = TDA10046_FREQ_045,	.i2c_gate      = 0x4b,	.tuner_address = 0x61,	.antenna_switch= 1,	.request_firmware = philips_tda1004x_request_firmware};static struct tda1004x_config cinergy_ht_config = {	.demod_address = 0x08,	.invert        = 1,	.invert_oclk   = 0,	.xtal_freq     = TDA10046_XTAL_16M,	.agc_config    = TDA10046_AGC_TDA827X,	.gpio_config   = TDA10046_GP01_I,	.if_freq       = TDA10046_FREQ_045,	.i2c_gate      = 0x4b,	.tuner_address = 0x61,	.request_firmware = philips_tda1004x_request_firmware};static struct tda1004x_config cinergy_ht_pci_config = {	.demod_address = 0x08,	.invert        = 1,	.invert_oclk   = 0,	.xtal_freq     = TDA10046_XTAL_16M,	.agc_config    = TDA10046_AGC_TDA827X,	.gpio_config   = TDA10046_GP01_I,	.if_freq       = TDA10046_FREQ_045,	.i2c_gate      = 0x4b,	.tuner_address = 0x60,	.request_firmware = philips_tda1004x_request_firmware};static struct tda1004x_config philips_tiger_s_config = {	.demod_address = 0x08,	.invert        = 1,	.invert_oclk   = 0,	.xtal_freq     = TDA10046_XTAL_16M,	.agc_config    = TDA10046_AGC_TDA827X,	.gpio_config   = TDA10046_GP01_I,	.if_freq       = TDA10046_FREQ_045,	.i2c_gate      = 0x4b,	.tuner_address = 0x61,	.antenna_switch= 1,	.request_firmware = philips_tda1004x_request_firmware};static struct tda1004x_config pinnacle_pctv_310i_config = {	.demod_address = 0x08,	.invert        = 1,	.invert_oclk   = 0,	.xtal_freq     = TDA10046_XTAL_16M,	.agc_config    = TDA10046_AGC_TDA827X,	.gpio_config   = TDA10046_GP11_I,	.if_freq       = TDA10046_FREQ_045,	.i2c_gate      = 0x4b,	.tuner_address = 0x61,	.request_firmware = philips_tda1004x_request_firmware};static struct tda1004x_config hauppauge_hvr_1110_config = {	.demod_address = 0x08,	.invert        = 1,	.invert_oclk   = 0,	.xtal_freq     = TDA10046_XTAL_16M,	.agc_config    = TDA10046_AGC_TDA827X,	.gpio_config   = TDA10046_GP11_I,	.if_freq       = TDA10046_FREQ_045,	.i2c_gate      = 0x4b,	.tuner_address = 0x61,	.request_firmware = philips_tda1004x_request_firmware};static struct tda1004x_config asus_p7131_dual_config = {	.demod_address = 0x08,	.invert        = 1,	.invert_oclk   = 0,	.xtal_freq     = TDA10046_XTAL_16M,	.agc_config    = TDA10046_AGC_TDA827X,	.gpio_config   = TDA10046_GP11_I,	.if_freq       = TDA10046_FREQ_045,	.i2c_gate      = 0x4b,	.tuner_address = 0x61,	.antenna_switch= 2,	.request_firmware = philips_tda1004x_request_firmware};static struct tda1004x_config lifeview_trio_config = {	.demod_address = 0x09,	.invert        = 1,	.invert_oclk   = 0,	.xtal_freq     = TDA10046_XTAL_16M,	.agc_config    = TDA10046_AGC_TDA827X,	.gpio_config   = TDA10046_GP00_I,	.if_freq       = TDA10046_FREQ_045,	.tuner_address = 0x60,	.request_firmware = philips_tda1004x_request_firmware};static struct tda1004x_config tevion_dvbt220rf_config = {	.demod_address = 0x08,	.invert        = 1,	.invert_oclk   = 0,	.xtal_freq     = TDA10046_XTAL_16M,	.agc_config    = TDA10046_AGC_TDA827X,	.gpio_config   = TDA10046_GP11_I,	.if_freq       = TDA10046_FREQ_045,	.tuner_address = 0x60,	.request_firmware = philips_tda1004x_request_firmware};static struct tda1004x_config md8800_dvbt_config = {	.demod_address = 0x08,	.invert        = 1,	.invert_oclk   = 0,	.xtal_freq     = TDA10046_XTAL_16M,	.agc_config    = TDA10046_AGC_TDA827X,	.gpio_config   = TDA10046_GP01_I,	.if_freq       = TDA10046_FREQ_045,	.i2c_gate      = 0x4b,	.tuner_address = 0x60,	.request_firmware = philips_tda1004x_request_firmware};static struct tda1004x_config asus_p7131_4871_config = {	.demod_address = 0x08,	.invert        = 1,	.invert_oclk   = 0,	.xtal_freq     = TDA10046_XTAL_16M,	.agc_config    = TDA10046_AGC_TDA827X,	.gpio_config   = TDA10046_GP01_I,	.if_freq       = TDA10046_FREQ_045,	.i2c_gate      = 0x4b,	.tuner_address = 0x61,	.antenna_switch= 2,	.request_firmware = philips_tda1004x_request_firmware};static struct tda1004x_config asus_p7131_hybrid_lna_config = {	.demod_address = 0x08,	.invert        = 1,	.invert_oclk   = 0,	.xtal_freq     = TDA10046_XTAL_16M,	.agc_config    = TDA10046_AGC_TDA827X,	.gpio_config   = TDA10046_GP11_I,	.if_freq       = TDA10046_FREQ_045,	.i2c_gate      = 0x4b,	.tuner_address = 0x61,	.antenna_switch= 2,	.request_firmware = philips_tda1004x_request_firmware};static struct tda1004x_config kworld_dvb_t_210_config = {	.demod_address = 0x08,	.invert        = 1,	.invert_oclk   = 0,	.xtal_freq     = TDA10046_XTAL_16M,	.agc_config    = TDA10046_AGC_TDA827X,	.gpio_config   = TDA10046_GP11_I,	.if_freq       = TDA10046_FREQ_045,	.i2c_gate      = 0x4b,	.tuner_address = 0x61,	.antenna_switch= 1,	.request_firmware = philips_tda1004x_request_firmware};static struct tda1004x_config avermedia_super_007_config = {	.demod_address = 0x08,	.invert        = 1,	.invert_oclk   = 0,	.xtal_freq     = TDA10046_XTAL_16M,	.agc_config    = TDA10046_AGC_TDA827X,	.gpio_config   = TDA10046_GP01_I,	.if_freq       = TDA10046_FREQ_045,	.i2c_gate      = 0x4b,	.tuner_address = 0x60,	.antenna_switch= 1,	.request_firmware = philips_tda1004x_request_firmware};static struct tda1004x_config twinhan_dtv_dvb_3056_config = {	.demod_address = 0x08,	.invert        = 1,	.invert_oclk   = 0,	.xtal_freq     = TDA10046_XTAL_16M,	.agc_config    = TDA10046_AGC_TDA827X,	.gpio_config   = TDA10046_GP01_I,	.if_freq       = TDA10046_FREQ_045,	.i2c_gate      = 0x42,	.tuner_address = 0x61,	.antenna_switch = 1,	.request_firmware = philips_tda1004x_request_firmware};static struct tda1004x_config asus_tiger_3in1_config = {	.demod_address = 0x0b,	.invert        = 1,	.invert_oclk   = 0,	.xtal_freq     = TDA10046_XTAL_16M,	.agc_config    = TDA10046_AGC_TDA827X,	.gpio_config   = TDA10046_GP11_I,	.if_freq       = TDA10046_FREQ_045,	.i2c_gate      = 0x4b,	.tuner_address = 0x61,	.antenna_switch = 1,	.request_firmware = philips_tda1004x_request_firmware};/* ------------------------------------------------------------------ * special case: this card uses saa713x GPIO22 for the mode switch */static int ads_duo_tuner_init(struct dvb_frontend *fe){	struct saa7134_dev *dev = fe->dvb->priv;	philips_tda827x_tuner_init(fe);	/* route TDA8275a AGC input to the channel decoder */	saa7134_set_gpio(dev, 22, 1);	return 0;}static int ads_duo_tuner_sleep(struct dvb_frontend *fe){	struct saa7134_dev *dev = fe->dvb->priv;	/* route TDA8275a AGC input to the analog IF chip*/	saa7134_set_gpio(dev, 22, 0);	philips_tda827x_tuner_sleep(fe);	return 0;}static struct tda827x_config ads_duo_cfg = {	.init = ads_duo_tuner_init,	.sleep = ads_duo_tuner_sleep,	.config = 0};static struct tda1004x_config ads_tech_duo_config = {	.demod_address = 0x08,	.invert        = 1,	.invert_oclk   = 0,	.xtal_freq     = TDA10046_XTAL_16M,	.agc_config    = TDA10046_AGC_TDA827X,	.gpio_config   = TDA10046_GP00_I,	.if_freq       = TDA10046_FREQ_045,	.tuner_address = 0x61,	.request_firmware = philips_tda1004x_request_firmware};/* ================================================================== * tda10086 based DVB-S cards, helper functions */static struct tda10086_config flydvbs = {	.demod_address = 0x0e,	.invert = 0,	.diseqc_tone = 0,	.xtal_freq = TDA10086_XTAL_16M,};static struct tda10086_config sd1878_4m = {	.demod_address = 0x0e,	.invert = 0,	.diseqc_tone = 0,	.xtal_freq = TDA10086_XTAL_4M,};/* ------------------------------------------------------------------ * special case: lnb supply is connected to the gated i2c */static int md8800_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage){	int res = -EIO;	struct saa7134_dev *dev = fe->dvb->priv;	if (fe->ops.i2c_gate_ctrl) {		fe->ops.i2c_gate_ctrl(fe, 1);		if (dev->original_set_voltage)			res = dev->original_set_voltage(fe, voltage);		fe->ops.i2c_gate_ctrl(fe, 0);	}	return res;};static int md8800_set_high_voltage(struct dvb_frontend *fe, long arg){	int res = -EIO;	struct saa7134_dev *dev = fe->dvb->priv;	if (fe->ops.i2c_gate_ctrl) {		fe->ops.i2c_gate_ctrl(fe, 1);		if (dev->original_set_high_voltage)			res = dev->original_set_high_voltage(fe, arg);		fe->ops.i2c_gate_ctrl(fe, 0);	}	return res;};static int md8800_set_voltage2(struct dvb_frontend *fe, fe_sec_voltage_t voltage){	struct saa7134_dev *dev = fe->dvb->priv;	u8 wbuf[2] = { 0x1f, 00 };	u8 rbuf;	struct i2c_msg msg[] = { { .addr = 0x08, .flags = 0, .buf = wbuf, .len = 1 },				 { .addr = 0x08, .flags = I2C_M_RD, .buf = &rbuf, .len = 1 } };	if (i2c_transfer(&dev->i2c_adap, msg, 2) != 2)		return -EIO;	/* NOTE: this assumes that gpo1 is used, it might be bit 5 (gpo2) */	if (voltage == SEC_VOLTAGE_18)		wbuf[1] = rbuf | 0x10;	else		wbuf[1] = rbuf & 0xef;	msg[0].len = 2;	i2c_transfer(&dev->i2c_adap, msg, 1);	return 0;}static int md8800_set_high_voltage2(struct dvb_frontend *fe, long arg){	struct saa7134_dev *dev = fe->dvb->priv;	wprintk("%s: sorry can't set high LNB supply voltage from here\n", __func__);	return -EIO;}/* ================================================================== * nxt200x based ATSC cards, helper functions */static struct nxt200x_config avertvhda180 = {	.demod_address    = 0x0a,};static struct nxt200x_config kworldatsc110 = {	.demod_address    = 0x0a,};/* ================================================================== * Core code */static int dvb_init(struct saa7134_dev *dev){	int ret;	int attach_xc3028 = 0;	struct videobuf_dvb_frontend *fe0;	/* FIXME: add support for multi-frontend */	mutex_init(&dev->frontends.lock);	INIT_LIST_HEAD(&dev->frontends.felist);	dev->frontends.active_fe_id = 0;	printk(KERN_INFO "%s() allocating 1 frontend\n", __func__);	if (videobuf_dvb_alloc_frontend(&dev->frontends, 1) == NULL) {		printk(KERN_ERR "%s() failed to alloc\n", __func__);		return -ENOMEM;	}	/* Get the first frontend */	fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);	if (!fe0)		return -EINVAL;	/* init struct videobuf_dvb */	dev->ts.nr_bufs    = 32;	dev->ts.nr_packets = 32*4;	fe0->dvb.name = dev->name;	videobuf_queue_sg_init(&fe0->dvb.dvbq, &saa7134_ts_qops,			    &dev->pci->dev, &dev->slock,			    V4L2_BUF_TYPE_VIDEO_CAPTURE,			    V4L2_FIELD_ALTERNATE,			    sizeof(struct saa7134_buf),			    dev);	switch (dev->board) {	case SAA7134_BOARD_PINNACLE_300I_DVBT_PAL:		dprintk("pinnacle 300i dvb setup\n");		fe0->dvb.frontend = dvb_attach(mt352_attach, &pinnacle_300i,					       &dev->i2c_adap);		if (fe0->dvb.frontend) {			fe0->dvb.frontend->ops.tuner_ops.set_params = mt352_pinnacle_tuner_set_params;		}		break;	case SAA7134_BOARD_AVERMEDIA_777:	case SAA7134_BOARD_AVERMEDIA_A16AR:		dprintk("avertv 777 dvb setup\n");		fe0->dvb.frontend = dvb_attach(mt352_attach, &avermedia_777,

⌨️ 快捷键说明

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