V4L/DVB (13584): DiBXXX0: fix most of the Codingstyle violations from the previous...
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / media / dvb / dvb-usb / dib0700_devices.c
blobd4673c71dff5c7928830b4bf5ac4830e02b2243c
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
8 */
9 #include "dib0700.h"
11 #include "dib3000mc.h"
12 #include "dib7000m.h"
13 #include "dib7000p.h"
14 #include "dib8000.h"
15 #include "mt2060.h"
16 #include "mt2266.h"
17 #include "tuner-xc2028.h"
18 #include "xc5000.h"
19 #include "s5h1411.h"
20 #include "dib0070.h"
21 #include "dib0090.h"
22 #include "lgdt3305.h"
23 #include "mxl5007t.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] = {
38 .i2c_address = 0x60,
39 .clock_out = 3,
40 }, {
41 .i2c_address = 0x61,
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),
50 .agc1_max = 42598,
51 .agc1_min = 17694,
52 .agc2_max = 45875,
53 .agc2_min = 0,
55 .agc1_pt1 = 0,
56 .agc1_pt2 = 59,
58 .agc1_slope1 = 0,
59 .agc1_slope2 = 69,
61 .agc2_pt1 = 0,
62 .agc2_pt2 = 59,
64 .agc2_slope1 = 111,
65 .agc2_slope2 = 28,
68 static struct dib3000mc_config bristol_dib3000mc_config[2] = {
69 { .agc = &bristol_dib3000p_mt2060_agc_config,
70 .max_time = 0x196,
71 .ln_adc_level = 0x1cc7,
72 .output_mpeg2_in_188_bytes = 1,
74 { .agc = &bristol_dib3000p_mt2060_agc_config,
75 .max_time = 0x196,
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;
84 if (adap->id == 0) {
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);
92 else
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);
97 return -ENODEV;
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;
112 return 0;
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);
119 s8 a;
120 int if1=1220;
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 */
131 /* MT226x */
132 static struct dibx000_agc_config stk7700d_7000p_mt2266_agc_config[2] = {
134 BAND_UHF,
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)
139 | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
141 1130,
145 118,
148 3530,
152 65535,
153 33770,
154 65535,
155 23592,
159 255,
162 132,
163 192,
173 }, {
174 BAND_VHF | BAND_LBAND,
176 /* 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,
177 * 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 */
178 (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8)
179 | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
181 2372,
185 118,
188 3530,
192 65535,
194 65535,
195 23592,
198 128,
199 128,
200 128,
202 128,
203 253,
216 static struct dibx000_bandwidth_config stk7700d_mt2266_pll_config = {
217 60000, 30000,
218 1, 8, 3, 1, 0,
219 0, 0, 1, 1, 2,
220 (3 << 14) | (1 << 12) | (524 << 0),
222 20452225,
225 static struct dib7000p_config stk7700d_dib7000p_mt2266_config[] = {
226 { .output_mpeg2_in_188_bytes = 1,
227 .hostbus_diversity = 1,
228 .tuner_is_baseband = 1,
230 .agc_config_count = 2,
231 .agc = stk7700d_7000p_mt2266_agc_config,
232 .bw = &stk7700d_mt2266_pll_config,
234 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
235 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
236 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
238 { .output_mpeg2_in_188_bytes = 1,
239 .hostbus_diversity = 1,
240 .tuner_is_baseband = 1,
242 .agc_config_count = 2,
243 .agc = stk7700d_7000p_mt2266_agc_config,
244 .bw = &stk7700d_mt2266_pll_config,
246 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
247 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
248 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
252 static struct mt2266_config stk7700d_mt2266_config[2] = {
253 { .i2c_address = 0x60
255 { .i2c_address = 0x60
259 static int stk7700P2_frontend_attach(struct dvb_usb_adapter *adap)
261 if (adap->id == 0) {
262 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
263 msleep(10);
264 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
265 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
266 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
267 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
268 msleep(10);
269 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
270 msleep(10);
271 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
272 stk7700d_dib7000p_mt2266_config)
273 != 0) {
274 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
275 return -ENODEV;
279 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
280 &stk7700d_dib7000p_mt2266_config[adap->id]);
282 return adap->fe == NULL ? -ENODEV : 0;
285 static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap)
287 if (adap->id == 0) {
288 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
289 msleep(10);
290 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
291 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
292 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
293 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
294 msleep(10);
295 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
296 msleep(10);
297 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
298 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
299 stk7700d_dib7000p_mt2266_config)
300 != 0) {
301 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
302 return -ENODEV;
306 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
307 &stk7700d_dib7000p_mt2266_config[adap->id]);
309 return adap->fe == NULL ? -ENODEV : 0;
312 static int stk7700d_tuner_attach(struct dvb_usb_adapter *adap)
314 struct i2c_adapter *tun_i2c;
315 tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
316 return dvb_attach(mt2266_attach, adap->fe, tun_i2c,
317 &stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0;
320 /* STK7700-PH: Digital/Analog Hybrid Tuner, e.h. Cinergy HT USB HE */
321 static struct dibx000_agc_config xc3028_agc_config = {
322 BAND_VHF | BAND_UHF, /* band_caps */
324 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0,
325 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
326 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
327 (0 << 15) | (0 << 14) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) |
328 (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), /* setup */
330 712, /* inv_gain */
331 21, /* time_stabiliz */
333 0, /* alpha_level */
334 118, /* thlock */
336 0, /* wbd_inv */
337 2867, /* wbd_ref */
338 0, /* wbd_sel */
339 2, /* wbd_alpha */
341 0, /* agc1_max */
342 0, /* agc1_min */
343 39718, /* agc2_max */
344 9930, /* agc2_min */
345 0, /* agc1_pt1 */
346 0, /* agc1_pt2 */
347 0, /* agc1_pt3 */
348 0, /* agc1_slope1 */
349 0, /* agc1_slope2 */
350 0, /* agc2_pt1 */
351 128, /* agc2_pt2 */
352 29, /* agc2_slope1 */
353 29, /* agc2_slope2 */
355 17, /* alpha_mant */
356 27, /* alpha_exp */
357 23, /* beta_mant */
358 51, /* beta_exp */
360 1, /* perform_agc_softsplit */
363 /* PLL Configuration for COFDM BW_MHz = 8.00 with external clock = 30.00 */
364 static struct dibx000_bandwidth_config xc3028_bw_config = {
365 60000, 30000, /* internal, sampling */
366 1, 8, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass */
367 0, 0, 1, 1, 0, /* misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc,
368 modulo */
369 (3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */
370 (1 << 25) | 5816102, /* ifreq = 5.200000 MHz */
371 20452225, /* timf */
372 30000000, /* xtal_hz */
375 static struct dib7000p_config stk7700ph_dib7700_xc3028_config = {
376 .output_mpeg2_in_188_bytes = 1,
377 .tuner_is_baseband = 1,
379 .agc_config_count = 1,
380 .agc = &xc3028_agc_config,
381 .bw = &xc3028_bw_config,
383 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
384 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
385 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
388 static int stk7700ph_xc3028_callback(void *ptr, int component,
389 int command, int arg)
391 struct dvb_usb_adapter *adap = ptr;
393 switch (command) {
394 case XC2028_TUNER_RESET:
395 /* Send the tuner in then out of reset */
396 dib7000p_set_gpio(adap->fe, 8, 0, 0); msleep(10);
397 dib7000p_set_gpio(adap->fe, 8, 0, 1);
398 break;
399 case XC2028_RESET_CLK:
400 break;
401 default:
402 err("%s: unknown command %d, arg %d\n", __func__,
403 command, arg);
404 return -EINVAL;
406 return 0;
409 static struct xc2028_ctrl stk7700ph_xc3028_ctrl = {
410 .fname = XC2028_DEFAULT_FIRMWARE,
411 .max_len = 64,
412 .demod = XC3028_FE_DIBCOM52,
415 static struct xc2028_config stk7700ph_xc3028_config = {
416 .i2c_addr = 0x61,
417 .ctrl = &stk7700ph_xc3028_ctrl,
420 static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap)
422 struct usb_device_descriptor *desc = &adap->dev->udev->descriptor;
424 if (desc->idVendor == cpu_to_le16(USB_VID_PINNACLE) &&
425 desc->idProduct == cpu_to_le16(USB_PID_PINNACLE_EXPRESSCARD_320CX))
426 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
427 else
428 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
429 msleep(20);
430 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
431 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
432 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
433 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
434 msleep(10);
435 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
436 msleep(20);
437 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
438 msleep(10);
440 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
441 &stk7700ph_dib7700_xc3028_config) != 0) {
442 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
443 __func__);
444 return -ENODEV;
447 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
448 &stk7700ph_dib7700_xc3028_config);
450 return adap->fe == NULL ? -ENODEV : 0;
453 static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap)
455 struct i2c_adapter *tun_i2c;
457 tun_i2c = dib7000p_get_i2c_master(adap->fe,
458 DIBX000_I2C_INTERFACE_TUNER, 1);
460 stk7700ph_xc3028_config.i2c_adap = tun_i2c;
462 /* FIXME: generalize & move to common area */
463 adap->fe->callback = stk7700ph_xc3028_callback;
465 return dvb_attach(xc2028_attach, adap->fe, &stk7700ph_xc3028_config)
466 == NULL ? -ENODEV : 0;
469 #define DEFAULT_RC_INTERVAL 50
471 static u8 rc_request[] = { REQUEST_POLL_RC, 0 };
473 /* Number of keypresses to ignore before start repeating */
474 #define RC_REPEAT_DELAY 6
475 #define RC_REPEAT_DELAY_V1_20 10
479 /* Used by firmware versions < 1.20 (deprecated) */
480 static int dib0700_rc_query_legacy(struct dvb_usb_device *d, u32 *event,
481 int *state)
483 u8 key[4];
484 int i;
485 struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
486 struct dib0700_state *st = d->priv;
487 *event = 0;
488 *state = REMOTE_NO_KEY_PRESSED;
489 i=dib0700_ctrl_rd(d,rc_request,2,key,4);
490 if (i<=0) {
491 err("RC Query Failed");
492 return -1;
495 /* losing half of KEY_0 events from Philipps rc5 remotes.. */
496 if (key[0]==0 && key[1]==0 && key[2]==0 && key[3]==0) return 0;
498 /* 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]); */
500 dib0700_rc_setup(d); /* reset ir sensor data to prevent false events */
502 switch (dvb_usb_dib0700_ir_proto) {
503 case 0: {
504 /* NEC protocol sends repeat code as 0 0 0 FF */
505 if ((key[3-2] == 0x00) && (key[3-3] == 0x00) &&
506 (key[3] == 0xFF)) {
507 st->rc_counter++;
508 if (st->rc_counter > RC_REPEAT_DELAY) {
509 *event = d->last_event;
510 *state = REMOTE_KEY_PRESSED;
511 st->rc_counter = RC_REPEAT_DELAY;
513 return 0;
515 for (i=0;i<d->props.rc_key_map_size; i++) {
516 if (rc5_custom(&keymap[i]) == key[3-2] &&
517 rc5_data(&keymap[i]) == key[3-3]) {
518 st->rc_counter = 0;
519 *event = keymap[i].event;
520 *state = REMOTE_KEY_PRESSED;
521 d->last_event = keymap[i].event;
522 return 0;
525 break;
527 default: {
528 /* RC-5 protocol changes toggle bit on new keypress */
529 for (i = 0; i < d->props.rc_key_map_size; i++) {
530 if (rc5_custom(&keymap[i]) == key[3-2] &&
531 rc5_data(&keymap[i]) == key[3-3]) {
532 if (d->last_event == keymap[i].event &&
533 key[3-1] == st->rc_toggle) {
534 st->rc_counter++;
535 /* prevents unwanted double hits */
536 if (st->rc_counter > RC_REPEAT_DELAY) {
537 *event = d->last_event;
538 *state = REMOTE_KEY_PRESSED;
539 st->rc_counter = RC_REPEAT_DELAY;
542 return 0;
544 st->rc_counter = 0;
545 *event = keymap[i].event;
546 *state = REMOTE_KEY_PRESSED;
547 st->rc_toggle = key[3-1];
548 d->last_event = keymap[i].event;
549 return 0;
552 break;
555 err("Unknown remote controller key: %2X %2X %2X %2X", (int) key[3-2], (int) key[3-3], (int) key[3-1], (int) key[3]);
556 d->last_event = 0;
557 return 0;
560 /* This is the structure of the RC response packet starting in firmware 1.20 */
561 struct dib0700_rc_response {
562 u8 report_id;
563 u8 data_state;
564 u16 system;
565 u8 data;
566 u8 not_data;
569 /* This supports the new IR response format for firmware v1.20 */
570 static int dib0700_rc_query_v1_20(struct dvb_usb_device *d, u32 *event,
571 int *state)
573 struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
574 struct dib0700_state *st = d->priv;
575 struct dib0700_rc_response poll_reply;
576 u8 buf[6];
577 int i;
578 int status;
579 int actlen;
580 int found = 0;
582 /* Set initial results in case we exit the function early */
583 *event = 0;
584 *state = REMOTE_NO_KEY_PRESSED;
586 /* Firmware v1.20 provides RC data via bulk endpoint 1 */
587 status = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev, 1), buf,
588 sizeof(buf), &actlen, 50);
589 if (status < 0) {
590 /* No data available (meaning no key press) */
591 return 0;
595 switch (dvb_usb_dib0700_ir_proto) {
596 case 0:
597 poll_reply.report_id = 0;
598 poll_reply.data_state = 1;
599 poll_reply.system = buf[2];
600 poll_reply.data = buf[4];
601 poll_reply.not_data = buf[5];
603 /* NEC protocol sends repeat code as 0 0 0 FF */
604 if ((poll_reply.system == 0x00) && (poll_reply.data == 0x00)
605 && (poll_reply.not_data == 0xff)) {
606 poll_reply.data_state = 2;
607 break;
609 break;
610 default:
611 if (actlen != sizeof(buf)) {
612 /* We didn't get back the 6 byte message we expected */
613 err("Unexpected RC response size [%d]", actlen);
614 return -1;
617 poll_reply.report_id = buf[0];
618 poll_reply.data_state = buf[1];
619 poll_reply.system = (buf[2] << 8) | buf[3];
620 poll_reply.data = buf[4];
621 poll_reply.not_data = buf[5];
623 break;
626 if ((poll_reply.data + poll_reply.not_data) != 0xff) {
627 /* Key failed integrity check */
628 err("key failed integrity check: %04x %02x %02x",
629 poll_reply.system,
630 poll_reply.data, poll_reply.not_data);
631 return -1;
635 /* Find the key in the map */
636 for (i = 0; i < d->props.rc_key_map_size; i++) {
637 if (rc5_custom(&keymap[i]) == (poll_reply.system & 0xff) &&
638 rc5_data(&keymap[i]) == poll_reply.data) {
639 *event = keymap[i].event;
640 found = 1;
641 break;
645 if (found == 0) {
646 err("Unknown remote controller key: %04x %02x %02x",
647 poll_reply.system,
648 poll_reply.data, poll_reply.not_data);
649 d->last_event = 0;
650 return 0;
653 if (poll_reply.data_state == 1) {
654 /* New key hit */
655 st->rc_counter = 0;
656 *event = keymap[i].event;
657 *state = REMOTE_KEY_PRESSED;
658 d->last_event = keymap[i].event;
659 } else if (poll_reply.data_state == 2) {
660 /* Key repeated */
661 st->rc_counter++;
663 /* prevents unwanted double hits */
664 if (st->rc_counter > RC_REPEAT_DELAY_V1_20) {
665 *event = d->last_event;
666 *state = REMOTE_KEY_PRESSED;
667 st->rc_counter = RC_REPEAT_DELAY_V1_20;
669 } else {
670 err("Unknown data state [%d]", poll_reply.data_state);
673 return 0;
676 static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
678 struct dib0700_state *st = d->priv;
680 /* Because some people may have improperly named firmware files,
681 let's figure out whether to use the new firmware call or the legacy
682 call based on the firmware version embedded in the file */
683 if (st->rc_func_version == 0) {
684 u32 hwver, romver, ramver, fwtype;
685 int ret = dib0700_get_version(d, &hwver, &romver, &ramver,
686 &fwtype);
687 if (ret < 0) {
688 err("Could not determine version info");
689 return -1;
691 if (ramver < 0x10200)
692 st->rc_func_version = 1;
693 else
694 st->rc_func_version = 2;
697 if (st->rc_func_version == 2)
698 return dib0700_rc_query_v1_20(d, event, state);
699 else
700 return dib0700_rc_query_legacy(d, event, state);
703 static struct dvb_usb_rc_key dib0700_rc_keys[] = {
704 /* Key codes for the tiny Pinnacle remote*/
705 { 0x0700, KEY_MUTE },
706 { 0x0701, KEY_MENU }, /* Pinnacle logo */
707 { 0x0739, KEY_POWER },
708 { 0x0703, KEY_VOLUMEUP },
709 { 0x0709, KEY_VOLUMEDOWN },
710 { 0x0706, KEY_CHANNELUP },
711 { 0x070c, KEY_CHANNELDOWN },
712 { 0x070f, KEY_1 },
713 { 0x0715, KEY_2 },
714 { 0x0710, KEY_3 },
715 { 0x0718, KEY_4 },
716 { 0x071b, KEY_5 },
717 { 0x071e, KEY_6 },
718 { 0x0711, KEY_7 },
719 { 0x0721, KEY_8 },
720 { 0x0712, KEY_9 },
721 { 0x0727, KEY_0 },
722 { 0x0724, KEY_SCREEN }, /* 'Square' key */
723 { 0x072a, KEY_TEXT }, /* 'T' key */
724 { 0x072d, KEY_REWIND },
725 { 0x0730, KEY_PLAY },
726 { 0x0733, KEY_FASTFORWARD },
727 { 0x0736, KEY_RECORD },
728 { 0x073c, KEY_STOP },
729 { 0x073f, KEY_CANCEL }, /* '?' key */
730 /* Key codes for the Terratec Cinergy DT XS Diversity, similar to cinergyT2.c */
731 { 0xeb01, KEY_POWER },
732 { 0xeb02, KEY_1 },
733 { 0xeb03, KEY_2 },
734 { 0xeb04, KEY_3 },
735 { 0xeb05, KEY_4 },
736 { 0xeb06, KEY_5 },
737 { 0xeb07, KEY_6 },
738 { 0xeb08, KEY_7 },
739 { 0xeb09, KEY_8 },
740 { 0xeb0a, KEY_9 },
741 { 0xeb0b, KEY_VIDEO },
742 { 0xeb0c, KEY_0 },
743 { 0xeb0d, KEY_REFRESH },
744 { 0xeb0f, KEY_EPG },
745 { 0xeb10, KEY_UP },
746 { 0xeb11, KEY_LEFT },
747 { 0xeb12, KEY_OK },
748 { 0xeb13, KEY_RIGHT },
749 { 0xeb14, KEY_DOWN },
750 { 0xeb16, KEY_INFO },
751 { 0xeb17, KEY_RED },
752 { 0xeb18, KEY_GREEN },
753 { 0xeb19, KEY_YELLOW },
754 { 0xeb1a, KEY_BLUE },
755 { 0xeb1b, KEY_CHANNELUP },
756 { 0xeb1c, KEY_VOLUMEUP },
757 { 0xeb1d, KEY_MUTE },
758 { 0xeb1e, KEY_VOLUMEDOWN },
759 { 0xeb1f, KEY_CHANNELDOWN },
760 { 0xeb40, KEY_PAUSE },
761 { 0xeb41, KEY_HOME },
762 { 0xeb42, KEY_MENU }, /* DVD Menu */
763 { 0xeb43, KEY_SUBTITLE },
764 { 0xeb44, KEY_TEXT }, /* Teletext */
765 { 0xeb45, KEY_DELETE },
766 { 0xeb46, KEY_TV },
767 { 0xeb47, KEY_DVD },
768 { 0xeb48, KEY_STOP },
769 { 0xeb49, KEY_VIDEO },
770 { 0xeb4a, KEY_AUDIO }, /* Music */
771 { 0xeb4b, KEY_SCREEN }, /* Pic */
772 { 0xeb4c, KEY_PLAY },
773 { 0xeb4d, KEY_BACK },
774 { 0xeb4e, KEY_REWIND },
775 { 0xeb4f, KEY_FASTFORWARD },
776 { 0xeb54, KEY_PREVIOUS },
777 { 0xeb58, KEY_RECORD },
778 { 0xeb5c, KEY_NEXT },
780 /* Key codes for the Haupauge WinTV Nova-TD, copied from nova-t-usb2.c (Nova-T USB2) */
781 { 0x1e00, KEY_0 },
782 { 0x1e01, KEY_1 },
783 { 0x1e02, KEY_2 },
784 { 0x1e03, KEY_3 },
785 { 0x1e04, KEY_4 },
786 { 0x1e05, KEY_5 },
787 { 0x1e06, KEY_6 },
788 { 0x1e07, KEY_7 },
789 { 0x1e08, KEY_8 },
790 { 0x1e09, KEY_9 },
791 { 0x1e0a, KEY_KPASTERISK },
792 { 0x1e0b, KEY_RED },
793 { 0x1e0c, KEY_RADIO },
794 { 0x1e0d, KEY_MENU },
795 { 0x1e0e, KEY_GRAVE }, /* # */
796 { 0x1e0f, KEY_MUTE },
797 { 0x1e10, KEY_VOLUMEUP },
798 { 0x1e11, KEY_VOLUMEDOWN },
799 { 0x1e12, KEY_CHANNEL },
800 { 0x1e14, KEY_UP },
801 { 0x1e15, KEY_DOWN },
802 { 0x1e16, KEY_LEFT },
803 { 0x1e17, KEY_RIGHT },
804 { 0x1e18, KEY_VIDEO },
805 { 0x1e19, KEY_AUDIO },
806 { 0x1e1a, KEY_MEDIA },
807 { 0x1e1b, KEY_EPG },
808 { 0x1e1c, KEY_TV },
809 { 0x1e1e, KEY_NEXT },
810 { 0x1e1f, KEY_BACK },
811 { 0x1e20, KEY_CHANNELUP },
812 { 0x1e21, KEY_CHANNELDOWN },
813 { 0x1e24, KEY_LAST }, /* Skip backwards */
814 { 0x1e25, KEY_OK },
815 { 0x1e29, KEY_BLUE},
816 { 0x1e2e, KEY_GREEN },
817 { 0x1e30, KEY_PAUSE },
818 { 0x1e32, KEY_REWIND },
819 { 0x1e34, KEY_FASTFORWARD },
820 { 0x1e35, KEY_PLAY },
821 { 0x1e36, KEY_STOP },
822 { 0x1e37, KEY_RECORD },
823 { 0x1e38, KEY_YELLOW },
824 { 0x1e3b, KEY_GOTO },
825 { 0x1e3d, KEY_POWER },
827 /* Key codes for the Leadtek Winfast DTV Dongle */
828 { 0x0042, KEY_POWER },
829 { 0x077c, KEY_TUNER },
830 { 0x0f4e, KEY_PRINT }, /* PREVIEW */
831 { 0x0840, KEY_SCREEN }, /* full screen toggle*/
832 { 0x0f71, KEY_DOT }, /* frequency */
833 { 0x0743, KEY_0 },
834 { 0x0c41, KEY_1 },
835 { 0x0443, KEY_2 },
836 { 0x0b7f, KEY_3 },
837 { 0x0e41, KEY_4 },
838 { 0x0643, KEY_5 },
839 { 0x097f, KEY_6 },
840 { 0x0d7e, KEY_7 },
841 { 0x057c, KEY_8 },
842 { 0x0a40, KEY_9 },
843 { 0x0e4e, KEY_CLEAR },
844 { 0x047c, KEY_CHANNEL }, /* show channel number */
845 { 0x0f41, KEY_LAST }, /* recall */
846 { 0x0342, KEY_MUTE },
847 { 0x064c, KEY_RESERVED }, /* PIP button*/
848 { 0x0172, KEY_SHUFFLE }, /* SNAPSHOT */
849 { 0x0c4e, KEY_PLAYPAUSE }, /* TIMESHIFT */
850 { 0x0b70, KEY_RECORD },
851 { 0x037d, KEY_VOLUMEUP },
852 { 0x017d, KEY_VOLUMEDOWN },
853 { 0x0242, KEY_CHANNELUP },
854 { 0x007d, KEY_CHANNELDOWN },
856 /* Key codes for Nova-TD "credit card" remote control. */
857 { 0x1d00, KEY_0 },
858 { 0x1d01, KEY_1 },
859 { 0x1d02, KEY_2 },
860 { 0x1d03, KEY_3 },
861 { 0x1d04, KEY_4 },
862 { 0x1d05, KEY_5 },
863 { 0x1d06, KEY_6 },
864 { 0x1d07, KEY_7 },
865 { 0x1d08, KEY_8 },
866 { 0x1d09, KEY_9 },
867 { 0x1d0a, KEY_TEXT },
868 { 0x1d0d, KEY_MENU },
869 { 0x1d0f, KEY_MUTE },
870 { 0x1d10, KEY_VOLUMEUP },
871 { 0x1d11, KEY_VOLUMEDOWN },
872 { 0x1d12, KEY_CHANNEL },
873 { 0x1d14, KEY_UP },
874 { 0x1d15, KEY_DOWN },
875 { 0x1d16, KEY_LEFT },
876 { 0x1d17, KEY_RIGHT },
877 { 0x1d1c, KEY_TV },
878 { 0x1d1e, KEY_NEXT },
879 { 0x1d1f, KEY_BACK },
880 { 0x1d20, KEY_CHANNELUP },
881 { 0x1d21, KEY_CHANNELDOWN },
882 { 0x1d24, KEY_LAST },
883 { 0x1d25, KEY_OK },
884 { 0x1d30, KEY_PAUSE },
885 { 0x1d32, KEY_REWIND },
886 { 0x1d34, KEY_FASTFORWARD },
887 { 0x1d35, KEY_PLAY },
888 { 0x1d36, KEY_STOP },
889 { 0x1d37, KEY_RECORD },
890 { 0x1d3b, KEY_GOTO },
891 { 0x1d3d, KEY_POWER },
893 /* Key codes for the Pixelview SBTVD remote (proto NEC) */
894 { 0x8613, KEY_MUTE },
895 { 0x8612, KEY_POWER },
896 { 0x8601, KEY_1 },
897 { 0x8602, KEY_2 },
898 { 0x8603, KEY_3 },
899 { 0x8604, KEY_4 },
900 { 0x8605, KEY_5 },
901 { 0x8606, KEY_6 },
902 { 0x8607, KEY_7 },
903 { 0x8608, KEY_8 },
904 { 0x8609, KEY_9 },
905 { 0x8600, KEY_0 },
906 { 0x860d, KEY_CHANNELUP },
907 { 0x8619, KEY_CHANNELDOWN },
908 { 0x8610, KEY_VOLUMEUP },
909 { 0x860c, KEY_VOLUMEDOWN },
911 { 0x860a, KEY_CAMERA },
912 { 0x860b, KEY_ZOOM },
913 { 0x861b, KEY_BACKSPACE },
914 { 0x8615, KEY_ENTER },
916 { 0x861d, KEY_UP },
917 { 0x861e, KEY_DOWN },
918 { 0x860e, KEY_LEFT },
919 { 0x860f, KEY_RIGHT },
921 { 0x8618, KEY_RECORD },
922 { 0x861a, KEY_STOP },
924 /* Key codes for the EvolutePC TVWay+ remote (proto NEC) */
925 { 0x7a00, KEY_MENU },
926 { 0x7a01, KEY_RECORD },
927 { 0x7a02, KEY_PLAY },
928 { 0x7a03, KEY_STOP },
929 { 0x7a10, KEY_CHANNELUP },
930 { 0x7a11, KEY_CHANNELDOWN },
931 { 0x7a12, KEY_VOLUMEUP },
932 { 0x7a13, KEY_VOLUMEDOWN },
933 { 0x7a40, KEY_POWER },
934 { 0x7a41, KEY_MUTE },
937 /* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */
938 static struct dibx000_agc_config stk7700p_7000m_mt2060_agc_config = {
939 BAND_UHF | BAND_VHF,
941 /* 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,
942 * 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 */
943 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
944 | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
946 712,
950 118,
953 4095,
957 42598,
958 17694,
959 45875,
960 2621,
963 139,
966 107,
967 172,
977 { 0,
978 107,
979 51800,
980 24700
984 static struct dibx000_agc_config stk7700p_7000p_mt2060_agc_config = {
985 BAND_UHF | BAND_VHF,
987 /* 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,
988 * 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 */
989 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
990 | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0),
992 712,
996 118,
999 4095,
1003 42598,
1004 16384,
1005 42598,
1009 137,
1010 255,
1013 255,
1030 static struct dibx000_bandwidth_config stk7700p_pll_config = {
1031 60000, 30000,
1032 1, 8, 3, 1, 0,
1033 0, 0, 1, 1, 0,
1034 (3 << 14) | (1 << 12) | (524 << 0),
1035 60258167,
1036 20452225,
1037 30000000,
1040 static struct dib7000m_config stk7700p_dib7000m_config = {
1041 .dvbt_mode = 1,
1042 .output_mpeg2_in_188_bytes = 1,
1043 .quartz_direct = 1,
1045 .agc_config_count = 1,
1046 .agc = &stk7700p_7000m_mt2060_agc_config,
1047 .bw = &stk7700p_pll_config,
1049 .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
1050 .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
1051 .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
1054 static struct dib7000p_config stk7700p_dib7000p_config = {
1055 .output_mpeg2_in_188_bytes = 1,
1057 .agc_config_count = 1,
1058 .agc = &stk7700p_7000p_mt2060_agc_config,
1059 .bw = &stk7700p_pll_config,
1061 .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
1062 .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
1063 .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
1066 static int stk7700p_frontend_attach(struct dvb_usb_adapter *adap)
1068 struct dib0700_state *st = adap->dev->priv;
1069 /* unless there is no real power management in DVB - we leave the device on GPIO6 */
1071 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1072 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(50);
1074 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(10);
1075 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1077 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
1078 dib0700_ctrl_clock(adap->dev, 72, 1);
1079 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(100);
1081 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1083 st->mt2060_if1[0] = 1220;
1085 if (dib7000pc_detection(&adap->dev->i2c_adap)) {
1086 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000p_config);
1087 st->is_dib7000pc = 1;
1088 } else
1089 adap->fe = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config);
1091 return adap->fe == NULL ? -ENODEV : 0;
1094 static struct mt2060_config stk7700p_mt2060_config = {
1095 0x60
1098 static int stk7700p_tuner_attach(struct dvb_usb_adapter *adap)
1100 struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
1101 struct dib0700_state *st = adap->dev->priv;
1102 struct i2c_adapter *tun_i2c;
1103 s8 a;
1104 int if1=1220;
1105 if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) &&
1106 adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_STICK)) {
1107 if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a;
1109 if (st->is_dib7000pc)
1110 tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1111 else
1112 tun_i2c = dib7000m_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1114 return dvb_attach(mt2060_attach, adap->fe, tun_i2c, &stk7700p_mt2060_config,
1115 if1) == NULL ? -ENODEV : 0;
1118 /* DIB7070 generic */
1119 static struct dibx000_agc_config dib7070_agc_config = {
1120 BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
1121 /* 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,
1122 * 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 */
1123 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
1124 | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
1126 600,
1130 118,
1133 3530,
1137 65535,
1140 65535,
1145 183,
1146 206,
1147 255,
1149 152,
1161 static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff)
1163 deb_info("reset: %d", onoff);
1164 return dib7000p_set_gpio(fe, 8, 0, !onoff);
1167 static int dib7070_tuner_sleep(struct dvb_frontend *fe, int onoff)
1169 deb_info("sleep: %d", onoff);
1170 return dib7000p_set_gpio(fe, 9, 0, onoff);
1173 static struct dib0070_config dib7070p_dib0070_config[2] = {
1175 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1176 .reset = dib7070_tuner_reset,
1177 .sleep = dib7070_tuner_sleep,
1178 .clock_khz = 12000,
1179 .clock_pad_drive = 4,
1180 .charge_pump = 2,
1181 }, {
1182 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1183 .reset = dib7070_tuner_reset,
1184 .sleep = dib7070_tuner_sleep,
1185 .clock_khz = 12000,
1186 .charge_pump = 2,
1190 static struct dib0070_config dib7770p_dib0070_config = {
1191 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1192 .reset = dib7070_tuner_reset,
1193 .sleep = dib7070_tuner_sleep,
1194 .clock_khz = 12000,
1195 .clock_pad_drive = 0,
1196 .flip_chip = 1,
1197 .charge_pump = 2,
1200 static int dib7070_set_param_override(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
1202 struct dvb_usb_adapter *adap = fe->dvb->priv;
1203 struct dib0700_adapter_state *state = adap->priv;
1205 u16 offset;
1206 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1207 switch (band) {
1208 case BAND_VHF: offset = 950; break;
1209 case BAND_UHF:
1210 default: offset = 550; break;
1212 deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
1213 dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
1214 return state->set_param_save(fe, fep);
1217 static int dib7770_set_param_override(struct dvb_frontend *fe,
1218 struct dvb_frontend_parameters *fep)
1220 struct dvb_usb_adapter *adap = fe->dvb->priv;
1221 struct dib0700_adapter_state *state = adap->priv;
1223 u16 offset;
1224 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1225 switch (band) {
1226 case BAND_VHF:
1227 dib7000p_set_gpio(fe, 0, 0, 1);
1228 offset = 850;
1229 break;
1230 case BAND_UHF:
1231 default:
1232 dib7000p_set_gpio(fe, 0, 0, 0);
1233 offset = 250;
1234 break;
1236 deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
1237 dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
1238 return state->set_param_save(fe, fep);
1241 static int dib7770p_tuner_attach(struct dvb_usb_adapter *adap)
1243 struct dib0700_adapter_state *st = adap->priv;
1244 struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe,
1245 DIBX000_I2C_INTERFACE_TUNER, 1);
1247 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
1248 &dib7770p_dib0070_config) == NULL)
1249 return -ENODEV;
1251 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1252 adap->fe->ops.tuner_ops.set_params = dib7770_set_param_override;
1253 return 0;
1256 static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap)
1258 struct dib0700_adapter_state *st = adap->priv;
1259 struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1261 if (adap->id == 0) {
1262 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c, &dib7070p_dib0070_config[0]) == NULL)
1263 return -ENODEV;
1264 } else {
1265 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c, &dib7070p_dib0070_config[1]) == NULL)
1266 return -ENODEV;
1269 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1270 adap->fe->ops.tuner_ops.set_params = dib7070_set_param_override;
1271 return 0;
1274 static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
1276 return dib7000p_pid_filter(adapter->fe, index, pid, onoff);
1279 static int stk70x0p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
1281 return dib7000p_pid_filter_ctrl(adapter->fe, onoff);
1284 static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
1285 60000, 15000,
1286 1, 20, 3, 1, 0,
1287 0, 0, 1, 1, 2,
1288 (3 << 14) | (1 << 12) | (524 << 0),
1289 (0 << 25) | 0,
1290 20452225,
1291 12000000,
1294 static struct dib7000p_config dib7070p_dib7000p_config = {
1295 .output_mpeg2_in_188_bytes = 1,
1297 .agc_config_count = 1,
1298 .agc = &dib7070_agc_config,
1299 .bw = &dib7070_bw_config_12_mhz,
1300 .tuner_is_baseband = 1,
1301 .spur_protect = 1,
1303 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1304 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1305 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1307 .hostbus_diversity = 1,
1310 /* STK7070P */
1311 static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
1313 struct usb_device_descriptor *p = &adap->dev->udev->descriptor;
1314 if (p->idVendor == cpu_to_le16(USB_VID_PINNACLE) &&
1315 p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E))
1316 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1317 else
1318 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1319 msleep(10);
1320 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1321 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1322 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1323 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1325 dib0700_ctrl_clock(adap->dev, 72, 1);
1327 msleep(10);
1328 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1329 msleep(10);
1330 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1332 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1333 &dib7070p_dib7000p_config) != 0) {
1334 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
1335 __func__);
1336 return -ENODEV;
1339 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
1340 &dib7070p_dib7000p_config);
1341 return adap->fe == NULL ? -ENODEV : 0;
1344 /* DIB807x generic */
1345 static struct dibx000_agc_config dib807x_agc_config[2] = {
1347 BAND_VHF,
1348 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1349 * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1350 * P_agc_inv_pwm2=0,P_agc_inh_dc_rv_est=0,
1351 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1352 * P_agc_write=0 */
1353 (0 << 15) | (0 << 14) | (7 << 11) | (0 << 10) | (0 << 9) |
1354 (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
1355 (0 << 0), /* setup*/
1357 600, /* inv_gain*/
1358 10, /* time_stabiliz*/
1360 0, /* alpha_level*/
1361 118, /* thlock*/
1363 0, /* wbd_inv*/
1364 3530, /* wbd_ref*/
1365 1, /* wbd_sel*/
1366 5, /* wbd_alpha*/
1368 65535, /* agc1_max*/
1369 0, /* agc1_min*/
1371 65535, /* agc2_max*/
1372 0, /* agc2_min*/
1374 0, /* agc1_pt1*/
1375 40, /* agc1_pt2*/
1376 183, /* agc1_pt3*/
1377 206, /* agc1_slope1*/
1378 255, /* agc1_slope2*/
1379 72, /* agc2_pt1*/
1380 152, /* agc2_pt2*/
1381 88, /* agc2_slope1*/
1382 90, /* agc2_slope2*/
1384 17, /* alpha_mant*/
1385 27, /* alpha_exp*/
1386 23, /* beta_mant*/
1387 51, /* beta_exp*/
1389 0, /* perform_agc_softsplit*/
1390 }, {
1391 BAND_UHF,
1392 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1393 * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1394 * P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1395 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1396 * P_agc_write=0 */
1397 (0 << 15) | (0 << 14) | (1 << 11) | (0 << 10) | (0 << 9) |
1398 (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
1399 (0 << 0), /* setup */
1401 600, /* inv_gain*/
1402 10, /* time_stabiliz*/
1404 0, /* alpha_level*/
1405 118, /* thlock*/
1407 0, /* wbd_inv*/
1408 3530, /* wbd_ref*/
1409 1, /* wbd_sel*/
1410 5, /* wbd_alpha*/
1412 65535, /* agc1_max*/
1413 0, /* agc1_min*/
1415 65535, /* agc2_max*/
1416 0, /* agc2_min*/
1418 0, /* agc1_pt1*/
1419 40, /* agc1_pt2*/
1420 183, /* agc1_pt3*/
1421 206, /* agc1_slope1*/
1422 255, /* agc1_slope2*/
1423 72, /* agc2_pt1*/
1424 152, /* agc2_pt2*/
1425 88, /* agc2_slope1*/
1426 90, /* agc2_slope2*/
1428 17, /* alpha_mant*/
1429 27, /* alpha_exp*/
1430 23, /* beta_mant*/
1431 51, /* beta_exp*/
1433 0, /* perform_agc_softsplit*/
1437 static struct dibx000_bandwidth_config dib807x_bw_config_12_mhz = {
1438 60000, 15000, /* internal, sampling*/
1439 1, 20, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass*/
1440 0, 0, 1, 1, 2, /* misc: refdiv, bypclk_div, IO_CLK_en_core,
1441 ADClkSrc, modulo */
1442 (3 << 14) | (1 << 12) | (599 << 0), /* sad_cfg: refsel, sel, freq_15k*/
1443 (0 << 25) | 0, /* ifreq = 0.000000 MHz*/
1444 18179755, /* timf*/
1445 12000000, /* xtal_hz*/
1448 static struct dib8000_config dib807x_dib8000_config[2] = {
1450 .output_mpeg2_in_188_bytes = 1,
1452 .agc_config_count = 2,
1453 .agc = dib807x_agc_config,
1454 .pll = &dib807x_bw_config_12_mhz,
1455 .tuner_is_baseband = 1,
1457 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1458 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1459 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1461 .hostbus_diversity = 1,
1462 .div_cfg = 1,
1463 .agc_control = &dib0070_ctrl_agc_filter,
1464 .output_mode = OUTMODE_MPEG2_FIFO,
1465 .drives = 0x2d98,
1466 }, {
1467 .output_mpeg2_in_188_bytes = 1,
1469 .agc_config_count = 2,
1470 .agc = dib807x_agc_config,
1471 .pll = &dib807x_bw_config_12_mhz,
1472 .tuner_is_baseband = 1,
1474 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1475 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1476 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1478 .hostbus_diversity = 1,
1479 .agc_control = &dib0070_ctrl_agc_filter,
1480 .output_mode = OUTMODE_MPEG2_FIFO,
1481 .drives = 0x2d98,
1485 static int dib80xx_tuner_reset(struct dvb_frontend *fe, int onoff)
1487 return dib8000_set_gpio(fe, 5, 0, !onoff);
1490 static int dib80xx_tuner_sleep(struct dvb_frontend *fe, int onoff)
1492 return dib8000_set_gpio(fe, 0, 0, onoff);
1495 static const struct dib0070_wbd_gain_cfg dib8070_wbd_gain_cfg[] = {
1496 { 240, 7},
1497 { 0xffff, 6},
1500 static struct dib0070_config dib807x_dib0070_config[2] = {
1502 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1503 .reset = dib80xx_tuner_reset,
1504 .sleep = dib80xx_tuner_sleep,
1505 .clock_khz = 12000,
1506 .clock_pad_drive = 4,
1507 .vga_filter = 1,
1508 .force_crystal_mode = 1,
1509 .enable_third_order_filter = 1,
1510 .charge_pump = 0,
1511 .wbd_gain = dib8070_wbd_gain_cfg,
1512 .osc_buffer_state = 0,
1513 .freq_offset_khz_uhf = -100,
1514 .freq_offset_khz_vhf = -100,
1515 }, {
1516 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1517 .reset = dib80xx_tuner_reset,
1518 .sleep = dib80xx_tuner_sleep,
1519 .clock_khz = 12000,
1520 .clock_pad_drive = 2,
1521 .vga_filter = 1,
1522 .force_crystal_mode = 1,
1523 .enable_third_order_filter = 1,
1524 .charge_pump = 0,
1525 .wbd_gain = dib8070_wbd_gain_cfg,
1526 .osc_buffer_state = 0,
1527 .freq_offset_khz_uhf = -25,
1528 .freq_offset_khz_vhf = -25,
1532 static int dib807x_set_param_override(struct dvb_frontend *fe,
1533 struct dvb_frontend_parameters *fep)
1535 struct dvb_usb_adapter *adap = fe->dvb->priv;
1536 struct dib0700_adapter_state *state = adap->priv;
1538 u16 offset = dib0070_wbd_offset(fe);
1539 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1540 switch (band) {
1541 case BAND_VHF:
1542 offset += 750;
1543 break;
1544 case BAND_UHF: /* fall-thru wanted */
1545 default:
1546 offset += 250; break;
1548 deb_info("WBD for DiB8000: %d\n", offset);
1549 dib8000_set_wbd_ref(fe, offset);
1551 return state->set_param_save(fe, fep);
1554 static int dib807x_tuner_attach(struct dvb_usb_adapter *adap)
1556 struct dib0700_adapter_state *st = adap->priv;
1557 struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe,
1558 DIBX000_I2C_INTERFACE_TUNER, 1);
1560 if (adap->id == 0) {
1561 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
1562 &dib807x_dib0070_config[0]) == NULL)
1563 return -ENODEV;
1564 } else {
1565 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
1566 &dib807x_dib0070_config[1]) == NULL)
1567 return -ENODEV;
1570 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1571 adap->fe->ops.tuner_ops.set_params = dib807x_set_param_override;
1572 return 0;
1575 static int stk80xx_pid_filter(struct dvb_usb_adapter *adapter, int index,
1576 u16 pid, int onoff)
1578 return dib8000_pid_filter(adapter->fe, index, pid, onoff);
1581 static int stk80xx_pid_filter_ctrl(struct dvb_usb_adapter *adapter,
1582 int onoff)
1584 return dib8000_pid_filter_ctrl(adapter->fe, onoff);
1587 /* STK807x */
1588 static int stk807x_frontend_attach(struct dvb_usb_adapter *adap)
1590 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1591 msleep(10);
1592 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1593 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1594 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1596 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1598 dib0700_ctrl_clock(adap->dev, 72, 1);
1600 msleep(10);
1601 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1602 msleep(10);
1603 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1605 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1606 0x80);
1608 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
1609 &dib807x_dib8000_config[0]);
1611 return adap->fe == NULL ? -ENODEV : 0;
1614 /* STK807xPVR */
1615 static int stk807xpvr_frontend_attach0(struct dvb_usb_adapter *adap)
1617 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1618 msleep(30);
1619 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1620 msleep(500);
1621 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1622 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1623 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1625 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1627 dib0700_ctrl_clock(adap->dev, 72, 1);
1629 msleep(10);
1630 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1631 msleep(10);
1632 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1634 /* initialize IC 0 */
1635 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x12, 0x80);
1637 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
1638 &dib807x_dib8000_config[0]);
1640 return adap->fe == NULL ? -ENODEV : 0;
1643 static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap)
1645 /* initialize IC 1 */
1646 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x22, 0x82);
1648 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82,
1649 &dib807x_dib8000_config[1]);
1651 return adap->fe == NULL ? -ENODEV : 0;
1654 /* STK8096GP */
1655 struct dibx000_agc_config dib8090_agc_config[2] = {
1657 BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
1658 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1,
1659 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1660 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
1661 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
1662 | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
1664 787,
1668 118,
1671 3530,
1675 65535,
1678 65535,
1683 114,
1684 143,
1685 144,
1686 114,
1687 227,
1688 116,
1689 117,
1699 BAND_CBAND,
1700 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1,
1701 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1702 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
1703 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8)
1704 | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
1706 787,
1710 118,
1713 3530,
1720 65535,
1725 114,
1726 143,
1727 144,
1728 114,
1729 227,
1730 116,
1731 117,
1742 static struct dibx000_bandwidth_config dib8090_pll_config_12mhz = {
1743 54000, 13500,
1744 1, 18, 3, 1, 0,
1745 0, 0, 1, 1, 2,
1746 (3 << 14) | (1 << 12) | (599 << 0),
1747 (0 << 25) | 0,
1748 20199727,
1749 12000000,
1752 static int dib8090_get_adc_power(struct dvb_frontend *fe)
1754 return dib8000_get_adc_power(fe, 1);
1757 static struct dib8000_config dib809x_dib8000_config = {
1758 .output_mpeg2_in_188_bytes = 1,
1760 .agc_config_count = 2,
1761 .agc = dib8090_agc_config,
1762 .agc_control = dib0090_dcc_freq,
1763 .pll = &dib8090_pll_config_12mhz,
1764 .tuner_is_baseband = 1,
1766 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1767 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1768 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1770 .hostbus_diversity = 1,
1771 .div_cfg = 0x31,
1772 .output_mode = OUTMODE_MPEG2_FIFO,
1773 .drives = 0x2d98,
1774 .diversity_delay = 144,
1775 .refclksel = 3,
1778 static struct dib0090_config dib809x_dib0090_config = {
1779 .io.pll_bypass = 1,
1780 .io.pll_range = 1,
1781 .io.pll_prediv = 1,
1782 .io.pll_loopdiv = 20,
1783 .io.adc_clock_ratio = 8,
1784 .io.pll_int_loop_filt = 0,
1785 .io.clock_khz = 12000,
1786 .reset = dib80xx_tuner_reset,
1787 .sleep = dib80xx_tuner_sleep,
1788 .clkouttobamse = 1,
1789 .analog_output = 1,
1790 .i2c_address = DEFAULT_DIB0090_I2C_ADDRESS,
1791 .wbd_vhf_offset = 100,
1792 .wbd_cband_offset = 450,
1793 .use_pwm_agc = 1,
1794 .clkoutdrive = 1,
1795 .get_adc_power = dib8090_get_adc_power,
1796 .freq_offset_khz_uhf = 0,
1797 .freq_offset_khz_vhf = -143,
1800 static int dib8096_set_param_override(struct dvb_frontend *fe,
1801 struct dvb_frontend_parameters *fep)
1803 struct dvb_usb_adapter *adap = fe->dvb->priv;
1804 struct dib0700_adapter_state *state = adap->priv;
1805 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1806 u16 offset;
1807 int ret = 0;
1808 enum frontend_tune_state tune_state = CT_SHUTDOWN;
1809 u16 ltgain, rf_gain_limit;
1811 ret = state->set_param_save(fe, fep);
1812 if (ret < 0)
1813 return ret;
1815 switch (band) {
1816 case BAND_VHF:
1817 offset = 100;
1818 break;
1819 case BAND_UHF:
1820 offset = 550;
1821 break;
1822 default:
1823 offset = 0;
1824 break;
1826 offset += (dib0090_get_wbd_offset(fe) * 8 * 18 / 33 + 1) / 2;
1827 dib8000_set_wbd_ref(fe, offset);
1830 if (band == BAND_CBAND) {
1831 deb_info("tuning in CBAND - soft-AGC startup\n");
1832 /* TODO specific wbd target for dib0090 - needed for startup ? */
1833 dib0090_set_tune_state(fe, CT_AGC_START);
1834 do {
1835 ret = dib0090_gain_control(fe);
1836 msleep(ret);
1837 tune_state = dib0090_get_tune_state(fe);
1838 if (tune_state == CT_AGC_STEP_0)
1839 dib8000_set_gpio(fe, 6, 0, 1);
1840 else if (tune_state == CT_AGC_STEP_1) {
1841 dib0090_get_current_gain(fe, NULL, NULL, &rf_gain_limit, &ltgain);
1842 if (rf_gain_limit == 0)
1843 dib8000_set_gpio(fe, 6, 0, 0);
1845 } while (tune_state < CT_AGC_STOP);
1846 dib0090_pwm_gain_reset(fe);
1847 dib8000_pwm_agc_reset(fe);
1848 dib8000_set_tune_state(fe, CT_DEMOD_START);
1849 } else {
1850 deb_info("not tuning in CBAND - standard AGC startup\n");
1851 dib0090_pwm_gain_reset(fe);
1854 return 0;
1857 static int dib809x_tuner_attach(struct dvb_usb_adapter *adap)
1859 struct dib0700_adapter_state *st = adap->priv;
1860 struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1862 if (dvb_attach(dib0090_register, adap->fe, tun_i2c, &dib809x_dib0090_config) == NULL)
1863 return -ENODEV;
1865 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1866 adap->fe->ops.tuner_ops.set_params = dib8096_set_param_override;
1867 return 0;
1870 static int stk809x_frontend_attach(struct dvb_usb_adapter *adap)
1872 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1873 msleep(10);
1874 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1875 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1876 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1878 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1880 dib0700_ctrl_clock(adap->dev, 72, 1);
1882 msleep(10);
1883 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1884 msleep(10);
1885 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1887 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 0x80);
1889 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80, &dib809x_dib8000_config);
1891 return adap->fe == NULL ? -ENODEV : 0;
1894 /* STK7070PD */
1895 static struct dib7000p_config stk7070pd_dib7000p_config[2] = {
1897 .output_mpeg2_in_188_bytes = 1,
1899 .agc_config_count = 1,
1900 .agc = &dib7070_agc_config,
1901 .bw = &dib7070_bw_config_12_mhz,
1902 .tuner_is_baseband = 1,
1903 .spur_protect = 1,
1905 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1906 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1907 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1909 .hostbus_diversity = 1,
1910 }, {
1911 .output_mpeg2_in_188_bytes = 1,
1913 .agc_config_count = 1,
1914 .agc = &dib7070_agc_config,
1915 .bw = &dib7070_bw_config_12_mhz,
1916 .tuner_is_baseband = 1,
1917 .spur_protect = 1,
1919 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1920 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1921 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1923 .hostbus_diversity = 1,
1927 static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap)
1929 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1930 msleep(10);
1931 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1932 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1933 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1934 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1936 dib0700_ctrl_clock(adap->dev, 72, 1);
1938 msleep(10);
1939 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1940 msleep(10);
1941 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1943 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
1944 stk7070pd_dib7000p_config) != 0) {
1945 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
1946 __func__);
1947 return -ENODEV;
1950 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]);
1951 return adap->fe == NULL ? -ENODEV : 0;
1954 static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap)
1956 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]);
1957 return adap->fe == NULL ? -ENODEV : 0;
1960 /* S5H1411 */
1961 static struct s5h1411_config pinnacle_801e_config = {
1962 .output_mode = S5H1411_PARALLEL_OUTPUT,
1963 .gpio = S5H1411_GPIO_OFF,
1964 .mpeg_timing = S5H1411_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK,
1965 .qam_if = S5H1411_IF_44000,
1966 .vsb_if = S5H1411_IF_44000,
1967 .inversion = S5H1411_INVERSION_OFF,
1968 .status_mode = S5H1411_DEMODLOCKING
1971 /* Pinnacle PCTV HD Pro 801e GPIOs map:
1972 GPIO0 - currently unknown
1973 GPIO1 - xc5000 tuner reset
1974 GPIO2 - CX25843 sleep
1975 GPIO3 - currently unknown
1976 GPIO4 - currently unknown
1977 GPIO6 - currently unknown
1978 GPIO7 - currently unknown
1979 GPIO9 - currently unknown
1980 GPIO10 - CX25843 reset
1982 static int s5h1411_frontend_attach(struct dvb_usb_adapter *adap)
1984 struct dib0700_state *st = adap->dev->priv;
1986 /* Make use of the new i2c functions from FW 1.20 */
1987 st->fw_use_new_i2c_api = 1;
1989 /* The s5h1411 requires the dib0700 to not be in master mode */
1990 st->disable_streaming_master_mode = 1;
1992 /* All msleep values taken from Windows USB trace */
1993 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
1994 dib0700_set_gpio(adap->dev, GPIO3, GPIO_OUT, 0);
1995 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1996 msleep(400);
1997 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1998 msleep(60);
1999 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2000 msleep(30);
2001 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
2002 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
2003 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
2004 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
2005 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 0);
2006 msleep(30);
2008 /* Put the CX25843 to sleep for now since we're in digital mode */
2009 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
2011 /* GPIOs are initialized, do the attach */
2012 adap->fe = dvb_attach(s5h1411_attach, &pinnacle_801e_config,
2013 &adap->dev->i2c_adap);
2014 return adap->fe == NULL ? -ENODEV : 0;
2017 static int dib0700_xc5000_tuner_callback(void *priv, int component,
2018 int command, int arg)
2020 struct dvb_usb_adapter *adap = priv;
2022 if (command == XC5000_TUNER_RESET) {
2023 /* Reset the tuner */
2024 dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0);
2025 msleep(10);
2026 dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1);
2027 msleep(10);
2028 } else {
2029 err("xc5000: unknown tuner callback command: %d\n", command);
2030 return -EINVAL;
2033 return 0;
2036 static struct xc5000_config s5h1411_xc5000_tunerconfig = {
2037 .i2c_address = 0x64,
2038 .if_khz = 5380,
2041 static int xc5000_tuner_attach(struct dvb_usb_adapter *adap)
2043 /* FIXME: generalize & move to common area */
2044 adap->fe->callback = dib0700_xc5000_tuner_callback;
2046 return dvb_attach(xc5000_attach, adap->fe, &adap->dev->i2c_adap,
2047 &s5h1411_xc5000_tunerconfig)
2048 == NULL ? -ENODEV : 0;
2051 static struct lgdt3305_config hcw_lgdt3305_config = {
2052 .i2c_addr = 0x0e,
2053 .mpeg_mode = LGDT3305_MPEG_PARALLEL,
2054 .tpclk_edge = LGDT3305_TPCLK_FALLING_EDGE,
2055 .tpvalid_polarity = LGDT3305_TP_VALID_LOW,
2056 .deny_i2c_rptr = 0,
2057 .spectral_inversion = 1,
2058 .qam_if_khz = 6000,
2059 .vsb_if_khz = 6000,
2060 .usref_8vsb = 0x0500,
2063 static struct mxl5007t_config hcw_mxl5007t_config = {
2064 .xtal_freq_hz = MxL_XTAL_25_MHZ,
2065 .if_freq_hz = MxL_IF_6_MHZ,
2066 .invert_if = 1,
2069 /* TIGER-ATSC map:
2070 GPIO0 - LNA_CTR (H: LNA power enabled, L: LNA power disabled)
2071 GPIO1 - ANT_SEL (H: VPA, L: MCX)
2072 GPIO4 - SCL2
2073 GPIO6 - EN_TUNER
2074 GPIO7 - SDA2
2075 GPIO10 - DEM_RST
2077 MXL is behind LG's i2c repeater. LG is on SCL2/SDA2 gpios on the DIB
2079 static int lgdt3305_frontend_attach(struct dvb_usb_adapter *adap)
2081 struct dib0700_state *st = adap->dev->priv;
2083 /* Make use of the new i2c functions from FW 1.20 */
2084 st->fw_use_new_i2c_api = 1;
2086 st->disable_streaming_master_mode = 1;
2088 /* fe power enable */
2089 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
2090 msleep(30);
2091 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
2092 msleep(30);
2094 /* demod reset */
2095 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2096 msleep(30);
2097 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
2098 msleep(30);
2099 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
2100 msleep(30);
2102 adap->fe = dvb_attach(lgdt3305_attach,
2103 &hcw_lgdt3305_config,
2104 &adap->dev->i2c_adap);
2106 return adap->fe == NULL ? -ENODEV : 0;
2109 static int mxl5007t_tuner_attach(struct dvb_usb_adapter *adap)
2111 return dvb_attach(mxl5007t_attach, adap->fe,
2112 &adap->dev->i2c_adap, 0x60,
2113 &hcw_mxl5007t_config) == NULL ? -ENODEV : 0;
2117 /* DVB-USB and USB stuff follows */
2118 struct usb_device_id dib0700_usb_id_table[] = {
2119 /* 0 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P) },
2120 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P_PC) },
2121 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) },
2122 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) },
2123 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) },
2124 /* 5 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) },
2125 { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500) },
2126 { USB_DEVICE(USB_VID_UNIWILL, USB_PID_UNIWILL_STK7700P) },
2127 { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P) },
2128 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) },
2129 /* 10 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_2) },
2130 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV2000E) },
2131 { USB_DEVICE(USB_VID_TERRATEC,
2132 USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) },
2133 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) },
2134 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700D) },
2135 /* 15 */{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070P) },
2136 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV_DVB_T_FLASH) },
2137 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070PD) },
2138 { USB_DEVICE(USB_VID_PINNACLE,
2139 USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) },
2140 { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500_PC) },
2141 /* 20 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_EXPRESS) },
2142 { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U7000) },
2143 { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) },
2144 { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000) },
2145 { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3100) },
2146 /* 25 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) },
2147 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) },
2148 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_USB_XE) },
2149 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_EXPRESSCARD_320CX) },
2150 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV72E) },
2151 /* 30 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73E) },
2152 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_EC372S) },
2153 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_EXPRESS) },
2154 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS) },
2155 { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P_2) },
2156 /* 35 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK_52009) },
2157 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_3) },
2158 { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U8000) },
2159 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700PH) },
2160 { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000H) },
2161 /* 40 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E) },
2162 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E_SE) },
2163 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_EXPRESS) },
2164 { USB_DEVICE(USB_VID_TERRATEC,
2165 USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2) },
2166 { USB_DEVICE(USB_VID_SONY, USB_PID_SONY_PLAYTV) },
2167 /* 45 */{ USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_PD378S) },
2168 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC) },
2169 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC_B210) },
2170 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_MC770) },
2171 { USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT) },
2172 /* 50 */{ USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT_Dlx) },
2173 { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_H) },
2174 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T3) },
2175 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T5) },
2176 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D) },
2177 /* 55 */{ USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D_2) },
2178 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73A) },
2179 { USB_DEVICE(USB_VID_PCTV, USB_PID_PINNACLE_PCTV73ESE) },
2180 { USB_DEVICE(USB_VID_PCTV, USB_PID_PINNACLE_PCTV282E) },
2181 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7770P) },
2182 /* 60 */{ USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS_2) },
2183 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XPVR) },
2184 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XP) },
2185 { USB_DEVICE(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD) },
2186 { USB_DEVICE(USB_VID_EVOLUTEPC, USB_PID_TVWAY_PLUS) },
2187 /* 65 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73ESE) },
2188 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV282E) },
2189 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK8096GP) },
2190 { 0 } /* Terminating entry */
2192 MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
2194 #define DIB0700_DEFAULT_DEVICE_PROPERTIES \
2195 .caps = DVB_USB_IS_AN_I2C_ADAPTER, \
2196 .usb_ctrl = DEVICE_SPECIFIC, \
2197 .firmware = "dvb-usb-dib0700-1.20.fw", \
2198 .download_firmware = dib0700_download_firmware, \
2199 .no_reconnect = 1, \
2200 .size_of_priv = sizeof(struct dib0700_state), \
2201 .i2c_algo = &dib0700_i2c_algo, \
2202 .identify_state = dib0700_identify_state
2204 #define DIB0700_DEFAULT_STREAMING_CONFIG(ep) \
2205 .streaming_ctrl = dib0700_streaming_ctrl, \
2206 .stream = { \
2207 .type = USB_BULK, \
2208 .count = 4, \
2209 .endpoint = ep, \
2210 .u = { \
2211 .bulk = { \
2212 .buffersize = 39480, \
2217 struct dvb_usb_device_properties dib0700_devices[] = {
2219 DIB0700_DEFAULT_DEVICE_PROPERTIES,
2221 .num_adapters = 1,
2222 .adapter = {
2224 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2225 .pid_filter_count = 32,
2226 .pid_filter = stk70x0p_pid_filter,
2227 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2228 .frontend_attach = stk7700p_frontend_attach,
2229 .tuner_attach = stk7700p_tuner_attach,
2231 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2235 .num_device_descs = 8,
2236 .devices = {
2237 { "DiBcom STK7700P reference design",
2238 { &dib0700_usb_id_table[0], &dib0700_usb_id_table[1] },
2239 { NULL },
2241 { "Hauppauge Nova-T Stick",
2242 { &dib0700_usb_id_table[4], &dib0700_usb_id_table[9], NULL },
2243 { NULL },
2245 { "AVerMedia AVerTV DVB-T Volar",
2246 { &dib0700_usb_id_table[5], &dib0700_usb_id_table[10] },
2247 { NULL },
2249 { "Compro Videomate U500",
2250 { &dib0700_usb_id_table[6], &dib0700_usb_id_table[19] },
2251 { NULL },
2253 { "Uniwill STK7700P based (Hama and others)",
2254 { &dib0700_usb_id_table[7], NULL },
2255 { NULL },
2257 { "Leadtek Winfast DTV Dongle (STK7700P based)",
2258 { &dib0700_usb_id_table[8], &dib0700_usb_id_table[34] },
2259 { NULL },
2261 { "AVerMedia AVerTV DVB-T Express",
2262 { &dib0700_usb_id_table[20] },
2263 { NULL },
2265 { "Gigabyte U7000",
2266 { &dib0700_usb_id_table[21], NULL },
2267 { NULL },
2271 .rc_interval = DEFAULT_RC_INTERVAL,
2272 .rc_key_map = dib0700_rc_keys,
2273 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2274 .rc_query = dib0700_rc_query
2275 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2277 .num_adapters = 2,
2278 .adapter = {
2280 .frontend_attach = bristol_frontend_attach,
2281 .tuner_attach = bristol_tuner_attach,
2283 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2284 }, {
2285 .frontend_attach = bristol_frontend_attach,
2286 .tuner_attach = bristol_tuner_attach,
2288 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2292 .num_device_descs = 1,
2293 .devices = {
2294 { "Hauppauge Nova-T 500 Dual DVB-T",
2295 { &dib0700_usb_id_table[2], &dib0700_usb_id_table[3], NULL },
2296 { NULL },
2300 .rc_interval = DEFAULT_RC_INTERVAL,
2301 .rc_key_map = dib0700_rc_keys,
2302 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2303 .rc_query = dib0700_rc_query
2304 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2306 .num_adapters = 2,
2307 .adapter = {
2309 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2310 .pid_filter_count = 32,
2311 .pid_filter = stk70x0p_pid_filter,
2312 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2313 .frontend_attach = stk7700d_frontend_attach,
2314 .tuner_attach = stk7700d_tuner_attach,
2316 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2317 }, {
2318 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2319 .pid_filter_count = 32,
2320 .pid_filter = stk70x0p_pid_filter,
2321 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2322 .frontend_attach = stk7700d_frontend_attach,
2323 .tuner_attach = stk7700d_tuner_attach,
2325 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2329 .num_device_descs = 5,
2330 .devices = {
2331 { "Pinnacle PCTV 2000e",
2332 { &dib0700_usb_id_table[11], NULL },
2333 { NULL },
2335 { "Terratec Cinergy DT XS Diversity",
2336 { &dib0700_usb_id_table[12], NULL },
2337 { NULL },
2339 { "Hauppauge Nova-TD Stick/Elgato Eye-TV Diversity",
2340 { &dib0700_usb_id_table[13], NULL },
2341 { NULL },
2343 { "DiBcom STK7700D reference design",
2344 { &dib0700_usb_id_table[14], NULL },
2345 { NULL },
2347 { "YUAN High-Tech DiBcom STK7700D",
2348 { &dib0700_usb_id_table[55], NULL },
2349 { NULL },
2354 .rc_interval = DEFAULT_RC_INTERVAL,
2355 .rc_key_map = dib0700_rc_keys,
2356 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2357 .rc_query = dib0700_rc_query
2359 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2361 .num_adapters = 1,
2362 .adapter = {
2364 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2365 .pid_filter_count = 32,
2366 .pid_filter = stk70x0p_pid_filter,
2367 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2368 .frontend_attach = stk7700P2_frontend_attach,
2369 .tuner_attach = stk7700d_tuner_attach,
2371 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2375 .num_device_descs = 3,
2376 .devices = {
2377 { "ASUS My Cinema U3000 Mini DVBT Tuner",
2378 { &dib0700_usb_id_table[23], NULL },
2379 { NULL },
2381 { "Yuan EC372S",
2382 { &dib0700_usb_id_table[31], NULL },
2383 { NULL },
2385 { "Terratec Cinergy T Express",
2386 { &dib0700_usb_id_table[42], NULL },
2387 { NULL },
2391 .rc_interval = DEFAULT_RC_INTERVAL,
2392 .rc_key_map = dib0700_rc_keys,
2393 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2394 .rc_query = dib0700_rc_query
2395 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2397 .num_adapters = 1,
2398 .adapter = {
2400 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2401 .pid_filter_count = 32,
2402 .pid_filter = stk70x0p_pid_filter,
2403 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2404 .frontend_attach = stk7070p_frontend_attach,
2405 .tuner_attach = dib7070p_tuner_attach,
2407 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2409 .size_of_priv = sizeof(struct dib0700_adapter_state),
2413 .num_device_descs = 11,
2414 .devices = {
2415 { "DiBcom STK7070P reference design",
2416 { &dib0700_usb_id_table[15], NULL },
2417 { NULL },
2419 { "Pinnacle PCTV DVB-T Flash Stick",
2420 { &dib0700_usb_id_table[16], NULL },
2421 { NULL },
2423 { "Artec T14BR DVB-T",
2424 { &dib0700_usb_id_table[22], NULL },
2425 { NULL },
2427 { "ASUS My Cinema U3100 Mini DVBT Tuner",
2428 { &dib0700_usb_id_table[24], NULL },
2429 { NULL },
2431 { "Hauppauge Nova-T Stick",
2432 { &dib0700_usb_id_table[25], NULL },
2433 { NULL },
2435 { "Hauppauge Nova-T MyTV.t",
2436 { &dib0700_usb_id_table[26], NULL },
2437 { NULL },
2439 { "Pinnacle PCTV 72e",
2440 { &dib0700_usb_id_table[29], NULL },
2441 { NULL },
2443 { "Pinnacle PCTV 73e",
2444 { &dib0700_usb_id_table[30], NULL },
2445 { NULL },
2447 { "Elgato EyeTV DTT",
2448 { &dib0700_usb_id_table[49], NULL },
2449 { NULL },
2451 { "Yuan PD378S",
2452 { &dib0700_usb_id_table[45], NULL },
2453 { NULL },
2455 { "Elgato EyeTV Dtt Dlx PD378S",
2456 { &dib0700_usb_id_table[50], NULL },
2457 { NULL },
2461 .rc_interval = DEFAULT_RC_INTERVAL,
2462 .rc_key_map = dib0700_rc_keys,
2463 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2464 .rc_query = dib0700_rc_query
2466 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2468 .num_adapters = 1,
2469 .adapter = {
2471 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2472 .pid_filter_count = 32,
2473 .pid_filter = stk70x0p_pid_filter,
2474 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2475 .frontend_attach = stk7070p_frontend_attach,
2476 .tuner_attach = dib7070p_tuner_attach,
2478 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2480 .size_of_priv = sizeof(struct dib0700_adapter_state),
2484 .num_device_descs = 3,
2485 .devices = {
2486 { "Pinnacle PCTV 73A",
2487 { &dib0700_usb_id_table[56], NULL },
2488 { NULL },
2490 { "Pinnacle PCTV 73e SE",
2491 { &dib0700_usb_id_table[57], &dib0700_usb_id_table[65], NULL },
2492 { NULL },
2494 { "Pinnacle PCTV 282e",
2495 { &dib0700_usb_id_table[58], &dib0700_usb_id_table[66], NULL },
2496 { NULL },
2500 .rc_interval = DEFAULT_RC_INTERVAL,
2501 .rc_key_map = dib0700_rc_keys,
2502 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2503 .rc_query = dib0700_rc_query
2505 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2507 .num_adapters = 2,
2508 .adapter = {
2510 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2511 .pid_filter_count = 32,
2512 .pid_filter = stk70x0p_pid_filter,
2513 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2514 .frontend_attach = stk7070pd_frontend_attach0,
2515 .tuner_attach = dib7070p_tuner_attach,
2517 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2519 .size_of_priv = sizeof(struct dib0700_adapter_state),
2520 }, {
2521 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2522 .pid_filter_count = 32,
2523 .pid_filter = stk70x0p_pid_filter,
2524 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2525 .frontend_attach = stk7070pd_frontend_attach1,
2526 .tuner_attach = dib7070p_tuner_attach,
2528 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2530 .size_of_priv = sizeof(struct dib0700_adapter_state),
2534 .num_device_descs = 6,
2535 .devices = {
2536 { "DiBcom STK7070PD reference design",
2537 { &dib0700_usb_id_table[17], NULL },
2538 { NULL },
2540 { "Pinnacle PCTV Dual DVB-T Diversity Stick",
2541 { &dib0700_usb_id_table[18], NULL },
2542 { NULL },
2544 { "Hauppauge Nova-TD Stick (52009)",
2545 { &dib0700_usb_id_table[35], NULL },
2546 { NULL },
2548 { "Hauppauge Nova-TD-500 (84xxx)",
2549 { &dib0700_usb_id_table[36], NULL },
2550 { NULL },
2552 { "Terratec Cinergy DT USB XS Diversity/ T5",
2553 { &dib0700_usb_id_table[43],
2554 &dib0700_usb_id_table[53], NULL},
2555 { NULL },
2557 { "Sony PlayTV",
2558 { &dib0700_usb_id_table[44], NULL },
2559 { NULL },
2562 .rc_interval = DEFAULT_RC_INTERVAL,
2563 .rc_key_map = dib0700_rc_keys,
2564 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2565 .rc_query = dib0700_rc_query
2566 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2568 .num_adapters = 1,
2569 .adapter = {
2571 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2572 .pid_filter_count = 32,
2573 .pid_filter = stk70x0p_pid_filter,
2574 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2575 .frontend_attach = stk7700ph_frontend_attach,
2576 .tuner_attach = stk7700ph_tuner_attach,
2578 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2580 .size_of_priv = sizeof(struct
2581 dib0700_adapter_state),
2585 .num_device_descs = 9,
2586 .devices = {
2587 { "Terratec Cinergy HT USB XE",
2588 { &dib0700_usb_id_table[27], NULL },
2589 { NULL },
2591 { "Pinnacle Expresscard 320cx",
2592 { &dib0700_usb_id_table[28], NULL },
2593 { NULL },
2595 { "Terratec Cinergy HT Express",
2596 { &dib0700_usb_id_table[32], NULL },
2597 { NULL },
2599 { "Gigabyte U8000-RH",
2600 { &dib0700_usb_id_table[37], NULL },
2601 { NULL },
2603 { "YUAN High-Tech STK7700PH",
2604 { &dib0700_usb_id_table[38], NULL },
2605 { NULL },
2607 { "Asus My Cinema-U3000Hybrid",
2608 { &dib0700_usb_id_table[39], NULL },
2609 { NULL },
2611 { "YUAN High-Tech MC770",
2612 { &dib0700_usb_id_table[48], NULL },
2613 { NULL },
2615 { "Leadtek WinFast DTV Dongle H",
2616 { &dib0700_usb_id_table[51], NULL },
2617 { NULL },
2619 { "YUAN High-Tech STK7700D",
2620 { &dib0700_usb_id_table[54], NULL },
2621 { NULL },
2624 .rc_interval = DEFAULT_RC_INTERVAL,
2625 .rc_key_map = dib0700_rc_keys,
2626 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2627 .rc_query = dib0700_rc_query
2628 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2629 .num_adapters = 1,
2630 .adapter = {
2632 .frontend_attach = s5h1411_frontend_attach,
2633 .tuner_attach = xc5000_tuner_attach,
2635 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2637 .size_of_priv = sizeof(struct
2638 dib0700_adapter_state),
2642 .num_device_descs = 2,
2643 .devices = {
2644 { "Pinnacle PCTV HD Pro USB Stick",
2645 { &dib0700_usb_id_table[40], NULL },
2646 { NULL },
2648 { "Pinnacle PCTV HD USB Stick",
2649 { &dib0700_usb_id_table[41], NULL },
2650 { NULL },
2653 .rc_interval = DEFAULT_RC_INTERVAL,
2654 .rc_key_map = dib0700_rc_keys,
2655 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2656 .rc_query = dib0700_rc_query
2657 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2658 .num_adapters = 1,
2659 .adapter = {
2661 .frontend_attach = lgdt3305_frontend_attach,
2662 .tuner_attach = mxl5007t_tuner_attach,
2664 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2666 .size_of_priv = sizeof(struct
2667 dib0700_adapter_state),
2671 .num_device_descs = 2,
2672 .devices = {
2673 { "Hauppauge ATSC MiniCard (B200)",
2674 { &dib0700_usb_id_table[46], NULL },
2675 { NULL },
2677 { "Hauppauge ATSC MiniCard (B210)",
2678 { &dib0700_usb_id_table[47], NULL },
2679 { NULL },
2682 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2684 .num_adapters = 1,
2685 .adapter = {
2687 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2688 .pid_filter_count = 32,
2689 .pid_filter = stk70x0p_pid_filter,
2690 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2691 .frontend_attach = stk7070p_frontend_attach,
2692 .tuner_attach = dib7770p_tuner_attach,
2694 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2696 .size_of_priv =
2697 sizeof(struct dib0700_adapter_state),
2701 .num_device_descs = 2,
2702 .devices = {
2703 { "DiBcom STK7770P reference design",
2704 { &dib0700_usb_id_table[59], NULL },
2705 { NULL },
2707 { "Terratec Cinergy T USB XXS (HD)/ T3",
2708 { &dib0700_usb_id_table[33],
2709 &dib0700_usb_id_table[52],
2710 &dib0700_usb_id_table[60], NULL},
2711 { NULL },
2714 .rc_interval = DEFAULT_RC_INTERVAL,
2715 .rc_key_map = dib0700_rc_keys,
2716 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2717 .rc_query = dib0700_rc_query
2718 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2719 .num_adapters = 1,
2720 .adapter = {
2722 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2723 .pid_filter_count = 32,
2724 .pid_filter = stk80xx_pid_filter,
2725 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
2726 .frontend_attach = stk807x_frontend_attach,
2727 .tuner_attach = dib807x_tuner_attach,
2729 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2731 .size_of_priv =
2732 sizeof(struct dib0700_adapter_state),
2736 .num_device_descs = 3,
2737 .devices = {
2738 { "DiBcom STK807xP reference design",
2739 { &dib0700_usb_id_table[62], NULL },
2740 { NULL },
2742 { "Prolink Pixelview SBTVD",
2743 { &dib0700_usb_id_table[63], NULL },
2744 { NULL },
2746 { "EvolutePC TVWay+",
2747 { &dib0700_usb_id_table[64], NULL },
2748 { NULL },
2752 .rc_interval = DEFAULT_RC_INTERVAL,
2753 .rc_key_map = dib0700_rc_keys,
2754 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2755 .rc_query = dib0700_rc_query
2757 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2758 .num_adapters = 2,
2759 .adapter = {
2761 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2762 .pid_filter_count = 32,
2763 .pid_filter = stk80xx_pid_filter,
2764 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
2765 .frontend_attach = stk807xpvr_frontend_attach0,
2766 .tuner_attach = dib807x_tuner_attach,
2768 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2770 .size_of_priv =
2771 sizeof(struct dib0700_adapter_state),
2774 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2775 .pid_filter_count = 32,
2776 .pid_filter = stk80xx_pid_filter,
2777 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
2778 .frontend_attach = stk807xpvr_frontend_attach1,
2779 .tuner_attach = dib807x_tuner_attach,
2781 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2783 .size_of_priv =
2784 sizeof(struct dib0700_adapter_state),
2788 .num_device_descs = 1,
2789 .devices = {
2790 { "DiBcom STK807xPVR reference design",
2791 { &dib0700_usb_id_table[61], NULL },
2792 { NULL },
2796 .rc_interval = DEFAULT_RC_INTERVAL,
2797 .rc_key_map = dib0700_rc_keys,
2798 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2799 .rc_query = dib0700_rc_query
2800 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2801 .num_adapters = 1,
2802 .adapter = {
2804 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
2805 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2806 .pid_filter_count = 32,
2807 .pid_filter = stk80xx_pid_filter,
2808 .pid_filter_ctrl = stk80xx_pid_filter_ctrl,
2809 .frontend_attach = stk809x_frontend_attach,
2810 .tuner_attach = dib809x_tuner_attach,
2812 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2814 .size_of_priv =
2815 sizeof(struct dib0700_adapter_state),
2819 .num_device_descs = 1,
2820 .devices = {
2821 { "DiBcom STK8096GP reference design",
2822 { &dib0700_usb_id_table[67], NULL },
2823 { NULL },
2827 .rc_interval = DEFAULT_RC_INTERVAL,
2828 .rc_key_map = dib0700_rc_keys,
2829 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2830 .rc_query = dib0700_rc_query
2834 int dib0700_device_count = ARRAY_SIZE(dib0700_devices);