📄 cx23885-dvb.c
字号:
/* * Driver for the Conexant CX23885 PCIe bridge * * Copyright (c) 2006 Steven Toth <stoth@linuxtv.org> * * 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; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include <linux/module.h>#include <linux/init.h>#include <linux/device.h>#include <linux/fs.h>#include <linux/kthread.h>#include <linux/file.h>#include <linux/suspend.h>#include "compat.h"#include "cx23885.h"#include <media/v4l2-common.h>#include "s5h1409.h"#include "s5h1411.h"#include "mt2131.h"#include "tda8290.h"#include "tda18271.h"#include "lgdt330x.h"#include "xc5000.h"#include "tda10048.h"#include "tuner-xc2028.h"#include "tuner-simple.h"#include "dib7000p.h"#include "dibx000_common.h"#include "zl10353.h"static unsigned int debug;#define dprintk(level, fmt, arg...)\ do { if (debug >= level)\ printk(KERN_DEBUG "%s/0: " fmt, dev->name, ## arg);\ } while (0)/* ------------------------------------------------------------------ */static unsigned int alt_tuner;module_param(alt_tuner, int, 0644);MODULE_PARM_DESC(alt_tuner, "Enable alternate tuner configuration");DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);/* ------------------------------------------------------------------ */static int dvb_buf_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size){ struct cx23885_tsport *port = q->priv_data; port->ts_packet_size = 188 * 4; port->ts_packet_count = 32; *size = port->ts_packet_size * port->ts_packet_count; *count = 32; return 0;}static int dvb_buf_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb, enum v4l2_field field){ struct cx23885_tsport *port = q->priv_data; return cx23885_buf_prepare(q, port, (struct cx23885_buffer *)vb, field);}static void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb){ struct cx23885_tsport *port = q->priv_data; cx23885_buf_queue(port, (struct cx23885_buffer *)vb);}static void dvb_buf_release(struct videobuf_queue *q, struct videobuf_buffer *vb){ cx23885_free_buffer(q, (struct cx23885_buffer *)vb);}static struct videobuf_queue_ops dvb_qops = { .buf_setup = dvb_buf_setup, .buf_prepare = dvb_buf_prepare, .buf_queue = dvb_buf_queue, .buf_release = dvb_buf_release,};static struct s5h1409_config hauppauge_generic_config = { .demod_address = 0x32 >> 1, .output_mode = S5H1409_SERIAL_OUTPUT, .gpio = S5H1409_GPIO_ON, .qam_if = 44000, .inversion = S5H1409_INVERSION_OFF, .status_mode = S5H1409_DEMODLOCKING, .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,};static struct tda10048_config hauppauge_hvr1200_config = { .demod_address = 0x10 >> 1, .output_mode = TDA10048_SERIAL_OUTPUT, .fwbulkwritelen = TDA10048_BULKWRITE_200, .inversion = TDA10048_INVERSION_ON};static struct s5h1409_config hauppauge_ezqam_config = { .demod_address = 0x32 >> 1, .output_mode = S5H1409_SERIAL_OUTPUT, .gpio = S5H1409_GPIO_OFF, .qam_if = 4000, .inversion = S5H1409_INVERSION_ON, .status_mode = S5H1409_DEMODLOCKING, .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,};static struct s5h1409_config hauppauge_hvr1800lp_config = { .demod_address = 0x32 >> 1, .output_mode = S5H1409_SERIAL_OUTPUT, .gpio = S5H1409_GPIO_OFF, .qam_if = 44000, .inversion = S5H1409_INVERSION_OFF, .status_mode = S5H1409_DEMODLOCKING, .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,};static struct s5h1409_config hauppauge_hvr1500_config = { .demod_address = 0x32 >> 1, .output_mode = S5H1409_SERIAL_OUTPUT, .gpio = S5H1409_GPIO_OFF, .inversion = S5H1409_INVERSION_OFF, .status_mode = S5H1409_DEMODLOCKING, .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,};static struct mt2131_config hauppauge_generic_tunerconfig = { 0x61};static struct lgdt330x_config fusionhdtv_5_express = { .demod_address = 0x0e, .demod_chip = LGDT3303, .serial_mpeg = 0x40,};static struct s5h1409_config hauppauge_hvr1500q_config = { .demod_address = 0x32 >> 1, .output_mode = S5H1409_SERIAL_OUTPUT, .gpio = S5H1409_GPIO_ON, .qam_if = 44000, .inversion = S5H1409_INVERSION_OFF, .status_mode = S5H1409_DEMODLOCKING, .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,};static struct s5h1409_config dvico_s5h1409_config = { .demod_address = 0x32 >> 1, .output_mode = S5H1409_SERIAL_OUTPUT, .gpio = S5H1409_GPIO_ON, .qam_if = 44000, .inversion = S5H1409_INVERSION_OFF, .status_mode = S5H1409_DEMODLOCKING, .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,};static struct s5h1411_config dvico_s5h1411_config = { .output_mode = S5H1411_SERIAL_OUTPUT, .gpio = S5H1411_GPIO_ON, .qam_if = S5H1411_IF_44000, .vsb_if = S5H1411_IF_44000, .inversion = S5H1411_INVERSION_OFF, .status_mode = S5H1411_DEMODLOCKING, .mpeg_timing = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,};static struct xc5000_config hauppauge_hvr1500q_tunerconfig = { .i2c_address = 0x61, .if_khz = 5380,};static struct xc5000_config dvico_xc5000_tunerconfig = { .i2c_address = 0x64, .if_khz = 5380,};static struct tda829x_config tda829x_no_probe = { .probe_tuner = TDA829X_DONT_PROBE,};static struct tda18271_std_map hauppauge_tda18271_std_map = { .atsc_6 = { .if_freq = 5380, .agc_mode = 3, .std = 3, .if_lvl = 6, .rfagc_top = 0x37 }, .qam_6 = { .if_freq = 4000, .agc_mode = 3, .std = 0, .if_lvl = 6, .rfagc_top = 0x37 },};static struct tda18271_config hauppauge_tda18271_config = { .std_map = &hauppauge_tda18271_std_map, .gate = TDA18271_GATE_ANALOG,};static struct tda18271_config hauppauge_hvr1200_tuner_config = { .gate = TDA18271_GATE_ANALOG,};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.000000 * With external clock = 30.000000 */static struct dibx000_bandwidth_config xc3028_bw_config = { 60000, /* internal */ 30000, /* sampling */ 1, /* pll_cfg: prediv */ 8, /* pll_cfg: ratio */ 3, /* pll_cfg: range */ 1, /* pll_cfg: reset */ 0, /* pll_cfg: bypass */ 0, /* misc: refdiv */ 0, /* misc: bypclk_div */ 1, /* misc: IO_CLK_en_core */ 1, /* misc: ADClkSrc */ 0, /* misc: 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 hauppauge_hvr1400_dib7000_config = { .output_mpeg2_in_188_bytes = 1, .hostbus_diversity = 1, .tuner_is_baseband = 0, .update_lna = NULL, .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, .pwm_freq_div = 0, .agc_control = NULL, .spur_protect = 0, .output_mode = OUTMODE_MPEG2_SERIAL,};static struct zl10353_config dvico_fusionhdtv_xc3028 = { .demod_address = 0x0f, .if2 = 45600, .no_tuner = 1,};static int dvb_register(struct cx23885_tsport *port){ struct cx23885_dev *dev = port->dev;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -