📄 saa7134-dvb.c
字号:
}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 + -