V4L/DVB (13049): dib8000: SNR in 10th of dB
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / media / dvb / dvb-usb / dib0700_devices.c
blobcda60291c06e443af7dfe0dc424094efab19f567
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 "lgdt3305.h"
22 #include "mxl5007t.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] = {
37 .i2c_address = 0x60,
38 .clock_out = 3,
39 }, {
40 .i2c_address = 0x61,
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),
49 .agc1_max = 42598,
50 .agc1_min = 17694,
51 .agc2_max = 45875,
52 .agc2_min = 0,
54 .agc1_pt1 = 0,
55 .agc1_pt2 = 59,
57 .agc1_slope1 = 0,
58 .agc1_slope2 = 69,
60 .agc2_pt1 = 0,
61 .agc2_pt2 = 59,
63 .agc2_slope1 = 111,
64 .agc2_slope2 = 28,
67 static struct dib3000mc_config bristol_dib3000mc_config[2] = {
68 { .agc = &bristol_dib3000p_mt2060_agc_config,
69 .max_time = 0x196,
70 .ln_adc_level = 0x1cc7,
71 .output_mpeg2_in_188_bytes = 1,
73 { .agc = &bristol_dib3000p_mt2060_agc_config,
74 .max_time = 0x196,
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;
83 if (adap->id == 0) {
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);
91 else
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);
96 return -ENODEV;
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;
111 return 0;
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);
118 s8 a;
119 int if1=1220;
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 */
130 /* MT226x */
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
139 1130, // inv_gain
140 21, // time_stabiliz
142 0, // alpha_level
143 118, // thlock
145 0, // wbd_inv
146 3530, // wbd_ref
147 1, // wbd_sel
148 0, // wbd_alpha
150 65535, // agc1_max
151 33770, // agc1_min
152 65535, // agc2_max
153 23592, // agc2_min
155 0, // agc1_pt1
156 62, // agc1_pt2
157 255, // agc1_pt3
158 64, // agc1_slope1
159 64, // agc1_slope2
160 132, // agc2_pt1
161 192, // agc2_pt2
162 80, // agc2_slope1
163 80, // agc2_slope2
165 17, // alpha_mant
166 27, // alpha_exp
167 23, // beta_mant
168 51, // beta_exp
170 1, // perform_agc_softsplit
171 }, {
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
178 2372, // inv_gain
179 21, // time_stabiliz
181 0, // alpha_level
182 118, // thlock
184 0, // wbd_inv
185 3530, // wbd_ref
186 1, // wbd_sel
187 0, // wbd_alpha
189 65535, // agc1_max
190 0, // agc1_min
191 65535, // agc2_max
192 23592, // agc2_min
194 0, // agc1_pt1
195 128, // agc1_pt2
196 128, // agc1_pt3
197 128, // agc1_slope1
198 0, // agc1_slope2
199 128, // agc2_pt1
200 253, // agc2_pt2
201 81, // agc2_slope1
202 0, // agc2_slope2
204 17, // alpha_mant
205 27, // alpha_exp
206 23, // beta_mant
207 51, // beta_exp
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
218 0, // ifreq
219 20452225, // timf
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)
258 if (adap->id == 0) {
259 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
260 msleep(10);
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);
265 msleep(10);
266 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
267 msleep(10);
268 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
269 stk7700d_dib7000p_mt2266_config)
270 != 0) {
271 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
272 return -ENODEV;
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)
284 if (adap->id == 0) {
285 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
286 msleep(10);
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);
291 msleep(10);
292 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
293 msleep(10);
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)
297 != 0) {
298 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
299 return -ENODEV;
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 */
327 712, /* inv_gain */
328 21, /* time_stabiliz */
330 0, /* alpha_level */
331 118, /* thlock */
333 0, /* wbd_inv */
334 2867, /* wbd_ref */
335 0, /* wbd_sel */
336 2, /* wbd_alpha */
338 0, /* agc1_max */
339 0, /* agc1_min */
340 39718, /* agc2_max */
341 9930, /* agc2_min */
342 0, /* agc1_pt1 */
343 0, /* agc1_pt2 */
344 0, /* agc1_pt3 */
345 0, /* agc1_slope1 */
346 0, /* agc1_slope2 */
347 0, /* agc2_pt1 */
348 128, /* agc2_pt2 */
349 29, /* agc2_slope1 */
350 29, /* agc2_slope2 */
352 17, /* alpha_mant */
353 27, /* alpha_exp */
354 23, /* beta_mant */
355 51, /* beta_exp */
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,
365 modulo */
366 (3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */
367 (1 << 25) | 5816102, /* ifreq = 5.200000 MHz */
368 20452225, /* timf */
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;
390 switch (command) {
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);
395 break;
396 case XC2028_RESET_CLK:
397 break;
398 default:
399 err("%s: unknown command %d, arg %d\n", __func__,
400 command, arg);
401 return -EINVAL;
403 return 0;
406 static struct xc2028_ctrl stk7700ph_xc3028_ctrl = {
407 .fname = XC2028_DEFAULT_FIRMWARE,
408 .max_len = 64,
409 .demod = XC3028_FE_DIBCOM52,
412 static struct xc2028_config stk7700ph_xc3028_config = {
413 .i2c_addr = 0x61,
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);
424 else
425 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
426 msleep(20);
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);
431 msleep(10);
432 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
433 msleep(20);
434 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
435 msleep(10);
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",
440 __func__);
441 return -ENODEV;
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,
478 int *state)
480 u8 key[4];
481 int i;
482 struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
483 struct dib0700_state *st = d->priv;
484 *event = 0;
485 *state = REMOTE_NO_KEY_PRESSED;
486 i=dib0700_ctrl_rd(d,rc_request,2,key,4);
487 if (i<=0) {
488 err("RC Query Failed");
489 return -1;
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) {
500 case 0: {
501 /* NEC protocol sends repeat code as 0 0 0 FF */
502 if ((key[3-2] == 0x00) && (key[3-3] == 0x00) &&
503 (key[3] == 0xFF)) {
504 st->rc_counter++;
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;
510 return 0;
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]) {
515 st->rc_counter = 0;
516 *event = keymap[i].event;
517 *state = REMOTE_KEY_PRESSED;
518 d->last_event = keymap[i].event;
519 return 0;
522 break;
524 default: {
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) {
531 st->rc_counter++;
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;
539 return 0;
541 st->rc_counter = 0;
542 *event = keymap[i].event;
543 *state = REMOTE_KEY_PRESSED;
544 st->rc_toggle = key[3-1];
545 d->last_event = keymap[i].event;
546 return 0;
549 break;
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]);
553 d->last_event = 0;
554 return 0;
557 /* This is the structure of the RC response packet starting in firmware 1.20 */
558 struct dib0700_rc_response {
559 u8 report_id;
560 u8 data_state;
561 u16 system;
562 u8 data;
563 u8 not_data;
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,
568 int *state)
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;
573 u8 buf[6];
574 int i;
575 int status;
576 int actlen;
577 int found = 0;
579 /* Set initial results in case we exit the function early */
580 *event = 0;
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);
586 if (status < 0) {
587 /* No data available (meaning no key press) */
588 return 0;
592 switch (dvb_usb_dib0700_ir_proto) {
593 case 0:
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;
604 break;
606 break;
607 default:
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);
611 return -1;
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];
620 break;
623 if ((poll_reply.data + poll_reply.not_data) != 0xff) {
624 /* Key failed integrity check */
625 err("key failed integrity check: %04x %02x %02x",
626 poll_reply.system,
627 poll_reply.data, poll_reply.not_data);
628 return -1;
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;
637 found = 1;
638 break;
642 if (found == 0) {
643 err("Unknown remote controller key: %04x %02x %02x",
644 poll_reply.system,
645 poll_reply.data, poll_reply.not_data);
646 d->last_event = 0;
647 return 0;
650 if (poll_reply.data_state == 1) {
651 /* New key hit */
652 st->rc_counter = 0;
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) {
657 /* Key repeated */
658 st->rc_counter++;
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;
666 } else {
667 err("Unknown data state [%d]", poll_reply.data_state);
670 return 0;
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,
683 &fwtype);
684 if (ret < 0) {
685 err("Could not determine version info");
686 return -1;
688 if (ramver < 0x10200)
689 st->rc_func_version = 1;
690 else
691 st->rc_func_version = 2;
694 if (st->rc_func_version == 2)
695 return dib0700_rc_query_v1_20(d, event, state);
696 else
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 },
709 { 0x070f, KEY_1 },
710 { 0x0715, KEY_2 },
711 { 0x0710, KEY_3 },
712 { 0x0718, KEY_4 },
713 { 0x071b, KEY_5 },
714 { 0x071e, KEY_6 },
715 { 0x0711, KEY_7 },
716 { 0x0721, KEY_8 },
717 { 0x0712, KEY_9 },
718 { 0x0727, KEY_0 },
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 },
729 { 0xeb02, KEY_1 },
730 { 0xeb03, KEY_2 },
731 { 0xeb04, KEY_3 },
732 { 0xeb05, KEY_4 },
733 { 0xeb06, KEY_5 },
734 { 0xeb07, KEY_6 },
735 { 0xeb08, KEY_7 },
736 { 0xeb09, KEY_8 },
737 { 0xeb0a, KEY_9 },
738 { 0xeb0b, KEY_VIDEO },
739 { 0xeb0c, KEY_0 },
740 { 0xeb0d, KEY_REFRESH },
741 { 0xeb0f, KEY_EPG },
742 { 0xeb10, KEY_UP },
743 { 0xeb11, KEY_LEFT },
744 { 0xeb12, KEY_OK },
745 { 0xeb13, KEY_RIGHT },
746 { 0xeb14, KEY_DOWN },
747 { 0xeb16, KEY_INFO },
748 { 0xeb17, KEY_RED },
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 },
763 { 0xeb46, KEY_TV },
764 { 0xeb47, KEY_DVD },
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) */
778 { 0x1e00, KEY_0 },
779 { 0x1e01, KEY_1 },
780 { 0x1e02, KEY_2 },
781 { 0x1e03, KEY_3 },
782 { 0x1e04, KEY_4 },
783 { 0x1e05, KEY_5 },
784 { 0x1e06, KEY_6 },
785 { 0x1e07, KEY_7 },
786 { 0x1e08, KEY_8 },
787 { 0x1e09, KEY_9 },
788 { 0x1e0a, KEY_KPASTERISK },
789 { 0x1e0b, KEY_RED },
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 },
797 { 0x1e14, KEY_UP },
798 { 0x1e15, KEY_DOWN },
799 { 0x1e16, KEY_LEFT },
800 { 0x1e17, KEY_RIGHT },
801 { 0x1e18, KEY_VIDEO },
802 { 0x1e19, KEY_AUDIO },
803 { 0x1e1a, KEY_MEDIA },
804 { 0x1e1b, KEY_EPG },
805 { 0x1e1c, KEY_TV },
806 { 0x1e1e, KEY_NEXT },
807 { 0x1e1f, KEY_BACK },
808 { 0x1e20, KEY_CHANNELUP },
809 { 0x1e21, KEY_CHANNELDOWN },
810 { 0x1e24, KEY_LAST }, /* Skip backwards */
811 { 0x1e25, KEY_OK },
812 { 0x1e29, KEY_BLUE},
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 */
830 { 0x0743, KEY_0 },
831 { 0x0c41, KEY_1 },
832 { 0x0443, KEY_2 },
833 { 0x0b7f, KEY_3 },
834 { 0x0e41, KEY_4 },
835 { 0x0643, KEY_5 },
836 { 0x097f, KEY_6 },
837 { 0x0d7e, KEY_7 },
838 { 0x057c, KEY_8 },
839 { 0x0a40, KEY_9 },
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. */
854 { 0x1d00, KEY_0 },
855 { 0x1d01, KEY_1 },
856 { 0x1d02, KEY_2 },
857 { 0x1d03, KEY_3 },
858 { 0x1d04, KEY_4 },
859 { 0x1d05, KEY_5 },
860 { 0x1d06, KEY_6 },
861 { 0x1d07, KEY_7 },
862 { 0x1d08, KEY_8 },
863 { 0x1d09, KEY_9 },
864 { 0x1d0a, KEY_TEXT },
865 { 0x1d0d, KEY_MENU },
866 { 0x1d0f, KEY_MUTE },
867 { 0x1d10, KEY_VOLUMEUP },
868 { 0x1d11, KEY_VOLUMEDOWN },
869 { 0x1d12, KEY_CHANNEL },
870 { 0x1d14, KEY_UP },
871 { 0x1d15, KEY_DOWN },
872 { 0x1d16, KEY_LEFT },
873 { 0x1d17, KEY_RIGHT },
874 { 0x1d1c, KEY_TV },
875 { 0x1d1e, KEY_NEXT },
876 { 0x1d1f, KEY_BACK },
877 { 0x1d20, KEY_CHANNELUP },
878 { 0x1d21, KEY_CHANNELDOWN },
879 { 0x1d24, KEY_LAST },
880 { 0x1d25, KEY_OK },
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 },
893 { 0x8601, KEY_1 },
894 { 0x8602, KEY_2 },
895 { 0x8603, KEY_3 },
896 { 0x8604, KEY_4 },
897 { 0x8605, KEY_5 },
898 { 0x8606, KEY_6 },
899 { 0x8607, KEY_7 },
900 { 0x8608, KEY_8 },
901 { 0x8609, KEY_9 },
902 { 0x8600, KEY_0 },
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 },
913 { 0x861d, KEY_UP },
914 { 0x861e, KEY_DOWN },
915 { 0x860e, KEY_LEFT },
916 { 0x860f, KEY_RIGHT },
918 { 0x8618, KEY_RECORD },
919 { 0x861a, KEY_STOP },
922 /* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */
923 static struct dibx000_agc_config stk7700p_7000m_mt2060_agc_config = {
924 BAND_UHF | BAND_VHF, // band_caps
926 /* 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,
927 * 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 */
928 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup
930 712, // inv_gain
931 41, // time_stabiliz
933 0, // alpha_level
934 118, // thlock
936 0, // wbd_inv
937 4095, // wbd_ref
938 0, // wbd_sel
939 0, // wbd_alpha
941 42598, // agc1_max
942 17694, // agc1_min
943 45875, // agc2_max
944 2621, // agc2_min
945 0, // agc1_pt1
946 76, // agc1_pt2
947 139, // agc1_pt3
948 52, // agc1_slope1
949 59, // agc1_slope2
950 107, // agc2_pt1
951 172, // agc2_pt2
952 57, // agc2_slope1
953 70, // agc2_slope2
955 21, // alpha_mant
956 25, // alpha_exp
957 28, // beta_mant
958 48, // beta_exp
960 1, // perform_agc_softsplit
961 { 0, // split_min
962 107, // split_max
963 51800, // global_split_min
964 24700 // global_split_max
968 static struct dibx000_agc_config stk7700p_7000p_mt2060_agc_config = {
969 BAND_UHF | BAND_VHF,
971 /* 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,
972 * 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 */
973 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup
975 712, // inv_gain
976 41, // time_stabiliz
978 0, // alpha_level
979 118, // thlock
981 0, // wbd_inv
982 4095, // wbd_ref
983 0, // wbd_sel
984 0, // wbd_alpha
986 42598, // agc1_max
987 16384, // agc1_min
988 42598, // agc2_max
989 0, // agc2_min
991 0, // agc1_pt1
992 137, // agc1_pt2
993 255, // agc1_pt3
995 0, // agc1_slope1
996 255, // agc1_slope2
998 0, // agc2_pt1
999 0, // agc2_pt2
1001 0, // agc2_slope1
1002 41, // agc2_slope2
1004 15, // alpha_mant
1005 25, // alpha_exp
1007 28, // beta_mant
1008 48, // beta_exp
1010 0, // perform_agc_softsplit
1013 static struct dibx000_bandwidth_config stk7700p_pll_config = {
1014 60000, 30000, // internal, sampling
1015 1, 8, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
1016 0, 0, 1, 1, 0, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
1017 (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
1018 60258167, // ifreq
1019 20452225, // timf
1020 30000000, // xtal
1023 static struct dib7000m_config stk7700p_dib7000m_config = {
1024 .dvbt_mode = 1,
1025 .output_mpeg2_in_188_bytes = 1,
1026 .quartz_direct = 1,
1028 .agc_config_count = 1,
1029 .agc = &stk7700p_7000m_mt2060_agc_config,
1030 .bw = &stk7700p_pll_config,
1032 .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
1033 .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
1034 .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
1037 static struct dib7000p_config stk7700p_dib7000p_config = {
1038 .output_mpeg2_in_188_bytes = 1,
1040 .agc_config_count = 1,
1041 .agc = &stk7700p_7000p_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 int stk7700p_frontend_attach(struct dvb_usb_adapter *adap)
1051 struct dib0700_state *st = adap->dev->priv;
1052 /* unless there is no real power management in DVB - we leave the device on GPIO6 */
1054 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1055 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(50);
1057 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(10);
1058 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1060 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
1061 dib0700_ctrl_clock(adap->dev, 72, 1);
1062 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(100);
1064 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1066 st->mt2060_if1[0] = 1220;
1068 if (dib7000pc_detection(&adap->dev->i2c_adap)) {
1069 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000p_config);
1070 st->is_dib7000pc = 1;
1071 } else
1072 adap->fe = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config);
1074 return adap->fe == NULL ? -ENODEV : 0;
1077 static struct mt2060_config stk7700p_mt2060_config = {
1078 0x60
1081 static int stk7700p_tuner_attach(struct dvb_usb_adapter *adap)
1083 struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
1084 struct dib0700_state *st = adap->dev->priv;
1085 struct i2c_adapter *tun_i2c;
1086 s8 a;
1087 int if1=1220;
1088 if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) &&
1089 adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_STICK)) {
1090 if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a;
1092 if (st->is_dib7000pc)
1093 tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1094 else
1095 tun_i2c = dib7000m_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1097 return dvb_attach(mt2060_attach, adap->fe, tun_i2c, &stk7700p_mt2060_config,
1098 if1) == NULL ? -ENODEV : 0;
1101 /* DIB7070 generic */
1102 static struct dibx000_agc_config dib7070_agc_config = {
1103 BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
1104 /* 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,
1105 * 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 */
1106 (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup
1108 600, // inv_gain
1109 10, // time_stabiliz
1111 0, // alpha_level
1112 118, // thlock
1114 0, // wbd_inv
1115 3530, // wbd_ref
1116 1, // wbd_sel
1117 5, // wbd_alpha
1119 65535, // agc1_max
1120 0, // agc1_min
1122 65535, // agc2_max
1123 0, // agc2_min
1125 0, // agc1_pt1
1126 40, // agc1_pt2
1127 183, // agc1_pt3
1128 206, // agc1_slope1
1129 255, // agc1_slope2
1130 72, // agc2_pt1
1131 152, // agc2_pt2
1132 88, // agc2_slope1
1133 90, // agc2_slope2
1135 17, // alpha_mant
1136 27, // alpha_exp
1137 23, // beta_mant
1138 51, // beta_exp
1140 0, // perform_agc_softsplit
1143 static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff)
1145 deb_info("reset: %d", onoff);
1146 return dib7000p_set_gpio(fe, 8, 0, !onoff);
1149 static int dib7070_tuner_sleep(struct dvb_frontend *fe, int onoff)
1151 deb_info("sleep: %d", onoff);
1152 return dib7000p_set_gpio(fe, 9, 0, onoff);
1155 static struct dib0070_config dib7070p_dib0070_config[2] = {
1157 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1158 .reset = dib7070_tuner_reset,
1159 .sleep = dib7070_tuner_sleep,
1160 .clock_khz = 12000,
1161 .clock_pad_drive = 4,
1162 .charge_pump = 2,
1163 }, {
1164 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1165 .reset = dib7070_tuner_reset,
1166 .sleep = dib7070_tuner_sleep,
1167 .clock_khz = 12000,
1168 .charge_pump = 2,
1172 static struct dib0070_config dib7770p_dib0070_config = {
1173 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1174 .reset = dib7070_tuner_reset,
1175 .sleep = dib7070_tuner_sleep,
1176 .clock_khz = 12000,
1177 .clock_pad_drive = 0,
1178 .flip_chip = 1,
1181 static int dib7070_set_param_override(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
1183 struct dvb_usb_adapter *adap = fe->dvb->priv;
1184 struct dib0700_adapter_state *state = adap->priv;
1186 u16 offset;
1187 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1188 switch (band) {
1189 case BAND_VHF: offset = 950; break;
1190 case BAND_UHF:
1191 default: offset = 550; break;
1193 deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
1194 dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
1195 return state->set_param_save(fe, fep);
1198 static int dib7770_set_param_override(struct dvb_frontend *fe,
1199 struct dvb_frontend_parameters *fep)
1201 struct dvb_usb_adapter *adap = fe->dvb->priv;
1202 struct dib0700_adapter_state *state = adap->priv;
1204 u16 offset;
1205 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1206 switch (band) {
1207 case BAND_VHF:
1208 dib7000p_set_gpio(fe, 0, 0, 1);
1209 offset = 850;
1210 break;
1211 case BAND_UHF:
1212 default:
1213 dib7000p_set_gpio(fe, 0, 0, 0);
1214 offset = 250;
1215 break;
1217 deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
1218 dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
1219 return state->set_param_save(fe, fep);
1222 static int dib7770p_tuner_attach(struct dvb_usb_adapter *adap)
1224 struct dib0700_adapter_state *st = adap->priv;
1225 struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe,
1226 DIBX000_I2C_INTERFACE_TUNER, 1);
1228 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
1229 &dib7770p_dib0070_config) == NULL)
1230 return -ENODEV;
1232 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1233 adap->fe->ops.tuner_ops.set_params = dib7770_set_param_override;
1234 return 0;
1237 static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap)
1239 struct dib0700_adapter_state *st = adap->priv;
1240 struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
1242 if (adap->id == 0) {
1243 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c, &dib7070p_dib0070_config[0]) == NULL)
1244 return -ENODEV;
1245 } else {
1246 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c, &dib7070p_dib0070_config[1]) == NULL)
1247 return -ENODEV;
1250 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1251 adap->fe->ops.tuner_ops.set_params = dib7070_set_param_override;
1252 return 0;
1255 static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
1257 return dib7000p_pid_filter(adapter->fe, index, pid, onoff);
1260 static int stk70x0p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
1262 return dib7000p_pid_filter_ctrl(adapter->fe, onoff);
1265 static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
1266 60000, 15000, // internal, sampling
1267 1, 20, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
1268 0, 0, 1, 1, 2, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
1269 (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
1270 (0 << 25) | 0, // ifreq = 0.000000 MHz
1271 20452225, // timf
1272 12000000, // xtal_hz
1275 static struct dib7000p_config dib7070p_dib7000p_config = {
1276 .output_mpeg2_in_188_bytes = 1,
1278 .agc_config_count = 1,
1279 .agc = &dib7070_agc_config,
1280 .bw = &dib7070_bw_config_12_mhz,
1281 .tuner_is_baseband = 1,
1282 .spur_protect = 1,
1284 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1285 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1286 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1288 .hostbus_diversity = 1,
1291 /* STK7070P */
1292 static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
1294 struct usb_device_descriptor *p = &adap->dev->udev->descriptor;
1295 if (p->idVendor == cpu_to_le16(USB_VID_PINNACLE) &&
1296 p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E))
1297 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1298 else
1299 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1300 msleep(10);
1301 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1302 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1303 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1304 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1306 dib0700_ctrl_clock(adap->dev, 72, 1);
1308 msleep(10);
1309 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1310 msleep(10);
1311 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1313 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1314 &dib7070p_dib7000p_config) != 0) {
1315 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
1316 __func__);
1317 return -ENODEV;
1320 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
1321 &dib7070p_dib7000p_config);
1322 return adap->fe == NULL ? -ENODEV : 0;
1325 /* DIB807x generic */
1326 static struct dibx000_agc_config dib807x_agc_config[2] = {
1328 BAND_VHF,
1329 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1330 * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1331 * P_agc_inv_pwm2=0,P_agc_inh_dc_rv_est=0,
1332 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1333 * P_agc_write=0 */
1334 (0 << 15) | (0 << 14) | (7 << 11) | (0 << 10) | (0 << 9) |
1335 (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
1336 (0 << 0), /* setup*/
1338 600, /* inv_gain*/
1339 10, /* time_stabiliz*/
1341 0, /* alpha_level*/
1342 118, /* thlock*/
1344 0, /* wbd_inv*/
1345 3530, /* wbd_ref*/
1346 1, /* wbd_sel*/
1347 5, /* wbd_alpha*/
1349 65535, /* agc1_max*/
1350 0, /* agc1_min*/
1352 65535, /* agc2_max*/
1353 0, /* agc2_min*/
1355 0, /* agc1_pt1*/
1356 40, /* agc1_pt2*/
1357 183, /* agc1_pt3*/
1358 206, /* agc1_slope1*/
1359 255, /* agc1_slope2*/
1360 72, /* agc2_pt1*/
1361 152, /* agc2_pt2*/
1362 88, /* agc2_slope1*/
1363 90, /* agc2_slope2*/
1365 17, /* alpha_mant*/
1366 27, /* alpha_exp*/
1367 23, /* beta_mant*/
1368 51, /* beta_exp*/
1370 0, /* perform_agc_softsplit*/
1371 }, {
1372 BAND_UHF,
1373 /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0,
1374 * P_agc_freq_pwm_div=1, P_agc_inv_pwm1=0,
1375 * P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1376 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5,
1377 * P_agc_write=0 */
1378 (0 << 15) | (0 << 14) | (1 << 11) | (0 << 10) | (0 << 9) |
1379 (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) |
1380 (0 << 0), /* setup */
1382 600, /* inv_gain*/
1383 10, /* time_stabiliz*/
1385 0, /* alpha_level*/
1386 118, /* thlock*/
1388 0, /* wbd_inv*/
1389 3530, /* wbd_ref*/
1390 1, /* wbd_sel*/
1391 5, /* wbd_alpha*/
1393 65535, /* agc1_max*/
1394 0, /* agc1_min*/
1396 65535, /* agc2_max*/
1397 0, /* agc2_min*/
1399 0, /* agc1_pt1*/
1400 40, /* agc1_pt2*/
1401 183, /* agc1_pt3*/
1402 206, /* agc1_slope1*/
1403 255, /* agc1_slope2*/
1404 72, /* agc2_pt1*/
1405 152, /* agc2_pt2*/
1406 88, /* agc2_slope1*/
1407 90, /* agc2_slope2*/
1409 17, /* alpha_mant*/
1410 27, /* alpha_exp*/
1411 23, /* beta_mant*/
1412 51, /* beta_exp*/
1414 0, /* perform_agc_softsplit*/
1418 static struct dibx000_bandwidth_config dib807x_bw_config_12_mhz = {
1419 60000, 15000, /* internal, sampling*/
1420 1, 20, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass*/
1421 0, 0, 1, 1, 2, /* misc: refdiv, bypclk_div, IO_CLK_en_core,
1422 ADClkSrc, modulo */
1423 (3 << 14) | (1 << 12) | (599 << 0), /* sad_cfg: refsel, sel, freq_15k*/
1424 (0 << 25) | 0, /* ifreq = 0.000000 MHz*/
1425 18179755, /* timf*/
1426 12000000, /* xtal_hz*/
1429 static struct dib8000_config dib807x_dib8000_config[2] = {
1431 .output_mpeg2_in_188_bytes = 1,
1433 .agc_config_count = 2,
1434 .agc = dib807x_agc_config,
1435 .pll = &dib807x_bw_config_12_mhz,
1436 .tuner_is_baseband = 1,
1438 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1439 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1440 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1442 .hostbus_diversity = 1,
1443 .div_cfg = 1,
1444 .agc_control = &dib0070_ctrl_agc_filter,
1445 .output_mode = OUTMODE_MPEG2_FIFO,
1446 .drives = 0x2d98,
1447 }, {
1448 .output_mpeg2_in_188_bytes = 1,
1450 .agc_config_count = 2,
1451 .agc = dib807x_agc_config,
1452 .pll = &dib807x_bw_config_12_mhz,
1453 .tuner_is_baseband = 1,
1455 .gpio_dir = DIB8000_GPIO_DEFAULT_DIRECTIONS,
1456 .gpio_val = DIB8000_GPIO_DEFAULT_VALUES,
1457 .gpio_pwm_pos = DIB8000_GPIO_DEFAULT_PWM_POS,
1459 .hostbus_diversity = 1,
1460 .agc_control = &dib0070_ctrl_agc_filter,
1461 .output_mode = OUTMODE_MPEG2_FIFO,
1462 .drives = 0x2d98,
1466 static int dib807x_tuner_reset(struct dvb_frontend *fe, int onoff)
1468 return dib8000_set_gpio(fe, 5, 0, !onoff);
1471 static int dib807x_tuner_sleep(struct dvb_frontend *fe, int onoff)
1473 return dib8000_set_gpio(fe, 0, 0, onoff);
1476 static const struct dib0070_wbd_gain_cfg dib8070_wbd_gain_cfg[] = {
1477 { 240, 7},
1478 { 0xffff, 6},
1481 static struct dib0070_config dib807x_dib0070_config[2] = {
1483 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1484 .reset = dib807x_tuner_reset,
1485 .sleep = dib807x_tuner_sleep,
1486 .clock_khz = 12000,
1487 .clock_pad_drive = 4,
1488 .vga_filter = 1,
1489 .force_crystal_mode = 1,
1490 .enable_third_order_filter = 1,
1491 .charge_pump = 0,
1492 .wbd_gain = dib8070_wbd_gain_cfg,
1493 .osc_buffer_state = 0,
1494 .freq_offset_khz_uhf = -100,
1495 .freq_offset_khz_vhf = -100,
1496 }, {
1497 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1498 .reset = dib807x_tuner_reset,
1499 .sleep = dib807x_tuner_sleep,
1500 .clock_khz = 12000,
1501 .clock_pad_drive = 2,
1502 .vga_filter = 1,
1503 .force_crystal_mode = 1,
1504 .enable_third_order_filter = 1,
1505 .charge_pump = 0,
1506 .wbd_gain = dib8070_wbd_gain_cfg,
1507 .osc_buffer_state = 0,
1508 .freq_offset_khz_uhf = -25,
1509 .freq_offset_khz_vhf = -25,
1513 static int dib807x_set_param_override(struct dvb_frontend *fe,
1514 struct dvb_frontend_parameters *fep)
1516 struct dvb_usb_adapter *adap = fe->dvb->priv;
1517 struct dib0700_adapter_state *state = adap->priv;
1519 u16 offset = dib0070_wbd_offset(fe);
1520 u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
1521 switch (band) {
1522 case BAND_VHF:
1523 offset += 750;
1524 break;
1525 case BAND_UHF: /* fall-thru wanted */
1526 default:
1527 offset += 250; break;
1529 deb_info("WBD for DiB8000: %d\n", offset);
1530 dib8000_set_wbd_ref(fe, offset);
1532 return state->set_param_save(fe, fep);
1535 static int dib807x_tuner_attach(struct dvb_usb_adapter *adap)
1537 struct dib0700_adapter_state *st = adap->priv;
1538 struct i2c_adapter *tun_i2c = dib8000_get_i2c_master(adap->fe,
1539 DIBX000_I2C_INTERFACE_TUNER, 1);
1541 if (adap->id == 0) {
1542 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
1543 &dib807x_dib0070_config[0]) == NULL)
1544 return -ENODEV;
1545 } else {
1546 if (dvb_attach(dib0070_attach, adap->fe, tun_i2c,
1547 &dib807x_dib0070_config[1]) == NULL)
1548 return -ENODEV;
1551 st->set_param_save = adap->fe->ops.tuner_ops.set_params;
1552 adap->fe->ops.tuner_ops.set_params = dib807x_set_param_override;
1553 return 0;
1556 static int stk807x_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
1558 return dib8000_pid_filter(adapter->fe, index, pid, onoff);
1561 static int stk807x_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
1563 return dib8000_pid_filter_ctrl(adapter->fe, onoff);
1566 /* STK807x */
1567 static int stk807x_frontend_attach(struct dvb_usb_adapter *adap)
1569 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1570 msleep(10);
1571 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1572 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1573 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1575 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1577 dib0700_ctrl_clock(adap->dev, 72, 1);
1579 msleep(10);
1580 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1581 msleep(10);
1582 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1584 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1585 0x80);
1587 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
1588 &dib807x_dib8000_config[0]);
1590 return adap->fe == NULL ? -ENODEV : 0;
1593 /* STK807xPVR */
1594 static int stk807xpvr_frontend_attach0(struct dvb_usb_adapter *adap)
1596 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1597 msleep(30);
1598 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1599 msleep(500);
1600 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1601 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1602 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1604 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1606 dib0700_ctrl_clock(adap->dev, 72, 1);
1608 msleep(10);
1609 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1610 msleep(10);
1611 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1613 /* initialize IC 0 */
1614 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x12, 0x80);
1616 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x80,
1617 &dib807x_dib8000_config[0]);
1619 return adap->fe == NULL ? -ENODEV : 0;
1622 static int stk807xpvr_frontend_attach1(struct dvb_usb_adapter *adap)
1624 /* initialize IC 1 */
1625 dib8000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x22, 0x82);
1627 adap->fe = dvb_attach(dib8000_attach, &adap->dev->i2c_adap, 0x82,
1628 &dib807x_dib8000_config[1]);
1630 return adap->fe == NULL ? -ENODEV : 0;
1634 /* STK7070PD */
1635 static struct dib7000p_config stk7070pd_dib7000p_config[2] = {
1637 .output_mpeg2_in_188_bytes = 1,
1639 .agc_config_count = 1,
1640 .agc = &dib7070_agc_config,
1641 .bw = &dib7070_bw_config_12_mhz,
1642 .tuner_is_baseband = 1,
1643 .spur_protect = 1,
1645 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1646 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1647 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1649 .hostbus_diversity = 1,
1650 }, {
1651 .output_mpeg2_in_188_bytes = 1,
1653 .agc_config_count = 1,
1654 .agc = &dib7070_agc_config,
1655 .bw = &dib7070_bw_config_12_mhz,
1656 .tuner_is_baseband = 1,
1657 .spur_protect = 1,
1659 .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1660 .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1661 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1663 .hostbus_diversity = 1,
1667 static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap)
1669 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1670 msleep(10);
1671 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1672 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1673 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1674 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1676 dib0700_ctrl_clock(adap->dev, 72, 1);
1678 msleep(10);
1679 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1680 msleep(10);
1681 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1683 if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
1684 stk7070pd_dib7000p_config) != 0) {
1685 err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
1686 __func__);
1687 return -ENODEV;
1690 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]);
1691 return adap->fe == NULL ? -ENODEV : 0;
1694 static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap)
1696 adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]);
1697 return adap->fe == NULL ? -ENODEV : 0;
1700 /* S5H1411 */
1701 static struct s5h1411_config pinnacle_801e_config = {
1702 .output_mode = S5H1411_PARALLEL_OUTPUT,
1703 .gpio = S5H1411_GPIO_OFF,
1704 .mpeg_timing = S5H1411_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK,
1705 .qam_if = S5H1411_IF_44000,
1706 .vsb_if = S5H1411_IF_44000,
1707 .inversion = S5H1411_INVERSION_OFF,
1708 .status_mode = S5H1411_DEMODLOCKING
1711 /* Pinnacle PCTV HD Pro 801e GPIOs map:
1712 GPIO0 - currently unknown
1713 GPIO1 - xc5000 tuner reset
1714 GPIO2 - CX25843 sleep
1715 GPIO3 - currently unknown
1716 GPIO4 - currently unknown
1717 GPIO6 - currently unknown
1718 GPIO7 - currently unknown
1719 GPIO9 - currently unknown
1720 GPIO10 - CX25843 reset
1722 static int s5h1411_frontend_attach(struct dvb_usb_adapter *adap)
1724 struct dib0700_state *st = adap->dev->priv;
1726 /* Make use of the new i2c functions from FW 1.20 */
1727 st->fw_use_new_i2c_api = 1;
1729 /* The s5h1411 requires the dib0700 to not be in master mode */
1730 st->disable_streaming_master_mode = 1;
1732 /* All msleep values taken from Windows USB trace */
1733 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
1734 dib0700_set_gpio(adap->dev, GPIO3, GPIO_OUT, 0);
1735 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1736 msleep(400);
1737 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1738 msleep(60);
1739 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1740 msleep(30);
1741 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1742 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1743 dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1744 dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1745 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 0);
1746 msleep(30);
1748 /* Put the CX25843 to sleep for now since we're in digital mode */
1749 dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
1751 /* GPIOs are initialized, do the attach */
1752 adap->fe = dvb_attach(s5h1411_attach, &pinnacle_801e_config,
1753 &adap->dev->i2c_adap);
1754 return adap->fe == NULL ? -ENODEV : 0;
1757 static int dib0700_xc5000_tuner_callback(void *priv, int component,
1758 int command, int arg)
1760 struct dvb_usb_adapter *adap = priv;
1762 if (command == XC5000_TUNER_RESET) {
1763 /* Reset the tuner */
1764 dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0);
1765 msleep(10);
1766 dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1);
1767 msleep(10);
1768 } else {
1769 err("xc5000: unknown tuner callback command: %d\n", command);
1770 return -EINVAL;
1773 return 0;
1776 static struct xc5000_config s5h1411_xc5000_tunerconfig = {
1777 .i2c_address = 0x64,
1778 .if_khz = 5380,
1781 static int xc5000_tuner_attach(struct dvb_usb_adapter *adap)
1783 /* FIXME: generalize & move to common area */
1784 adap->fe->callback = dib0700_xc5000_tuner_callback;
1786 return dvb_attach(xc5000_attach, adap->fe, &adap->dev->i2c_adap,
1787 &s5h1411_xc5000_tunerconfig)
1788 == NULL ? -ENODEV : 0;
1791 static struct lgdt3305_config hcw_lgdt3305_config = {
1792 .i2c_addr = 0x0e,
1793 .mpeg_mode = LGDT3305_MPEG_PARALLEL,
1794 .tpclk_edge = LGDT3305_TPCLK_FALLING_EDGE,
1795 .tpvalid_polarity = LGDT3305_TP_VALID_LOW,
1796 .deny_i2c_rptr = 0,
1797 .spectral_inversion = 1,
1798 .qam_if_khz = 6000,
1799 .vsb_if_khz = 6000,
1800 .usref_8vsb = 0x0500,
1803 static struct mxl5007t_config hcw_mxl5007t_config = {
1804 .xtal_freq_hz = MxL_XTAL_25_MHZ,
1805 .if_freq_hz = MxL_IF_6_MHZ,
1806 .invert_if = 1,
1809 /* TIGER-ATSC map:
1810 GPIO0 - LNA_CTR (H: LNA power enabled, L: LNA power disabled)
1811 GPIO1 - ANT_SEL (H: VPA, L: MCX)
1812 GPIO4 - SCL2
1813 GPIO6 - EN_TUNER
1814 GPIO7 - SDA2
1815 GPIO10 - DEM_RST
1817 MXL is behind LG's i2c repeater. LG is on SCL2/SDA2 gpios on the DIB
1819 static int lgdt3305_frontend_attach(struct dvb_usb_adapter *adap)
1821 struct dib0700_state *st = adap->dev->priv;
1823 /* Make use of the new i2c functions from FW 1.20 */
1824 st->fw_use_new_i2c_api = 1;
1826 st->disable_streaming_master_mode = 1;
1828 /* fe power enable */
1829 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1830 msleep(30);
1831 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1832 msleep(30);
1834 /* demod reset */
1835 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1836 msleep(30);
1837 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1838 msleep(30);
1839 dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1840 msleep(30);
1842 adap->fe = dvb_attach(lgdt3305_attach,
1843 &hcw_lgdt3305_config,
1844 &adap->dev->i2c_adap);
1846 return adap->fe == NULL ? -ENODEV : 0;
1849 static int mxl5007t_tuner_attach(struct dvb_usb_adapter *adap)
1851 return dvb_attach(mxl5007t_attach, adap->fe,
1852 &adap->dev->i2c_adap, 0x60,
1853 &hcw_mxl5007t_config) == NULL ? -ENODEV : 0;
1857 /* DVB-USB and USB stuff follows */
1858 struct usb_device_id dib0700_usb_id_table[] = {
1859 /* 0 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P) },
1860 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P_PC) },
1861 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) },
1862 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) },
1863 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) },
1864 /* 5 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) },
1865 { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500) },
1866 { USB_DEVICE(USB_VID_UNIWILL, USB_PID_UNIWILL_STK7700P) },
1867 { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P) },
1868 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) },
1869 /* 10 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_2) },
1870 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV2000E) },
1871 { USB_DEVICE(USB_VID_TERRATEC,
1872 USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) },
1873 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) },
1874 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700D) },
1875 /* 15 */{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070P) },
1876 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV_DVB_T_FLASH) },
1877 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070PD) },
1878 { USB_DEVICE(USB_VID_PINNACLE,
1879 USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) },
1880 { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500_PC) },
1881 /* 20 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_EXPRESS) },
1882 { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U7000) },
1883 { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) },
1884 { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000) },
1885 { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3100) },
1886 /* 25 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) },
1887 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) },
1888 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_USB_XE) },
1889 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_EXPRESSCARD_320CX) },
1890 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV72E) },
1891 /* 30 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73E) },
1892 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_EC372S) },
1893 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_EXPRESS) },
1894 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS) },
1895 { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P_2) },
1896 /* 35 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK_52009) },
1897 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_3) },
1898 { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U8000) },
1899 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700PH) },
1900 { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000H) },
1901 /* 40 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E) },
1902 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E_SE) },
1903 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_EXPRESS) },
1904 { USB_DEVICE(USB_VID_TERRATEC,
1905 USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2) },
1906 { USB_DEVICE(USB_VID_SONY, USB_PID_SONY_PLAYTV) },
1907 /* 45 */{ USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_PD378S) },
1908 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC) },
1909 { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC_B210) },
1910 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_MC770) },
1911 { USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT) },
1912 /* 50 */{ USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT_Dlx) },
1913 { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_H) },
1914 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T3) },
1915 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T5) },
1916 { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D) },
1917 /* 55 */{ USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700D_2) },
1918 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73A) },
1919 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73ESE) },
1920 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV282E) },
1921 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7770P) },
1922 /* 60 */{ USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS_2) },
1923 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XPVR) },
1924 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XP) },
1925 { USB_DEVICE(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD) },
1926 { 0 } /* Terminating entry */
1928 MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
1930 #define DIB0700_DEFAULT_DEVICE_PROPERTIES \
1931 .caps = DVB_USB_IS_AN_I2C_ADAPTER, \
1932 .usb_ctrl = DEVICE_SPECIFIC, \
1933 .firmware = "dvb-usb-dib0700-1.20.fw", \
1934 .download_firmware = dib0700_download_firmware, \
1935 .no_reconnect = 1, \
1936 .size_of_priv = sizeof(struct dib0700_state), \
1937 .i2c_algo = &dib0700_i2c_algo, \
1938 .identify_state = dib0700_identify_state
1940 #define DIB0700_DEFAULT_STREAMING_CONFIG(ep) \
1941 .streaming_ctrl = dib0700_streaming_ctrl, \
1942 .stream = { \
1943 .type = USB_BULK, \
1944 .count = 4, \
1945 .endpoint = ep, \
1946 .u = { \
1947 .bulk = { \
1948 .buffersize = 39480, \
1953 struct dvb_usb_device_properties dib0700_devices[] = {
1955 DIB0700_DEFAULT_DEVICE_PROPERTIES,
1957 .num_adapters = 1,
1958 .adapter = {
1960 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1961 .pid_filter_count = 32,
1962 .pid_filter = stk70x0p_pid_filter,
1963 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
1964 .frontend_attach = stk7700p_frontend_attach,
1965 .tuner_attach = stk7700p_tuner_attach,
1967 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
1971 .num_device_descs = 8,
1972 .devices = {
1973 { "DiBcom STK7700P reference design",
1974 { &dib0700_usb_id_table[0], &dib0700_usb_id_table[1] },
1975 { NULL },
1977 { "Hauppauge Nova-T Stick",
1978 { &dib0700_usb_id_table[4], &dib0700_usb_id_table[9], NULL },
1979 { NULL },
1981 { "AVerMedia AVerTV DVB-T Volar",
1982 { &dib0700_usb_id_table[5], &dib0700_usb_id_table[10] },
1983 { NULL },
1985 { "Compro Videomate U500",
1986 { &dib0700_usb_id_table[6], &dib0700_usb_id_table[19] },
1987 { NULL },
1989 { "Uniwill STK7700P based (Hama and others)",
1990 { &dib0700_usb_id_table[7], NULL },
1991 { NULL },
1993 { "Leadtek Winfast DTV Dongle (STK7700P based)",
1994 { &dib0700_usb_id_table[8], &dib0700_usb_id_table[34] },
1995 { NULL },
1997 { "AVerMedia AVerTV DVB-T Express",
1998 { &dib0700_usb_id_table[20] },
1999 { NULL },
2001 { "Gigabyte U7000",
2002 { &dib0700_usb_id_table[21], NULL },
2003 { NULL },
2007 .rc_interval = DEFAULT_RC_INTERVAL,
2008 .rc_key_map = dib0700_rc_keys,
2009 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2010 .rc_query = dib0700_rc_query
2011 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2013 .num_adapters = 2,
2014 .adapter = {
2016 .frontend_attach = bristol_frontend_attach,
2017 .tuner_attach = bristol_tuner_attach,
2019 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2020 }, {
2021 .frontend_attach = bristol_frontend_attach,
2022 .tuner_attach = bristol_tuner_attach,
2024 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2028 .num_device_descs = 1,
2029 .devices = {
2030 { "Hauppauge Nova-T 500 Dual DVB-T",
2031 { &dib0700_usb_id_table[2], &dib0700_usb_id_table[3], NULL },
2032 { NULL },
2036 .rc_interval = DEFAULT_RC_INTERVAL,
2037 .rc_key_map = dib0700_rc_keys,
2038 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2039 .rc_query = dib0700_rc_query
2040 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2042 .num_adapters = 2,
2043 .adapter = {
2045 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2046 .pid_filter_count = 32,
2047 .pid_filter = stk70x0p_pid_filter,
2048 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2049 .frontend_attach = stk7700d_frontend_attach,
2050 .tuner_attach = stk7700d_tuner_attach,
2052 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2053 }, {
2054 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2055 .pid_filter_count = 32,
2056 .pid_filter = stk70x0p_pid_filter,
2057 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2058 .frontend_attach = stk7700d_frontend_attach,
2059 .tuner_attach = stk7700d_tuner_attach,
2061 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2065 .num_device_descs = 5,
2066 .devices = {
2067 { "Pinnacle PCTV 2000e",
2068 { &dib0700_usb_id_table[11], NULL },
2069 { NULL },
2071 { "Terratec Cinergy DT XS Diversity",
2072 { &dib0700_usb_id_table[12], NULL },
2073 { NULL },
2075 { "Hauppauge Nova-TD Stick/Elgato Eye-TV Diversity",
2076 { &dib0700_usb_id_table[13], NULL },
2077 { NULL },
2079 { "DiBcom STK7700D reference design",
2080 { &dib0700_usb_id_table[14], NULL },
2081 { NULL },
2083 { "YUAN High-Tech DiBcom STK7700D",
2084 { &dib0700_usb_id_table[55], NULL },
2085 { NULL },
2090 .rc_interval = DEFAULT_RC_INTERVAL,
2091 .rc_key_map = dib0700_rc_keys,
2092 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2093 .rc_query = dib0700_rc_query
2095 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2097 .num_adapters = 1,
2098 .adapter = {
2100 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2101 .pid_filter_count = 32,
2102 .pid_filter = stk70x0p_pid_filter,
2103 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2104 .frontend_attach = stk7700P2_frontend_attach,
2105 .tuner_attach = stk7700d_tuner_attach,
2107 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2111 .num_device_descs = 3,
2112 .devices = {
2113 { "ASUS My Cinema U3000 Mini DVBT Tuner",
2114 { &dib0700_usb_id_table[23], NULL },
2115 { NULL },
2117 { "Yuan EC372S",
2118 { &dib0700_usb_id_table[31], NULL },
2119 { NULL },
2121 { "Terratec Cinergy T Express",
2122 { &dib0700_usb_id_table[42], NULL },
2123 { NULL },
2127 .rc_interval = DEFAULT_RC_INTERVAL,
2128 .rc_key_map = dib0700_rc_keys,
2129 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2130 .rc_query = dib0700_rc_query
2131 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2133 .num_adapters = 1,
2134 .adapter = {
2136 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2137 .pid_filter_count = 32,
2138 .pid_filter = stk70x0p_pid_filter,
2139 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2140 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2141 .pid_filter_count = 32,
2142 .pid_filter = stk70x0p_pid_filter,
2143 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2144 .frontend_attach = stk7070p_frontend_attach,
2145 .tuner_attach = dib7070p_tuner_attach,
2147 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2149 .size_of_priv = sizeof(struct dib0700_adapter_state),
2153 .num_device_descs = 11,
2154 .devices = {
2155 { "DiBcom STK7070P reference design",
2156 { &dib0700_usb_id_table[15], NULL },
2157 { NULL },
2159 { "Pinnacle PCTV DVB-T Flash Stick",
2160 { &dib0700_usb_id_table[16], NULL },
2161 { NULL },
2163 { "Artec T14BR DVB-T",
2164 { &dib0700_usb_id_table[22], NULL },
2165 { NULL },
2167 { "ASUS My Cinema U3100 Mini DVBT Tuner",
2168 { &dib0700_usb_id_table[24], NULL },
2169 { NULL },
2171 { "Hauppauge Nova-T Stick",
2172 { &dib0700_usb_id_table[25], NULL },
2173 { NULL },
2175 { "Hauppauge Nova-T MyTV.t",
2176 { &dib0700_usb_id_table[26], NULL },
2177 { NULL },
2179 { "Pinnacle PCTV 72e",
2180 { &dib0700_usb_id_table[29], NULL },
2181 { NULL },
2183 { "Pinnacle PCTV 73e",
2184 { &dib0700_usb_id_table[30], NULL },
2185 { NULL },
2187 { "Elgato EyeTV DTT",
2188 { &dib0700_usb_id_table[49], NULL },
2189 { NULL },
2191 { "Yuan PD378S",
2192 { &dib0700_usb_id_table[45], NULL },
2193 { NULL },
2195 { "Elgato EyeTV Dtt Dlx PD378S",
2196 { &dib0700_usb_id_table[50], NULL },
2197 { NULL },
2201 .rc_interval = DEFAULT_RC_INTERVAL,
2202 .rc_key_map = dib0700_rc_keys,
2203 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2204 .rc_query = dib0700_rc_query
2206 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2208 .num_adapters = 1,
2209 .adapter = {
2211 .frontend_attach = stk7070p_frontend_attach,
2212 .tuner_attach = dib7070p_tuner_attach,
2214 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2216 .size_of_priv = sizeof(struct dib0700_adapter_state),
2220 .num_device_descs = 3,
2221 .devices = {
2222 { "Pinnacle PCTV 73A",
2223 { &dib0700_usb_id_table[56], NULL },
2224 { NULL },
2226 { "Pinnacle PCTV 73e SE",
2227 { &dib0700_usb_id_table[57], NULL },
2228 { NULL },
2230 { "Pinnacle PCTV 282e",
2231 { &dib0700_usb_id_table[58], NULL },
2232 { NULL },
2236 .rc_interval = DEFAULT_RC_INTERVAL,
2237 .rc_key_map = dib0700_rc_keys,
2238 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2239 .rc_query = dib0700_rc_query
2241 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2243 .num_adapters = 2,
2244 .adapter = {
2246 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2247 .pid_filter_count = 32,
2248 .pid_filter = stk70x0p_pid_filter,
2249 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2250 .frontend_attach = stk7070pd_frontend_attach0,
2251 .tuner_attach = dib7070p_tuner_attach,
2253 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2255 .size_of_priv = sizeof(struct dib0700_adapter_state),
2256 }, {
2257 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2258 .pid_filter_count = 32,
2259 .pid_filter = stk70x0p_pid_filter,
2260 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2261 .frontend_attach = stk7070pd_frontend_attach1,
2262 .tuner_attach = dib7070p_tuner_attach,
2264 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2266 .size_of_priv = sizeof(struct dib0700_adapter_state),
2270 .num_device_descs = 6,
2271 .devices = {
2272 { "DiBcom STK7070PD reference design",
2273 { &dib0700_usb_id_table[17], NULL },
2274 { NULL },
2276 { "Pinnacle PCTV Dual DVB-T Diversity Stick",
2277 { &dib0700_usb_id_table[18], NULL },
2278 { NULL },
2280 { "Hauppauge Nova-TD Stick (52009)",
2281 { &dib0700_usb_id_table[35], NULL },
2282 { NULL },
2284 { "Hauppauge Nova-TD-500 (84xxx)",
2285 { &dib0700_usb_id_table[36], NULL },
2286 { NULL },
2288 { "Terratec Cinergy DT USB XS Diversity/ T5",
2289 { &dib0700_usb_id_table[43],
2290 &dib0700_usb_id_table[53], NULL},
2291 { NULL },
2293 { "Sony PlayTV",
2294 { &dib0700_usb_id_table[44], NULL },
2295 { NULL },
2298 .rc_interval = DEFAULT_RC_INTERVAL,
2299 .rc_key_map = dib0700_rc_keys,
2300 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2301 .rc_query = dib0700_rc_query
2302 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2304 .num_adapters = 1,
2305 .adapter = {
2307 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2308 .pid_filter_count = 32,
2309 .pid_filter = stk70x0p_pid_filter,
2310 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2311 .frontend_attach = stk7700ph_frontend_attach,
2312 .tuner_attach = stk7700ph_tuner_attach,
2314 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2316 .size_of_priv = sizeof(struct
2317 dib0700_adapter_state),
2321 .num_device_descs = 9,
2322 .devices = {
2323 { "Terratec Cinergy HT USB XE",
2324 { &dib0700_usb_id_table[27], NULL },
2325 { NULL },
2327 { "Pinnacle Expresscard 320cx",
2328 { &dib0700_usb_id_table[28], NULL },
2329 { NULL },
2331 { "Terratec Cinergy HT Express",
2332 { &dib0700_usb_id_table[32], NULL },
2333 { NULL },
2335 { "Gigabyte U8000-RH",
2336 { &dib0700_usb_id_table[37], NULL },
2337 { NULL },
2339 { "YUAN High-Tech STK7700PH",
2340 { &dib0700_usb_id_table[38], NULL },
2341 { NULL },
2343 { "Asus My Cinema-U3000Hybrid",
2344 { &dib0700_usb_id_table[39], NULL },
2345 { NULL },
2347 { "YUAN High-Tech MC770",
2348 { &dib0700_usb_id_table[48], NULL },
2349 { NULL },
2351 { "Leadtek WinFast DTV Dongle H",
2352 { &dib0700_usb_id_table[51], NULL },
2353 { NULL },
2355 { "YUAN High-Tech STK7700D",
2356 { &dib0700_usb_id_table[54], NULL },
2357 { NULL },
2360 .rc_interval = DEFAULT_RC_INTERVAL,
2361 .rc_key_map = dib0700_rc_keys,
2362 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2363 .rc_query = dib0700_rc_query
2364 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2365 .num_adapters = 1,
2366 .adapter = {
2368 .frontend_attach = s5h1411_frontend_attach,
2369 .tuner_attach = xc5000_tuner_attach,
2371 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2373 .size_of_priv = sizeof(struct
2374 dib0700_adapter_state),
2378 .num_device_descs = 2,
2379 .devices = {
2380 { "Pinnacle PCTV HD Pro USB Stick",
2381 { &dib0700_usb_id_table[40], NULL },
2382 { NULL },
2384 { "Pinnacle PCTV HD USB Stick",
2385 { &dib0700_usb_id_table[41], NULL },
2386 { NULL },
2389 .rc_interval = DEFAULT_RC_INTERVAL,
2390 .rc_key_map = dib0700_rc_keys,
2391 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2392 .rc_query = dib0700_rc_query
2393 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2394 .num_adapters = 1,
2395 .adapter = {
2397 .frontend_attach = lgdt3305_frontend_attach,
2398 .tuner_attach = mxl5007t_tuner_attach,
2400 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2402 .size_of_priv = sizeof(struct
2403 dib0700_adapter_state),
2407 .num_device_descs = 2,
2408 .devices = {
2409 { "Hauppauge ATSC MiniCard (B200)",
2410 { &dib0700_usb_id_table[46], NULL },
2411 { NULL },
2413 { "Hauppauge ATSC MiniCard (B210)",
2414 { &dib0700_usb_id_table[47], NULL },
2415 { NULL },
2418 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2420 .num_adapters = 1,
2421 .adapter = {
2423 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2424 .pid_filter_count = 32,
2425 .pid_filter = stk70x0p_pid_filter,
2426 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
2427 .frontend_attach = stk7070p_frontend_attach,
2428 .tuner_attach = dib7770p_tuner_attach,
2430 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2432 .size_of_priv =
2433 sizeof(struct dib0700_adapter_state),
2437 .num_device_descs = 2,
2438 .devices = {
2439 { "DiBcom STK7770P reference design",
2440 { &dib0700_usb_id_table[59], NULL },
2441 { NULL },
2443 { "Terratec Cinergy T USB XXS (HD)/ T3",
2444 { &dib0700_usb_id_table[33],
2445 &dib0700_usb_id_table[52],
2446 &dib0700_usb_id_table[60], NULL},
2447 { NULL },
2450 .rc_interval = DEFAULT_RC_INTERVAL,
2451 .rc_key_map = dib0700_rc_keys,
2452 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2453 .rc_query = dib0700_rc_query
2454 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2455 .num_adapters = 1,
2456 .adapter = {
2458 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2459 .pid_filter_count = 32,
2460 .pid_filter = stk807x_pid_filter,
2461 .pid_filter_ctrl = stk807x_pid_filter_ctrl,
2462 .frontend_attach = stk807x_frontend_attach,
2463 .tuner_attach = dib807x_tuner_attach,
2465 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2467 .size_of_priv =
2468 sizeof(struct dib0700_adapter_state),
2472 .num_device_descs = 2,
2473 .devices = {
2474 { "DiBcom STK807xP reference design",
2475 { &dib0700_usb_id_table[62], NULL },
2476 { NULL },
2478 { "Prolink Pixelview SBTVD",
2479 { &dib0700_usb_id_table[63], NULL },
2480 { NULL },
2484 .rc_interval = DEFAULT_RC_INTERVAL,
2485 .rc_key_map = dib0700_rc_keys,
2486 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2487 .rc_query = dib0700_rc_query
2489 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2490 .num_adapters = 2,
2491 .adapter = {
2493 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2494 .pid_filter_count = 32,
2495 .pid_filter = stk807x_pid_filter,
2496 .pid_filter_ctrl = stk807x_pid_filter_ctrl,
2497 .frontend_attach = stk807xpvr_frontend_attach0,
2498 .tuner_attach = dib807x_tuner_attach,
2500 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
2502 .size_of_priv =
2503 sizeof(struct dib0700_adapter_state),
2506 .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
2507 .pid_filter_count = 32,
2508 .pid_filter = stk807x_pid_filter,
2509 .pid_filter_ctrl = stk807x_pid_filter_ctrl,
2510 .frontend_attach = stk807xpvr_frontend_attach1,
2511 .tuner_attach = dib807x_tuner_attach,
2513 DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
2515 .size_of_priv =
2516 sizeof(struct dib0700_adapter_state),
2520 .num_device_descs = 1,
2521 .devices = {
2522 { "DiBcom STK807xPVR reference design",
2523 { &dib0700_usb_id_table[61], NULL },
2524 { NULL },
2528 .rc_interval = DEFAULT_RC_INTERVAL,
2529 .rc_key_map = dib0700_rc_keys,
2530 .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
2531 .rc_query = dib0700_rc_query
2535 int dib0700_device_count = ARRAY_SIZE(dib0700_devices);