1 /* Linux driver for devices based on the DiBcom DiB0700 USB bridge
3 * This program is free software; you can redistribute it and/or modify it
4 * under the terms of the GNU General Public License as published by the Free
5 * Software Foundation, version 2.
7 * Copyright (C) 2005-9 DiBcom, SA et al
11 #include "dib3000mc.h"
17 #include "tuner-xc2028.h"
25 static int force_lna_activation;
26 module_param(force_lna_activation, int, 0644);
27 MODULE_PARM_DESC(force_lna_activation, "force the activation of Low-Noise-Amplifyer(s) (LNA), "
28 "if applicable for the device (default: 0=automatic/off).");
30 struct dib0700_adapter_state {
31 int (*set_param_save) (struct dvb_frontend *, struct dvb_frontend_parameters *);
34 /* Hauppauge Nova-T 500 (aka Bristol)
35 * has a LNA on GPIO0 which is enabled by setting 1 */
36 static struct mt2060_config bristol_mt2060_config[2] = {
46 static struct dibx000_agc_config bristol_dib3000p_mt2060_agc_config = {
47 .band_caps = BAND_VHF | BAND_UHF,
48 .setup = (1 << 8) | (5 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (2 << 0),
68 static struct dib3000mc_config bristol_dib3000mc_config[2] = {
69 { .agc = &bristol_dib3000p_mt2060_agc_config,
71 .ln_adc_level = 0x1cc7,
72 .output_mpeg2_in_188_bytes = 1,
74 { .agc = &bristol_dib3000p_mt2060_agc_config,
76 .ln_adc_level = 0x1cc7,
77 .output_mpeg2_in_188_bytes = 1,
81 static int bristol_frontend_attach(struct dvb_usb_adapter *adap)
83 struct dib0700_state *st = adap->dev->priv;
85 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10);
86 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(10);
87 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
88 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(10);
90 if (force_lna_activation)
91 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
93 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
95 if (dib3000mc_i2c_enumeration(&adap->dev->i2c_adap, 2, DEFAULT_DIB3000P_I2C_ADDRESS, bristol_dib3000mc_config) != 0) {
96 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10);
100 st->mt2060_if1[adap->id] = 1220;
101 return (adap->fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap,
102 (10 + adap->id) << 1, &bristol_dib3000mc_config[adap->id])) == NULL ? -ENODEV : 0;
105 static int eeprom_read(struct i2c_adapter *adap,u8 adrs,u8 *pval)
107 struct i2c_msg msg[2] = {
108 { .addr = 0x50, .flags = 0, .buf = &adrs, .len = 1 },
109 { .addr = 0x50, .flags = I2C_M_RD, .buf = pval, .len = 1 },
111 if (i2c_transfer(adap, msg, 2) != 2) return -EREMOTEIO;
115 static int bristol_tuner_attach(struct dvb_usb_adapter *adap)
117 struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
118 struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe, 1);
121 if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) &&
122 adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_500_2)) {
123 if (!eeprom_read(prim_i2c,0x59 + adap->id,&a)) if1=1220+a;
125 return dvb_attach(mt2060_attach,adap->fe, tun_i2c,&bristol_mt2060_config[adap->id],
126 if1) == NULL ? -ENODEV : 0;
129 /* STK7700D: Pinnacle/Terratec/Hauppauge Dual DVB-T Diversity */
132 static struct dibx000_agc_config stk7700d_7000p_mt2266_agc_config[2] = {
134 BAND_UHF, // band_caps
136 /* 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,
137 * 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 */
138 (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup
171 1, // perform_agc_softsplit
173 BAND_VHF | BAND_LBAND, // band_caps
175 /* 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,
176 * 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 */
177 (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup
210 1, // perform_agc_softsplit
214 static struct dibx000_bandwidth_config stk7700d_mt2266_pll_config = {
215 60000, 30000, // internal, sampling
216 1, 8, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
217 0, 0, 1, 1, 2, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
218 (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
223 static struct dib7000p_config stk7700d_dib7000p_mt2266_config[] = {
224 { .output_mpeg2_in_188_bytes = 1,
225 .hostbus_diversity = 1,
226 .tuner_is_baseband = 1,
228 .agc_config_count = 2,
229 .agc = stk7700d_7000p_mt2266_agc_config,
230 .bw = &stk7700d_mt2266_pll_config,
232 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
233 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
234 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
236 { .output_mpeg2_in_188_bytes = 1,
237 .hostbus_diversity = 1,
238 .tuner_is_baseband = 1,
240 .agc_config_count = 2,
241 .agc = stk7700d_7000p_mt2266_agc_config,
242 .bw = &stk7700d_mt2266_pll_config,
244 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
245 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
246 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
250 static struct mt2266_config stk7700d_mt2266_config[2] = {
251 { .i2c_address = 0x60
253 { .i2c_address = 0x60
257 static int stk7700P2_frontend_attach(struct dvb_usb_adapter *adap)
260 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
262 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
263 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
264 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
265 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
267 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
269 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
270 stk7700d_dib7000p_mt2266_config)
272 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
277 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
278 &stk7700d_dib7000p_mt2266_config[adap->id]);
280 return adap->fe == NULL ? -ENODEV : 0;
283 static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap)
286 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
288 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
289 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
290 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
291 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
293 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
295 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
296 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
297 stk7700d_dib7000p_mt2266_config)
299 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
304 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
305 &stk7700d_dib7000p_mt2266_config[adap->id]);
307 return adap->fe == NULL ? -ENODEV : 0;
310 static int stk7700d_tuner_attach(struct dvb_usb_adapter *adap)
312 struct i2c_adapter *tun_i2c;
313 tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
314 return dvb_attach(mt2266_attach, adap->fe, tun_i2c,
315 &stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0;
318 /* STK7700-PH: Digital/Analog Hybrid Tuner, e.h. Cinergy HT USB HE */
319 static struct dibx000_agc_config xc3028_agc_config = {
320 BAND_VHF | BAND_UHF, /* band_caps */
322 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0,
323 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
324 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
325 (0 << 15) | (0 << 14) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) |
326 (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), /* setup */
329 21, /* time_stabiliz */
341 39718, /* agc2_max */
350 29, /* agc2_slope1 */
351 29, /* agc2_slope2 */
358 1, /* perform_agc_softsplit */
361 /* PLL Configuration for COFDM BW_MHz = 8.00 with external clock = 30.00 */
362 static struct dibx000_bandwidth_config xc3028_bw_config = {
363 60000, 30000, /* internal, sampling */
364 1, 8, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass */
365 0, 0, 1, 1, 0, /* misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc,
367 (3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */
368 (1 << 25) | 5816102, /* ifreq = 5.200000 MHz */
370 30000000, /* xtal_hz */
373 static struct dib7000p_config stk7700ph_dib7700_xc3028_config = {
374 .output_mpeg2_in_188_bytes = 1,
375 .tuner_is_baseband = 1,
377 .agc_config_count = 1,
378 .agc = &xc3028_agc_config,
379 .bw = &xc3028_bw_config,
381 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
382 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
383 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
386 static int stk7700ph_xc3028_callback(void *ptr, int component,
387 int command, int arg)
389 struct dvb_usb_adapter *adap = ptr;
392 case XC2028_TUNER_RESET:
393 /* Send the tuner in then out of reset */
394 dib7000p_set_gpio(adap->fe, 8, 0, 0); msleep(10);
395 dib7000p_set_gpio(adap->fe, 8, 0, 1);
397 case XC2028_RESET_CLK:
400 err("%s: unknown command %d, arg %d\n", __func__,
407 static struct xc2028_ctrl stk7700ph_xc3028_ctrl = {
408 .fname = XC2028_DEFAULT_FIRMWARE,
410 .demod = XC3028_FE_DIBCOM52,
413 static struct xc2028_config stk7700ph_xc3028_config = {
415 .ctrl = &stk7700ph_xc3028_ctrl,
418 static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap)
420 struct usb_device_descriptor *desc = &adap->dev->udev->descriptor;
422 if (desc->idVendor == cpu_to_le16(USB_VID_PINNACLE) &&
423 desc->idProduct == cpu_to_le16(USB_PID_PINNACLE_EXPRESSCARD_320CX))
424 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
426 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
428 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
429 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
430 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
431 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
433 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
435 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
438 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
439 &stk7700ph_dib7700_xc3028_config) != 0) {
440 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
445 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
446 &stk7700ph_dib7700_xc3028_config);
448 return adap->fe == NULL ? -ENODEV : 0;
451 static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap)
453 struct i2c_adapter *tun_i2c;
455 tun_i2c = dib7000p_get_i2c_master(adap->fe,
456 DIBX000_I2C_INTERFACE_TUNER, 1);
458 stk7700ph_xc3028_config.i2c_adap = tun_i2c;
460 /* FIXME: generalize & move to common area */
461 adap->fe->callback = stk7700ph_xc3028_callback;
463 return dvb_attach(xc2028_attach, adap->fe, &stk7700ph_xc3028_config)
464 == NULL ? -ENODEV : 0;
467 #define DEFAULT_RC_INTERVAL 50
469 static u8 rc_request[] = { REQUEST_POLL_RC, 0 };
471 /* Number of keypresses to ignore before start repeating */
472 #define RC_REPEAT_DELAY 6
473 #define RC_REPEAT_DELAY_V1_20 10
477 /* Used by firmware versions < 1.20 (deprecated) */
478 static int dib0700_rc_query_legacy(struct dvb_usb_device *d, u32 *event,
483 struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
484 struct dib0700_state *st = d->priv;
486 *state = REMOTE_NO_KEY_PRESSED;
487 i=dib0700_ctrl_rd(d,rc_request,2,key,4);
489 err("RC Query Failed");
493 /* losing half of KEY_0 events from Philipps rc5 remotes.. */
494 if (key[0]==0 && key[1]==0 && key[2]==0 && key[3]==0) return 0;
496 /* info("%d: %2X %2X %2X %2X",dvb_usb_dib0700_ir_proto,(int)key[3-2],(int)key[3-3],(int)key[3-1],(int)key[3]); */
498 dib0700_rc_setup(d); /* reset ir sensor data to prevent false events */
500 switch (dvb_usb_dib0700_ir_proto) {
502 /* NEC protocol sends repeat code as 0 0 0 FF */
503 if ((key[3-2] == 0x00) && (key[3-3] == 0x00) &&
506 if (st->rc_counter > RC_REPEAT_DELAY) {
507 *event = d->last_event;
508 *state = REMOTE_KEY_PRESSED;
509 st->rc_counter = RC_REPEAT_DELAY;
513 for (i=0;i<d->props.rc_key_map_size; i++) {
514 if (rc5_custom(&keymap[i]) == key[3-2] &&
515 rc5_data(&keymap[i]) == key[3-3]) {
517 *event = keymap[i].event;
518 *state = REMOTE_KEY_PRESSED;
519 d->last_event = keymap[i].event;
526 /* RC-5 protocol changes toggle bit on new keypress */
527 for (i = 0; i < d->props.rc_key_map_size; i++) {
528 if (rc5_custom(&keymap[i]) == key[3-2] &&
529 rc5_data(&keymap[i]) == key[3-3]) {
530 if (d->last_event == keymap[i].event &&
531 key[3-1] == st->rc_toggle) {
533 /* prevents unwanted double hits */
534 if (st->rc_counter > RC_REPEAT_DELAY) {
535 *event = d->last_event;
536 *state = REMOTE_KEY_PRESSED;
537 st->rc_counter = RC_REPEAT_DELAY;
543 *event = keymap[i].event;
544 *state = REMOTE_KEY_PRESSED;
545 st->rc_toggle = key[3-1];
546 d->last_event = keymap[i].event;
553 err("Unknown remote controller key: %2X %2X %2X %2X", (int) key[3-2], (int) key[3-3], (int) key[3-1], (int) key[3]);
558 /* This is the structure of the RC response packet starting in firmware 1.20 */
559 struct dib0700_rc_response {
567 /* This supports the new IR response format for firmware v1.20 */
568 static int dib0700_rc_query_v1_20(struct dvb_usb_device *d, u32 *event,
571 struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
572 struct dib0700_state *st = d->priv;
573 struct dib0700_rc_response poll_reply;
580 /* Set initial results in case we exit the function early */
582 *state = REMOTE_NO_KEY_PRESSED;
584 /* Firmware v1.20 provides RC data via bulk endpoint 1 */
585 status = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev, 1), buf,
586 sizeof(buf), &actlen, 50);
588 /* No data available (meaning no key press) */
593 switch (dvb_usb_dib0700_ir_proto) {
595 poll_reply.report_id = 0;
596 poll_reply.data_state = 1;
597 poll_reply.system = buf[2];
598 poll_reply.data = buf[4];
599 poll_reply.not_data = buf[5];
601 /* NEC protocol sends repeat code as 0 0 0 FF */
602 if ((poll_reply.system == 0x00) && (poll_reply.data == 0x00)
603 && (poll_reply.not_data == 0xff)) {
604 poll_reply.data_state = 2;
609 if (actlen != sizeof(buf)) {
610 /* We didn't get back the 6 byte message we expected */
611 err("Unexpected RC response size [%d]", actlen);
615 poll_reply.report_id = buf[0];
616 poll_reply.data_state = buf[1];
617 poll_reply.system = (buf[2] << 8) | buf[3];
618 poll_reply.data = buf[4];
619 poll_reply.not_data = buf[5];
624 if ((poll_reply.data + poll_reply.not_data) != 0xff) {
625 /* Key failed integrity check */
626 err("key failed integrity check: %04x %02x %02x",
628 poll_reply.data, poll_reply.not_data);
633 /* Find the key in the map */
634 for (i = 0; i < d->props.rc_key_map_size; i++) {
635 if (rc5_custom(&keymap[i]) == (poll_reply.system & 0xff) &&
636 rc5_data(&keymap[i]) == poll_reply.data) {
637 *event = keymap[i].event;
644 err("Unknown remote controller key: %04x %02x %02x",
646 poll_reply.data, poll_reply.not_data);
651 if (poll_reply.data_state == 1) {
654 *event = keymap[i].event;
655 *state = REMOTE_KEY_PRESSED;
656 d->last_event = keymap[i].event;
657 } else if (poll_reply.data_state == 2) {
661 /* prevents unwanted double hits */
662 if (st->rc_counter > RC_REPEAT_DELAY_V1_20) {
663 *event = d->last_event;
664 *state = REMOTE_KEY_PRESSED;
665 st->rc_counter = RC_REPEAT_DELAY_V1_20;
668 err("Unknown data state [%d]", poll_reply.data_state);
674 static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
676 struct dib0700_state *st = d->priv;
678 /* Because some people may have improperly named firmware files,
679 let's figure out whether to use the new firmware call or the legacy
680 call based on the firmware version embedded in the file */
681 if (st->rc_func_version == 0) {
682 u32 hwver, romver, ramver, fwtype;
683 int ret = dib0700_get_version(d, &hwver, &romver, &ramver,
686 err("Could not determine version info");
689 if (ramver < 0x10200)
690 st->rc_func_version = 1;
692 st->rc_func_version = 2;
695 if (st->rc_func_version == 2)
696 return dib0700_rc_query_v1_20(d, event, state);
698 return dib0700_rc_query_legacy(d, event, state);
701 static struct dvb_usb_rc_key dib0700_rc_keys[] = {
702 /* Key codes for the tiny Pinnacle remote*/
703 { 0x0700, KEY_MUTE },
704 { 0x0701, KEY_MENU }, /* Pinnacle logo */
705 { 0x0739, KEY_POWER },
706 { 0x0703, KEY_VOLUMEUP },
707 { 0x0709, KEY_VOLUMEDOWN },
708 { 0x0706, KEY_CHANNELUP },
709 { 0x070c, KEY_CHANNELDOWN },
720 { 0x0724, KEY_SCREEN }, /* 'Square' key */
721 { 0x072a, KEY_TEXT }, /* 'T' key */
722 { 0x072d, KEY_REWIND },
723 { 0x0730, KEY_PLAY },
724 { 0x0733, KEY_FASTFORWARD },
725 { 0x0736, KEY_RECORD },
726 { 0x073c, KEY_STOP },
727 { 0x073f, KEY_CANCEL }, /* '?' key */
728 /* Key codes for the Terratec Cinergy DT XS Diversity, similar to cinergyT2.c */
729 { 0xeb01, KEY_POWER },
739 { 0xeb0b, KEY_VIDEO },
741 { 0xeb0d, KEY_REFRESH },
744 { 0xeb11, KEY_LEFT },
746 { 0xeb13, KEY_RIGHT },
747 { 0xeb14, KEY_DOWN },
748 { 0xeb16, KEY_INFO },
750 { 0xeb18, KEY_GREEN },
751 { 0xeb19, KEY_YELLOW },
752 { 0xeb1a, KEY_BLUE },
753 { 0xeb1b, KEY_CHANNELUP },
754 { 0xeb1c, KEY_VOLUMEUP },
755 { 0xeb1d, KEY_MUTE },
756 { 0xeb1e, KEY_VOLUMEDOWN },
757 { 0xeb1f, KEY_CHANNELDOWN },
758 { 0xeb40, KEY_PAUSE },
759 { 0xeb41, KEY_HOME },
760 { 0xeb42, KEY_MENU }, /* DVD Menu */
761 { 0xeb43, KEY_SUBTITLE },
762 { 0xeb44, KEY_TEXT }, /* Teletext */
763 { 0xeb45, KEY_DELETE },
766 { 0xeb48, KEY_STOP },
767 { 0xeb49, KEY_VIDEO },
768 { 0xeb4a, KEY_AUDIO }, /* Music */
769 { 0xeb4b, KEY_SCREEN }, /* Pic */
770 { 0xeb4c, KEY_PLAY },
771 { 0xeb4d, KEY_BACK },
772 { 0xeb4e, KEY_REWIND },
773 { 0xeb4f, KEY_FASTFORWARD },
774 { 0xeb54, KEY_PREVIOUS },
775 { 0xeb58, KEY_RECORD },
776 { 0xeb5c, KEY_NEXT },
778 /* Key codes for the Haupauge WinTV Nova-TD, copied from nova-t-usb2.c (Nova-T USB2) */
789 { 0x1e0a, KEY_KPASTERISK },
791 { 0x1e0c, KEY_RADIO },
792 { 0x1e0d, KEY_MENU },
793 { 0x1e0e, KEY_GRAVE }, /* # */
794 { 0x1e0f, KEY_MUTE },
795 { 0x1e10, KEY_VOLUMEUP },
796 { 0x1e11, KEY_VOLUMEDOWN },
797 { 0x1e12, KEY_CHANNEL },
799 { 0x1e15, KEY_DOWN },
800 { 0x1e16, KEY_LEFT },
801 { 0x1e17, KEY_RIGHT },
802 { 0x1e18, KEY_VIDEO },
803 { 0x1e19, KEY_AUDIO },
804 { 0x1e1a, KEY_MEDIA },
807 { 0x1e1e, KEY_NEXT },
808 { 0x1e1f, KEY_BACK },
809 { 0x1e20, KEY_CHANNELUP },
810 { 0x1e21, KEY_CHANNELDOWN },
811 { 0x1e24, KEY_LAST }, /* Skip backwards */
814 { 0x1e2e, KEY_GREEN },
815 { 0x1e30, KEY_PAUSE },
816 { 0x1e32, KEY_REWIND },
817 { 0x1e34, KEY_FASTFORWARD },
818 { 0x1e35, KEY_PLAY },
819 { 0x1e36, KEY_STOP },
820 { 0x1e37, KEY_RECORD },
821 { 0x1e38, KEY_YELLOW },
822 { 0x1e3b, KEY_GOTO },
823 { 0x1e3d, KEY_POWER },
825 /* Key codes for the Leadtek Winfast DTV Dongle */
826 { 0x0042, KEY_POWER },
827 { 0x077c, KEY_TUNER },
828 { 0x0f4e, KEY_PRINT }, /* PREVIEW */
829 { 0x0840, KEY_SCREEN }, /* full screen toggle*/
830 { 0x0f71, KEY_DOT }, /* frequency */
841 { 0x0e4e, KEY_CLEAR },
842 { 0x047c, KEY_CHANNEL }, /* show channel number */
843 { 0x0f41, KEY_LAST }, /* recall */
844 { 0x0342, KEY_MUTE },
845 { 0x064c, KEY_RESERVED }, /* PIP button*/
846 { 0x0172, KEY_SHUFFLE }, /* SNAPSHOT */
847 { 0x0c4e, KEY_PLAYPAUSE }, /* TIMESHIFT */
848 { 0x0b70, KEY_RECORD },
849 { 0x037d, KEY_VOLUMEUP },
850 { 0x017d, KEY_VOLUMEDOWN },
851 { 0x0242, KEY_CHANNELUP },
852 { 0x007d, KEY_CHANNELDOWN },
854 /* Key codes for Nova-TD "credit card" remote control. */
865 { 0x1d0a, KEY_TEXT },
866 { 0x1d0d, KEY_MENU },
867 { 0x1d0f, KEY_MUTE },
868 { 0x1d10, KEY_VOLUMEUP },
869 { 0x1d11, KEY_VOLUMEDOWN },
870 { 0x1d12, KEY_CHANNEL },
872 { 0x1d15, KEY_DOWN },
873 { 0x1d16, KEY_LEFT },
874 { 0x1d17, KEY_RIGHT },
876 { 0x1d1e, KEY_NEXT },
877 { 0x1d1f, KEY_BACK },
878 { 0x1d20, KEY_CHANNELUP },
879 { 0x1d21, KEY_CHANNELDOWN },
880 { 0x1d24, KEY_LAST },
882 { 0x1d30, KEY_PAUSE },
883 { 0x1d32, KEY_REWIND },
884 { 0x1d34, KEY_FASTFORWARD },
885 { 0x1d35, KEY_PLAY },
886 { 0x1d36, KEY_STOP },
887 { 0x1d37, KEY_RECORD },
888 { 0x1d3b, KEY_GOTO },
889 { 0x1d3d, KEY_POWER },
891 /* Key codes for the Pixelview SBTVD remote (proto NEC) */
892 { 0x8613, KEY_MUTE },
893 { 0x8612, KEY_POWER },
904 { 0x860d, KEY_CHANNELUP },
905 { 0x8619, KEY_CHANNELDOWN },
906 { 0x8610, KEY_VOLUMEUP },
907 { 0x860c, KEY_VOLUMEDOWN },
909 { 0x860a, KEY_CAMERA },
910 { 0x860b, KEY_ZOOM },
911 { 0x861b, KEY_BACKSPACE },
912 { 0x8615, KEY_ENTER },
915 { 0x861e, KEY_DOWN },
916 { 0x860e, KEY_LEFT },
917 { 0x860f, KEY_RIGHT },
919 { 0x8618, KEY_RECORD },
920 { 0x861a, KEY_STOP },
922 /* Key codes for the EvolutePC TVWay+ remote (proto NEC) */
923 { 0x7a00, KEY_MENU },
924 { 0x7a01, KEY_RECORD },
925 { 0x7a02, KEY_PLAY },
926 { 0x7a03, KEY_STOP },
927 { 0x7a10, KEY_CHANNELUP },
928 { 0x7a11, KEY_CHANNELDOWN },
929 { 0x7a12, KEY_VOLUMEUP },
930 { 0x7a13, KEY_VOLUMEDOWN },
931 { 0x7a40, KEY_POWER },
932 { 0x7a41, KEY_MUTE },
935 /* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */
936 static struct dibx000_agc_config stk7700p_7000m_mt2060_agc_config = {
937 BAND_UHF | BAND_VHF, // band_caps
939 /* 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,
940 * 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 */
941 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup
973 1, // perform_agc_softsplit
976 51800, // global_split_min
977 24700 // global_split_max
981 static struct dibx000_agc_config stk7700p_7000p_mt2060_agc_config = {
984 /* 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,
985 * 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 */
986 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup
1023 0, // perform_agc_softsplit
1026 static struct dibx000_bandwidth_config stk7700p_pll_config = {
1027 60000, 30000, // internal, sampling
1028 1, 8, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
1029 0, 0, 1, 1, 0, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
1030 (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
1036 static struct dib7000m_config stk7700p_dib7000m_config = {
1038 .output_mpeg2_in_188_bytes = 1,
1041 .agc_config_count = 1,
1042 .agc = &stk7700p_7000m_mt2060_agc_config,
1043 .bw = &stk7700p_pll_config,
1045 .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
1046 .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
1047 .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
1050 static struct dib7000p_config stk7700p_dib7000p_config = {
1051 .output_mpeg2_in_188_bytes = 1,
1053 .agc_config_count = 1,
1054 .agc = &stk7700p_7000p_mt2060_agc_config,
1055 .bw = &stk7700p_pll_config,
1057 .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
1058 .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
1059 .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
1062 static int stk7700p_frontend_attach(struct dvb_usb_adapter *adap)
1064 struct dib0700_state *st = adap->dev->priv;
1065 /* unless there is no real power management in DVB - we leave the device on GPIO6 */
1067 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1068 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(50);
1070 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(10);
1071 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1073 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
1074 dib0700_ctrl_clock(adap->dev, 72, 1);
1075 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(100);
1077 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1079 st->mt2060_if1[0] = 1220;
1081 if (dib7000pc_detection(&adap->dev->i2c_adap)) {
1082 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000p_config);
1083 st->is_dib7000pc = 1;
1085 adap->fe = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config);
1087 return adap->fe == NULL ? -ENODEV : 0;
1090 static struct mt2060_config stk7700p_mt2060_config = {
1094 static int stk7700p_tuner_attach(struct dvb_usb_adapter *adap)
1096 struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
1097 struct dib0700_state *st = adap->dev->priv;
1098 struct i2c_adapter *tun_i2c;
1101 if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) &&
1102 adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_STICK)) {
1103 if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a;
1105 if (st->is_dib7000pc)
1106 tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1108 tun_i2c = dib7000m_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1110 return dvb_attach(mt2060_attach, adap->fe, tun_i2c, &stk7700p_mt2060_config,
1111 if1) == NULL ? -ENODEV : 0;
1114 /* DIB7070 generic */
1115 static struct dibx000_agc_config dib7070_agc_config = {
1116 BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
1117 /* 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,
1118 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
1119 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup
1122 10, // time_stabiliz
1153 0, // perform_agc_softsplit
1156 static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff)
1158 deb_info("reset: %d", onoff);
1159 return dib7000p_set_gpio(fe, 8, 0, !onoff);
1162 static int dib7070_tuner_sleep(struct dvb_frontend *fe, int onoff)
1164 deb_info("sleep: %d", onoff);
1165 return dib7000p_set_gpio(fe, 9, 0, onoff);
1168 static struct dib0070_config dib7070p_dib0070_config[2] = {
1170 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1171 .reset = dib7070_tuner_reset,
1172 .sleep = dib7070_tuner_sleep,
1174 .clock_pad_drive = 4,
1177 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1178 .reset = dib7070_tuner_reset,
1179 .sleep = dib7070_tuner_sleep,
1185 static struct dib0070_config dib7770p_dib0070_config = {
1186 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1187 .reset = dib7070_tuner_reset,
1188 .sleep = dib7070_tuner_sleep,
1190 .clock_pad_drive = 0,
1195 static int dib7070_set_param_override(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
1197 struct dvb_usb_adapter *adap = fe->dvb->priv;
1198 struct dib0700_adapter_state *state = adap->priv;
1201 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1203 case BAND_VHF: offset = 950; break;
1205 default: offset = 550; break;
1207 deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
1208 dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
1209 return state->set_param_save(fe, fep);
1212 static int dib7770_set_param_override(struct dvb_frontend *fe,
1213 struct dvb_frontend_parameters *fep)
1215 struct dvb_usb_adapter *adap = fe->dvb->priv;
1216 struct dib0700_adapter_state *state = adap->priv;
1219 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1222 dib7000p_set_gpio(fe, 0, 0, 1);
1227 dib7000p_set_gpio(fe, 0, 0, 0);
1231 deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
1232 dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
1233 return state->set_param_save(fe, fep);
1236 static int dib7770p_tuner_attach(struct dvb_usb_adapter *adap)
1238 struct dib0700_adapter_state *st = adap->priv;
1239 struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe,
1240 DIBX000_I2C_INTERFACE_TUNER, 1);
1242 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
1243 &dib7770p_dib0070_config) == NULL)
1246 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1247 adap->fe->ops.tuner_ops.set_params = dib7770_set_param_override;
1251 static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap)
1253 struct dib0700_adapter_state *st = adap->priv;
1254 struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1256 if (adap->id == 0) {
1257 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c, &dib7070p_dib0070_config[0]) == NULL)
1260 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c, &dib7070p_dib0070_config[1]) == NULL)
1264 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1265 adap->fe->ops.tuner_ops.set_params = dib7070_set_param_override;
1269 static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
1271 return dib7000p_pid_filter(adapter->fe, index, pid, onoff);
1274 static int stk70x0p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
1276 return dib7000p_pid_filter_ctrl(adapter->fe, onoff);
1279 static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
1280 60000, 15000, // internal, sampling
1281 1, 20, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
1282 0, 0, 1, 1, 2, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
1283 (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
1284 (0 << 25) | 0, // ifreq = 0.000000 MHz
1286 12000000, // xtal_hz
1289 static struct dib7000p_config dib7070p_dib7000p_config = {
1290 .output_mpeg2_in_188_bytes = 1,
1292 .agc_config_count = 1,
1293 .agc = &dib7070_agc_config,
1294 .bw = &dib7070_bw_config_12_mhz,
1295 .tuner_is_baseband = 1,
1298 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1299 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1300 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1302 .hostbus_diversity = 1,
1306 static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
1308 struct usb_device_descriptor *p = &adap->dev->udev->descriptor;
1309 if (p->idVendor == cpu_to_le16(USB_VID_PINNACLE) &&
1310 p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E))
1311 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1313 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1315 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1316 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1317 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1318 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1320 dib0700_ctrl_clock(adap->dev, 72, 1);
1323 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1325 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1327 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1328 &dib7070p_dib7000p_config) != 0) {
1329 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
1334 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
1335 &dib7070p_dib7000p_config);
1336 return adap->fe == NULL ? -ENODEV : 0;
1339 /* DIB807x generic */
1340 static struct dibx000_agc_config dib807x_agc_config[2] = {
1343 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1344 * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1345 * P_agc_inv_pwm2=0,P_agc_inh_dc_rv_est=0,
1346 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1348 (0 << 15) | (0 << 14) | (7 << 11) | (0 << 10) | (0 << 9) |
1349 (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
1350 (0 << 0), /* setup*/
1353 10, /* time_stabiliz*/
1363 65535, /* agc1_max*/
1366 65535, /* agc2_max*/
1372 206, /* agc1_slope1*/
1373 255, /* agc1_slope2*/
1376 88, /* agc2_slope1*/
1377 90, /* agc2_slope2*/
1384 0, /* perform_agc_softsplit*/
1387 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1388 * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1389 * P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1390 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1392 (0 << 15) | (0 << 14) | (1 << 11) | (0 << 10) | (0 << 9) |
1393 (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
1394 (0 << 0), /* setup */
1397 10, /* time_stabiliz*/
1407 65535, /* agc1_max*/
1410 65535, /* agc2_max*/
1416 206, /* agc1_slope1*/
1417 255, /* agc1_slope2*/
1420 88, /* agc2_slope1*/
1421 90, /* agc2_slope2*/
1428 0, /* perform_agc_softsplit*/
1432 static struct dibx000_bandwidth_config dib807x_bw_config_12_mhz = {
1433 60000, 15000, /* internal, sampling*/
1434 1, 20, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass*/
1435 0, 0, 1, 1, 2, /* misc: refdiv, bypclk_div, IO_CLK_en_core,
1437 (3 << 14) | (1 << 12) | (599 << 0), /* sad_cfg: refsel, sel, freq_15k*/
1438 (0 << 25) | 0, /* ifreq = 0.000000 MHz*/
1440 12000000, /* xtal_hz*/
1443 static struct dib8000_config dib807x_dib8000_config[2] = {
1445 .output_mpeg2_in_188_bytes = 1,
1447 .agc_config_count = 2,
1448 .agc = dib807x_agc_config,
1449 .pll = &dib807x_bw_config_12_mhz,
1450 .tuner_is_baseband = 1,
1452 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1453 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1454 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1456 .hostbus_diversity = 1,
1458 .agc_control = &dib0070_ctrl_agc_filter,
1459 .output_mode = OUTMODE_MPEG2_FIFO,
1462 .output_mpeg2_in_188_bytes = 1,
1464 .agc_config_count = 2,
1465 .agc = dib807x_agc_config,
1466 .pll = &dib807x_bw_config_12_mhz,
1467 .tuner_is_baseband = 1,
1469 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1470 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1471 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1473 .hostbus_diversity = 1,
1474 .agc_control = &dib0070_ctrl_agc_filter,
1475 .output_mode = OUTMODE_MPEG2_FIFO,
1480 static int dib80xx_tuner_reset(struct dvb_frontend *fe, int onoff)
1482 return dib8000_set_gpio(fe, 5, 0, !onoff);
1485 static int dib80xx_tuner_sleep(struct dvb_frontend *fe, int onoff)
1487 return dib8000_set_gpio(fe, 0, 0, onoff);
1490 static const struct dib0070_wbd_gain_cfg dib8070_wbd_gain_cfg[] = {
1495 static struct dib0070_config dib807x_dib0070_config[2] = {
1497 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1498 .reset = dib80xx_tuner_reset,
1499 .sleep = dib80xx_tuner_sleep,
1501 .clock_pad_drive = 4,
1503 .force_crystal_mode = 1,
1504 .enable_third_order_filter = 1,
1506 .wbd_gain = dib8070_wbd_gain_cfg,
1507 .osc_buffer_state = 0,
1508 .freq_offset_khz_uhf = -100,
1509 .freq_offset_khz_vhf = -100,
1511 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1512 .reset = dib80xx_tuner_reset,
1513 .sleep = dib80xx_tuner_sleep,
1515 .clock_pad_drive = 2,
1517 .force_crystal_mode = 1,
1518 .enable_third_order_filter = 1,
1520 .wbd_gain = dib8070_wbd_gain_cfg,
1521 .osc_buffer_state = 0,
1522 .freq_offset_khz_uhf = -25,
1523 .freq_offset_khz_vhf = -25,
1527 static int dib807x_set_param_override(struct dvb_frontend *fe,
1528 struct dvb_frontend_parameters *fep)
1530 struct dvb_usb_adapter *adap = fe->dvb->priv;
1531 struct dib0700_adapter_state *state = adap->priv;
1533 u16 offset = dib0070_wbd_offset(fe);
1534 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1539 case BAND_UHF: /* fall-thru wanted */
1541 offset += 250; break;
1543 deb_info("WBD for DiB8000: %d\n", offset);
1544 dib8000_set_wbd_ref(fe, offset);
1546 return state->set_param_save(fe, fep);
1549 static int dib807x_tuner_attach(struct dvb_usb_adapter *adap)
1551 struct dib0700_adapter_state *st = adap->priv;
1552 struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe,
1553 DIBX000_I2C_INTERFACE_TUNER, 1);
1555 if (adap->id == 0) {
1556 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
1557 &dib807x_dib0070_config[0]) == NULL)
1560 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
1561 &dib807x_dib0070_config[1]) == NULL)
1565 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1566 adap->fe->ops.tuner_ops.set_params = dib807x_set_param_override;
1570 static int stk80xx_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
1572 return dib8000_pid_filter(adapter->fe, index, pid, onoff);
1575 static int stk80xx_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
1577 return dib8000_pid_filter_ctrl(adapter->fe, onoff);
1581 static int stk807x_frontend_attach(struct dvb_usb_adapter *adap)
1583 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1585 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1586 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1587 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1589 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1591 dib0700_ctrl_clock(adap->dev, 72, 1);
1594 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1596 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1598 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1601 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
1602 &dib807x_dib8000_config[0]);
1604 return adap->fe == NULL ? -ENODEV : 0;
1608 static int stk807xpvr_frontend_attach0(struct dvb_usb_adapter *adap)
1610 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1612 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1614 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1615 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1616 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1618 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1620 dib0700_ctrl_clock(adap->dev, 72, 1);
1623 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1625 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1627 /* initialize IC 0 */
1628 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x12, 0x80);
1630 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
1631 &dib807x_dib8000_config[0]);
1633 return adap->fe == NULL ? -ENODEV : 0;
1636 static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap)
1638 /* initialize IC 1 */
1639 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x22, 0x82);
1641 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82,
1642 &dib807x_dib8000_config[1]);
1644 return adap->fe == NULL ? -ENODEV : 0;
1648 struct dibx000_agc_config dib8090_agc_config[2] = {
1650 BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
1651 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
1652 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
1653 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup
1655 787,// inv_gain = 1/ 90.4dB // no boost, lower gain due to ramp quantification
1656 10, // time_stabiliz
1674 114, // agc1_pt3 // 40.4dB
1682 28, // alpha_mant // 5Hz with 90.2dB
1687 0, // perform_agc_softsplit
1691 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
1692 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
1693 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup
1695 787,// inv_gain = 1/ 90.4dB // no boost, lower gain due to ramp quantification
1696 10, // time_stabiliz
1714 114, // agc1_pt3 // 40.4dB
1722 28, // alpha_mant // 5Hz with 90.2dB
1727 0, // perform_agc_softsplit
1731 static struct dibx000_bandwidth_config dib8090_pll_config_12mhz = {
1732 54000, 13500, // internal, sampling
1733 1, 18, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
1734 0, 0, 1, 1, 2, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
1735 (3 << 14) | (1 << 12) | (599 << 0), // sad_cfg: refsel, sel, freq_15k
1736 (0 << 25) | 0, // ifreq = 0 MHz
1738 12000000, // xtal_hz
1741 static int dib8090_get_adc_power(struct dvb_frontend *fe)
1743 return dib8000_get_adc_power(fe, 1);
1746 static struct dib8000_config dib809x_dib8000_config = {
1747 .output_mpeg2_in_188_bytes = 1,
1749 .agc_config_count = 2,
1750 .agc = dib8090_agc_config,
1751 .agc_control = dib0090_dcc_freq,
1752 .pll = &dib8090_pll_config_12mhz,
1753 .tuner_is_baseband = 1,
1755 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1756 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1757 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1759 .hostbus_diversity = 1,
1761 .output_mode = OUTMODE_MPEG2_FIFO,
1763 .diversity_delay = 144,
1767 static struct dib0090_config dib809x_dib0090_config = {
1771 .io.pll_loopdiv = 20,
1772 .io.adc_clock_ratio = 8,
1773 .io.pll_int_loop_filt = 0,
1774 .io.clock_khz = 12000,
1775 .reset = dib80xx_tuner_reset,
1776 .sleep = dib80xx_tuner_sleep,
1779 .i2c_address = DEFAULT_DIB0090_I2C_ADDRESS,
1780 .wbd_vhf_offset = 100,
1781 .wbd_cband_offset = 450,
1784 .get_adc_power = dib8090_get_adc_power,
1785 .freq_offset_khz_uhf = 0,
1786 .freq_offset_khz_vhf = -143,
1789 static int dib8096_set_param_override(struct dvb_frontend *fe,
1790 struct dvb_frontend_parameters *fep)
1792 struct dvb_usb_adapter *adap = fe->dvb->priv;
1793 struct dib0700_adapter_state *state = adap->priv;
1794 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1797 enum frontend_tune_state tune_state = CT_SHUTDOWN;
1798 u16 ltgain, rf_gain_limit;
1800 ret = state->set_param_save(fe, fep);
1815 offset += (dib0090_get_wbd_offset(fe) * 8 * 18 / 33 + 1) / 2;
1816 dib8000_set_wbd_ref(fe, offset);
1819 if (band == BAND_CBAND)
1821 deb_info("tuning in CBAND - soft-AGC startup\n");
1822 /* TODO specific wbd target for dib0090 - needed for startup ? */
1823 dib0090_set_tune_state(fe, CT_AGC_START);
1826 ret = dib0090_gain_control(fe);
1828 tune_state = dib0090_get_tune_state(fe);
1829 if (tune_state == CT_AGC_STEP_0)
1830 dib8000_set_gpio(fe, 6, 0, 1);
1831 else if (tune_state == CT_AGC_STEP_1)
1833 dib0090_get_current_gain(fe, NULL, NULL, &rf_gain_limit, <gain);
1834 if (rf_gain_limit == 0)
1835 dib8000_set_gpio(fe, 6, 0, 0);
1838 while(tune_state<CT_AGC_STOP);
1839 dib0090_pwm_gain_reset(fe);
1840 dib8000_pwm_agc_reset(fe);
1841 dib8000_set_tune_state(fe, CT_DEMOD_START);
1844 deb_info("not tuning in CBAND - standard AGC startup\n");
1845 dib0090_pwm_gain_reset(fe);
1851 static int dib809x_tuner_attach(struct dvb_usb_adapter *adap)
1853 struct dib0700_adapter_state *st = adap->priv;
1854 struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1856 if (dvb_attach(dib0090_register, adap->fe, tun_i2c, &dib809x_dib0090_config) == NULL)
1859 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1860 adap->fe->ops.tuner_ops.set_params = dib8096_set_param_override;
1864 static int stk809x_frontend_attach(struct dvb_usb_adapter *adap)
1866 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1868 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1869 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1870 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1872 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1874 dib0700_ctrl_clock(adap->dev, 72, 1);
1877 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1879 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1881 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 0x80);
1883 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config);
1885 return adap->fe == NULL ? -ENODEV : 0;
1889 static struct dib7000p_config stk7070pd_dib7000p_config[2] = {
1891 .output_mpeg2_in_188_bytes = 1,
1893 .agc_config_count = 1,
1894 .agc = &dib7070_agc_config,
1895 .bw = &dib7070_bw_config_12_mhz,
1896 .tuner_is_baseband = 1,
1899 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1900 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1901 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1903 .hostbus_diversity = 1,
1905 .output_mpeg2_in_188_bytes = 1,
1907 .agc_config_count = 1,
1908 .agc = &dib7070_agc_config,
1909 .bw = &dib7070_bw_config_12_mhz,
1910 .tuner_is_baseband = 1,
1913 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1914 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1915 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1917 .hostbus_diversity = 1,
1921 static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap)
1923 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1925 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1926 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1927 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1928 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1930 dib0700_ctrl_clock(adap->dev, 72, 1);
1933 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1935 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1937 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
1938 stk7070pd_dib7000p_config) != 0) {
1939 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
1944 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]);
1945 return adap->fe == NULL ? -ENODEV : 0;
1948 static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap)
1950 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]);
1951 return adap->fe == NULL ? -ENODEV : 0;
1955 static struct s5h1411_config pinnacle_801e_config = {
1956 .output_mode = S5H1411_PARALLEL_OUTPUT,
1957 .gpio = S5H1411_GPIO_OFF,
1958 .mpeg_timing = S5H1411_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK,
1959 .qam_if = S5H1411_IF_44000,
1960 .vsb_if = S5H1411_IF_44000,
1961 .inversion = S5H1411_INVERSION_OFF,
1962 .status_mode = S5H1411_DEMODLOCKING
1965 /* Pinnacle PCTV HD Pro 801e GPIOs map:
1966 GPIO0 - currently unknown
1967 GPIO1 - xc5000 tuner reset
1968 GPIO2 - CX25843 sleep
1969 GPIO3 - currently unknown
1970 GPIO4 - currently unknown
1971 GPIO6 - currently unknown
1972 GPIO7 - currently unknown
1973 GPIO9 - currently unknown
1974 GPIO10 - CX25843 reset
1976 static int s5h1411_frontend_attach(struct dvb_usb_adapter *adap)
1978 struct dib0700_state *st = adap->dev->priv;
1980 /* Make use of the new i2c functions from FW 1.20 */
1981 st->fw_use_new_i2c_api = 1;
1983 /* The s5h1411 requires the dib0700 to not be in master mode */
1984 st->disable_streaming_master_mode = 1;
1986 /* All msleep values taken from Windows USB trace */
1987 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
1988 dib0700_set_gpio(adap->dev, GPIO3, GPIO_OUT, 0);
1989 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1991 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1993 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1995 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1996 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1997 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1998 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1999 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 0);
2002 /* Put the CX25843 to sleep for now since we're in digital mode */
2003 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
2005 /* GPIOs are initialized, do the attach */
2006 adap->fe = dvb_attach(s5h1411_attach, &pinnacle_801e_config,
2007 &adap->dev->i2c_adap);
2008 return adap->fe == NULL ? -ENODEV : 0;
2011 static int dib0700_xc5000_tuner_callback(void *priv, int component,
2012 int command, int arg)
2014 struct dvb_usb_adapter *adap = priv;
2016 if (command == XC5000_TUNER_RESET) {
2017 /* Reset the tuner */
2018 dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0);
2020 dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1);
2023 err("xc5000: unknown tuner callback command: %d\n", command);
2030 static struct xc5000_config s5h1411_xc5000_tunerconfig = {
2031 .i2c_address = 0x64,
2035 static int xc5000_tuner_attach(struct dvb_usb_adapter *adap)
2037 /* FIXME: generalize & move to common area */
2038 adap->fe->callback = dib0700_xc5000_tuner_callback;
2040 return dvb_attach(xc5000_attach, adap->fe, &adap->dev->i2c_adap,
2041 &s5h1411_xc5000_tunerconfig)
2042 == NULL ? -ENODEV : 0;
2045 static struct lgdt3305_config hcw_lgdt3305_config = {
2047 .mpeg_mode = LGDT3305_MPEG_PARALLEL,
2048 .tpclk_edge = LGDT3305_TPCLK_FALLING_EDGE,
2049 .tpvalid_polarity = LGDT3305_TP_VALID_LOW,
2051 .spectral_inversion = 1,
2054 .usref_8vsb = 0x0500,
2057 static struct mxl5007t_config hcw_mxl5007t_config = {
2058 .xtal_freq_hz = MxL_XTAL_25_MHZ,
2059 .if_freq_hz = MxL_IF_6_MHZ,
2064 GPIO0 - LNA_CTR (H: LNA power enabled, L: LNA power disabled)
2065 GPIO1 - ANT_SEL (H: VPA, L: MCX)
2071 MXL is behind LG's i2c repeater. LG is on SCL2/SDA2 gpios on the DIB
2073 static int lgdt3305_frontend_attach(struct dvb_usb_adapter *adap)
2075 struct dib0700_state *st = adap->dev->priv;
2077 /* Make use of the new i2c functions from FW 1.20 */
2078 st->fw_use_new_i2c_api = 1;
2080 st->disable_streaming_master_mode = 1;
2082 /* fe power enable */
2083 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
2085 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
2089 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2091 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
2093 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2096 adap->fe = dvb_attach(lgdt3305_attach,
2097 &hcw_lgdt3305_config,
2098 &adap->dev->i2c_adap);
2100 return adap->fe == NULL ? -ENODEV : 0;
2103 static int mxl5007t_tuner_attach(struct dvb_usb_adapter *adap)
2105 return dvb_attach(mxl5007t_attach, adap->fe,
2106 &adap->dev->i2c_adap, 0x60,
2107 &hcw_mxl5007t_config) == NULL ? -ENODEV : 0;
2111 /* DVB-USB and USB stuff follows */
2112 struct usb_device_id dib0700_usb_id_table[] = {
2113 /* 0 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P) },
2114 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P_PC) },
2115 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) },
2116 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) },
2117 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) },
2118 /* 5 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) },
2119 { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500) },
2120 { USB_DEVICE(USB_VID_UNIWILL, USB_PID_UNIWILL_STK7700P) },
2121 { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P) },
2122 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) },
2123 /* 10 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_2) },
2124 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV2000E) },
2125 { USB_DEVICE(USB_VID_TERRATEC,
2126 USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) },
2127 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) },
2128 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700D) },
2129 /* 15 */{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070P) },
2130 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV_DVB_T_FLASH) },
2131 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070PD) },
2132 { USB_DEVICE(USB_VID_PINNACLE,
2133 USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) },
2134 { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500_PC) },
2135 /* 20 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_EXPRESS) },
2136 { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U7000) },
2137 { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) },
2138 { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000) },
2139 { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3100) },
2140 /* 25 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) },
2141 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) },
2142 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_USB_XE) },
2143 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_EXPRESSCARD_320CX) },
2144 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV72E) },
2145 /* 30 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73E) },
2146 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_EC372S) },
2147 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_EXPRESS) },
2148 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS) },
2149 { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P_2) },
2150 /* 35 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK_52009) },
2151 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_3) },
2152 { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U8000) },
2153 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700PH) },
2154 { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000H) },
2155 /* 40 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E) },
2156 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E_SE) },
2157 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_EXPRESS) },
2158 { USB_DEVICE(USB_VID_TERRATEC,
2159 USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2) },
2160 { USB_DEVICE(USB_VID_SONY, USB_PID_SONY_PLAYTV) },
2161 /* 45 */{ USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_PD378S) },
2162 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC) },
2163 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC_B210) },
2164 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_MC770) },
2165 { USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT) },
2166 /* 50 */{ USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT_Dlx) },
2167 { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_H) },
2168 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T3) },
2169 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T5) },
2170 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D) },
2171 /* 55 */{ USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D_2) },
2172 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73A) },
2173 { USB_DEVICE(USB_VID_PCTV, USB_PID_PINNACLE_PCTV73ESE) },
2174 { USB_DEVICE(USB_VID_PCTV, USB_PID_PINNACLE_PCTV282E) },
2175 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7770P) },
2176 /* 60 */{ USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS_2) },
2177 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XPVR) },
2178 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XP) },
2179 { USB_DEVICE(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD) },
2180 { USB_DEVICE(USB_VID_EVOLUTEPC, USB_PID_TVWAY_PLUS) },
2181 /* 65 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73ESE) },
2182 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV282E) },
2183 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK8096GP) },
2184 { 0 } /* Terminating entry */
2186 MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
2188 #define DIB0700_DEFAULT_DEVICE_PROPERTIES \
2189 .caps = DVB_USB_IS_AN_I2C_ADAPTER, \
2190 .usb_ctrl = DEVICE_SPECIFIC, \
2191 .firmware = "dvb-usb-dib0700-1.20.fw", \
2192 .download_firmware = dib0700_download_firmware, \
2193 .no_reconnect = 1, \
2194 .size_of_priv = sizeof(struct dib0700_state), \
2195 .i2c_algo = &dib0700_i2c_algo, \
2196 .identify_state = dib0700_identify_state
2198 #define DIB0700_DEFAULT_STREAMING_CONFIG(ep) \
2199 .streaming_ctrl = dib0700_streaming_ctrl, \
2206 .buffersize = 39480, \
2211 struct dvb_usb_device_properties dib0700_devices[] = {
2213 DIB0700_DEFAULT_DEVICE_PROPERTIES,
2218 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2219 .pid_filter_count = 32,
2220 .pid_filter = stk70x0p_pid_filter,
2221 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2222 .frontend_attach = stk7700p_frontend_attach,
2223 .tuner_attach = stk7700p_tuner_attach,
2225 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2229 .num_device_descs = 8,
2231 { "DiBcom STK7700P reference design",
2232 { &dib0700_usb_id_table[0], &dib0700_usb_id_table[1] },
2235 { "Hauppauge Nova-T Stick",
2236 { &dib0700_usb_id_table[4], &dib0700_usb_id_table[9], NULL },
2239 { "AVerMedia AVerTV DVB-T Volar",
2240 { &dib0700_usb_id_table[5], &dib0700_usb_id_table[10] },
2243 { "Compro Videomate U500",
2244 { &dib0700_usb_id_table[6], &dib0700_usb_id_table[19] },
2247 { "Uniwill STK7700P based (Hama and others)",
2248 { &dib0700_usb_id_table[7], NULL },
2251 { "Leadtek Winfast DTV Dongle (STK7700P based)",
2252 { &dib0700_usb_id_table[8], &dib0700_usb_id_table[34] },
2255 { "AVerMedia AVerTV DVB-T Express",
2256 { &dib0700_usb_id_table[20] },
2260 { &dib0700_usb_id_table[21], NULL },
2265 .rc_interval = DEFAULT_RC_INTERVAL,
2266 .rc_key_map = dib0700_rc_keys,
2267 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2268 .rc_query = dib0700_rc_query
2269 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2274 .frontend_attach = bristol_frontend_attach,
2275 .tuner_attach = bristol_tuner_attach,
2277 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2279 .frontend_attach = bristol_frontend_attach,
2280 .tuner_attach = bristol_tuner_attach,
2282 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2286 .num_device_descs = 1,
2288 { "Hauppauge Nova-T 500 Dual DVB-T",
2289 { &dib0700_usb_id_table[2], &dib0700_usb_id_table[3], NULL },
2294 .rc_interval = DEFAULT_RC_INTERVAL,
2295 .rc_key_map = dib0700_rc_keys,
2296 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2297 .rc_query = dib0700_rc_query
2298 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2303 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2304 .pid_filter_count = 32,
2305 .pid_filter = stk70x0p_pid_filter,
2306 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2307 .frontend_attach = stk7700d_frontend_attach,
2308 .tuner_attach = stk7700d_tuner_attach,
2310 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2312 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2313 .pid_filter_count = 32,
2314 .pid_filter = stk70x0p_pid_filter,
2315 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2316 .frontend_attach = stk7700d_frontend_attach,
2317 .tuner_attach = stk7700d_tuner_attach,
2319 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2323 .num_device_descs = 5,
2325 { "Pinnacle PCTV 2000e",
2326 { &dib0700_usb_id_table[11], NULL },
2329 { "Terratec Cinergy DT XS Diversity",
2330 { &dib0700_usb_id_table[12], NULL },
2333 { "Hauppauge Nova-TD Stick/Elgato Eye-TV Diversity",
2334 { &dib0700_usb_id_table[13], NULL },
2337 { "DiBcom STK7700D reference design",
2338 { &dib0700_usb_id_table[14], NULL },
2341 { "YUAN High-Tech DiBcom STK7700D",
2342 { &dib0700_usb_id_table[55], NULL },
2348 .rc_interval = DEFAULT_RC_INTERVAL,
2349 .rc_key_map = dib0700_rc_keys,
2350 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2351 .rc_query = dib0700_rc_query
2353 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2358 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2359 .pid_filter_count = 32,
2360 .pid_filter = stk70x0p_pid_filter,
2361 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2362 .frontend_attach = stk7700P2_frontend_attach,
2363 .tuner_attach = stk7700d_tuner_attach,
2365 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2369 .num_device_descs = 3,
2371 { "ASUS My Cinema U3000 Mini DVBT Tuner",
2372 { &dib0700_usb_id_table[23], NULL },
2376 { &dib0700_usb_id_table[31], NULL },
2379 { "Terratec Cinergy T Express",
2380 { &dib0700_usb_id_table[42], NULL },
2385 .rc_interval = DEFAULT_RC_INTERVAL,
2386 .rc_key_map = dib0700_rc_keys,
2387 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2388 .rc_query = dib0700_rc_query
2389 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2394 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2395 .pid_filter_count = 32,
2396 .pid_filter = stk70x0p_pid_filter,
2397 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2398 .frontend_attach = stk7070p_frontend_attach,
2399 .tuner_attach = dib7070p_tuner_attach,
2401 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2403 .size_of_priv = sizeof(struct dib0700_adapter_state),
2407 .num_device_descs = 11,
2409 { "DiBcom STK7070P reference design",
2410 { &dib0700_usb_id_table[15], NULL },
2413 { "Pinnacle PCTV DVB-T Flash Stick",
2414 { &dib0700_usb_id_table[16], NULL },
2417 { "Artec T14BR DVB-T",
2418 { &dib0700_usb_id_table[22], NULL },
2421 { "ASUS My Cinema U3100 Mini DVBT Tuner",
2422 { &dib0700_usb_id_table[24], NULL },
2425 { "Hauppauge Nova-T Stick",
2426 { &dib0700_usb_id_table[25], NULL },
2429 { "Hauppauge Nova-T MyTV.t",
2430 { &dib0700_usb_id_table[26], NULL },
2433 { "Pinnacle PCTV 72e",
2434 { &dib0700_usb_id_table[29], NULL },
2437 { "Pinnacle PCTV 73e",
2438 { &dib0700_usb_id_table[30], NULL },
2441 { "Elgato EyeTV DTT",
2442 { &dib0700_usb_id_table[49], NULL },
2446 { &dib0700_usb_id_table[45], NULL },
2449 { "Elgato EyeTV Dtt Dlx PD378S",
2450 { &dib0700_usb_id_table[50], NULL },
2455 .rc_interval = DEFAULT_RC_INTERVAL,
2456 .rc_key_map = dib0700_rc_keys,
2457 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2458 .rc_query = dib0700_rc_query
2460 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2465 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2466 .pid_filter_count = 32,
2467 .pid_filter = stk70x0p_pid_filter,
2468 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2469 .frontend_attach = stk7070p_frontend_attach,
2470 .tuner_attach = dib7070p_tuner_attach,
2472 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2474 .size_of_priv = sizeof(struct dib0700_adapter_state),
2478 .num_device_descs = 3,
2480 { "Pinnacle PCTV 73A",
2481 { &dib0700_usb_id_table[56], NULL },
2484 { "Pinnacle PCTV 73e SE",
2485 { &dib0700_usb_id_table[57], &dib0700_usb_id_table[65], NULL },
2488 { "Pinnacle PCTV 282e",
2489 { &dib0700_usb_id_table[58], &dib0700_usb_id_table[66], NULL },
2494 .rc_interval = DEFAULT_RC_INTERVAL,
2495 .rc_key_map = dib0700_rc_keys,
2496 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2497 .rc_query = dib0700_rc_query
2499 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2504 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2505 .pid_filter_count = 32,
2506 .pid_filter = stk70x0p_pid_filter,
2507 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2508 .frontend_attach = stk7070pd_frontend_attach0,
2509 .tuner_attach = dib7070p_tuner_attach,
2511 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2513 .size_of_priv = sizeof(struct dib0700_adapter_state),
2515 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2516 .pid_filter_count = 32,
2517 .pid_filter = stk70x0p_pid_filter,
2518 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2519 .frontend_attach = stk7070pd_frontend_attach1,
2520 .tuner_attach = dib7070p_tuner_attach,
2522 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2524 .size_of_priv = sizeof(struct dib0700_adapter_state),
2528 .num_device_descs = 6,
2530 { "DiBcom STK7070PD reference design",
2531 { &dib0700_usb_id_table[17], NULL },
2534 { "Pinnacle PCTV Dual DVB-T Diversity Stick",
2535 { &dib0700_usb_id_table[18], NULL },
2538 { "Hauppauge Nova-TD Stick (52009)",
2539 { &dib0700_usb_id_table[35], NULL },
2542 { "Hauppauge Nova-TD-500 (84xxx)",
2543 { &dib0700_usb_id_table[36], NULL },
2546 { "Terratec Cinergy DT USB XS Diversity/ T5",
2547 { &dib0700_usb_id_table[43],
2548 &dib0700_usb_id_table[53], NULL},
2552 { &dib0700_usb_id_table[44], NULL },
2556 .rc_interval = DEFAULT_RC_INTERVAL,
2557 .rc_key_map = dib0700_rc_keys,
2558 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2559 .rc_query = dib0700_rc_query
2560 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2565 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2566 .pid_filter_count = 32,
2567 .pid_filter = stk70x0p_pid_filter,
2568 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2569 .frontend_attach = stk7700ph_frontend_attach,
2570 .tuner_attach = stk7700ph_tuner_attach,
2572 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2574 .size_of_priv = sizeof(struct
2575 dib0700_adapter_state),
2579 .num_device_descs = 9,
2581 { "Terratec Cinergy HT USB XE",
2582 { &dib0700_usb_id_table[27], NULL },
2585 { "Pinnacle Expresscard 320cx",
2586 { &dib0700_usb_id_table[28], NULL },
2589 { "Terratec Cinergy HT Express",
2590 { &dib0700_usb_id_table[32], NULL },
2593 { "Gigabyte U8000-RH",
2594 { &dib0700_usb_id_table[37], NULL },
2597 { "YUAN High-Tech STK7700PH",
2598 { &dib0700_usb_id_table[38], NULL },
2601 { "Asus My Cinema-U3000Hybrid",
2602 { &dib0700_usb_id_table[39], NULL },
2605 { "YUAN High-Tech MC770",
2606 { &dib0700_usb_id_table[48], NULL },
2609 { "Leadtek WinFast DTV Dongle H",
2610 { &dib0700_usb_id_table[51], NULL },
2613 { "YUAN High-Tech STK7700D",
2614 { &dib0700_usb_id_table[54], NULL },
2618 .rc_interval = DEFAULT_RC_INTERVAL,
2619 .rc_key_map = dib0700_rc_keys,
2620 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2621 .rc_query = dib0700_rc_query
2622 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2626 .frontend_attach = s5h1411_frontend_attach,
2627 .tuner_attach = xc5000_tuner_attach,
2629 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2631 .size_of_priv = sizeof(struct
2632 dib0700_adapter_state),
2636 .num_device_descs = 2,
2638 { "Pinnacle PCTV HD Pro USB Stick",
2639 { &dib0700_usb_id_table[40], NULL },
2642 { "Pinnacle PCTV HD USB Stick",
2643 { &dib0700_usb_id_table[41], NULL },
2647 .rc_interval = DEFAULT_RC_INTERVAL,
2648 .rc_key_map = dib0700_rc_keys,
2649 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2650 .rc_query = dib0700_rc_query
2651 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2655 .frontend_attach = lgdt3305_frontend_attach,
2656 .tuner_attach = mxl5007t_tuner_attach,
2658 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2660 .size_of_priv = sizeof(struct
2661 dib0700_adapter_state),
2665 .num_device_descs = 2,
2667 { "Hauppauge ATSC MiniCard (B200)",
2668 { &dib0700_usb_id_table[46], NULL },
2671 { "Hauppauge ATSC MiniCard (B210)",
2672 { &dib0700_usb_id_table[47], NULL },
2676 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2681 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2682 .pid_filter_count = 32,
2683 .pid_filter = stk70x0p_pid_filter,
2684 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2685 .frontend_attach = stk7070p_frontend_attach,
2686 .tuner_attach = dib7770p_tuner_attach,
2688 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2691 sizeof(struct dib0700_adapter_state),
2695 .num_device_descs = 2,
2697 { "DiBcom STK7770P reference design",
2698 { &dib0700_usb_id_table[59], NULL },
2701 { "Terratec Cinergy T USB XXS (HD)/ T3",
2702 { &dib0700_usb_id_table[33],
2703 &dib0700_usb_id_table[52],
2704 &dib0700_usb_id_table[60], NULL},
2708 .rc_interval = DEFAULT_RC_INTERVAL,
2709 .rc_key_map = dib0700_rc_keys,
2710 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2711 .rc_query = dib0700_rc_query
2712 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2716 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2717 .pid_filter_count = 32,
2718 .pid_filter = stk80xx_pid_filter,
2719 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
2720 .frontend_attach = stk807x_frontend_attach,
2721 .tuner_attach = dib807x_tuner_attach,
2723 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2726 sizeof(struct dib0700_adapter_state),
2730 .num_device_descs = 3,
2732 { "DiBcom STK807xP reference design",
2733 { &dib0700_usb_id_table[62], NULL },
2736 { "Prolink Pixelview SBTVD",
2737 { &dib0700_usb_id_table[63], NULL },
2740 { "EvolutePC TVWay+",
2741 { &dib0700_usb_id_table[64], NULL },
2746 .rc_interval = DEFAULT_RC_INTERVAL,
2747 .rc_key_map = dib0700_rc_keys,
2748 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2749 .rc_query = dib0700_rc_query
2751 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2755 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2756 .pid_filter_count = 32,
2757 .pid_filter = stk80xx_pid_filter,
2758 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
2759 .frontend_attach = stk807xpvr_frontend_attach0,
2760 .tuner_attach = dib807x_tuner_attach,
2762 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2765 sizeof(struct dib0700_adapter_state),
2768 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2769 .pid_filter_count = 32,
2770 .pid_filter = stk80xx_pid_filter,
2771 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
2772 .frontend_attach = stk807xpvr_frontend_attach1,
2773 .tuner_attach = dib807x_tuner_attach,
2775 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2778 sizeof(struct dib0700_adapter_state),
2782 .num_device_descs = 1,
2784 { "DiBcom STK807xPVR reference design",
2785 { &dib0700_usb_id_table[61], NULL },
2790 .rc_interval = DEFAULT_RC_INTERVAL,
2791 .rc_key_map = dib0700_rc_keys,
2792 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2793 .rc_query = dib0700_rc_query
2794 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2798 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
2799 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2800 .pid_filter_count = 32,
2801 .pid_filter = stk80xx_pid_filter,
2802 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
2803 .frontend_attach = stk809x_frontend_attach,
2804 .tuner_attach = dib809x_tuner_attach,
2806 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2809 sizeof(struct dib0700_adapter_state),
2813 .num_device_descs = 1,
2815 { "DiBcom STK8096GP reference design",
2816 { &dib0700_usb_id_table[67], NULL },
2821 .rc_interval = DEFAULT_RC_INTERVAL,
2822 .rc_key_map = dib0700_rc_keys,
2823 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2824 .rc_query = dib0700_rc_query
2828 int dib0700_device_count = ARRAY_SIZE(dib0700_devices);