Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/media/dvb/dvb-usb/anysee.c
15111 views
1
/*
2
* DVB USB Linux driver for Anysee E30 DVB-C & DVB-T USB2.0 receiver
3
*
4
* Copyright (C) 2007 Antti Palosaari <[email protected]>
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19
*
20
* TODO:
21
* - add smart card reader support for Conditional Access (CA)
22
*
23
* Card reader in Anysee is nothing more than ISO 7816 card reader.
24
* There is no hardware CAM in any Anysee device sold.
25
* In my understanding it should be implemented by making own module
26
* for ISO 7816 card reader, like dvb_ca_en50221 is implemented. This
27
* module registers serial interface that can be used to communicate
28
* with any ISO 7816 smart card.
29
*
30
* Any help according to implement serial smart card reader support
31
* is highly welcome!
32
*/
33
34
#include "anysee.h"
35
#include "tda1002x.h"
36
#include "mt352.h"
37
#include "mt352_priv.h"
38
#include "zl10353.h"
39
#include "tda18212.h"
40
#include "cx24116.h"
41
#include "stv0900.h"
42
#include "stv6110.h"
43
#include "isl6423.h"
44
45
/* debug */
46
static int dvb_usb_anysee_debug;
47
module_param_named(debug, dvb_usb_anysee_debug, int, 0644);
48
MODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS);
49
static int dvb_usb_anysee_delsys;
50
module_param_named(delsys, dvb_usb_anysee_delsys, int, 0644);
51
MODULE_PARM_DESC(delsys, "select delivery mode (0=DVB-C, 1=DVB-T)");
52
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
53
54
static DEFINE_MUTEX(anysee_usb_mutex);
55
56
static int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen,
57
u8 *rbuf, u8 rlen)
58
{
59
struct anysee_state *state = d->priv;
60
int act_len, ret;
61
u8 buf[64];
62
63
memcpy(&buf[0], sbuf, slen);
64
buf[60] = state->seq++;
65
66
if (mutex_lock_interruptible(&anysee_usb_mutex) < 0)
67
return -EAGAIN;
68
69
/* We need receive one message more after dvb_usb_generic_rw due
70
to weird transaction flow, which is 1 x send + 2 x receive. */
71
ret = dvb_usb_generic_rw(d, buf, sizeof(buf), buf, sizeof(buf), 0);
72
73
if (!ret) {
74
/* receive 2nd answer */
75
ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev,
76
d->props.generic_bulk_ctrl_endpoint), buf, sizeof(buf),
77
&act_len, 2000);
78
if (ret)
79
err("%s: recv bulk message failed: %d", __func__, ret);
80
else {
81
deb_xfer("<<< ");
82
debug_dump(buf, act_len, deb_xfer);
83
}
84
}
85
86
/* read request, copy returned data to return buf */
87
if (!ret && rbuf && rlen)
88
memcpy(rbuf, buf, rlen);
89
90
mutex_unlock(&anysee_usb_mutex);
91
92
return ret;
93
}
94
95
static int anysee_read_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
96
{
97
u8 buf[] = {CMD_REG_READ, reg >> 8, reg & 0xff, 0x01};
98
int ret;
99
ret = anysee_ctrl_msg(d, buf, sizeof(buf), val, 1);
100
deb_info("%s: reg:%04x val:%02x\n", __func__, reg, *val);
101
return ret;
102
}
103
104
static int anysee_write_reg(struct dvb_usb_device *d, u16 reg, u8 val)
105
{
106
u8 buf[] = {CMD_REG_WRITE, reg >> 8, reg & 0xff, 0x01, val};
107
deb_info("%s: reg:%04x val:%02x\n", __func__, reg, val);
108
return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
109
}
110
111
/* write single register with mask */
112
static int anysee_wr_reg_mask(struct dvb_usb_device *d, u16 reg, u8 val,
113
u8 mask)
114
{
115
int ret;
116
u8 tmp;
117
118
/* no need for read if whole reg is written */
119
if (mask != 0xff) {
120
ret = anysee_read_reg(d, reg, &tmp);
121
if (ret)
122
return ret;
123
124
val &= mask;
125
tmp &= ~mask;
126
val |= tmp;
127
}
128
129
return anysee_write_reg(d, reg, val);
130
}
131
132
static int anysee_get_hw_info(struct dvb_usb_device *d, u8 *id)
133
{
134
u8 buf[] = {CMD_GET_HW_INFO};
135
return anysee_ctrl_msg(d, buf, sizeof(buf), id, 3);
136
}
137
138
static int anysee_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
139
{
140
u8 buf[] = {CMD_STREAMING_CTRL, (u8)onoff, 0x00};
141
deb_info("%s: onoff:%02x\n", __func__, onoff);
142
return anysee_ctrl_msg(adap->dev, buf, sizeof(buf), NULL, 0);
143
}
144
145
static int anysee_led_ctrl(struct dvb_usb_device *d, u8 mode, u8 interval)
146
{
147
u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x01, mode, interval};
148
deb_info("%s: state:%02x interval:%02x\n", __func__, mode, interval);
149
return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
150
}
151
152
static int anysee_ir_ctrl(struct dvb_usb_device *d, u8 onoff)
153
{
154
u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x02, onoff};
155
deb_info("%s: onoff:%02x\n", __func__, onoff);
156
return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
157
}
158
159
static int anysee_init(struct dvb_usb_device *d)
160
{
161
int ret;
162
/* LED light */
163
ret = anysee_led_ctrl(d, 0x01, 0x03);
164
if (ret)
165
return ret;
166
167
/* enable IR */
168
ret = anysee_ir_ctrl(d, 1);
169
if (ret)
170
return ret;
171
172
return 0;
173
}
174
175
/* I2C */
176
static int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
177
int num)
178
{
179
struct dvb_usb_device *d = i2c_get_adapdata(adap);
180
int ret = 0, inc, i = 0;
181
u8 buf[52]; /* 4 + 48 (I2C WR USB command header + I2C WR max) */
182
183
if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
184
return -EAGAIN;
185
186
while (i < num) {
187
if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
188
if (msg[i].len > 2 || msg[i+1].len > 60) {
189
ret = -EOPNOTSUPP;
190
break;
191
}
192
buf[0] = CMD_I2C_READ;
193
buf[1] = (msg[i].addr << 1) | 0x01;
194
buf[2] = msg[i].buf[0];
195
buf[3] = msg[i].buf[1];
196
buf[4] = msg[i].len-1;
197
buf[5] = msg[i+1].len;
198
ret = anysee_ctrl_msg(d, buf, 6, msg[i+1].buf,
199
msg[i+1].len);
200
inc = 2;
201
} else {
202
if (msg[i].len > 48) {
203
ret = -EOPNOTSUPP;
204
break;
205
}
206
buf[0] = CMD_I2C_WRITE;
207
buf[1] = (msg[i].addr << 1);
208
buf[2] = msg[i].len;
209
buf[3] = 0x01;
210
memcpy(&buf[4], msg[i].buf, msg[i].len);
211
ret = anysee_ctrl_msg(d, buf, 4 + msg[i].len, NULL, 0);
212
inc = 1;
213
}
214
if (ret)
215
break;
216
217
i += inc;
218
}
219
220
mutex_unlock(&d->i2c_mutex);
221
222
return ret ? ret : i;
223
}
224
225
static u32 anysee_i2c_func(struct i2c_adapter *adapter)
226
{
227
return I2C_FUNC_I2C;
228
}
229
230
static struct i2c_algorithm anysee_i2c_algo = {
231
.master_xfer = anysee_master_xfer,
232
.functionality = anysee_i2c_func,
233
};
234
235
static int anysee_mt352_demod_init(struct dvb_frontend *fe)
236
{
237
static u8 clock_config[] = { CLOCK_CTL, 0x38, 0x28 };
238
static u8 reset[] = { RESET, 0x80 };
239
static u8 adc_ctl_1_cfg[] = { ADC_CTL_1, 0x40 };
240
static u8 agc_cfg[] = { AGC_TARGET, 0x28, 0x20 };
241
static u8 gpp_ctl_cfg[] = { GPP_CTL, 0x33 };
242
static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
243
244
mt352_write(fe, clock_config, sizeof(clock_config));
245
udelay(200);
246
mt352_write(fe, reset, sizeof(reset));
247
mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
248
249
mt352_write(fe, agc_cfg, sizeof(agc_cfg));
250
mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
251
mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
252
253
return 0;
254
}
255
256
/* Callbacks for DVB USB */
257
static struct tda10023_config anysee_tda10023_config = {
258
.demod_address = (0x1a >> 1),
259
.invert = 0,
260
.xtal = 16000000,
261
.pll_m = 11,
262
.pll_p = 3,
263
.pll_n = 1,
264
.output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
265
.deltaf = 0xfeeb,
266
};
267
268
static struct mt352_config anysee_mt352_config = {
269
.demod_address = (0x1e >> 1),
270
.demod_init = anysee_mt352_demod_init,
271
};
272
273
static struct zl10353_config anysee_zl10353_config = {
274
.demod_address = (0x1e >> 1),
275
.parallel_ts = 1,
276
};
277
278
static struct zl10353_config anysee_zl10353_tda18212_config2 = {
279
.demod_address = (0x1e >> 1),
280
.parallel_ts = 1,
281
.disable_i2c_gate_ctrl = 1,
282
.no_tuner = 1,
283
.if2 = 41500,
284
};
285
286
static struct zl10353_config anysee_zl10353_tda18212_config = {
287
.demod_address = (0x18 >> 1),
288
.parallel_ts = 1,
289
.disable_i2c_gate_ctrl = 1,
290
.no_tuner = 1,
291
.if2 = 41500,
292
};
293
294
static struct tda10023_config anysee_tda10023_tda18212_config = {
295
.demod_address = (0x1a >> 1),
296
.xtal = 16000000,
297
.pll_m = 12,
298
.pll_p = 3,
299
.pll_n = 1,
300
.output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
301
.deltaf = 0xba02,
302
};
303
304
static struct tda18212_config anysee_tda18212_config = {
305
.i2c_address = (0xc0 >> 1),
306
.if_dvbt_6 = 4150,
307
.if_dvbt_7 = 4150,
308
.if_dvbt_8 = 4150,
309
.if_dvbc = 5000,
310
};
311
312
static struct cx24116_config anysee_cx24116_config = {
313
.demod_address = (0xaa >> 1),
314
.mpg_clk_pos_pol = 0x00,
315
.i2c_wr_max = 48,
316
};
317
318
static struct stv0900_config anysee_stv0900_config = {
319
.demod_address = (0xd0 >> 1),
320
.demod_mode = 0,
321
.xtal = 8000000,
322
.clkmode = 3,
323
.diseqc_mode = 2,
324
.tun1_maddress = 0,
325
.tun1_adc = 1, /* 1 Vpp */
326
.path1_mode = 3,
327
};
328
329
static struct stv6110_config anysee_stv6110_config = {
330
.i2c_address = (0xc0 >> 1),
331
.mclk = 16000000,
332
.clk_div = 1,
333
};
334
335
static struct isl6423_config anysee_isl6423_config = {
336
.current_max = SEC_CURRENT_800m,
337
.curlim = SEC_CURRENT_LIM_OFF,
338
.mod_extern = 1,
339
.addr = (0x10 >> 1),
340
};
341
342
/*
343
* New USB device strings: Mfr=1, Product=2, SerialNumber=0
344
* Manufacturer: AMT.CO.KR
345
*
346
* E30 VID=04b4 PID=861f HW=2 FW=2.1 Product=????????
347
* PCB: ?
348
* parts: DNOS404ZH102A(MT352, DTT7579(?))
349
*
350
* E30 VID=04b4 PID=861f HW=2 FW=2.1 Product=????????
351
* PCB: ?
352
* parts: DNOS404ZH103A(ZL10353, DTT7579(?))
353
*
354
* E30 Plus VID=04b4 PID=861f HW=6 FW=1.0 "anysee"
355
* PCB: 507CD (rev1.1)
356
* parts: DNOS404ZH103A(ZL10353, DTT7579(?)), CST56I01
357
* OEA=80 OEB=00 OEC=00 OED=ff OEF=fe
358
* IOA=4f IOB=ff IOC=00 IOD=06 IOF=01
359
* IOD[0] ZL10353 1=enabled
360
* IOA[7] TS 0=enabled
361
* tuner is not behind ZL10353 I2C-gate (no care if gate disabled or not)
362
*
363
* E30 C Plus VID=04b4 PID=861f HW=10 FW=1.0 "anysee-DC(LP)"
364
* PCB: 507DC (rev0.2)
365
* parts: TDA10023, DTOS403IH102B TM, CST56I01
366
* OEA=80 OEB=00 OEC=00 OED=ff OEF=fe
367
* IOA=4f IOB=ff IOC=00 IOD=26 IOF=01
368
* IOD[0] TDA10023 1=enabled
369
*
370
* E30 S2 Plus VID=04b4 PID=861f HW=11 FW=0.1 "anysee-S2(LP)"
371
* PCB: 507SI (rev2.1)
372
* parts: BS2N10WCC01(CX24116, CX24118), ISL6423, TDA8024
373
* OEA=80 OEB=00 OEC=ff OED=ff OEF=fe
374
* IOA=4d IOB=ff IOC=00 IOD=26 IOF=01
375
* IOD[0] CX24116 1=enabled
376
*
377
* E30 C Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
378
* PCB: 507FA (rev0.4)
379
* parts: TDA10023, DTOS403IH102B TM, TDA8024
380
* OEA=80 OEB=00 OEC=ff OED=ff OEF=ff
381
* IOA=4d IOB=ff IOC=00 IOD=00 IOF=c0
382
* IOD[5] TDA10023 1=enabled
383
* IOE[0] tuner 1=enabled
384
*
385
* E30 Combo Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
386
* PCB: 507FA (rev1.1)
387
* parts: ZL10353, TDA10023, DTOS403IH102B TM, TDA8024
388
* OEA=80 OEB=00 OEC=ff OED=ff OEF=ff
389
* IOA=4d IOB=ff IOC=00 IOD=00 IOF=c0
390
* DVB-C:
391
* IOD[5] TDA10023 1=enabled
392
* IOE[0] tuner 1=enabled
393
* DVB-T:
394
* IOD[0] ZL10353 1=enabled
395
* IOE[0] tuner 0=enabled
396
* tuner is behind ZL10353 I2C-gate
397
*
398
* E7 TC VID=1c73 PID=861f HW=18 FW=0.7 AMTCI=0.5 "anysee-E7TC(LP)"
399
* PCB: 508TC (rev0.6)
400
* parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
401
* OEA=80 OEB=00 OEC=03 OED=f7 OEF=ff
402
* IOA=4d IOB=00 IOC=cc IOD=48 IOF=e4
403
* IOA[7] TS 1=enabled
404
* IOE[4] TDA18212 1=enabled
405
* DVB-C:
406
* IOD[6] ZL10353 0=disabled
407
* IOD[5] TDA10023 1=enabled
408
* IOE[0] IF 1=enabled
409
* DVB-T:
410
* IOD[5] TDA10023 0=disabled
411
* IOD[6] ZL10353 1=enabled
412
* IOE[0] IF 0=enabled
413
*
414
* E7 S2 VID=1c73 PID=861f HW=19 FW=0.4 AMTCI=0.5 "anysee-E7S2(LP)"
415
* PCB: 508S2 (rev0.7)
416
* parts: DNBU10512IST(STV0903, STV6110), ISL6423
417
* OEA=80 OEB=00 OEC=03 OED=f7 OEF=ff
418
* IOA=4d IOB=00 IOC=c4 IOD=08 IOF=e4
419
* IOA[7] TS 1=enabled
420
* IOE[5] STV0903 1=enabled
421
*
422
*/
423
424
static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
425
{
426
int ret;
427
struct anysee_state *state = adap->dev->priv;
428
u8 hw_info[3];
429
u8 tmp;
430
struct i2c_msg msg[2] = {
431
{
432
.addr = anysee_tda18212_config.i2c_address,
433
.flags = 0,
434
.len = 1,
435
.buf = "\x00",
436
}, {
437
.addr = anysee_tda18212_config.i2c_address,
438
.flags = I2C_M_RD,
439
.len = 1,
440
.buf = &tmp,
441
}
442
};
443
444
/* Check which hardware we have.
445
* We must do this call two times to get reliable values (hw bug).
446
*/
447
ret = anysee_get_hw_info(adap->dev, hw_info);
448
if (ret)
449
goto error;
450
451
ret = anysee_get_hw_info(adap->dev, hw_info);
452
if (ret)
453
goto error;
454
455
/* Meaning of these info bytes are guessed. */
456
info("firmware version:%d.%d hardware id:%d",
457
hw_info[1], hw_info[2], hw_info[0]);
458
459
state->hw = hw_info[0];
460
461
switch (state->hw) {
462
case ANYSEE_HW_02: /* 2 */
463
/* E30 */
464
465
/* attach demod */
466
adap->fe = dvb_attach(mt352_attach, &anysee_mt352_config,
467
&adap->dev->i2c_adap);
468
if (adap->fe)
469
break;
470
471
/* attach demod */
472
adap->fe = dvb_attach(zl10353_attach, &anysee_zl10353_config,
473
&adap->dev->i2c_adap);
474
475
break;
476
case ANYSEE_HW_507CD: /* 6 */
477
/* E30 Plus */
478
479
/* enable DVB-T demod on IOD[0] */
480
ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
481
if (ret)
482
goto error;
483
484
/* enable transport stream on IOA[7] */
485
ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (0 << 7), 0x80);
486
if (ret)
487
goto error;
488
489
/* attach demod */
490
adap->fe = dvb_attach(zl10353_attach, &anysee_zl10353_config,
491
&adap->dev->i2c_adap);
492
493
break;
494
case ANYSEE_HW_507DC: /* 10 */
495
/* E30 C Plus */
496
497
/* enable DVB-C demod on IOD[0] */
498
ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
499
if (ret)
500
goto error;
501
502
/* attach demod */
503
adap->fe = dvb_attach(tda10023_attach, &anysee_tda10023_config,
504
&adap->dev->i2c_adap, 0x48);
505
506
break;
507
case ANYSEE_HW_507SI: /* 11 */
508
/* E30 S2 Plus */
509
510
/* enable DVB-S/S2 demod on IOD[0] */
511
ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
512
if (ret)
513
goto error;
514
515
/* attach demod */
516
adap->fe = dvb_attach(cx24116_attach, &anysee_cx24116_config,
517
&adap->dev->i2c_adap);
518
519
break;
520
case ANYSEE_HW_507FA: /* 15 */
521
/* E30 Combo Plus */
522
/* E30 C Plus */
523
524
/* enable tuner on IOE[4] */
525
ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
526
if (ret)
527
goto error;
528
529
/* probe TDA18212 */
530
tmp = 0;
531
ret = i2c_transfer(&adap->dev->i2c_adap, msg, 2);
532
if (ret == 2 && tmp == 0xc7)
533
deb_info("%s: TDA18212 found\n", __func__);
534
else
535
tmp = 0;
536
537
/* disable tuner on IOE[4] */
538
ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 4), 0x10);
539
if (ret)
540
goto error;
541
542
if (dvb_usb_anysee_delsys) {
543
/* disable DVB-C demod on IOD[5] */
544
ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
545
0x20);
546
if (ret)
547
goto error;
548
549
/* enable DVB-T demod on IOD[0] */
550
ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0),
551
0x01);
552
if (ret)
553
goto error;
554
555
/* attach demod */
556
if (tmp == 0xc7) {
557
/* TDA18212 config */
558
adap->fe = dvb_attach(zl10353_attach,
559
&anysee_zl10353_tda18212_config2,
560
&adap->dev->i2c_adap);
561
} else {
562
/* PLL config */
563
adap->fe = dvb_attach(zl10353_attach,
564
&anysee_zl10353_config,
565
&adap->dev->i2c_adap);
566
}
567
} else {
568
/* disable DVB-T demod on IOD[0] */
569
ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 0),
570
0x01);
571
if (ret)
572
goto error;
573
574
/* enable DVB-C demod on IOD[5] */
575
ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
576
0x20);
577
if (ret)
578
goto error;
579
580
/* attach demod */
581
if (tmp == 0xc7) {
582
/* TDA18212 config */
583
adap->fe = dvb_attach(tda10023_attach,
584
&anysee_tda10023_tda18212_config,
585
&adap->dev->i2c_adap, 0x48);
586
} else {
587
/* PLL config */
588
adap->fe = dvb_attach(tda10023_attach,
589
&anysee_tda10023_config,
590
&adap->dev->i2c_adap, 0x48);
591
}
592
}
593
594
break;
595
case ANYSEE_HW_508TC: /* 18 */
596
/* E7 TC */
597
598
/* enable transport stream on IOA[7] */
599
ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (1 << 7), 0x80);
600
if (ret)
601
goto error;
602
603
if (dvb_usb_anysee_delsys) {
604
/* disable DVB-C demod on IOD[5] */
605
ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
606
0x20);
607
if (ret)
608
goto error;
609
610
/* enable DVB-T demod on IOD[6] */
611
ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 6),
612
0x40);
613
if (ret)
614
goto error;
615
616
/* enable IF route on IOE[0] */
617
ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 0),
618
0x01);
619
if (ret)
620
goto error;
621
622
/* attach demod */
623
adap->fe = dvb_attach(zl10353_attach,
624
&anysee_zl10353_tda18212_config,
625
&adap->dev->i2c_adap);
626
} else {
627
/* disable DVB-T demod on IOD[6] */
628
ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 6),
629
0x40);
630
if (ret)
631
goto error;
632
633
/* enable DVB-C demod on IOD[5] */
634
ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
635
0x20);
636
if (ret)
637
goto error;
638
639
/* enable IF route on IOE[0] */
640
ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 0),
641
0x01);
642
if (ret)
643
goto error;
644
645
/* attach demod */
646
adap->fe = dvb_attach(tda10023_attach,
647
&anysee_tda10023_tda18212_config,
648
&adap->dev->i2c_adap, 0x48);
649
}
650
651
break;
652
case ANYSEE_HW_508S2: /* 19 */
653
/* E7 S2 */
654
655
/* enable transport stream on IOA[7] */
656
ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (1 << 7), 0x80);
657
if (ret)
658
goto error;
659
660
/* enable DVB-S/S2 demod on IOE[5] */
661
ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 5), 0x20);
662
if (ret)
663
goto error;
664
665
/* attach demod */
666
adap->fe = dvb_attach(stv0900_attach, &anysee_stv0900_config,
667
&adap->dev->i2c_adap, 0);
668
669
break;
670
}
671
672
if (!adap->fe) {
673
/* we have no frontend :-( */
674
ret = -ENODEV;
675
err("Unsupported Anysee version. " \
676
"Please report the <[email protected]>.");
677
}
678
error:
679
return ret;
680
}
681
682
static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
683
{
684
struct anysee_state *state = adap->dev->priv;
685
struct dvb_frontend *fe;
686
int ret;
687
deb_info("%s:\n", __func__);
688
689
switch (state->hw) {
690
case ANYSEE_HW_02: /* 2 */
691
/* E30 */
692
693
/* attach tuner */
694
fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc2 >> 1),
695
NULL, DVB_PLL_THOMSON_DTT7579);
696
697
break;
698
case ANYSEE_HW_507CD: /* 6 */
699
/* E30 Plus */
700
701
/* attach tuner */
702
fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc2 >> 1),
703
&adap->dev->i2c_adap, DVB_PLL_THOMSON_DTT7579);
704
705
break;
706
case ANYSEE_HW_507DC: /* 10 */
707
/* E30 C Plus */
708
709
/* attach tuner */
710
fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc0 >> 1),
711
&adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
712
713
break;
714
case ANYSEE_HW_507SI: /* 11 */
715
/* E30 S2 Plus */
716
717
/* attach LNB controller */
718
fe = dvb_attach(isl6423_attach, adap->fe, &adap->dev->i2c_adap,
719
&anysee_isl6423_config);
720
721
break;
722
case ANYSEE_HW_507FA: /* 15 */
723
/* E30 Combo Plus */
724
/* E30 C Plus */
725
726
if (dvb_usb_anysee_delsys) {
727
/* enable DVB-T tuner on IOE[0] */
728
ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 0),
729
0x01);
730
if (ret)
731
goto error;
732
} else {
733
/* enable DVB-C tuner on IOE[0] */
734
ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 0),
735
0x01);
736
if (ret)
737
goto error;
738
}
739
740
/* Try first attach TDA18212 silicon tuner on IOE[4], if that
741
* fails attach old simple PLL. */
742
743
/* enable tuner on IOE[4] */
744
ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
745
if (ret)
746
goto error;
747
748
/* attach tuner */
749
fe = dvb_attach(tda18212_attach, adap->fe, &adap->dev->i2c_adap,
750
&anysee_tda18212_config);
751
if (fe)
752
break;
753
754
/* disable tuner on IOE[4] */
755
ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 4), 0x10);
756
if (ret)
757
goto error;
758
759
/* attach tuner */
760
fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc0 >> 1),
761
&adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
762
763
break;
764
case ANYSEE_HW_508TC: /* 18 */
765
/* E7 TC */
766
767
/* enable tuner on IOE[4] */
768
ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
769
if (ret)
770
goto error;
771
772
/* attach tuner */
773
fe = dvb_attach(tda18212_attach, adap->fe, &adap->dev->i2c_adap,
774
&anysee_tda18212_config);
775
776
break;
777
case ANYSEE_HW_508S2: /* 19 */
778
/* E7 S2 */
779
780
/* attach tuner */
781
fe = dvb_attach(stv6110_attach, adap->fe,
782
&anysee_stv6110_config, &adap->dev->i2c_adap);
783
784
if (fe) {
785
/* attach LNB controller */
786
fe = dvb_attach(isl6423_attach, adap->fe,
787
&adap->dev->i2c_adap, &anysee_isl6423_config);
788
}
789
790
break;
791
default:
792
fe = NULL;
793
}
794
795
if (fe)
796
ret = 0;
797
else
798
ret = -ENODEV;
799
800
error:
801
return ret;
802
}
803
804
static int anysee_rc_query(struct dvb_usb_device *d)
805
{
806
u8 buf[] = {CMD_GET_IR_CODE};
807
u8 ircode[2];
808
int ret;
809
810
/* Remote controller is basic NEC using address byte 0x08.
811
Anysee device RC query returns only two bytes, status and code,
812
address byte is dropped. Also it does not return any value for
813
NEC RCs having address byte other than 0x08. Due to that, we
814
cannot use that device as standard NEC receiver.
815
It could be possible make hack which reads whole code directly
816
from device memory... */
817
818
ret = anysee_ctrl_msg(d, buf, sizeof(buf), ircode, sizeof(ircode));
819
if (ret)
820
return ret;
821
822
if (ircode[0]) {
823
deb_rc("%s: key pressed %02x\n", __func__, ircode[1]);
824
rc_keydown(d->rc_dev, 0x08 << 8 | ircode[1], 0);
825
}
826
827
return 0;
828
}
829
830
/* DVB USB Driver stuff */
831
static struct dvb_usb_device_properties anysee_properties;
832
833
static int anysee_probe(struct usb_interface *intf,
834
const struct usb_device_id *id)
835
{
836
struct dvb_usb_device *d;
837
struct usb_host_interface *alt;
838
int ret;
839
840
/* There is one interface with two alternate settings.
841
Alternate setting 0 is for bulk transfer.
842
Alternate setting 1 is for isochronous transfer.
843
We use bulk transfer (alternate setting 0). */
844
if (intf->num_altsetting < 1)
845
return -ENODEV;
846
847
/*
848
* Anysee is always warm (its USB-bridge, Cypress FX2, uploads
849
* firmware from eeprom). If dvb_usb_device_init() succeeds that
850
* means d is a valid pointer.
851
*/
852
ret = dvb_usb_device_init(intf, &anysee_properties, THIS_MODULE, &d,
853
adapter_nr);
854
if (ret)
855
return ret;
856
857
alt = usb_altnum_to_altsetting(intf, 0);
858
if (alt == NULL) {
859
deb_info("%s: no alt found!\n", __func__);
860
return -ENODEV;
861
}
862
863
ret = usb_set_interface(d->udev, alt->desc.bInterfaceNumber,
864
alt->desc.bAlternateSetting);
865
if (ret)
866
return ret;
867
868
return anysee_init(d);
869
}
870
871
static struct usb_device_id anysee_table[] = {
872
{ USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE) },
873
{ USB_DEVICE(USB_VID_AMT, USB_PID_ANYSEE) },
874
{ } /* Terminating entry */
875
};
876
MODULE_DEVICE_TABLE(usb, anysee_table);
877
878
static struct dvb_usb_device_properties anysee_properties = {
879
.caps = DVB_USB_IS_AN_I2C_ADAPTER,
880
881
.usb_ctrl = DEVICE_SPECIFIC,
882
883
.size_of_priv = sizeof(struct anysee_state),
884
885
.num_adapters = 1,
886
.adapter = {
887
{
888
.streaming_ctrl = anysee_streaming_ctrl,
889
.frontend_attach = anysee_frontend_attach,
890
.tuner_attach = anysee_tuner_attach,
891
.stream = {
892
.type = USB_BULK,
893
.count = 8,
894
.endpoint = 0x82,
895
.u = {
896
.bulk = {
897
.buffersize = (16*512),
898
}
899
}
900
},
901
}
902
},
903
904
.rc.core = {
905
.rc_codes = RC_MAP_ANYSEE,
906
.protocol = RC_TYPE_OTHER,
907
.module_name = "anysee",
908
.rc_query = anysee_rc_query,
909
.rc_interval = 250, /* windows driver uses 500ms */
910
},
911
912
.i2c_algo = &anysee_i2c_algo,
913
914
.generic_bulk_ctrl_endpoint = 1,
915
916
.num_device_descs = 1,
917
.devices = {
918
{
919
.name = "Anysee DVB USB2.0",
920
.cold_ids = {NULL},
921
.warm_ids = {&anysee_table[0],
922
&anysee_table[1], NULL},
923
},
924
}
925
};
926
927
static struct usb_driver anysee_driver = {
928
.name = "dvb_usb_anysee",
929
.probe = anysee_probe,
930
.disconnect = dvb_usb_device_exit,
931
.id_table = anysee_table,
932
};
933
934
/* module stuff */
935
static int __init anysee_module_init(void)
936
{
937
int ret;
938
939
ret = usb_register(&anysee_driver);
940
if (ret)
941
err("%s: usb_register failed. Error number %d", __func__, ret);
942
943
return ret;
944
}
945
946
static void __exit anysee_module_exit(void)
947
{
948
/* deregister this driver from the USB subsystem */
949
usb_deregister(&anysee_driver);
950
}
951
952
module_init(anysee_module_init);
953
module_exit(anysee_module_exit);
954
955
MODULE_AUTHOR("Antti Palosaari <[email protected]>");
956
MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
957
MODULE_LICENSE("GPL");
958
959