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"
24 static int force_lna_activation;
25 module_param(force_lna_activation, int, 0644);
26 MODULE_PARM_DESC(force_lna_activation, "force the activation of Low-Noise-Amplifyer(s) (LNA), "
27 "if applicable for the device (default: 0=automatic/off).");
29 struct dib0700_adapter_state {
30 int (*set_param_save) (struct dvb_frontend *, struct dvb_frontend_parameters *);
33 /* Hauppauge Nova-T 500 (aka Bristol)
34 * has a LNA on GPIO0 which is enabled by setting 1 */
35 static struct mt2060_config bristol_mt2060_config[2] = {
45 static struct dibx000_agc_config bristol_dib3000p_mt2060_agc_config = {
46 .band_caps = BAND_VHF | BAND_UHF,
47 .setup = (1 << 8) | (5 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (2 << 0),
67 static struct dib3000mc_config bristol_dib3000mc_config[2] = {
68 { .agc = &bristol_dib3000p_mt2060_agc_config,
70 .ln_adc_level = 0x1cc7,
71 .output_mpeg2_in_188_bytes = 1,
73 { .agc = &bristol_dib3000p_mt2060_agc_config,
75 .ln_adc_level = 0x1cc7,
76 .output_mpeg2_in_188_bytes = 1,
80 static int bristol_frontend_attach(struct dvb_usb_adapter *adap)
82 struct dib0700_state *st = adap->dev->priv;
84 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10);
85 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(10);
86 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
87 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(10);
89 if (force_lna_activation)
90 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
92 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
94 if (dib3000mc_i2c_enumeration(&adap->dev->i2c_adap, 2, DEFAULT_DIB3000P_I2C_ADDRESS, bristol_dib3000mc_config) != 0) {
95 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10);
99 st->mt2060_if1[adap->id] = 1220;
100 return (adap->fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap,
101 (10 + adap->id) << 1, &bristol_dib3000mc_config[adap->id])) == NULL ? -ENODEV : 0;
104 static int eeprom_read(struct i2c_adapter *adap,u8 adrs,u8 *pval)
106 struct i2c_msg msg[2] = {
107 { .addr = 0x50, .flags = 0, .buf = &adrs, .len = 1 },
108 { .addr = 0x50, .flags = I2C_M_RD, .buf = pval, .len = 1 },
110 if (i2c_transfer(adap, msg, 2) != 2) return -EREMOTEIO;
114 static int bristol_tuner_attach(struct dvb_usb_adapter *adap)
116 struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
117 struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe, 1);
120 if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) &&
121 adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_500_2)) {
122 if (!eeprom_read(prim_i2c,0x59 + adap->id,&a)) if1=1220+a;
124 return dvb_attach(mt2060_attach,adap->fe, tun_i2c,&bristol_mt2060_config[adap->id],
125 if1) == NULL ? -ENODEV : 0;
128 /* STK7700D: Pinnacle/Terratec/Hauppauge Dual DVB-T Diversity */
131 static struct dibx000_agc_config stk7700d_7000p_mt2266_agc_config[2] = {
133 BAND_UHF, // band_caps
135 /* 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,
136 * 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 */
137 (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup
170 1, // perform_agc_softsplit
172 BAND_VHF | BAND_LBAND, // band_caps
174 /* 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,
175 * 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 */
176 (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup
209 1, // perform_agc_softsplit
213 static struct dibx000_bandwidth_config stk7700d_mt2266_pll_config = {
214 60000, 30000, // internal, sampling
215 1, 8, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
216 0, 0, 1, 1, 2, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
217 (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
222 static struct dib7000p_config stk7700d_dib7000p_mt2266_config[] = {
223 { .output_mpeg2_in_188_bytes = 1,
224 .hostbus_diversity = 1,
225 .tuner_is_baseband = 1,
227 .agc_config_count = 2,
228 .agc = stk7700d_7000p_mt2266_agc_config,
229 .bw = &stk7700d_mt2266_pll_config,
231 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
232 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
233 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
235 { .output_mpeg2_in_188_bytes = 1,
236 .hostbus_diversity = 1,
237 .tuner_is_baseband = 1,
239 .agc_config_count = 2,
240 .agc = stk7700d_7000p_mt2266_agc_config,
241 .bw = &stk7700d_mt2266_pll_config,
243 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
244 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
245 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
249 static struct mt2266_config stk7700d_mt2266_config[2] = {
250 { .i2c_address = 0x60
252 { .i2c_address = 0x60
256 static int stk7700P2_frontend_attach(struct dvb_usb_adapter *adap)
259 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
261 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
262 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
263 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
264 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
266 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
268 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
269 stk7700d_dib7000p_mt2266_config)
271 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
276 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
277 &stk7700d_dib7000p_mt2266_config[adap->id]);
279 return adap->fe == NULL ? -ENODEV : 0;
282 static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap)
285 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
287 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
288 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
289 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
290 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
292 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
294 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
295 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
296 stk7700d_dib7000p_mt2266_config)
298 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
303 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
304 &stk7700d_dib7000p_mt2266_config[adap->id]);
306 return adap->fe == NULL ? -ENODEV : 0;
309 static int stk7700d_tuner_attach(struct dvb_usb_adapter *adap)
311 struct i2c_adapter *tun_i2c;
312 tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
313 return dvb_attach(mt2266_attach, adap->fe, tun_i2c,
314 &stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0;
317 /* STK7700-PH: Digital/Analog Hybrid Tuner, e.h. Cinergy HT USB HE */
318 static struct dibx000_agc_config xc3028_agc_config = {
319 BAND_VHF | BAND_UHF, /* band_caps */
321 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0,
322 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
323 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
324 (0 << 15) | (0 << 14) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) |
325 (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), /* setup */
328 21, /* time_stabiliz */
340 39718, /* agc2_max */
349 29, /* agc2_slope1 */
350 29, /* agc2_slope2 */
357 1, /* perform_agc_softsplit */
360 /* PLL Configuration for COFDM BW_MHz = 8.00 with external clock = 30.00 */
361 static struct dibx000_bandwidth_config xc3028_bw_config = {
362 60000, 30000, /* internal, sampling */
363 1, 8, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass */
364 0, 0, 1, 1, 0, /* misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc,
366 (3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */
367 (1 << 25) | 5816102, /* ifreq = 5.200000 MHz */
369 30000000, /* xtal_hz */
372 static struct dib7000p_config stk7700ph_dib7700_xc3028_config = {
373 .output_mpeg2_in_188_bytes = 1,
374 .tuner_is_baseband = 1,
376 .agc_config_count = 1,
377 .agc = &xc3028_agc_config,
378 .bw = &xc3028_bw_config,
380 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
381 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
382 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
385 static int stk7700ph_xc3028_callback(void *ptr, int component,
386 int command, int arg)
388 struct dvb_usb_adapter *adap = ptr;
391 case XC2028_TUNER_RESET:
392 /* Send the tuner in then out of reset */
393 dib7000p_set_gpio(adap->fe, 8, 0, 0); msleep(10);
394 dib7000p_set_gpio(adap->fe, 8, 0, 1);
396 case XC2028_RESET_CLK:
399 err("%s: unknown command %d, arg %d\n", __func__,
406 static struct xc2028_ctrl stk7700ph_xc3028_ctrl = {
407 .fname = XC2028_DEFAULT_FIRMWARE,
409 .demod = XC3028_FE_DIBCOM52,
412 static struct xc2028_config stk7700ph_xc3028_config = {
414 .ctrl = &stk7700ph_xc3028_ctrl,
417 static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap)
419 struct usb_device_descriptor *desc = &adap->dev->udev->descriptor;
421 if (desc->idVendor == cpu_to_le16(USB_VID_PINNACLE) &&
422 desc->idProduct == cpu_to_le16(USB_PID_PINNACLE_EXPRESSCARD_320CX))
423 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
425 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
427 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
428 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
429 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
430 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
432 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
434 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
437 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
438 &stk7700ph_dib7700_xc3028_config) != 0) {
439 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
444 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
445 &stk7700ph_dib7700_xc3028_config);
447 return adap->fe == NULL ? -ENODEV : 0;
450 static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap)
452 struct i2c_adapter *tun_i2c;
454 tun_i2c = dib7000p_get_i2c_master(adap->fe,
455 DIBX000_I2C_INTERFACE_TUNER, 1);
457 stk7700ph_xc3028_config.i2c_adap = tun_i2c;
459 /* FIXME: generalize & move to common area */
460 adap->fe->callback = stk7700ph_xc3028_callback;
462 return dvb_attach(xc2028_attach, adap->fe, &stk7700ph_xc3028_config)
463 == NULL ? -ENODEV : 0;
466 #define DEFAULT_RC_INTERVAL 50
468 static u8 rc_request[] = { REQUEST_POLL_RC, 0 };
470 /* Number of keypresses to ignore before start repeating */
471 #define RC_REPEAT_DELAY 6
472 #define RC_REPEAT_DELAY_V1_20 10
476 /* Used by firmware versions < 1.20 (deprecated) */
477 static int dib0700_rc_query_legacy(struct dvb_usb_device *d, u32 *event,
482 struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
483 struct dib0700_state *st = d->priv;
485 *state = REMOTE_NO_KEY_PRESSED;
486 i=dib0700_ctrl_rd(d,rc_request,2,key,4);
488 err("RC Query Failed");
492 /* losing half of KEY_0 events from Philipps rc5 remotes.. */
493 if (key[0]==0 && key[1]==0 && key[2]==0 && key[3]==0) return 0;
495 /* 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]); */
497 dib0700_rc_setup(d); /* reset ir sensor data to prevent false events */
499 switch (dvb_usb_dib0700_ir_proto) {
501 /* NEC protocol sends repeat code as 0 0 0 FF */
502 if ((key[3-2] == 0x00) && (key[3-3] == 0x00) &&
505 if (st->rc_counter > RC_REPEAT_DELAY) {
506 *event = d->last_event;
507 *state = REMOTE_KEY_PRESSED;
508 st->rc_counter = RC_REPEAT_DELAY;
512 for (i=0;i<d->props.rc_key_map_size; i++) {
513 if (rc5_custom(&keymap[i]) == key[3-2] &&
514 rc5_data(&keymap[i]) == key[3-3]) {
516 *event = keymap[i].event;
517 *state = REMOTE_KEY_PRESSED;
518 d->last_event = keymap[i].event;
525 /* RC-5 protocol changes toggle bit on new keypress */
526 for (i = 0; i < d->props.rc_key_map_size; i++) {
527 if (rc5_custom(&keymap[i]) == key[3-2] &&
528 rc5_data(&keymap[i]) == key[3-3]) {
529 if (d->last_event == keymap[i].event &&
530 key[3-1] == st->rc_toggle) {
532 /* prevents unwanted double hits */
533 if (st->rc_counter > RC_REPEAT_DELAY) {
534 *event = d->last_event;
535 *state = REMOTE_KEY_PRESSED;
536 st->rc_counter = RC_REPEAT_DELAY;
542 *event = keymap[i].event;
543 *state = REMOTE_KEY_PRESSED;
544 st->rc_toggle = key[3-1];
545 d->last_event = keymap[i].event;
552 err("Unknown remote controller key: %2X %2X %2X %2X", (int) key[3-2], (int) key[3-3], (int) key[3-1], (int) key[3]);
557 /* This is the structure of the RC response packet starting in firmware 1.20 */
558 struct dib0700_rc_response {
566 /* This supports the new IR response format for firmware v1.20 */
567 static int dib0700_rc_query_v1_20(struct dvb_usb_device *d, u32 *event,
570 struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
571 struct dib0700_state *st = d->priv;
572 struct dib0700_rc_response poll_reply;
579 /* Set initial results in case we exit the function early */
581 *state = REMOTE_NO_KEY_PRESSED;
583 /* Firmware v1.20 provides RC data via bulk endpoint 1 */
584 status = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev, 1), buf,
585 sizeof(buf), &actlen, 50);
587 /* No data available (meaning no key press) */
592 switch (dvb_usb_dib0700_ir_proto) {
594 poll_reply.report_id = 0;
595 poll_reply.data_state = 1;
596 poll_reply.system = buf[2];
597 poll_reply.data = buf[4];
598 poll_reply.not_data = buf[5];
600 /* NEC protocol sends repeat code as 0 0 0 FF */
601 if ((poll_reply.system == 0x00) && (poll_reply.data == 0x00)
602 && (poll_reply.not_data == 0xff)) {
603 poll_reply.data_state = 2;
608 if (actlen != sizeof(buf)) {
609 /* We didn't get back the 6 byte message we expected */
610 err("Unexpected RC response size [%d]", actlen);
614 poll_reply.report_id = buf[0];
615 poll_reply.data_state = buf[1];
616 poll_reply.system = (buf[2] << 8) | buf[3];
617 poll_reply.data = buf[4];
618 poll_reply.not_data = buf[5];
623 if ((poll_reply.data + poll_reply.not_data) != 0xff) {
624 /* Key failed integrity check */
625 err("key failed integrity check: %04x %02x %02x",
627 poll_reply.data, poll_reply.not_data);
632 /* Find the key in the map */
633 for (i = 0; i < d->props.rc_key_map_size; i++) {
634 if (rc5_custom(&keymap[i]) == (poll_reply.system & 0xff) &&
635 rc5_data(&keymap[i]) == poll_reply.data) {
636 *event = keymap[i].event;
643 err("Unknown remote controller key: %04x %02x %02x",
645 poll_reply.data, poll_reply.not_data);
650 if (poll_reply.data_state == 1) {
653 *event = keymap[i].event;
654 *state = REMOTE_KEY_PRESSED;
655 d->last_event = keymap[i].event;
656 } else if (poll_reply.data_state == 2) {
660 /* prevents unwanted double hits */
661 if (st->rc_counter > RC_REPEAT_DELAY_V1_20) {
662 *event = d->last_event;
663 *state = REMOTE_KEY_PRESSED;
664 st->rc_counter = RC_REPEAT_DELAY_V1_20;
667 err("Unknown data state [%d]", poll_reply.data_state);
673 static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
675 struct dib0700_state *st = d->priv;
677 /* Because some people may have improperly named firmware files,
678 let's figure out whether to use the new firmware call or the legacy
679 call based on the firmware version embedded in the file */
680 if (st->rc_func_version == 0) {
681 u32 hwver, romver, ramver, fwtype;
682 int ret = dib0700_get_version(d, &hwver, &romver, &ramver,
685 err("Could not determine version info");
688 if (ramver < 0x10200)
689 st->rc_func_version = 1;
691 st->rc_func_version = 2;
694 if (st->rc_func_version == 2)
695 return dib0700_rc_query_v1_20(d, event, state);
697 return dib0700_rc_query_legacy(d, event, state);
700 static struct dvb_usb_rc_key dib0700_rc_keys[] = {
701 /* Key codes for the tiny Pinnacle remote*/
702 { 0x0700, KEY_MUTE },
703 { 0x0701, KEY_MENU }, /* Pinnacle logo */
704 { 0x0739, KEY_POWER },
705 { 0x0703, KEY_VOLUMEUP },
706 { 0x0709, KEY_VOLUMEDOWN },
707 { 0x0706, KEY_CHANNELUP },
708 { 0x070c, KEY_CHANNELDOWN },
719 { 0x0724, KEY_SCREEN }, /* 'Square' key */
720 { 0x072a, KEY_TEXT }, /* 'T' key */
721 { 0x072d, KEY_REWIND },
722 { 0x0730, KEY_PLAY },
723 { 0x0733, KEY_FASTFORWARD },
724 { 0x0736, KEY_RECORD },
725 { 0x073c, KEY_STOP },
726 { 0x073f, KEY_CANCEL }, /* '?' key */
727 /* Key codes for the Terratec Cinergy DT XS Diversity, similar to cinergyT2.c */
728 { 0xeb01, KEY_POWER },
738 { 0xeb0b, KEY_VIDEO },
740 { 0xeb0d, KEY_REFRESH },
743 { 0xeb11, KEY_LEFT },
745 { 0xeb13, KEY_RIGHT },
746 { 0xeb14, KEY_DOWN },
747 { 0xeb16, KEY_INFO },
749 { 0xeb18, KEY_GREEN },
750 { 0xeb19, KEY_YELLOW },
751 { 0xeb1a, KEY_BLUE },
752 { 0xeb1b, KEY_CHANNELUP },
753 { 0xeb1c, KEY_VOLUMEUP },
754 { 0xeb1d, KEY_MUTE },
755 { 0xeb1e, KEY_VOLUMEDOWN },
756 { 0xeb1f, KEY_CHANNELDOWN },
757 { 0xeb40, KEY_PAUSE },
758 { 0xeb41, KEY_HOME },
759 { 0xeb42, KEY_MENU }, /* DVD Menu */
760 { 0xeb43, KEY_SUBTITLE },
761 { 0xeb44, KEY_TEXT }, /* Teletext */
762 { 0xeb45, KEY_DELETE },
765 { 0xeb48, KEY_STOP },
766 { 0xeb49, KEY_VIDEO },
767 { 0xeb4a, KEY_AUDIO }, /* Music */
768 { 0xeb4b, KEY_SCREEN }, /* Pic */
769 { 0xeb4c, KEY_PLAY },
770 { 0xeb4d, KEY_BACK },
771 { 0xeb4e, KEY_REWIND },
772 { 0xeb4f, KEY_FASTFORWARD },
773 { 0xeb54, KEY_PREVIOUS },
774 { 0xeb58, KEY_RECORD },
775 { 0xeb5c, KEY_NEXT },
777 /* Key codes for the Haupauge WinTV Nova-TD, copied from nova-t-usb2.c (Nova-T USB2) */
788 { 0x1e0a, KEY_KPASTERISK },
790 { 0x1e0c, KEY_RADIO },
791 { 0x1e0d, KEY_MENU },
792 { 0x1e0e, KEY_GRAVE }, /* # */
793 { 0x1e0f, KEY_MUTE },
794 { 0x1e10, KEY_VOLUMEUP },
795 { 0x1e11, KEY_VOLUMEDOWN },
796 { 0x1e12, KEY_CHANNEL },
798 { 0x1e15, KEY_DOWN },
799 { 0x1e16, KEY_LEFT },
800 { 0x1e17, KEY_RIGHT },
801 { 0x1e18, KEY_VIDEO },
802 { 0x1e19, KEY_AUDIO },
803 { 0x1e1a, KEY_MEDIA },
806 { 0x1e1e, KEY_NEXT },
807 { 0x1e1f, KEY_BACK },
808 { 0x1e20, KEY_CHANNELUP },
809 { 0x1e21, KEY_CHANNELDOWN },
810 { 0x1e24, KEY_LAST }, /* Skip backwards */
813 { 0x1e2e, KEY_GREEN },
814 { 0x1e30, KEY_PAUSE },
815 { 0x1e32, KEY_REWIND },
816 { 0x1e34, KEY_FASTFORWARD },
817 { 0x1e35, KEY_PLAY },
818 { 0x1e36, KEY_STOP },
819 { 0x1e37, KEY_RECORD },
820 { 0x1e38, KEY_YELLOW },
821 { 0x1e3b, KEY_GOTO },
822 { 0x1e3d, KEY_POWER },
824 /* Key codes for the Leadtek Winfast DTV Dongle */
825 { 0x0042, KEY_POWER },
826 { 0x077c, KEY_TUNER },
827 { 0x0f4e, KEY_PRINT }, /* PREVIEW */
828 { 0x0840, KEY_SCREEN }, /* full screen toggle*/
829 { 0x0f71, KEY_DOT }, /* frequency */
840 { 0x0e4e, KEY_CLEAR },
841 { 0x047c, KEY_CHANNEL }, /* show channel number */
842 { 0x0f41, KEY_LAST }, /* recall */
843 { 0x0342, KEY_MUTE },
844 { 0x064c, KEY_RESERVED }, /* PIP button*/
845 { 0x0172, KEY_SHUFFLE }, /* SNAPSHOT */
846 { 0x0c4e, KEY_PLAYPAUSE }, /* TIMESHIFT */
847 { 0x0b70, KEY_RECORD },
848 { 0x037d, KEY_VOLUMEUP },
849 { 0x017d, KEY_VOLUMEDOWN },
850 { 0x0242, KEY_CHANNELUP },
851 { 0x007d, KEY_CHANNELDOWN },
853 /* Key codes for Nova-TD "credit card" remote control. */
864 { 0x1d0a, KEY_TEXT },
865 { 0x1d0d, KEY_MENU },
866 { 0x1d0f, KEY_MUTE },
867 { 0x1d10, KEY_VOLUMEUP },
868 { 0x1d11, KEY_VOLUMEDOWN },
869 { 0x1d12, KEY_CHANNEL },
871 { 0x1d15, KEY_DOWN },
872 { 0x1d16, KEY_LEFT },
873 { 0x1d17, KEY_RIGHT },
875 { 0x1d1e, KEY_NEXT },
876 { 0x1d1f, KEY_BACK },
877 { 0x1d20, KEY_CHANNELUP },
878 { 0x1d21, KEY_CHANNELDOWN },
879 { 0x1d24, KEY_LAST },
881 { 0x1d30, KEY_PAUSE },
882 { 0x1d32, KEY_REWIND },
883 { 0x1d34, KEY_FASTFORWARD },
884 { 0x1d35, KEY_PLAY },
885 { 0x1d36, KEY_STOP },
886 { 0x1d37, KEY_RECORD },
887 { 0x1d3b, KEY_GOTO },
888 { 0x1d3d, KEY_POWER },
890 /* Key codes for the Pixelview SBTVD remote (proto NEC) */
891 { 0x8613, KEY_MUTE },
892 { 0x8612, KEY_POWER },
903 { 0x860d, KEY_CHANNELUP },
904 { 0x8619, KEY_CHANNELDOWN },
905 { 0x8610, KEY_VOLUMEUP },
906 { 0x860c, KEY_VOLUMEDOWN },
908 { 0x860a, KEY_CAMERA },
909 { 0x860b, KEY_ZOOM },
910 { 0x861b, KEY_BACKSPACE },
911 { 0x8615, KEY_ENTER },
914 { 0x861e, KEY_DOWN },
915 { 0x860e, KEY_LEFT },
916 { 0x860f, KEY_RIGHT },
918 { 0x8618, KEY_RECORD },
919 { 0x861a, KEY_STOP },
921 /* Key codes for the EvolutePC TVWay+ remote (proto NEC) */
922 { 0x7a00, KEY_MENU },
923 { 0x7a01, KEY_RECORD },
924 { 0x7a02, KEY_PLAY },
925 { 0x7a03, KEY_STOP },
926 { 0x7a10, KEY_CHANNELUP },
927 { 0x7a11, KEY_CHANNELDOWN },
928 { 0x7a12, KEY_VOLUMEUP },
929 { 0x7a13, KEY_VOLUMEDOWN },
930 { 0x7a40, KEY_POWER },
931 { 0x7a41, KEY_MUTE },
934 /* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */
935 static struct dibx000_agc_config stk7700p_7000m_mt2060_agc_config = {
936 BAND_UHF | BAND_VHF, // band_caps
938 /* 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,
939 * 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 */
940 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup
972 1, // perform_agc_softsplit
975 51800, // global_split_min
976 24700 // global_split_max
980 static struct dibx000_agc_config stk7700p_7000p_mt2060_agc_config = {
983 /* 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,
984 * 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 */
985 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup
1022 0, // perform_agc_softsplit
1025 static struct dibx000_bandwidth_config stk7700p_pll_config = {
1026 60000, 30000, // internal, sampling
1027 1, 8, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
1028 0, 0, 1, 1, 0, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
1029 (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
1035 static struct dib7000m_config stk7700p_dib7000m_config = {
1037 .output_mpeg2_in_188_bytes = 1,
1040 .agc_config_count = 1,
1041 .agc = &stk7700p_7000m_mt2060_agc_config,
1042 .bw = &stk7700p_pll_config,
1044 .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
1045 .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
1046 .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
1049 static struct dib7000p_config stk7700p_dib7000p_config = {
1050 .output_mpeg2_in_188_bytes = 1,
1052 .agc_config_count = 1,
1053 .agc = &stk7700p_7000p_mt2060_agc_config,
1054 .bw = &stk7700p_pll_config,
1056 .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
1057 .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
1058 .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
1061 static int stk7700p_frontend_attach(struct dvb_usb_adapter *adap)
1063 struct dib0700_state *st = adap->dev->priv;
1064 /* unless there is no real power management in DVB - we leave the device on GPIO6 */
1066 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1067 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(50);
1069 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(10);
1070 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1072 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
1073 dib0700_ctrl_clock(adap->dev, 72, 1);
1074 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(100);
1076 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1078 st->mt2060_if1[0] = 1220;
1080 if (dib7000pc_detection(&adap->dev->i2c_adap)) {
1081 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000p_config);
1082 st->is_dib7000pc = 1;
1084 adap->fe = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config);
1086 return adap->fe == NULL ? -ENODEV : 0;
1089 static struct mt2060_config stk7700p_mt2060_config = {
1093 static int stk7700p_tuner_attach(struct dvb_usb_adapter *adap)
1095 struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
1096 struct dib0700_state *st = adap->dev->priv;
1097 struct i2c_adapter *tun_i2c;
1100 if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) &&
1101 adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_STICK)) {
1102 if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a;
1104 if (st->is_dib7000pc)
1105 tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1107 tun_i2c = dib7000m_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1109 return dvb_attach(mt2060_attach, adap->fe, tun_i2c, &stk7700p_mt2060_config,
1110 if1) == NULL ? -ENODEV : 0;
1113 /* DIB7070 generic */
1114 static struct dibx000_agc_config dib7070_agc_config = {
1115 BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
1116 /* 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,
1117 * 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 */
1118 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup
1121 10, // time_stabiliz
1152 0, // perform_agc_softsplit
1155 static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff)
1157 deb_info("reset: %d", onoff);
1158 return dib7000p_set_gpio(fe, 8, 0, !onoff);
1161 static int dib7070_tuner_sleep(struct dvb_frontend *fe, int onoff)
1163 deb_info("sleep: %d", onoff);
1164 return dib7000p_set_gpio(fe, 9, 0, onoff);
1167 static struct dib0070_config dib7070p_dib0070_config[2] = {
1169 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1170 .reset = dib7070_tuner_reset,
1171 .sleep = dib7070_tuner_sleep,
1173 .clock_pad_drive = 4,
1176 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1177 .reset = dib7070_tuner_reset,
1178 .sleep = dib7070_tuner_sleep,
1184 static struct dib0070_config dib7770p_dib0070_config = {
1185 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1186 .reset = dib7070_tuner_reset,
1187 .sleep = dib7070_tuner_sleep,
1189 .clock_pad_drive = 0,
1194 static int dib7070_set_param_override(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
1196 struct dvb_usb_adapter *adap = fe->dvb->priv;
1197 struct dib0700_adapter_state *state = adap->priv;
1200 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1202 case BAND_VHF: offset = 950; break;
1204 default: offset = 550; break;
1206 deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
1207 dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
1208 return state->set_param_save(fe, fep);
1211 static int dib7770_set_param_override(struct dvb_frontend *fe,
1212 struct dvb_frontend_parameters *fep)
1214 struct dvb_usb_adapter *adap = fe->dvb->priv;
1215 struct dib0700_adapter_state *state = adap->priv;
1218 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1221 dib7000p_set_gpio(fe, 0, 0, 1);
1226 dib7000p_set_gpio(fe, 0, 0, 0);
1230 deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
1231 dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
1232 return state->set_param_save(fe, fep);
1235 static int dib7770p_tuner_attach(struct dvb_usb_adapter *adap)
1237 struct dib0700_adapter_state *st = adap->priv;
1238 struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe,
1239 DIBX000_I2C_INTERFACE_TUNER, 1);
1241 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
1242 &dib7770p_dib0070_config) == NULL)
1245 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1246 adap->fe->ops.tuner_ops.set_params = dib7770_set_param_override;
1250 static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap)
1252 struct dib0700_adapter_state *st = adap->priv;
1253 struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1255 if (adap->id == 0) {
1256 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c, &dib7070p_dib0070_config[0]) == NULL)
1259 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c, &dib7070p_dib0070_config[1]) == NULL)
1263 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1264 adap->fe->ops.tuner_ops.set_params = dib7070_set_param_override;
1268 static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
1270 return dib7000p_pid_filter(adapter->fe, index, pid, onoff);
1273 static int stk70x0p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
1275 return dib7000p_pid_filter_ctrl(adapter->fe, onoff);
1278 static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
1279 60000, 15000, // internal, sampling
1280 1, 20, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
1281 0, 0, 1, 1, 2, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
1282 (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
1283 (0 << 25) | 0, // ifreq = 0.000000 MHz
1285 12000000, // xtal_hz
1288 static struct dib7000p_config dib7070p_dib7000p_config = {
1289 .output_mpeg2_in_188_bytes = 1,
1291 .agc_config_count = 1,
1292 .agc = &dib7070_agc_config,
1293 .bw = &dib7070_bw_config_12_mhz,
1294 .tuner_is_baseband = 1,
1297 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1298 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1299 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1301 .hostbus_diversity = 1,
1305 static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
1307 struct usb_device_descriptor *p = &adap->dev->udev->descriptor;
1308 if (p->idVendor == cpu_to_le16(USB_VID_PINNACLE) &&
1309 p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E))
1310 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1312 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1314 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1315 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1316 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1317 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1319 dib0700_ctrl_clock(adap->dev, 72, 1);
1322 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1324 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1326 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1327 &dib7070p_dib7000p_config) != 0) {
1328 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
1333 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
1334 &dib7070p_dib7000p_config);
1335 return adap->fe == NULL ? -ENODEV : 0;
1338 /* DIB807x generic */
1339 static struct dibx000_agc_config dib807x_agc_config[2] = {
1342 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1343 * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1344 * P_agc_inv_pwm2=0,P_agc_inh_dc_rv_est=0,
1345 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1347 (0 << 15) | (0 << 14) | (7 << 11) | (0 << 10) | (0 << 9) |
1348 (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
1349 (0 << 0), /* setup*/
1352 10, /* time_stabiliz*/
1362 65535, /* agc1_max*/
1365 65535, /* agc2_max*/
1371 206, /* agc1_slope1*/
1372 255, /* agc1_slope2*/
1375 88, /* agc2_slope1*/
1376 90, /* agc2_slope2*/
1383 0, /* perform_agc_softsplit*/
1386 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1387 * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1388 * P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1389 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1391 (0 << 15) | (0 << 14) | (1 << 11) | (0 << 10) | (0 << 9) |
1392 (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
1393 (0 << 0), /* setup */
1396 10, /* time_stabiliz*/
1406 65535, /* agc1_max*/
1409 65535, /* agc2_max*/
1415 206, /* agc1_slope1*/
1416 255, /* agc1_slope2*/
1419 88, /* agc2_slope1*/
1420 90, /* agc2_slope2*/
1427 0, /* perform_agc_softsplit*/
1431 static struct dibx000_bandwidth_config dib807x_bw_config_12_mhz = {
1432 60000, 15000, /* internal, sampling*/
1433 1, 20, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass*/
1434 0, 0, 1, 1, 2, /* misc: refdiv, bypclk_div, IO_CLK_en_core,
1436 (3 << 14) | (1 << 12) | (599 << 0), /* sad_cfg: refsel, sel, freq_15k*/
1437 (0 << 25) | 0, /* ifreq = 0.000000 MHz*/
1439 12000000, /* xtal_hz*/
1442 static struct dib8000_config dib807x_dib8000_config[2] = {
1444 .output_mpeg2_in_188_bytes = 1,
1446 .agc_config_count = 2,
1447 .agc = dib807x_agc_config,
1448 .pll = &dib807x_bw_config_12_mhz,
1449 .tuner_is_baseband = 1,
1451 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1452 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1453 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1455 .hostbus_diversity = 1,
1457 .agc_control = &dib0070_ctrl_agc_filter,
1458 .output_mode = OUTMODE_MPEG2_FIFO,
1461 .output_mpeg2_in_188_bytes = 1,
1463 .agc_config_count = 2,
1464 .agc = dib807x_agc_config,
1465 .pll = &dib807x_bw_config_12_mhz,
1466 .tuner_is_baseband = 1,
1468 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1469 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1470 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1472 .hostbus_diversity = 1,
1473 .agc_control = &dib0070_ctrl_agc_filter,
1474 .output_mode = OUTMODE_MPEG2_FIFO,
1479 static int dib807x_tuner_reset(struct dvb_frontend *fe, int onoff)
1481 return dib8000_set_gpio(fe, 5, 0, !onoff);
1484 static int dib807x_tuner_sleep(struct dvb_frontend *fe, int onoff)
1486 return dib8000_set_gpio(fe, 0, 0, onoff);
1489 static const struct dib0070_wbd_gain_cfg dib8070_wbd_gain_cfg[] = {
1494 static struct dib0070_config dib807x_dib0070_config[2] = {
1496 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1497 .reset = dib807x_tuner_reset,
1498 .sleep = dib807x_tuner_sleep,
1500 .clock_pad_drive = 4,
1502 .force_crystal_mode = 1,
1503 .enable_third_order_filter = 1,
1505 .wbd_gain = dib8070_wbd_gain_cfg,
1506 .osc_buffer_state = 0,
1507 .freq_offset_khz_uhf = -100,
1508 .freq_offset_khz_vhf = -100,
1510 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1511 .reset = dib807x_tuner_reset,
1512 .sleep = dib807x_tuner_sleep,
1514 .clock_pad_drive = 2,
1516 .force_crystal_mode = 1,
1517 .enable_third_order_filter = 1,
1519 .wbd_gain = dib8070_wbd_gain_cfg,
1520 .osc_buffer_state = 0,
1521 .freq_offset_khz_uhf = -25,
1522 .freq_offset_khz_vhf = -25,
1526 static int dib807x_set_param_override(struct dvb_frontend *fe,
1527 struct dvb_frontend_parameters *fep)
1529 struct dvb_usb_adapter *adap = fe->dvb->priv;
1530 struct dib0700_adapter_state *state = adap->priv;
1532 u16 offset = dib0070_wbd_offset(fe);
1533 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1538 case BAND_UHF: /* fall-thru wanted */
1540 offset += 250; break;
1542 deb_info("WBD for DiB8000: %d\n", offset);
1543 dib8000_set_wbd_ref(fe, offset);
1545 return state->set_param_save(fe, fep);
1548 static int dib807x_tuner_attach(struct dvb_usb_adapter *adap)
1550 struct dib0700_adapter_state *st = adap->priv;
1551 struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe,
1552 DIBX000_I2C_INTERFACE_TUNER, 1);
1554 if (adap->id == 0) {
1555 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
1556 &dib807x_dib0070_config[0]) == NULL)
1559 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
1560 &dib807x_dib0070_config[1]) == NULL)
1564 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1565 adap->fe->ops.tuner_ops.set_params = dib807x_set_param_override;
1569 static int stk807x_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
1571 return dib8000_pid_filter(adapter->fe, index, pid, onoff);
1574 static int stk807x_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
1576 return dib8000_pid_filter_ctrl(adapter->fe, onoff);
1580 static int stk807x_frontend_attach(struct dvb_usb_adapter *adap)
1582 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1584 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1585 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1586 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1588 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1590 dib0700_ctrl_clock(adap->dev, 72, 1);
1593 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1595 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1597 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1600 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
1601 &dib807x_dib8000_config[0]);
1603 return adap->fe == NULL ? -ENODEV : 0;
1607 static int stk807xpvr_frontend_attach0(struct dvb_usb_adapter *adap)
1609 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1611 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1613 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1614 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1615 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1617 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1619 dib0700_ctrl_clock(adap->dev, 72, 1);
1622 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1624 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1626 /* initialize IC 0 */
1627 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x12, 0x80);
1629 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
1630 &dib807x_dib8000_config[0]);
1632 return adap->fe == NULL ? -ENODEV : 0;
1635 static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap)
1637 /* initialize IC 1 */
1638 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x22, 0x82);
1640 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82,
1641 &dib807x_dib8000_config[1]);
1643 return adap->fe == NULL ? -ENODEV : 0;
1648 static struct dib7000p_config stk7070pd_dib7000p_config[2] = {
1650 .output_mpeg2_in_188_bytes = 1,
1652 .agc_config_count = 1,
1653 .agc = &dib7070_agc_config,
1654 .bw = &dib7070_bw_config_12_mhz,
1655 .tuner_is_baseband = 1,
1658 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1659 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1660 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1662 .hostbus_diversity = 1,
1664 .output_mpeg2_in_188_bytes = 1,
1666 .agc_config_count = 1,
1667 .agc = &dib7070_agc_config,
1668 .bw = &dib7070_bw_config_12_mhz,
1669 .tuner_is_baseband = 1,
1672 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1673 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1674 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1676 .hostbus_diversity = 1,
1680 static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap)
1682 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1684 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1685 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1686 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1687 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1689 dib0700_ctrl_clock(adap->dev, 72, 1);
1692 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1694 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1696 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
1697 stk7070pd_dib7000p_config) != 0) {
1698 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
1703 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]);
1704 return adap->fe == NULL ? -ENODEV : 0;
1707 static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap)
1709 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]);
1710 return adap->fe == NULL ? -ENODEV : 0;
1714 static struct s5h1411_config pinnacle_801e_config = {
1715 .output_mode = S5H1411_PARALLEL_OUTPUT,
1716 .gpio = S5H1411_GPIO_OFF,
1717 .mpeg_timing = S5H1411_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK,
1718 .qam_if = S5H1411_IF_44000,
1719 .vsb_if = S5H1411_IF_44000,
1720 .inversion = S5H1411_INVERSION_OFF,
1721 .status_mode = S5H1411_DEMODLOCKING
1724 /* Pinnacle PCTV HD Pro 801e GPIOs map:
1725 GPIO0 - currently unknown
1726 GPIO1 - xc5000 tuner reset
1727 GPIO2 - CX25843 sleep
1728 GPIO3 - currently unknown
1729 GPIO4 - currently unknown
1730 GPIO6 - currently unknown
1731 GPIO7 - currently unknown
1732 GPIO9 - currently unknown
1733 GPIO10 - CX25843 reset
1735 static int s5h1411_frontend_attach(struct dvb_usb_adapter *adap)
1737 struct dib0700_state *st = adap->dev->priv;
1739 /* Make use of the new i2c functions from FW 1.20 */
1740 st->fw_use_new_i2c_api = 1;
1742 /* The s5h1411 requires the dib0700 to not be in master mode */
1743 st->disable_streaming_master_mode = 1;
1745 /* All msleep values taken from Windows USB trace */
1746 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
1747 dib0700_set_gpio(adap->dev, GPIO3, GPIO_OUT, 0);
1748 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1750 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1752 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1754 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1755 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1756 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1757 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1758 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 0);
1761 /* Put the CX25843 to sleep for now since we're in digital mode */
1762 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
1764 /* GPIOs are initialized, do the attach */
1765 adap->fe = dvb_attach(s5h1411_attach, &pinnacle_801e_config,
1766 &adap->dev->i2c_adap);
1767 return adap->fe == NULL ? -ENODEV : 0;
1770 static int dib0700_xc5000_tuner_callback(void *priv, int component,
1771 int command, int arg)
1773 struct dvb_usb_adapter *adap = priv;
1775 if (command == XC5000_TUNER_RESET) {
1776 /* Reset the tuner */
1777 dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0);
1779 dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1);
1782 err("xc5000: unknown tuner callback command: %d\n", command);
1789 static struct xc5000_config s5h1411_xc5000_tunerconfig = {
1790 .i2c_address = 0x64,
1794 static int xc5000_tuner_attach(struct dvb_usb_adapter *adap)
1796 /* FIXME: generalize & move to common area */
1797 adap->fe->callback = dib0700_xc5000_tuner_callback;
1799 return dvb_attach(xc5000_attach, adap->fe, &adap->dev->i2c_adap,
1800 &s5h1411_xc5000_tunerconfig)
1801 == NULL ? -ENODEV : 0;
1804 static struct lgdt3305_config hcw_lgdt3305_config = {
1806 .mpeg_mode = LGDT3305_MPEG_PARALLEL,
1807 .tpclk_edge = LGDT3305_TPCLK_FALLING_EDGE,
1808 .tpvalid_polarity = LGDT3305_TP_VALID_LOW,
1810 .spectral_inversion = 1,
1813 .usref_8vsb = 0x0500,
1816 static struct mxl5007t_config hcw_mxl5007t_config = {
1817 .xtal_freq_hz = MxL_XTAL_25_MHZ,
1818 .if_freq_hz = MxL_IF_6_MHZ,
1823 GPIO0 - LNA_CTR (H: LNA power enabled, L: LNA power disabled)
1824 GPIO1 - ANT_SEL (H: VPA, L: MCX)
1830 MXL is behind LG's i2c repeater. LG is on SCL2/SDA2 gpios on the DIB
1832 static int lgdt3305_frontend_attach(struct dvb_usb_adapter *adap)
1834 struct dib0700_state *st = adap->dev->priv;
1836 /* Make use of the new i2c functions from FW 1.20 */
1837 st->fw_use_new_i2c_api = 1;
1839 st->disable_streaming_master_mode = 1;
1841 /* fe power enable */
1842 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1844 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1848 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1850 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1852 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1855 adap->fe = dvb_attach(lgdt3305_attach,
1856 &hcw_lgdt3305_config,
1857 &adap->dev->i2c_adap);
1859 return adap->fe == NULL ? -ENODEV : 0;
1862 static int mxl5007t_tuner_attach(struct dvb_usb_adapter *adap)
1864 return dvb_attach(mxl5007t_attach, adap->fe,
1865 &adap->dev->i2c_adap, 0x60,
1866 &hcw_mxl5007t_config) == NULL ? -ENODEV : 0;
1870 /* DVB-USB and USB stuff follows */
1871 struct usb_device_id dib0700_usb_id_table[] = {
1872 /* 0 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P) },
1873 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P_PC) },
1874 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) },
1875 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) },
1876 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) },
1877 /* 5 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) },
1878 { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500) },
1879 { USB_DEVICE(USB_VID_UNIWILL, USB_PID_UNIWILL_STK7700P) },
1880 { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P) },
1881 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) },
1882 /* 10 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_2) },
1883 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV2000E) },
1884 { USB_DEVICE(USB_VID_TERRATEC,
1885 USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) },
1886 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) },
1887 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700D) },
1888 /* 15 */{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070P) },
1889 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV_DVB_T_FLASH) },
1890 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070PD) },
1891 { USB_DEVICE(USB_VID_PINNACLE,
1892 USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) },
1893 { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500_PC) },
1894 /* 20 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_EXPRESS) },
1895 { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U7000) },
1896 { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) },
1897 { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000) },
1898 { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3100) },
1899 /* 25 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) },
1900 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) },
1901 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_USB_XE) },
1902 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_EXPRESSCARD_320CX) },
1903 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV72E) },
1904 /* 30 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73E) },
1905 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_EC372S) },
1906 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_EXPRESS) },
1907 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS) },
1908 { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P_2) },
1909 /* 35 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK_52009) },
1910 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_3) },
1911 { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U8000) },
1912 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700PH) },
1913 { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000H) },
1914 /* 40 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E) },
1915 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E_SE) },
1916 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_EXPRESS) },
1917 { USB_DEVICE(USB_VID_TERRATEC,
1918 USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2) },
1919 { USB_DEVICE(USB_VID_SONY, USB_PID_SONY_PLAYTV) },
1920 /* 45 */{ USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_PD378S) },
1921 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC) },
1922 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC_B210) },
1923 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_MC770) },
1924 { USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT) },
1925 /* 50 */{ USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT_Dlx) },
1926 { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_H) },
1927 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T3) },
1928 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T5) },
1929 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D) },
1930 /* 55 */{ USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D_2) },
1931 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73A) },
1932 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73ESE) },
1933 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV282E) },
1934 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7770P) },
1935 /* 60 */{ USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS_2) },
1936 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XPVR) },
1937 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XP) },
1938 { USB_DEVICE(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD) },
1939 { USB_DEVICE(USB_VID_EVOLUTEPC, USB_PID_TVWAY_PLUS) },
1940 { 0 } /* Terminating entry */
1942 MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
1944 #define DIB0700_DEFAULT_DEVICE_PROPERTIES \
1945 .caps = DVB_USB_IS_AN_I2C_ADAPTER, \
1946 .usb_ctrl = DEVICE_SPECIFIC, \
1947 .firmware = "dvb-usb-dib0700-1.20.fw", \
1948 .download_firmware = dib0700_download_firmware, \
1949 .no_reconnect = 1, \
1950 .size_of_priv = sizeof(struct dib0700_state), \
1951 .i2c_algo = &dib0700_i2c_algo, \
1952 .identify_state = dib0700_identify_state
1954 #define DIB0700_DEFAULT_STREAMING_CONFIG(ep) \
1955 .streaming_ctrl = dib0700_streaming_ctrl, \
1962 .buffersize = 39480, \
1967 struct dvb_usb_device_properties dib0700_devices[] = {
1969 DIB0700_DEFAULT_DEVICE_PROPERTIES,
1974 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1975 .pid_filter_count = 32,
1976 .pid_filter = stk70x0p_pid_filter,
1977 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
1978 .frontend_attach = stk7700p_frontend_attach,
1979 .tuner_attach = stk7700p_tuner_attach,
1981 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
1985 .num_device_descs = 8,
1987 { "DiBcom STK7700P reference design",
1988 { &dib0700_usb_id_table[0], &dib0700_usb_id_table[1] },
1991 { "Hauppauge Nova-T Stick",
1992 { &dib0700_usb_id_table[4], &dib0700_usb_id_table[9], NULL },
1995 { "AVerMedia AVerTV DVB-T Volar",
1996 { &dib0700_usb_id_table[5], &dib0700_usb_id_table[10] },
1999 { "Compro Videomate U500",
2000 { &dib0700_usb_id_table[6], &dib0700_usb_id_table[19] },
2003 { "Uniwill STK7700P based (Hama and others)",
2004 { &dib0700_usb_id_table[7], NULL },
2007 { "Leadtek Winfast DTV Dongle (STK7700P based)",
2008 { &dib0700_usb_id_table[8], &dib0700_usb_id_table[34] },
2011 { "AVerMedia AVerTV DVB-T Express",
2012 { &dib0700_usb_id_table[20] },
2016 { &dib0700_usb_id_table[21], NULL },
2021 .rc_interval = DEFAULT_RC_INTERVAL,
2022 .rc_key_map = dib0700_rc_keys,
2023 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2024 .rc_query = dib0700_rc_query
2025 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2030 .frontend_attach = bristol_frontend_attach,
2031 .tuner_attach = bristol_tuner_attach,
2033 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2035 .frontend_attach = bristol_frontend_attach,
2036 .tuner_attach = bristol_tuner_attach,
2038 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2042 .num_device_descs = 1,
2044 { "Hauppauge Nova-T 500 Dual DVB-T",
2045 { &dib0700_usb_id_table[2], &dib0700_usb_id_table[3], NULL },
2050 .rc_interval = DEFAULT_RC_INTERVAL,
2051 .rc_key_map = dib0700_rc_keys,
2052 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2053 .rc_query = dib0700_rc_query
2054 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2059 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2060 .pid_filter_count = 32,
2061 .pid_filter = stk70x0p_pid_filter,
2062 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2063 .frontend_attach = stk7700d_frontend_attach,
2064 .tuner_attach = stk7700d_tuner_attach,
2066 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2068 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2069 .pid_filter_count = 32,
2070 .pid_filter = stk70x0p_pid_filter,
2071 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2072 .frontend_attach = stk7700d_frontend_attach,
2073 .tuner_attach = stk7700d_tuner_attach,
2075 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2079 .num_device_descs = 5,
2081 { "Pinnacle PCTV 2000e",
2082 { &dib0700_usb_id_table[11], NULL },
2085 { "Terratec Cinergy DT XS Diversity",
2086 { &dib0700_usb_id_table[12], NULL },
2089 { "Hauppauge Nova-TD Stick/Elgato Eye-TV Diversity",
2090 { &dib0700_usb_id_table[13], NULL },
2093 { "DiBcom STK7700D reference design",
2094 { &dib0700_usb_id_table[14], NULL },
2097 { "YUAN High-Tech DiBcom STK7700D",
2098 { &dib0700_usb_id_table[55], NULL },
2104 .rc_interval = DEFAULT_RC_INTERVAL,
2105 .rc_key_map = dib0700_rc_keys,
2106 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2107 .rc_query = dib0700_rc_query
2109 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2114 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2115 .pid_filter_count = 32,
2116 .pid_filter = stk70x0p_pid_filter,
2117 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2118 .frontend_attach = stk7700P2_frontend_attach,
2119 .tuner_attach = stk7700d_tuner_attach,
2121 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2125 .num_device_descs = 3,
2127 { "ASUS My Cinema U3000 Mini DVBT Tuner",
2128 { &dib0700_usb_id_table[23], NULL },
2132 { &dib0700_usb_id_table[31], NULL },
2135 { "Terratec Cinergy T Express",
2136 { &dib0700_usb_id_table[42], NULL },
2141 .rc_interval = DEFAULT_RC_INTERVAL,
2142 .rc_key_map = dib0700_rc_keys,
2143 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2144 .rc_query = dib0700_rc_query
2145 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2150 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2151 .pid_filter_count = 32,
2152 .pid_filter = stk70x0p_pid_filter,
2153 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2154 .frontend_attach = stk7070p_frontend_attach,
2155 .tuner_attach = dib7070p_tuner_attach,
2157 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2159 .size_of_priv = sizeof(struct dib0700_adapter_state),
2163 .num_device_descs = 11,
2165 { "DiBcom STK7070P reference design",
2166 { &dib0700_usb_id_table[15], NULL },
2169 { "Pinnacle PCTV DVB-T Flash Stick",
2170 { &dib0700_usb_id_table[16], NULL },
2173 { "Artec T14BR DVB-T",
2174 { &dib0700_usb_id_table[22], NULL },
2177 { "ASUS My Cinema U3100 Mini DVBT Tuner",
2178 { &dib0700_usb_id_table[24], NULL },
2181 { "Hauppauge Nova-T Stick",
2182 { &dib0700_usb_id_table[25], NULL },
2185 { "Hauppauge Nova-T MyTV.t",
2186 { &dib0700_usb_id_table[26], NULL },
2189 { "Pinnacle PCTV 72e",
2190 { &dib0700_usb_id_table[29], NULL },
2193 { "Pinnacle PCTV 73e",
2194 { &dib0700_usb_id_table[30], NULL },
2197 { "Elgato EyeTV DTT",
2198 { &dib0700_usb_id_table[49], NULL },
2202 { &dib0700_usb_id_table[45], NULL },
2205 { "Elgato EyeTV Dtt Dlx PD378S",
2206 { &dib0700_usb_id_table[50], NULL },
2211 .rc_interval = DEFAULT_RC_INTERVAL,
2212 .rc_key_map = dib0700_rc_keys,
2213 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2214 .rc_query = dib0700_rc_query
2216 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2221 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2222 .pid_filter_count = 32,
2223 .pid_filter = stk70x0p_pid_filter,
2224 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2225 .frontend_attach = stk7070p_frontend_attach,
2226 .tuner_attach = dib7070p_tuner_attach,
2228 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2230 .size_of_priv = sizeof(struct dib0700_adapter_state),
2234 .num_device_descs = 3,
2236 { "Pinnacle PCTV 73A",
2237 { &dib0700_usb_id_table[56], NULL },
2240 { "Pinnacle PCTV 73e SE",
2241 { &dib0700_usb_id_table[57], NULL },
2244 { "Pinnacle PCTV 282e",
2245 { &dib0700_usb_id_table[58], NULL },
2250 .rc_interval = DEFAULT_RC_INTERVAL,
2251 .rc_key_map = dib0700_rc_keys,
2252 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2253 .rc_query = dib0700_rc_query
2255 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2260 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2261 .pid_filter_count = 32,
2262 .pid_filter = stk70x0p_pid_filter,
2263 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2264 .frontend_attach = stk7070pd_frontend_attach0,
2265 .tuner_attach = dib7070p_tuner_attach,
2267 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2269 .size_of_priv = sizeof(struct dib0700_adapter_state),
2271 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2272 .pid_filter_count = 32,
2273 .pid_filter = stk70x0p_pid_filter,
2274 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2275 .frontend_attach = stk7070pd_frontend_attach1,
2276 .tuner_attach = dib7070p_tuner_attach,
2278 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2280 .size_of_priv = sizeof(struct dib0700_adapter_state),
2284 .num_device_descs = 6,
2286 { "DiBcom STK7070PD reference design",
2287 { &dib0700_usb_id_table[17], NULL },
2290 { "Pinnacle PCTV Dual DVB-T Diversity Stick",
2291 { &dib0700_usb_id_table[18], NULL },
2294 { "Hauppauge Nova-TD Stick (52009)",
2295 { &dib0700_usb_id_table[35], NULL },
2298 { "Hauppauge Nova-TD-500 (84xxx)",
2299 { &dib0700_usb_id_table[36], NULL },
2302 { "Terratec Cinergy DT USB XS Diversity/ T5",
2303 { &dib0700_usb_id_table[43],
2304 &dib0700_usb_id_table[53], NULL},
2308 { &dib0700_usb_id_table[44], NULL },
2312 .rc_interval = DEFAULT_RC_INTERVAL,
2313 .rc_key_map = dib0700_rc_keys,
2314 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2315 .rc_query = dib0700_rc_query
2316 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2321 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2322 .pid_filter_count = 32,
2323 .pid_filter = stk70x0p_pid_filter,
2324 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2325 .frontend_attach = stk7700ph_frontend_attach,
2326 .tuner_attach = stk7700ph_tuner_attach,
2328 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2330 .size_of_priv = sizeof(struct
2331 dib0700_adapter_state),
2335 .num_device_descs = 9,
2337 { "Terratec Cinergy HT USB XE",
2338 { &dib0700_usb_id_table[27], NULL },
2341 { "Pinnacle Expresscard 320cx",
2342 { &dib0700_usb_id_table[28], NULL },
2345 { "Terratec Cinergy HT Express",
2346 { &dib0700_usb_id_table[32], NULL },
2349 { "Gigabyte U8000-RH",
2350 { &dib0700_usb_id_table[37], NULL },
2353 { "YUAN High-Tech STK7700PH",
2354 { &dib0700_usb_id_table[38], NULL },
2357 { "Asus My Cinema-U3000Hybrid",
2358 { &dib0700_usb_id_table[39], NULL },
2361 { "YUAN High-Tech MC770",
2362 { &dib0700_usb_id_table[48], NULL },
2365 { "Leadtek WinFast DTV Dongle H",
2366 { &dib0700_usb_id_table[51], NULL },
2369 { "YUAN High-Tech STK7700D",
2370 { &dib0700_usb_id_table[54], NULL },
2374 .rc_interval = DEFAULT_RC_INTERVAL,
2375 .rc_key_map = dib0700_rc_keys,
2376 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2377 .rc_query = dib0700_rc_query
2378 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2382 .frontend_attach = s5h1411_frontend_attach,
2383 .tuner_attach = xc5000_tuner_attach,
2385 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2387 .size_of_priv = sizeof(struct
2388 dib0700_adapter_state),
2392 .num_device_descs = 2,
2394 { "Pinnacle PCTV HD Pro USB Stick",
2395 { &dib0700_usb_id_table[40], NULL },
2398 { "Pinnacle PCTV HD USB Stick",
2399 { &dib0700_usb_id_table[41], NULL },
2403 .rc_interval = DEFAULT_RC_INTERVAL,
2404 .rc_key_map = dib0700_rc_keys,
2405 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2406 .rc_query = dib0700_rc_query
2407 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2411 .frontend_attach = lgdt3305_frontend_attach,
2412 .tuner_attach = mxl5007t_tuner_attach,
2414 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2416 .size_of_priv = sizeof(struct
2417 dib0700_adapter_state),
2421 .num_device_descs = 2,
2423 { "Hauppauge ATSC MiniCard (B200)",
2424 { &dib0700_usb_id_table[46], NULL },
2427 { "Hauppauge ATSC MiniCard (B210)",
2428 { &dib0700_usb_id_table[47], NULL },
2432 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2437 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2438 .pid_filter_count = 32,
2439 .pid_filter = stk70x0p_pid_filter,
2440 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2441 .frontend_attach = stk7070p_frontend_attach,
2442 .tuner_attach = dib7770p_tuner_attach,
2444 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2447 sizeof(struct dib0700_adapter_state),
2451 .num_device_descs = 2,
2453 { "DiBcom STK7770P reference design",
2454 { &dib0700_usb_id_table[59], NULL },
2457 { "Terratec Cinergy T USB XXS (HD)/ T3",
2458 { &dib0700_usb_id_table[33],
2459 &dib0700_usb_id_table[52],
2460 &dib0700_usb_id_table[60], NULL},
2464 .rc_interval = DEFAULT_RC_INTERVAL,
2465 .rc_key_map = dib0700_rc_keys,
2466 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2467 .rc_query = dib0700_rc_query
2468 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2472 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2473 .pid_filter_count = 32,
2474 .pid_filter = stk807x_pid_filter,
2475 .pid_filter_ctrl = stk807x_pid_filter_ctrl,
2476 .frontend_attach = stk807x_frontend_attach,
2477 .tuner_attach = dib807x_tuner_attach,
2479 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2482 sizeof(struct dib0700_adapter_state),
2486 .num_device_descs = 3,
2488 { "DiBcom STK807xP reference design",
2489 { &dib0700_usb_id_table[62], NULL },
2492 { "Prolink Pixelview SBTVD",
2493 { &dib0700_usb_id_table[63], NULL },
2496 { "EvolutePC TVWay+",
2497 { &dib0700_usb_id_table[64], NULL },
2502 .rc_interval = DEFAULT_RC_INTERVAL,
2503 .rc_key_map = dib0700_rc_keys,
2504 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2505 .rc_query = dib0700_rc_query
2507 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2511 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2512 .pid_filter_count = 32,
2513 .pid_filter = stk807x_pid_filter,
2514 .pid_filter_ctrl = stk807x_pid_filter_ctrl,
2515 .frontend_attach = stk807xpvr_frontend_attach0,
2516 .tuner_attach = dib807x_tuner_attach,
2518 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2521 sizeof(struct dib0700_adapter_state),
2524 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2525 .pid_filter_count = 32,
2526 .pid_filter = stk807x_pid_filter,
2527 .pid_filter_ctrl = stk807x_pid_filter_ctrl,
2528 .frontend_attach = stk807xpvr_frontend_attach1,
2529 .tuner_attach = dib807x_tuner_attach,
2531 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2534 sizeof(struct dib0700_adapter_state),
2538 .num_device_descs = 1,
2540 { "DiBcom STK807xPVR reference design",
2541 { &dib0700_usb_id_table[61], NULL },
2546 .rc_interval = DEFAULT_RC_INTERVAL,
2547 .rc_key_map = dib0700_rc_keys,
2548 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2549 .rc_query = dib0700_rc_query
2553 int dib0700_device_count = ARRAY_SIZE(dib0700_devices);