Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/media/dvb/dvb-usb/af9015.c
15111 views
1
/*
2
* DVB USB Linux driver for Afatech AF9015 DVB-T USB2.0 receiver
3
*
4
* Copyright (C) 2007 Antti Palosaari <[email protected]>
5
*
6
* Thanks to Afatech who kindly provided information.
7
*
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published by
10
* the Free Software Foundation; either version 2 of the License, or
11
* (at your option) any later version.
12
*
13
* This program is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
* GNU General Public License for more details.
17
*
18
* You should have received a copy of the GNU General Public License
19
* along with this program; if not, write to the Free Software
20
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21
*
22
*/
23
24
#include <linux/hash.h>
25
#include <linux/slab.h>
26
27
#include "af9015.h"
28
#include "af9013.h"
29
#include "mt2060.h"
30
#include "qt1010.h"
31
#include "tda18271.h"
32
#include "mxl5005s.h"
33
#include "mc44s803.h"
34
#include "tda18218.h"
35
#include "mxl5007t.h"
36
37
static int dvb_usb_af9015_debug;
38
module_param_named(debug, dvb_usb_af9015_debug, int, 0644);
39
MODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS);
40
static int dvb_usb_af9015_remote;
41
module_param_named(remote, dvb_usb_af9015_remote, int, 0644);
42
MODULE_PARM_DESC(remote, "select remote");
43
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
44
45
static DEFINE_MUTEX(af9015_usb_mutex);
46
47
static struct af9015_config af9015_config;
48
static struct dvb_usb_device_properties af9015_properties[3];
49
static int af9015_properties_count = ARRAY_SIZE(af9015_properties);
50
51
static struct af9013_config af9015_af9013_config[] = {
52
{
53
.demod_address = AF9015_I2C_DEMOD,
54
.output_mode = AF9013_OUTPUT_MODE_USB,
55
.api_version = { 0, 1, 9, 0 },
56
.gpio[0] = AF9013_GPIO_HI,
57
.gpio[3] = AF9013_GPIO_TUNER_ON,
58
59
}, {
60
.output_mode = AF9013_OUTPUT_MODE_SERIAL,
61
.api_version = { 0, 1, 9, 0 },
62
.gpio[0] = AF9013_GPIO_TUNER_ON,
63
.gpio[1] = AF9013_GPIO_LO,
64
}
65
};
66
67
static int af9015_rw_udev(struct usb_device *udev, struct req_t *req)
68
{
69
#define BUF_LEN 63
70
#define REQ_HDR_LEN 8 /* send header size */
71
#define ACK_HDR_LEN 2 /* rece header size */
72
int act_len, ret;
73
u8 buf[BUF_LEN];
74
u8 write = 1;
75
u8 msg_len = REQ_HDR_LEN;
76
static u8 seq; /* packet sequence number */
77
78
if (mutex_lock_interruptible(&af9015_usb_mutex) < 0)
79
return -EAGAIN;
80
81
buf[0] = req->cmd;
82
buf[1] = seq++;
83
buf[2] = req->i2c_addr;
84
buf[3] = req->addr >> 8;
85
buf[4] = req->addr & 0xff;
86
buf[5] = req->mbox;
87
buf[6] = req->addr_len;
88
buf[7] = req->data_len;
89
90
switch (req->cmd) {
91
case GET_CONFIG:
92
case READ_MEMORY:
93
case RECONNECT_USB:
94
case GET_IR_CODE:
95
write = 0;
96
break;
97
case READ_I2C:
98
write = 0;
99
buf[2] |= 0x01; /* set I2C direction */
100
case WRITE_I2C:
101
buf[0] = READ_WRITE_I2C;
102
break;
103
case WRITE_MEMORY:
104
if (((req->addr & 0xff00) == 0xff00) ||
105
((req->addr & 0xff00) == 0xae00))
106
buf[0] = WRITE_VIRTUAL_MEMORY;
107
case WRITE_VIRTUAL_MEMORY:
108
case COPY_FIRMWARE:
109
case DOWNLOAD_FIRMWARE:
110
case BOOT:
111
break;
112
default:
113
err("unknown command:%d", req->cmd);
114
ret = -1;
115
goto error_unlock;
116
}
117
118
/* buffer overflow check */
119
if ((write && (req->data_len > BUF_LEN - REQ_HDR_LEN)) ||
120
(!write && (req->data_len > BUF_LEN - ACK_HDR_LEN))) {
121
err("too much data; cmd:%d len:%d", req->cmd, req->data_len);
122
ret = -EINVAL;
123
goto error_unlock;
124
}
125
126
/* write requested */
127
if (write) {
128
memcpy(&buf[REQ_HDR_LEN], req->data, req->data_len);
129
msg_len += req->data_len;
130
}
131
132
deb_xfer(">>> ");
133
debug_dump(buf, msg_len, deb_xfer);
134
135
/* send req */
136
ret = usb_bulk_msg(udev, usb_sndbulkpipe(udev, 0x02), buf, msg_len,
137
&act_len, AF9015_USB_TIMEOUT);
138
if (ret)
139
err("bulk message failed:%d (%d/%d)", ret, msg_len, act_len);
140
else
141
if (act_len != msg_len)
142
ret = -1; /* all data is not send */
143
if (ret)
144
goto error_unlock;
145
146
/* no ack for those packets */
147
if (req->cmd == DOWNLOAD_FIRMWARE || req->cmd == RECONNECT_USB)
148
goto exit_unlock;
149
150
/* write receives seq + status = 2 bytes
151
read receives seq + status + data = 2 + N bytes */
152
msg_len = ACK_HDR_LEN;
153
if (!write)
154
msg_len += req->data_len;
155
156
ret = usb_bulk_msg(udev, usb_rcvbulkpipe(udev, 0x81), buf, msg_len,
157
&act_len, AF9015_USB_TIMEOUT);
158
if (ret) {
159
err("recv bulk message failed:%d", ret);
160
ret = -1;
161
goto error_unlock;
162
}
163
164
deb_xfer("<<< ");
165
debug_dump(buf, act_len, deb_xfer);
166
167
/* remote controller query status is 1 if remote code is not received */
168
if (req->cmd == GET_IR_CODE && buf[1] == 1) {
169
buf[1] = 0; /* clear command "error" status */
170
memset(&buf[2], 0, req->data_len);
171
buf[3] = 1; /* no remote code received mark */
172
}
173
174
/* check status */
175
if (buf[1]) {
176
err("command failed:%d", buf[1]);
177
ret = -1;
178
goto error_unlock;
179
}
180
181
/* read request, copy returned data to return buf */
182
if (!write)
183
memcpy(req->data, &buf[ACK_HDR_LEN], req->data_len);
184
185
error_unlock:
186
exit_unlock:
187
mutex_unlock(&af9015_usb_mutex);
188
189
return ret;
190
}
191
192
static int af9015_ctrl_msg(struct dvb_usb_device *d, struct req_t *req)
193
{
194
return af9015_rw_udev(d->udev, req);
195
}
196
197
static int af9015_write_regs(struct dvb_usb_device *d, u16 addr, u8 *val,
198
u8 len)
199
{
200
struct req_t req = {WRITE_MEMORY, AF9015_I2C_DEMOD, addr, 0, 0, len,
201
val};
202
return af9015_ctrl_msg(d, &req);
203
}
204
205
static int af9015_write_reg(struct dvb_usb_device *d, u16 addr, u8 val)
206
{
207
return af9015_write_regs(d, addr, &val, 1);
208
}
209
210
static int af9015_read_regs(struct dvb_usb_device *d, u16 addr, u8 *val, u8 len)
211
{
212
struct req_t req = {READ_MEMORY, AF9015_I2C_DEMOD, addr, 0, 0, len,
213
val};
214
return af9015_ctrl_msg(d, &req);
215
}
216
217
static int af9015_read_reg(struct dvb_usb_device *d, u16 addr, u8 *val)
218
{
219
return af9015_read_regs(d, addr, val, 1);
220
}
221
222
static int af9015_write_reg_i2c(struct dvb_usb_device *d, u8 addr, u16 reg,
223
u8 val)
224
{
225
struct req_t req = {WRITE_I2C, addr, reg, 1, 1, 1, &val};
226
227
if (addr == af9015_af9013_config[0].demod_address ||
228
addr == af9015_af9013_config[1].demod_address)
229
req.addr_len = 3;
230
231
return af9015_ctrl_msg(d, &req);
232
}
233
234
static int af9015_read_reg_i2c(struct dvb_usb_device *d, u8 addr, u16 reg,
235
u8 *val)
236
{
237
struct req_t req = {READ_I2C, addr, reg, 0, 1, 1, val};
238
239
if (addr == af9015_af9013_config[0].demod_address ||
240
addr == af9015_af9013_config[1].demod_address)
241
req.addr_len = 3;
242
243
return af9015_ctrl_msg(d, &req);
244
}
245
246
static int af9015_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
247
int num)
248
{
249
struct dvb_usb_device *d = i2c_get_adapdata(adap);
250
int ret = 0, i = 0;
251
u16 addr;
252
u8 uninitialized_var(mbox), addr_len;
253
struct req_t req;
254
255
/* TODO: implement bus lock
256
257
The bus lock is needed because there is two tuners both using same I2C-address.
258
Due to that the only way to select correct tuner is use demodulator I2C-gate.
259
260
................................................
261
. AF9015 includes integrated AF9013 demodulator.
262
. ____________ ____________ . ____________
263
.| uC | | demod | . | tuner |
264
.|------------| |------------| . |------------|
265
.| AF9015 | | AF9013/5 | . | MXL5003 |
266
.| |--+----I2C-------|-----/ -----|-.-----I2C-------| |
267
.| | | | addr 0x38 | . | addr 0xc6 |
268
.|____________| | |____________| . |____________|
269
.................|..............................
270
| ____________ ____________
271
| | demod | | tuner |
272
| |------------| |------------|
273
| | AF9013 | | MXL5003 |
274
+----I2C-------|-----/ -----|-------I2C-------| |
275
| addr 0x3a | | addr 0xc6 |
276
|____________| |____________|
277
*/
278
if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
279
return -EAGAIN;
280
281
while (i < num) {
282
if (msg[i].addr == af9015_af9013_config[0].demod_address ||
283
msg[i].addr == af9015_af9013_config[1].demod_address) {
284
addr = msg[i].buf[0] << 8;
285
addr += msg[i].buf[1];
286
mbox = msg[i].buf[2];
287
addr_len = 3;
288
} else {
289
addr = msg[i].buf[0];
290
addr_len = 1;
291
/* mbox is don't care in that case */
292
}
293
294
if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
295
if (msg[i].addr ==
296
af9015_af9013_config[0].demod_address)
297
req.cmd = READ_MEMORY;
298
else
299
req.cmd = READ_I2C;
300
req.i2c_addr = msg[i].addr;
301
req.addr = addr;
302
req.mbox = mbox;
303
req.addr_len = addr_len;
304
req.data_len = msg[i+1].len;
305
req.data = &msg[i+1].buf[0];
306
ret = af9015_ctrl_msg(d, &req);
307
i += 2;
308
} else if (msg[i].flags & I2C_M_RD) {
309
ret = -EINVAL;
310
if (msg[i].addr ==
311
af9015_af9013_config[0].demod_address)
312
goto error;
313
else
314
req.cmd = READ_I2C;
315
req.i2c_addr = msg[i].addr;
316
req.addr = addr;
317
req.mbox = mbox;
318
req.addr_len = addr_len;
319
req.data_len = msg[i].len;
320
req.data = &msg[i].buf[0];
321
ret = af9015_ctrl_msg(d, &req);
322
i += 1;
323
} else {
324
if (msg[i].addr ==
325
af9015_af9013_config[0].demod_address)
326
req.cmd = WRITE_MEMORY;
327
else
328
req.cmd = WRITE_I2C;
329
req.i2c_addr = msg[i].addr;
330
req.addr = addr;
331
req.mbox = mbox;
332
req.addr_len = addr_len;
333
req.data_len = msg[i].len-addr_len;
334
req.data = &msg[i].buf[addr_len];
335
ret = af9015_ctrl_msg(d, &req);
336
i += 1;
337
}
338
if (ret)
339
goto error;
340
341
}
342
ret = i;
343
344
error:
345
mutex_unlock(&d->i2c_mutex);
346
347
return ret;
348
}
349
350
static u32 af9015_i2c_func(struct i2c_adapter *adapter)
351
{
352
return I2C_FUNC_I2C;
353
}
354
355
static struct i2c_algorithm af9015_i2c_algo = {
356
.master_xfer = af9015_i2c_xfer,
357
.functionality = af9015_i2c_func,
358
};
359
360
static int af9015_do_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit, u8 op)
361
{
362
int ret;
363
u8 val, mask = 0x01;
364
365
ret = af9015_read_reg(d, addr, &val);
366
if (ret)
367
return ret;
368
369
mask <<= bit;
370
if (op) {
371
/* set bit */
372
val |= mask;
373
} else {
374
/* clear bit */
375
mask ^= 0xff;
376
val &= mask;
377
}
378
379
return af9015_write_reg(d, addr, val);
380
}
381
382
static int af9015_set_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit)
383
{
384
return af9015_do_reg_bit(d, addr, bit, 1);
385
}
386
387
static int af9015_clear_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit)
388
{
389
return af9015_do_reg_bit(d, addr, bit, 0);
390
}
391
392
static int af9015_init_endpoint(struct dvb_usb_device *d)
393
{
394
int ret;
395
u16 frame_size;
396
u8 packet_size;
397
deb_info("%s: USB speed:%d\n", __func__, d->udev->speed);
398
399
/* Windows driver uses packet count 21 for USB1.1 and 348 for USB2.0.
400
We use smaller - about 1/4 from the original, 5 and 87. */
401
#define TS_PACKET_SIZE 188
402
403
#define TS_USB20_PACKET_COUNT 87
404
#define TS_USB20_FRAME_SIZE (TS_PACKET_SIZE*TS_USB20_PACKET_COUNT)
405
406
#define TS_USB11_PACKET_COUNT 5
407
#define TS_USB11_FRAME_SIZE (TS_PACKET_SIZE*TS_USB11_PACKET_COUNT)
408
409
#define TS_USB20_MAX_PACKET_SIZE 512
410
#define TS_USB11_MAX_PACKET_SIZE 64
411
412
if (d->udev->speed == USB_SPEED_FULL) {
413
frame_size = TS_USB11_FRAME_SIZE/4;
414
packet_size = TS_USB11_MAX_PACKET_SIZE/4;
415
} else {
416
frame_size = TS_USB20_FRAME_SIZE/4;
417
packet_size = TS_USB20_MAX_PACKET_SIZE/4;
418
}
419
420
ret = af9015_set_reg_bit(d, 0xd507, 2); /* assert EP4 reset */
421
if (ret)
422
goto error;
423
ret = af9015_set_reg_bit(d, 0xd50b, 1); /* assert EP5 reset */
424
if (ret)
425
goto error;
426
ret = af9015_clear_reg_bit(d, 0xdd11, 5); /* disable EP4 */
427
if (ret)
428
goto error;
429
ret = af9015_clear_reg_bit(d, 0xdd11, 6); /* disable EP5 */
430
if (ret)
431
goto error;
432
ret = af9015_set_reg_bit(d, 0xdd11, 5); /* enable EP4 */
433
if (ret)
434
goto error;
435
if (af9015_config.dual_mode) {
436
ret = af9015_set_reg_bit(d, 0xdd11, 6); /* enable EP5 */
437
if (ret)
438
goto error;
439
}
440
ret = af9015_clear_reg_bit(d, 0xdd13, 5); /* disable EP4 NAK */
441
if (ret)
442
goto error;
443
if (af9015_config.dual_mode) {
444
ret = af9015_clear_reg_bit(d, 0xdd13, 6); /* disable EP5 NAK */
445
if (ret)
446
goto error;
447
}
448
/* EP4 xfer length */
449
ret = af9015_write_reg(d, 0xdd88, frame_size & 0xff);
450
if (ret)
451
goto error;
452
ret = af9015_write_reg(d, 0xdd89, frame_size >> 8);
453
if (ret)
454
goto error;
455
/* EP5 xfer length */
456
ret = af9015_write_reg(d, 0xdd8a, frame_size & 0xff);
457
if (ret)
458
goto error;
459
ret = af9015_write_reg(d, 0xdd8b, frame_size >> 8);
460
if (ret)
461
goto error;
462
ret = af9015_write_reg(d, 0xdd0c, packet_size); /* EP4 packet size */
463
if (ret)
464
goto error;
465
ret = af9015_write_reg(d, 0xdd0d, packet_size); /* EP5 packet size */
466
if (ret)
467
goto error;
468
ret = af9015_clear_reg_bit(d, 0xd507, 2); /* negate EP4 reset */
469
if (ret)
470
goto error;
471
if (af9015_config.dual_mode) {
472
ret = af9015_clear_reg_bit(d, 0xd50b, 1); /* negate EP5 reset */
473
if (ret)
474
goto error;
475
}
476
477
/* enable / disable mp2if2 */
478
if (af9015_config.dual_mode)
479
ret = af9015_set_reg_bit(d, 0xd50b, 0);
480
else
481
ret = af9015_clear_reg_bit(d, 0xd50b, 0);
482
483
error:
484
if (ret)
485
err("endpoint init failed:%d", ret);
486
return ret;
487
}
488
489
static int af9015_copy_firmware(struct dvb_usb_device *d)
490
{
491
int ret;
492
u8 fw_params[4];
493
u8 val, i;
494
struct req_t req = {COPY_FIRMWARE, 0, 0x5100, 0, 0, sizeof(fw_params),
495
fw_params };
496
deb_info("%s:\n", __func__);
497
498
fw_params[0] = af9015_config.firmware_size >> 8;
499
fw_params[1] = af9015_config.firmware_size & 0xff;
500
fw_params[2] = af9015_config.firmware_checksum >> 8;
501
fw_params[3] = af9015_config.firmware_checksum & 0xff;
502
503
/* wait 2nd demodulator ready */
504
msleep(100);
505
506
ret = af9015_read_reg_i2c(d,
507
af9015_af9013_config[1].demod_address, 0x98be, &val);
508
if (ret)
509
goto error;
510
else
511
deb_info("%s: firmware status:%02x\n", __func__, val);
512
513
if (val == 0x0c) /* fw is running, no need for download */
514
goto exit;
515
516
/* set I2C master clock to fast (to speed up firmware copy) */
517
ret = af9015_write_reg(d, 0xd416, 0x04); /* 0x04 * 400ns */
518
if (ret)
519
goto error;
520
521
msleep(50);
522
523
/* copy firmware */
524
ret = af9015_ctrl_msg(d, &req);
525
if (ret)
526
err("firmware copy cmd failed:%d", ret);
527
deb_info("%s: firmware copy done\n", __func__);
528
529
/* set I2C master clock back to normal */
530
ret = af9015_write_reg(d, 0xd416, 0x14); /* 0x14 * 400ns */
531
if (ret)
532
goto error;
533
534
/* request boot firmware */
535
ret = af9015_write_reg_i2c(d, af9015_af9013_config[1].demod_address,
536
0xe205, 1);
537
deb_info("%s: firmware boot cmd status:%d\n", __func__, ret);
538
if (ret)
539
goto error;
540
541
for (i = 0; i < 15; i++) {
542
msleep(100);
543
544
/* check firmware status */
545
ret = af9015_read_reg_i2c(d,
546
af9015_af9013_config[1].demod_address, 0x98be, &val);
547
deb_info("%s: firmware status cmd status:%d fw status:%02x\n",
548
__func__, ret, val);
549
if (ret)
550
goto error;
551
552
if (val == 0x0c || val == 0x04) /* success or fail */
553
break;
554
}
555
556
if (val == 0x04) {
557
err("firmware did not run");
558
ret = -1;
559
} else if (val != 0x0c) {
560
err("firmware boot timeout");
561
ret = -1;
562
}
563
564
error:
565
exit:
566
return ret;
567
}
568
569
/* hash (and dump) eeprom */
570
static int af9015_eeprom_hash(struct usb_device *udev)
571
{
572
static const unsigned int eeprom_size = 256;
573
unsigned int reg;
574
int ret;
575
u8 val, *eeprom;
576
struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val};
577
578
eeprom = kmalloc(eeprom_size, GFP_KERNEL);
579
if (eeprom == NULL)
580
return -ENOMEM;
581
582
for (reg = 0; reg < eeprom_size; reg++) {
583
req.addr = reg;
584
ret = af9015_rw_udev(udev, &req);
585
if (ret)
586
goto free;
587
eeprom[reg] = val;
588
}
589
590
if (dvb_usb_af9015_debug & 0x01)
591
print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, eeprom,
592
eeprom_size);
593
594
BUG_ON(eeprom_size % 4);
595
596
af9015_config.eeprom_sum = 0;
597
for (reg = 0; reg < eeprom_size / sizeof(u32); reg++) {
598
af9015_config.eeprom_sum *= GOLDEN_RATIO_PRIME_32;
599
af9015_config.eeprom_sum += le32_to_cpu(((u32 *)eeprom)[reg]);
600
}
601
602
deb_info("%s: eeprom sum=%.8x\n", __func__, af9015_config.eeprom_sum);
603
604
ret = 0;
605
free:
606
kfree(eeprom);
607
return ret;
608
}
609
610
static int af9015_init(struct dvb_usb_device *d)
611
{
612
int ret;
613
deb_info("%s:\n", __func__);
614
615
/* init RC canary */
616
ret = af9015_write_reg(d, 0x98e9, 0xff);
617
if (ret)
618
goto error;
619
620
ret = af9015_init_endpoint(d);
621
if (ret)
622
goto error;
623
624
error:
625
return ret;
626
}
627
628
static int af9015_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
629
{
630
int ret;
631
deb_info("%s: onoff:%d\n", __func__, onoff);
632
633
if (onoff)
634
ret = af9015_set_reg_bit(adap->dev, 0xd503, 0);
635
else
636
ret = af9015_clear_reg_bit(adap->dev, 0xd503, 0);
637
638
return ret;
639
}
640
641
static int af9015_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
642
int onoff)
643
{
644
int ret;
645
u8 idx;
646
647
deb_info("%s: set pid filter, index %d, pid %x, onoff %d\n",
648
__func__, index, pid, onoff);
649
650
ret = af9015_write_reg(adap->dev, 0xd505, (pid & 0xff));
651
if (ret)
652
goto error;
653
654
ret = af9015_write_reg(adap->dev, 0xd506, (pid >> 8));
655
if (ret)
656
goto error;
657
658
idx = ((index & 0x1f) | (1 << 5));
659
ret = af9015_write_reg(adap->dev, 0xd504, idx);
660
661
error:
662
return ret;
663
}
664
665
static int af9015_download_firmware(struct usb_device *udev,
666
const struct firmware *fw)
667
{
668
int i, len, remaining, ret;
669
struct req_t req = {DOWNLOAD_FIRMWARE, 0, 0, 0, 0, 0, NULL};
670
u16 checksum = 0;
671
672
deb_info("%s:\n", __func__);
673
674
/* calc checksum */
675
for (i = 0; i < fw->size; i++)
676
checksum += fw->data[i];
677
678
af9015_config.firmware_size = fw->size;
679
af9015_config.firmware_checksum = checksum;
680
681
#define FW_ADDR 0x5100 /* firmware start address */
682
#define LEN_MAX 55 /* max packet size */
683
for (remaining = fw->size; remaining > 0; remaining -= LEN_MAX) {
684
len = remaining;
685
if (len > LEN_MAX)
686
len = LEN_MAX;
687
688
req.data_len = len;
689
req.data = (u8 *) &fw->data[fw->size - remaining];
690
req.addr = FW_ADDR + fw->size - remaining;
691
692
ret = af9015_rw_udev(udev, &req);
693
if (ret) {
694
err("firmware download failed:%d", ret);
695
goto error;
696
}
697
}
698
699
/* firmware loaded, request boot */
700
req.cmd = BOOT;
701
ret = af9015_rw_udev(udev, &req);
702
if (ret) {
703
err("firmware boot failed:%d", ret);
704
goto error;
705
}
706
707
error:
708
return ret;
709
}
710
711
struct af9015_rc_setup {
712
unsigned int id;
713
char *rc_codes;
714
};
715
716
static char *af9015_rc_setup_match(unsigned int id,
717
const struct af9015_rc_setup *table)
718
{
719
for (; table->rc_codes; table++)
720
if (table->id == id)
721
return table->rc_codes;
722
return NULL;
723
}
724
725
static const struct af9015_rc_setup af9015_rc_setup_modparam[] = {
726
{ AF9015_REMOTE_A_LINK_DTU_M, RC_MAP_ALINK_DTU_M },
727
{ AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3, RC_MAP_MSI_DIGIVOX_II },
728
{ AF9015_REMOTE_MYGICTV_U718, RC_MAP_TOTAL_MEDIA_IN_HAND },
729
{ AF9015_REMOTE_DIGITTRADE_DVB_T, RC_MAP_DIGITTRADE },
730
{ AF9015_REMOTE_AVERMEDIA_KS, RC_MAP_AVERMEDIA_RM_KS },
731
{ }
732
};
733
734
static const struct af9015_rc_setup af9015_rc_setup_hashes[] = {
735
{ 0xb8feb708, RC_MAP_MSI_DIGIVOX_II },
736
{ 0xa3703d00, RC_MAP_ALINK_DTU_M },
737
{ 0x9b7dc64e, RC_MAP_TOTAL_MEDIA_IN_HAND }, /* MYGICTV U718 */
738
{ }
739
};
740
741
static const struct af9015_rc_setup af9015_rc_setup_usbids[] = {
742
{ (USB_VID_TERRATEC << 16) + USB_PID_TERRATEC_CINERGY_T_STICK_RC,
743
RC_MAP_TERRATEC_SLIM_2 },
744
{ (USB_VID_TERRATEC << 16) + USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC,
745
RC_MAP_TERRATEC_SLIM },
746
{ (USB_VID_VISIONPLUS << 16) + USB_PID_AZUREWAVE_AD_TU700,
747
RC_MAP_AZUREWAVE_AD_TU700 },
748
{ (USB_VID_VISIONPLUS << 16) + USB_PID_TINYTWIN,
749
RC_MAP_AZUREWAVE_AD_TU700 },
750
{ (USB_VID_MSI_2 << 16) + USB_PID_MSI_DIGI_VOX_MINI_III,
751
RC_MAP_MSI_DIGIVOX_III },
752
{ (USB_VID_LEADTEK << 16) + USB_PID_WINFAST_DTV_DONGLE_GOLD,
753
RC_MAP_LEADTEK_Y04G0051 },
754
{ (USB_VID_AVERMEDIA << 16) + USB_PID_AVERMEDIA_VOLAR_X,
755
RC_MAP_AVERMEDIA_M135A },
756
{ (USB_VID_AFATECH << 16) + USB_PID_TREKSTOR_DVBT,
757
RC_MAP_TREKSTOR },
758
{ (USB_VID_KWORLD_2 << 16) + USB_PID_TINYTWIN_2,
759
RC_MAP_DIGITALNOW_TINYTWIN },
760
{ (USB_VID_GTEK << 16) + USB_PID_TINYTWIN_3,
761
RC_MAP_DIGITALNOW_TINYTWIN },
762
{ }
763
};
764
765
static void af9015_set_remote_config(struct usb_device *udev,
766
struct dvb_usb_device_properties *props)
767
{
768
u16 vid = le16_to_cpu(udev->descriptor.idVendor);
769
u16 pid = le16_to_cpu(udev->descriptor.idProduct);
770
771
/* try to load remote based module param */
772
props->rc.core.rc_codes = af9015_rc_setup_match(
773
dvb_usb_af9015_remote, af9015_rc_setup_modparam);
774
775
/* try to load remote based eeprom hash */
776
if (!props->rc.core.rc_codes)
777
props->rc.core.rc_codes = af9015_rc_setup_match(
778
af9015_config.eeprom_sum, af9015_rc_setup_hashes);
779
780
/* try to load remote based USB ID */
781
if (!props->rc.core.rc_codes)
782
props->rc.core.rc_codes = af9015_rc_setup_match(
783
(vid << 16) + pid, af9015_rc_setup_usbids);
784
785
/* try to load remote based USB iManufacturer string */
786
if (!props->rc.core.rc_codes && vid == USB_VID_AFATECH) {
787
/* Check USB manufacturer and product strings and try
788
to determine correct remote in case of chip vendor
789
reference IDs are used.
790
DO NOT ADD ANYTHING NEW HERE. Use hashes instead. */
791
char manufacturer[10];
792
memset(manufacturer, 0, sizeof(manufacturer));
793
usb_string(udev, udev->descriptor.iManufacturer,
794
manufacturer, sizeof(manufacturer));
795
if (!strcmp("MSI", manufacturer)) {
796
/* iManufacturer 1 MSI
797
iProduct 2 MSI K-VOX */
798
props->rc.core.rc_codes = af9015_rc_setup_match(
799
AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
800
af9015_rc_setup_modparam);
801
}
802
}
803
804
/* finally load "empty" just for leaving IR receiver enabled */
805
if (!props->rc.core.rc_codes)
806
props->rc.core.rc_codes = RC_MAP_EMPTY;
807
808
return;
809
}
810
811
static int af9015_read_config(struct usb_device *udev)
812
{
813
int ret;
814
u8 val, i, offset = 0;
815
struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val};
816
817
/* IR remote controller */
818
req.addr = AF9015_EEPROM_IR_MODE;
819
/* first message will timeout often due to possible hw bug */
820
for (i = 0; i < 4; i++) {
821
ret = af9015_rw_udev(udev, &req);
822
if (!ret)
823
break;
824
}
825
if (ret)
826
goto error;
827
828
ret = af9015_eeprom_hash(udev);
829
if (ret)
830
goto error;
831
832
deb_info("%s: IR mode:%d\n", __func__, val);
833
for (i = 0; i < af9015_properties_count; i++) {
834
if (val == AF9015_IR_MODE_DISABLED)
835
af9015_properties[i].rc.core.rc_codes = NULL;
836
else
837
af9015_set_remote_config(udev, &af9015_properties[i]);
838
}
839
840
/* TS mode - one or two receivers */
841
req.addr = AF9015_EEPROM_TS_MODE;
842
ret = af9015_rw_udev(udev, &req);
843
if (ret)
844
goto error;
845
af9015_config.dual_mode = val;
846
deb_info("%s: TS mode:%d\n", __func__, af9015_config.dual_mode);
847
848
/* Set adapter0 buffer size according to USB port speed, adapter1 buffer
849
size can be static because it is enabled only USB2.0 */
850
for (i = 0; i < af9015_properties_count; i++) {
851
/* USB1.1 set smaller buffersize and disable 2nd adapter */
852
if (udev->speed == USB_SPEED_FULL) {
853
af9015_properties[i].adapter[0].stream.u.bulk.buffersize
854
= TS_USB11_FRAME_SIZE;
855
/* disable 2nd adapter because we don't have
856
PID-filters */
857
af9015_config.dual_mode = 0;
858
} else {
859
af9015_properties[i].adapter[0].stream.u.bulk.buffersize
860
= TS_USB20_FRAME_SIZE;
861
}
862
}
863
864
if (af9015_config.dual_mode) {
865
/* read 2nd demodulator I2C address */
866
req.addr = AF9015_EEPROM_DEMOD2_I2C;
867
ret = af9015_rw_udev(udev, &req);
868
if (ret)
869
goto error;
870
af9015_af9013_config[1].demod_address = val;
871
872
/* enable 2nd adapter */
873
for (i = 0; i < af9015_properties_count; i++)
874
af9015_properties[i].num_adapters = 2;
875
876
} else {
877
/* disable 2nd adapter */
878
for (i = 0; i < af9015_properties_count; i++)
879
af9015_properties[i].num_adapters = 1;
880
}
881
882
for (i = 0; i < af9015_properties[0].num_adapters; i++) {
883
if (i == 1)
884
offset = AF9015_EEPROM_OFFSET;
885
/* xtal */
886
req.addr = AF9015_EEPROM_XTAL_TYPE1 + offset;
887
ret = af9015_rw_udev(udev, &req);
888
if (ret)
889
goto error;
890
switch (val) {
891
case 0:
892
af9015_af9013_config[i].adc_clock = 28800;
893
break;
894
case 1:
895
af9015_af9013_config[i].adc_clock = 20480;
896
break;
897
case 2:
898
af9015_af9013_config[i].adc_clock = 28000;
899
break;
900
case 3:
901
af9015_af9013_config[i].adc_clock = 25000;
902
break;
903
};
904
deb_info("%s: [%d] xtal:%d set adc_clock:%d\n", __func__, i,
905
val, af9015_af9013_config[i].adc_clock);
906
907
/* tuner IF */
908
req.addr = AF9015_EEPROM_IF1H + offset;
909
ret = af9015_rw_udev(udev, &req);
910
if (ret)
911
goto error;
912
af9015_af9013_config[i].tuner_if = val << 8;
913
req.addr = AF9015_EEPROM_IF1L + offset;
914
ret = af9015_rw_udev(udev, &req);
915
if (ret)
916
goto error;
917
af9015_af9013_config[i].tuner_if += val;
918
deb_info("%s: [%d] IF1:%d\n", __func__, i,
919
af9015_af9013_config[0].tuner_if);
920
921
/* MT2060 IF1 */
922
req.addr = AF9015_EEPROM_MT2060_IF1H + offset;
923
ret = af9015_rw_udev(udev, &req);
924
if (ret)
925
goto error;
926
af9015_config.mt2060_if1[i] = val << 8;
927
req.addr = AF9015_EEPROM_MT2060_IF1L + offset;
928
ret = af9015_rw_udev(udev, &req);
929
if (ret)
930
goto error;
931
af9015_config.mt2060_if1[i] += val;
932
deb_info("%s: [%d] MT2060 IF1:%d\n", __func__, i,
933
af9015_config.mt2060_if1[i]);
934
935
/* tuner */
936
req.addr = AF9015_EEPROM_TUNER_ID1 + offset;
937
ret = af9015_rw_udev(udev, &req);
938
if (ret)
939
goto error;
940
switch (val) {
941
case AF9013_TUNER_ENV77H11D5:
942
case AF9013_TUNER_MT2060:
943
case AF9013_TUNER_QT1010:
944
case AF9013_TUNER_UNKNOWN:
945
case AF9013_TUNER_MT2060_2:
946
case AF9013_TUNER_TDA18271:
947
case AF9013_TUNER_QT1010A:
948
case AF9013_TUNER_TDA18218:
949
af9015_af9013_config[i].rf_spec_inv = 1;
950
break;
951
case AF9013_TUNER_MXL5003D:
952
case AF9013_TUNER_MXL5005D:
953
case AF9013_TUNER_MXL5005R:
954
case AF9013_TUNER_MXL5007T:
955
af9015_af9013_config[i].rf_spec_inv = 0;
956
break;
957
case AF9013_TUNER_MC44S803:
958
af9015_af9013_config[i].gpio[1] = AF9013_GPIO_LO;
959
af9015_af9013_config[i].rf_spec_inv = 1;
960
break;
961
default:
962
warn("tuner id:%d not supported, please report!", val);
963
return -ENODEV;
964
};
965
966
af9015_af9013_config[i].tuner = val;
967
deb_info("%s: [%d] tuner id:%d\n", __func__, i, val);
968
}
969
970
error:
971
if (ret)
972
err("eeprom read failed:%d", ret);
973
974
/* AverMedia AVerTV Volar Black HD (A850) device have bad EEPROM
975
content :-( Override some wrong values here. Ditto for the
976
AVerTV Red HD+ (A850T) device. */
977
if (le16_to_cpu(udev->descriptor.idVendor) == USB_VID_AVERMEDIA &&
978
((le16_to_cpu(udev->descriptor.idProduct) ==
979
USB_PID_AVERMEDIA_A850) ||
980
(le16_to_cpu(udev->descriptor.idProduct) ==
981
USB_PID_AVERMEDIA_A850T))) {
982
deb_info("%s: AverMedia A850: overriding config\n", __func__);
983
/* disable dual mode */
984
af9015_config.dual_mode = 0;
985
/* disable 2nd adapter */
986
for (i = 0; i < af9015_properties_count; i++)
987
af9015_properties[i].num_adapters = 1;
988
989
/* set correct IF */
990
af9015_af9013_config[0].tuner_if = 4570;
991
}
992
993
return ret;
994
}
995
996
static int af9015_identify_state(struct usb_device *udev,
997
struct dvb_usb_device_properties *props,
998
struct dvb_usb_device_description **desc,
999
int *cold)
1000
{
1001
int ret;
1002
u8 reply;
1003
struct req_t req = {GET_CONFIG, 0, 0, 0, 0, 1, &reply};
1004
1005
ret = af9015_rw_udev(udev, &req);
1006
if (ret)
1007
return ret;
1008
1009
deb_info("%s: reply:%02x\n", __func__, reply);
1010
if (reply == 0x02)
1011
*cold = 0;
1012
else
1013
*cold = 1;
1014
1015
return ret;
1016
}
1017
1018
static int af9015_rc_query(struct dvb_usb_device *d)
1019
{
1020
struct af9015_state *priv = d->priv;
1021
int ret;
1022
u8 buf[17];
1023
1024
/* read registers needed to detect remote controller code */
1025
ret = af9015_read_regs(d, 0x98d9, buf, sizeof(buf));
1026
if (ret)
1027
goto error;
1028
1029
/* If any of these are non-zero, assume invalid data */
1030
if (buf[1] || buf[2] || buf[3])
1031
return ret;
1032
1033
/* Check for repeat of previous code */
1034
if ((priv->rc_repeat != buf[6] || buf[0]) &&
1035
!memcmp(&buf[12], priv->rc_last, 4)) {
1036
deb_rc("%s: key repeated\n", __func__);
1037
rc_keydown(d->rc_dev, priv->rc_keycode, 0);
1038
priv->rc_repeat = buf[6];
1039
return ret;
1040
}
1041
1042
/* Only process key if canary killed */
1043
if (buf[16] != 0xff && buf[0] != 0x01) {
1044
deb_rc("%s: key pressed %02x %02x %02x %02x\n", __func__,
1045
buf[12], buf[13], buf[14], buf[15]);
1046
1047
/* Reset the canary */
1048
ret = af9015_write_reg(d, 0x98e9, 0xff);
1049
if (ret)
1050
goto error;
1051
1052
/* Remember this key */
1053
memcpy(priv->rc_last, &buf[12], 4);
1054
if (buf[14] == (u8) ~buf[15]) {
1055
if (buf[12] == (u8) ~buf[13]) {
1056
/* NEC */
1057
priv->rc_keycode = buf[12] << 8 | buf[14];
1058
} else {
1059
/* NEC extended*/
1060
priv->rc_keycode = buf[12] << 16 |
1061
buf[13] << 8 | buf[14];
1062
}
1063
} else {
1064
/* 32 bit NEC */
1065
priv->rc_keycode = buf[12] << 24 | buf[13] << 16 |
1066
buf[14] << 8 | buf[15];
1067
}
1068
rc_keydown(d->rc_dev, priv->rc_keycode, 0);
1069
} else {
1070
deb_rc("%s: no key press\n", __func__);
1071
/* Invalidate last keypress */
1072
/* Not really needed, but helps with debug */
1073
priv->rc_last[2] = priv->rc_last[3];
1074
}
1075
1076
priv->rc_repeat = buf[6];
1077
1078
error:
1079
if (ret)
1080
err("%s: failed:%d", __func__, ret);
1081
1082
return ret;
1083
}
1084
1085
/* init 2nd I2C adapter */
1086
static int af9015_i2c_init(struct dvb_usb_device *d)
1087
{
1088
int ret;
1089
struct af9015_state *state = d->priv;
1090
deb_info("%s:\n", __func__);
1091
1092
strncpy(state->i2c_adap.name, d->desc->name,
1093
sizeof(state->i2c_adap.name));
1094
state->i2c_adap.algo = d->props.i2c_algo;
1095
state->i2c_adap.algo_data = NULL;
1096
state->i2c_adap.dev.parent = &d->udev->dev;
1097
1098
i2c_set_adapdata(&state->i2c_adap, d);
1099
1100
ret = i2c_add_adapter(&state->i2c_adap);
1101
if (ret < 0)
1102
err("could not add i2c adapter");
1103
1104
return ret;
1105
}
1106
1107
static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap)
1108
{
1109
int ret;
1110
struct af9015_state *state = adap->dev->priv;
1111
struct i2c_adapter *i2c_adap;
1112
1113
if (adap->id == 0) {
1114
/* select I2C adapter */
1115
i2c_adap = &adap->dev->i2c_adap;
1116
1117
deb_info("%s: init I2C\n", __func__);
1118
ret = af9015_i2c_init(adap->dev);
1119
} else {
1120
/* select I2C adapter */
1121
i2c_adap = &state->i2c_adap;
1122
1123
/* copy firmware to 2nd demodulator */
1124
if (af9015_config.dual_mode) {
1125
ret = af9015_copy_firmware(adap->dev);
1126
if (ret) {
1127
err("firmware copy to 2nd frontend " \
1128
"failed, will disable it");
1129
af9015_config.dual_mode = 0;
1130
return -ENODEV;
1131
}
1132
} else {
1133
return -ENODEV;
1134
}
1135
}
1136
1137
/* attach demodulator */
1138
adap->fe = dvb_attach(af9013_attach, &af9015_af9013_config[adap->id],
1139
i2c_adap);
1140
1141
return adap->fe == NULL ? -ENODEV : 0;
1142
}
1143
1144
static struct mt2060_config af9015_mt2060_config = {
1145
.i2c_address = 0xc0,
1146
.clock_out = 0,
1147
};
1148
1149
static struct qt1010_config af9015_qt1010_config = {
1150
.i2c_address = 0xc4,
1151
};
1152
1153
static struct tda18271_config af9015_tda18271_config = {
1154
.gate = TDA18271_GATE_DIGITAL,
1155
.small_i2c = TDA18271_16_BYTE_CHUNK_INIT,
1156
};
1157
1158
static struct mxl5005s_config af9015_mxl5003_config = {
1159
.i2c_address = 0xc6,
1160
.if_freq = IF_FREQ_4570000HZ,
1161
.xtal_freq = CRYSTAL_FREQ_16000000HZ,
1162
.agc_mode = MXL_SINGLE_AGC,
1163
.tracking_filter = MXL_TF_DEFAULT,
1164
.rssi_enable = MXL_RSSI_ENABLE,
1165
.cap_select = MXL_CAP_SEL_ENABLE,
1166
.div_out = MXL_DIV_OUT_4,
1167
.clock_out = MXL_CLOCK_OUT_DISABLE,
1168
.output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
1169
.top = MXL5005S_TOP_25P2,
1170
.mod_mode = MXL_DIGITAL_MODE,
1171
.if_mode = MXL_ZERO_IF,
1172
.AgcMasterByte = 0x00,
1173
};
1174
1175
static struct mxl5005s_config af9015_mxl5005_config = {
1176
.i2c_address = 0xc6,
1177
.if_freq = IF_FREQ_4570000HZ,
1178
.xtal_freq = CRYSTAL_FREQ_16000000HZ,
1179
.agc_mode = MXL_SINGLE_AGC,
1180
.tracking_filter = MXL_TF_OFF,
1181
.rssi_enable = MXL_RSSI_ENABLE,
1182
.cap_select = MXL_CAP_SEL_ENABLE,
1183
.div_out = MXL_DIV_OUT_4,
1184
.clock_out = MXL_CLOCK_OUT_DISABLE,
1185
.output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
1186
.top = MXL5005S_TOP_25P2,
1187
.mod_mode = MXL_DIGITAL_MODE,
1188
.if_mode = MXL_ZERO_IF,
1189
.AgcMasterByte = 0x00,
1190
};
1191
1192
static struct mc44s803_config af9015_mc44s803_config = {
1193
.i2c_address = 0xc0,
1194
.dig_out = 1,
1195
};
1196
1197
static struct tda18218_config af9015_tda18218_config = {
1198
.i2c_address = 0xc0,
1199
.i2c_wr_max = 21, /* max wr bytes AF9015 I2C adap can handle at once */
1200
};
1201
1202
static struct mxl5007t_config af9015_mxl5007t_config = {
1203
.xtal_freq_hz = MxL_XTAL_24_MHZ,
1204
.if_freq_hz = MxL_IF_4_57_MHZ,
1205
};
1206
1207
static int af9015_tuner_attach(struct dvb_usb_adapter *adap)
1208
{
1209
struct af9015_state *state = adap->dev->priv;
1210
struct i2c_adapter *i2c_adap;
1211
int ret;
1212
deb_info("%s:\n", __func__);
1213
1214
/* select I2C adapter */
1215
if (adap->id == 0)
1216
i2c_adap = &adap->dev->i2c_adap;
1217
else
1218
i2c_adap = &state->i2c_adap;
1219
1220
switch (af9015_af9013_config[adap->id].tuner) {
1221
case AF9013_TUNER_MT2060:
1222
case AF9013_TUNER_MT2060_2:
1223
ret = dvb_attach(mt2060_attach, adap->fe, i2c_adap,
1224
&af9015_mt2060_config,
1225
af9015_config.mt2060_if1[adap->id])
1226
== NULL ? -ENODEV : 0;
1227
break;
1228
case AF9013_TUNER_QT1010:
1229
case AF9013_TUNER_QT1010A:
1230
ret = dvb_attach(qt1010_attach, adap->fe, i2c_adap,
1231
&af9015_qt1010_config) == NULL ? -ENODEV : 0;
1232
break;
1233
case AF9013_TUNER_TDA18271:
1234
ret = dvb_attach(tda18271_attach, adap->fe, 0xc0, i2c_adap,
1235
&af9015_tda18271_config) == NULL ? -ENODEV : 0;
1236
break;
1237
case AF9013_TUNER_TDA18218:
1238
ret = dvb_attach(tda18218_attach, adap->fe, i2c_adap,
1239
&af9015_tda18218_config) == NULL ? -ENODEV : 0;
1240
break;
1241
case AF9013_TUNER_MXL5003D:
1242
ret = dvb_attach(mxl5005s_attach, adap->fe, i2c_adap,
1243
&af9015_mxl5003_config) == NULL ? -ENODEV : 0;
1244
break;
1245
case AF9013_TUNER_MXL5005D:
1246
case AF9013_TUNER_MXL5005R:
1247
ret = dvb_attach(mxl5005s_attach, adap->fe, i2c_adap,
1248
&af9015_mxl5005_config) == NULL ? -ENODEV : 0;
1249
break;
1250
case AF9013_TUNER_ENV77H11D5:
1251
ret = dvb_attach(dvb_pll_attach, adap->fe, 0xc0, i2c_adap,
1252
DVB_PLL_TDA665X) == NULL ? -ENODEV : 0;
1253
break;
1254
case AF9013_TUNER_MC44S803:
1255
ret = dvb_attach(mc44s803_attach, adap->fe, i2c_adap,
1256
&af9015_mc44s803_config) == NULL ? -ENODEV : 0;
1257
break;
1258
case AF9013_TUNER_MXL5007T:
1259
ret = dvb_attach(mxl5007t_attach, adap->fe, i2c_adap,
1260
0xc0, &af9015_mxl5007t_config) == NULL ? -ENODEV : 0;
1261
break;
1262
case AF9013_TUNER_UNKNOWN:
1263
default:
1264
ret = -ENODEV;
1265
err("Unknown tuner id:%d",
1266
af9015_af9013_config[adap->id].tuner);
1267
}
1268
return ret;
1269
}
1270
1271
static struct usb_device_id af9015_usb_table[] = {
1272
/* 0 */{USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9015_9015)},
1273
{USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9015_9016)},
1274
{USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_GOLD)},
1275
{USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV71E)},
1276
{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U)},
1277
/* 5 */{USB_DEVICE(USB_VID_VISIONPLUS,
1278
USB_PID_TINYTWIN)},
1279
{USB_DEVICE(USB_VID_VISIONPLUS,
1280
USB_PID_AZUREWAVE_AD_TU700)},
1281
{USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_USB_XE_REV2)},
1282
{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_2T)},
1283
{USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_X)},
1284
/* 10 */{USB_DEVICE(USB_VID_XTENSIONS, USB_PID_XTENSIONS_XD_380)},
1285
{USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGIVOX_DUO)},
1286
{USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_X_2)},
1287
{USB_DEVICE(USB_VID_TELESTAR, USB_PID_TELESTAR_STARSTICK_2)},
1288
{USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A309)},
1289
/* 15 */{USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGI_VOX_MINI_III)},
1290
{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U)},
1291
{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_2)},
1292
{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_3)},
1293
{USB_DEVICE(USB_VID_AFATECH, USB_PID_TREKSTOR_DVBT)},
1294
/* 20 */{USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850)},
1295
{USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A805)},
1296
{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_CONCEPTRONIC_CTVDIGRCU)},
1297
{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_MC810)},
1298
{USB_DEVICE(USB_VID_KYE, USB_PID_GENIUS_TVGO_DVB_T03)},
1299
/* 25 */{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U_2)},
1300
{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_T)},
1301
{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV20)},
1302
{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_TINYTWIN_2)},
1303
{USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV2000DS)},
1304
/* 30 */{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_UB383_T)},
1305
{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_4)},
1306
{USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A815M)},
1307
{USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_RC)},
1308
{USB_DEVICE(USB_VID_TERRATEC,
1309
USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC)},
1310
/* 35 */{USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850T)},
1311
{USB_DEVICE(USB_VID_GTEK, USB_PID_TINYTWIN_3)},
1312
{0},
1313
};
1314
MODULE_DEVICE_TABLE(usb, af9015_usb_table);
1315
1316
#define AF9015_RC_INTERVAL 500
1317
static struct dvb_usb_device_properties af9015_properties[] = {
1318
{
1319
.caps = DVB_USB_IS_AN_I2C_ADAPTER,
1320
1321
.usb_ctrl = DEVICE_SPECIFIC,
1322
.download_firmware = af9015_download_firmware,
1323
.firmware = "dvb-usb-af9015.fw",
1324
.no_reconnect = 1,
1325
1326
.size_of_priv = sizeof(struct af9015_state),
1327
1328
.num_adapters = 2,
1329
.adapter = {
1330
{
1331
.caps = DVB_USB_ADAP_HAS_PID_FILTER |
1332
DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1333
1334
.pid_filter_count = 32,
1335
.pid_filter = af9015_pid_filter,
1336
.pid_filter_ctrl = af9015_pid_filter_ctrl,
1337
1338
.frontend_attach =
1339
af9015_af9013_frontend_attach,
1340
.tuner_attach = af9015_tuner_attach,
1341
.stream = {
1342
.type = USB_BULK,
1343
.count = 6,
1344
.endpoint = 0x84,
1345
},
1346
},
1347
{
1348
.frontend_attach =
1349
af9015_af9013_frontend_attach,
1350
.tuner_attach = af9015_tuner_attach,
1351
.stream = {
1352
.type = USB_BULK,
1353
.count = 6,
1354
.endpoint = 0x85,
1355
.u = {
1356
.bulk = {
1357
.buffersize =
1358
TS_USB20_FRAME_SIZE,
1359
}
1360
}
1361
},
1362
}
1363
},
1364
1365
.identify_state = af9015_identify_state,
1366
1367
.rc.core = {
1368
.protocol = RC_TYPE_NEC,
1369
.module_name = "af9015",
1370
.rc_query = af9015_rc_query,
1371
.rc_interval = AF9015_RC_INTERVAL,
1372
.allowed_protos = RC_TYPE_NEC,
1373
},
1374
1375
.i2c_algo = &af9015_i2c_algo,
1376
1377
.num_device_descs = 12, /* check max from dvb-usb.h */
1378
.devices = {
1379
{
1380
.name = "Afatech AF9015 DVB-T USB2.0 stick",
1381
.cold_ids = {&af9015_usb_table[0],
1382
&af9015_usb_table[1], NULL},
1383
.warm_ids = {NULL},
1384
},
1385
{
1386
.name = "Leadtek WinFast DTV Dongle Gold",
1387
.cold_ids = {&af9015_usb_table[2], NULL},
1388
.warm_ids = {NULL},
1389
},
1390
{
1391
.name = "Pinnacle PCTV 71e",
1392
.cold_ids = {&af9015_usb_table[3], NULL},
1393
.warm_ids = {NULL},
1394
},
1395
{
1396
.name = "KWorld PlusTV Dual DVB-T Stick " \
1397
"(DVB-T 399U)",
1398
.cold_ids = {&af9015_usb_table[4],
1399
&af9015_usb_table[25], NULL},
1400
.warm_ids = {NULL},
1401
},
1402
{
1403
.name = "DigitalNow TinyTwin DVB-T Receiver",
1404
.cold_ids = {&af9015_usb_table[5],
1405
&af9015_usb_table[28],
1406
&af9015_usb_table[36], NULL},
1407
.warm_ids = {NULL},
1408
},
1409
{
1410
.name = "TwinHan AzureWave AD-TU700(704J)",
1411
.cold_ids = {&af9015_usb_table[6], NULL},
1412
.warm_ids = {NULL},
1413
},
1414
{
1415
.name = "TerraTec Cinergy T USB XE",
1416
.cold_ids = {&af9015_usb_table[7], NULL},
1417
.warm_ids = {NULL},
1418
},
1419
{
1420
.name = "KWorld PlusTV Dual DVB-T PCI " \
1421
"(DVB-T PC160-2T)",
1422
.cold_ids = {&af9015_usb_table[8], NULL},
1423
.warm_ids = {NULL},
1424
},
1425
{
1426
.name = "AVerMedia AVerTV DVB-T Volar X",
1427
.cold_ids = {&af9015_usb_table[9], NULL},
1428
.warm_ids = {NULL},
1429
},
1430
{
1431
.name = "TerraTec Cinergy T Stick RC",
1432
.cold_ids = {&af9015_usb_table[33], NULL},
1433
.warm_ids = {NULL},
1434
},
1435
{
1436
.name = "TerraTec Cinergy T Stick Dual RC",
1437
.cold_ids = {&af9015_usb_table[34], NULL},
1438
.warm_ids = {NULL},
1439
},
1440
{
1441
.name = "AverMedia AVerTV Red HD+ (A850T)",
1442
.cold_ids = {&af9015_usb_table[35], NULL},
1443
.warm_ids = {NULL},
1444
},
1445
}
1446
}, {
1447
.caps = DVB_USB_IS_AN_I2C_ADAPTER,
1448
1449
.usb_ctrl = DEVICE_SPECIFIC,
1450
.download_firmware = af9015_download_firmware,
1451
.firmware = "dvb-usb-af9015.fw",
1452
.no_reconnect = 1,
1453
1454
.size_of_priv = sizeof(struct af9015_state),
1455
1456
.num_adapters = 2,
1457
.adapter = {
1458
{
1459
.caps = DVB_USB_ADAP_HAS_PID_FILTER |
1460
DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1461
1462
.pid_filter_count = 32,
1463
.pid_filter = af9015_pid_filter,
1464
.pid_filter_ctrl = af9015_pid_filter_ctrl,
1465
1466
.frontend_attach =
1467
af9015_af9013_frontend_attach,
1468
.tuner_attach = af9015_tuner_attach,
1469
.stream = {
1470
.type = USB_BULK,
1471
.count = 6,
1472
.endpoint = 0x84,
1473
},
1474
},
1475
{
1476
.frontend_attach =
1477
af9015_af9013_frontend_attach,
1478
.tuner_attach = af9015_tuner_attach,
1479
.stream = {
1480
.type = USB_BULK,
1481
.count = 6,
1482
.endpoint = 0x85,
1483
.u = {
1484
.bulk = {
1485
.buffersize =
1486
TS_USB20_FRAME_SIZE,
1487
}
1488
}
1489
},
1490
}
1491
},
1492
1493
.identify_state = af9015_identify_state,
1494
1495
.rc.core = {
1496
.protocol = RC_TYPE_NEC,
1497
.module_name = "af9015",
1498
.rc_query = af9015_rc_query,
1499
.rc_interval = AF9015_RC_INTERVAL,
1500
.allowed_protos = RC_TYPE_NEC,
1501
},
1502
1503
.i2c_algo = &af9015_i2c_algo,
1504
1505
.num_device_descs = 9, /* check max from dvb-usb.h */
1506
.devices = {
1507
{
1508
.name = "Xtensions XD-380",
1509
.cold_ids = {&af9015_usb_table[10], NULL},
1510
.warm_ids = {NULL},
1511
},
1512
{
1513
.name = "MSI DIGIVOX Duo",
1514
.cold_ids = {&af9015_usb_table[11], NULL},
1515
.warm_ids = {NULL},
1516
},
1517
{
1518
.name = "Fujitsu-Siemens Slim Mobile USB DVB-T",
1519
.cold_ids = {&af9015_usb_table[12], NULL},
1520
.warm_ids = {NULL},
1521
},
1522
{
1523
.name = "Telestar Starstick 2",
1524
.cold_ids = {&af9015_usb_table[13], NULL},
1525
.warm_ids = {NULL},
1526
},
1527
{
1528
.name = "AVerMedia A309",
1529
.cold_ids = {&af9015_usb_table[14], NULL},
1530
.warm_ids = {NULL},
1531
},
1532
{
1533
.name = "MSI Digi VOX mini III",
1534
.cold_ids = {&af9015_usb_table[15], NULL},
1535
.warm_ids = {NULL},
1536
},
1537
{
1538
.name = "KWorld USB DVB-T TV Stick II " \
1539
"(VS-DVB-T 395U)",
1540
.cold_ids = {&af9015_usb_table[16],
1541
&af9015_usb_table[17],
1542
&af9015_usb_table[18],
1543
&af9015_usb_table[31], NULL},
1544
.warm_ids = {NULL},
1545
},
1546
{
1547
.name = "TrekStor DVB-T USB Stick",
1548
.cold_ids = {&af9015_usb_table[19], NULL},
1549
.warm_ids = {NULL},
1550
},
1551
{
1552
.name = "AverMedia AVerTV Volar Black HD " \
1553
"(A850)",
1554
.cold_ids = {&af9015_usb_table[20], NULL},
1555
.warm_ids = {NULL},
1556
},
1557
}
1558
}, {
1559
.caps = DVB_USB_IS_AN_I2C_ADAPTER,
1560
1561
.usb_ctrl = DEVICE_SPECIFIC,
1562
.download_firmware = af9015_download_firmware,
1563
.firmware = "dvb-usb-af9015.fw",
1564
.no_reconnect = 1,
1565
1566
.size_of_priv = sizeof(struct af9015_state),
1567
1568
.num_adapters = 2,
1569
.adapter = {
1570
{
1571
.caps = DVB_USB_ADAP_HAS_PID_FILTER |
1572
DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1573
1574
.pid_filter_count = 32,
1575
.pid_filter = af9015_pid_filter,
1576
.pid_filter_ctrl = af9015_pid_filter_ctrl,
1577
1578
.frontend_attach =
1579
af9015_af9013_frontend_attach,
1580
.tuner_attach = af9015_tuner_attach,
1581
.stream = {
1582
.type = USB_BULK,
1583
.count = 6,
1584
.endpoint = 0x84,
1585
},
1586
},
1587
{
1588
.frontend_attach =
1589
af9015_af9013_frontend_attach,
1590
.tuner_attach = af9015_tuner_attach,
1591
.stream = {
1592
.type = USB_BULK,
1593
.count = 6,
1594
.endpoint = 0x85,
1595
.u = {
1596
.bulk = {
1597
.buffersize =
1598
TS_USB20_FRAME_SIZE,
1599
}
1600
}
1601
},
1602
}
1603
},
1604
1605
.identify_state = af9015_identify_state,
1606
1607
.rc.core = {
1608
.protocol = RC_TYPE_NEC,
1609
.module_name = "af9015",
1610
.rc_query = af9015_rc_query,
1611
.rc_interval = AF9015_RC_INTERVAL,
1612
.allowed_protos = RC_TYPE_NEC,
1613
},
1614
1615
.i2c_algo = &af9015_i2c_algo,
1616
1617
.num_device_descs = 9, /* check max from dvb-usb.h */
1618
.devices = {
1619
{
1620
.name = "AverMedia AVerTV Volar GPS 805 (A805)",
1621
.cold_ids = {&af9015_usb_table[21], NULL},
1622
.warm_ids = {NULL},
1623
},
1624
{
1625
.name = "Conceptronic USB2.0 DVB-T CTVDIGRCU " \
1626
"V3.0",
1627
.cold_ids = {&af9015_usb_table[22], NULL},
1628
.warm_ids = {NULL},
1629
},
1630
{
1631
.name = "KWorld Digial MC-810",
1632
.cold_ids = {&af9015_usb_table[23], NULL},
1633
.warm_ids = {NULL},
1634
},
1635
{
1636
.name = "Genius TVGo DVB-T03",
1637
.cold_ids = {&af9015_usb_table[24], NULL},
1638
.warm_ids = {NULL},
1639
},
1640
{
1641
.name = "KWorld PlusTV DVB-T PCI Pro Card " \
1642
"(DVB-T PC160-T)",
1643
.cold_ids = {&af9015_usb_table[26], NULL},
1644
.warm_ids = {NULL},
1645
},
1646
{
1647
.name = "Sveon STV20 Tuner USB DVB-T HDTV",
1648
.cold_ids = {&af9015_usb_table[27], NULL},
1649
.warm_ids = {NULL},
1650
},
1651
{
1652
.name = "Leadtek WinFast DTV2000DS",
1653
.cold_ids = {&af9015_usb_table[29], NULL},
1654
.warm_ids = {NULL},
1655
},
1656
{
1657
.name = "KWorld USB DVB-T Stick Mobile " \
1658
"(UB383-T)",
1659
.cold_ids = {&af9015_usb_table[30], NULL},
1660
.warm_ids = {NULL},
1661
},
1662
{
1663
.name = "AverMedia AVerTV Volar M (A815Mac)",
1664
.cold_ids = {&af9015_usb_table[32], NULL},
1665
.warm_ids = {NULL},
1666
},
1667
}
1668
},
1669
};
1670
1671
static int af9015_usb_probe(struct usb_interface *intf,
1672
const struct usb_device_id *id)
1673
{
1674
int ret = 0;
1675
struct dvb_usb_device *d = NULL;
1676
struct usb_device *udev = interface_to_usbdev(intf);
1677
u8 i;
1678
1679
deb_info("%s: interface:%d\n", __func__,
1680
intf->cur_altsetting->desc.bInterfaceNumber);
1681
1682
/* interface 0 is used by DVB-T receiver and
1683
interface 1 is for remote controller (HID) */
1684
if (intf->cur_altsetting->desc.bInterfaceNumber == 0) {
1685
ret = af9015_read_config(udev);
1686
if (ret)
1687
return ret;
1688
1689
for (i = 0; i < af9015_properties_count; i++) {
1690
ret = dvb_usb_device_init(intf, &af9015_properties[i],
1691
THIS_MODULE, &d, adapter_nr);
1692
if (!ret)
1693
break;
1694
if (ret != -ENODEV)
1695
return ret;
1696
}
1697
if (ret)
1698
return ret;
1699
1700
if (d)
1701
ret = af9015_init(d);
1702
}
1703
1704
return ret;
1705
}
1706
1707
static void af9015_i2c_exit(struct dvb_usb_device *d)
1708
{
1709
struct af9015_state *state = d->priv;
1710
deb_info("%s:\n", __func__);
1711
1712
/* remove 2nd I2C adapter */
1713
if (d->state & DVB_USB_STATE_I2C)
1714
i2c_del_adapter(&state->i2c_adap);
1715
}
1716
1717
static void af9015_usb_device_exit(struct usb_interface *intf)
1718
{
1719
struct dvb_usb_device *d = usb_get_intfdata(intf);
1720
deb_info("%s:\n", __func__);
1721
1722
/* remove 2nd I2C adapter */
1723
if (d != NULL && d->desc != NULL)
1724
af9015_i2c_exit(d);
1725
1726
dvb_usb_device_exit(intf);
1727
}
1728
1729
/* usb specific object needed to register this driver with the usb subsystem */
1730
static struct usb_driver af9015_usb_driver = {
1731
.name = "dvb_usb_af9015",
1732
.probe = af9015_usb_probe,
1733
.disconnect = af9015_usb_device_exit,
1734
.id_table = af9015_usb_table,
1735
};
1736
1737
/* module stuff */
1738
static int __init af9015_usb_module_init(void)
1739
{
1740
int ret;
1741
ret = usb_register(&af9015_usb_driver);
1742
if (ret)
1743
err("module init failed:%d", ret);
1744
1745
return ret;
1746
}
1747
1748
static void __exit af9015_usb_module_exit(void)
1749
{
1750
/* deregister this driver from the USB subsystem */
1751
usb_deregister(&af9015_usb_driver);
1752
}
1753
1754
module_init(af9015_usb_module_init);
1755
module_exit(af9015_usb_module_exit);
1756
1757
MODULE_AUTHOR("Antti Palosaari <[email protected]>");
1758
MODULE_DESCRIPTION("Driver for Afatech AF9015 DVB-T");
1759
MODULE_LICENSE("GPL");
1760
1761