2 * DVB USB Linux driver for Afatech AF9015 DVB-T USB2.0 receiver
4 * Copyright (C) 2007 Antti Palosaari <crope@iki.fi>
6 * Thanks to Afatech who kindly provided information.
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.
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.
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.
24 #include <linux/hash.h>
25 #include <linux/slab.h>
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
);
45 static DEFINE_MUTEX(af9015_usb_mutex
);
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
);
51 static struct af9013_config af9015_af9013_config
[] = {
53 .i2c_addr
= AF9015_I2C_DEMOD
,
54 .ts_mode
= AF9013_TS_USB
,
55 .api_version
= { 0, 1, 9, 0 },
56 .gpio
[0] = AF9013_GPIO_HI
,
57 .gpio
[3] = AF9013_GPIO_TUNER_ON
,
60 .ts_mode
= AF9013_TS_SERIAL
,
61 .api_version
= { 0, 1, 9, 0 },
62 .gpio
[0] = AF9013_GPIO_TUNER_ON
,
63 .gpio
[1] = AF9013_GPIO_LO
,
67 static int af9015_rw_udev(struct usb_device
*udev
, struct req_t
*req
)
70 #define REQ_HDR_LEN 8 /* send header size */
71 #define ACK_HDR_LEN 2 /* rece header size */
75 u8 msg_len
= REQ_HDR_LEN
;
76 static u8 seq
; /* packet sequence number */
78 if (mutex_lock_interruptible(&af9015_usb_mutex
) < 0)
83 buf
[2] = req
->i2c_addr
;
84 buf
[3] = req
->addr
>> 8;
85 buf
[4] = req
->addr
& 0xff;
87 buf
[6] = req
->addr_len
;
88 buf
[7] = req
->data_len
;
98 buf
[2] |= 0x01; /* set I2C direction */
100 buf
[0] = READ_WRITE_I2C
;
103 if (((req
->addr
& 0xff00) == 0xff00) ||
104 ((req
->addr
& 0xff00) == 0xae00))
105 buf
[0] = WRITE_VIRTUAL_MEMORY
;
106 case WRITE_VIRTUAL_MEMORY
:
108 case DOWNLOAD_FIRMWARE
:
112 err("unknown command:%d", req
->cmd
);
117 /* buffer overflow check */
118 if ((write
&& (req
->data_len
> BUF_LEN
- REQ_HDR_LEN
)) ||
119 (!write
&& (req
->data_len
> BUF_LEN
- ACK_HDR_LEN
))) {
120 err("too much data; cmd:%d len:%d", req
->cmd
, req
->data_len
);
125 /* write requested */
127 memcpy(&buf
[REQ_HDR_LEN
], req
->data
, req
->data_len
);
128 msg_len
+= req
->data_len
;
132 debug_dump(buf
, msg_len
, deb_xfer
);
135 ret
= usb_bulk_msg(udev
, usb_sndbulkpipe(udev
, 0x02), buf
, msg_len
,
136 &act_len
, AF9015_USB_TIMEOUT
);
138 err("bulk message failed:%d (%d/%d)", ret
, msg_len
, act_len
);
140 if (act_len
!= msg_len
)
141 ret
= -1; /* all data is not send */
145 /* no ack for those packets */
146 if (req
->cmd
== DOWNLOAD_FIRMWARE
|| req
->cmd
== RECONNECT_USB
)
149 /* write receives seq + status = 2 bytes
150 read receives seq + status + data = 2 + N bytes */
151 msg_len
= ACK_HDR_LEN
;
153 msg_len
+= req
->data_len
;
155 ret
= usb_bulk_msg(udev
, usb_rcvbulkpipe(udev
, 0x81), buf
, msg_len
,
156 &act_len
, AF9015_USB_TIMEOUT
);
158 err("recv bulk message failed:%d", ret
);
164 debug_dump(buf
, act_len
, deb_xfer
);
168 err("command failed:%d", buf
[1]);
173 /* read request, copy returned data to return buf */
175 memcpy(req
->data
, &buf
[ACK_HDR_LEN
], req
->data_len
);
179 mutex_unlock(&af9015_usb_mutex
);
184 static int af9015_ctrl_msg(struct dvb_usb_device
*d
, struct req_t
*req
)
186 return af9015_rw_udev(d
->udev
, req
);
189 static int af9015_write_regs(struct dvb_usb_device
*d
, u16 addr
, u8
*val
,
192 struct req_t req
= {WRITE_MEMORY
, AF9015_I2C_DEMOD
, addr
, 0, 0, len
,
194 return af9015_ctrl_msg(d
, &req
);
197 static int af9015_write_reg(struct dvb_usb_device
*d
, u16 addr
, u8 val
)
199 return af9015_write_regs(d
, addr
, &val
, 1);
202 static int af9015_read_regs(struct dvb_usb_device
*d
, u16 addr
, u8
*val
, u8 len
)
204 struct req_t req
= {READ_MEMORY
, AF9015_I2C_DEMOD
, addr
, 0, 0, len
,
206 return af9015_ctrl_msg(d
, &req
);
209 static int af9015_read_reg(struct dvb_usb_device
*d
, u16 addr
, u8
*val
)
211 return af9015_read_regs(d
, addr
, val
, 1);
214 static int af9015_write_reg_i2c(struct dvb_usb_device
*d
, u8 addr
, u16 reg
,
217 struct req_t req
= {WRITE_I2C
, addr
, reg
, 1, 1, 1, &val
};
219 if (addr
== af9015_af9013_config
[0].i2c_addr
||
220 addr
== af9015_af9013_config
[1].i2c_addr
)
223 return af9015_ctrl_msg(d
, &req
);
226 static int af9015_read_reg_i2c(struct dvb_usb_device
*d
, u8 addr
, u16 reg
,
229 struct req_t req
= {READ_I2C
, addr
, reg
, 0, 1, 1, val
};
231 if (addr
== af9015_af9013_config
[0].i2c_addr
||
232 addr
== af9015_af9013_config
[1].i2c_addr
)
235 return af9015_ctrl_msg(d
, &req
);
238 static int af9015_i2c_xfer(struct i2c_adapter
*adap
, struct i2c_msg msg
[],
241 struct dvb_usb_device
*d
= i2c_get_adapdata(adap
);
244 u8
uninitialized_var(mbox
), addr_len
;
247 /* TODO: implement bus lock
249 The bus lock is needed because there is two tuners both using same I2C-address.
250 Due to that the only way to select correct tuner is use demodulator I2C-gate.
252 ................................................
253 . AF9015 includes integrated AF9013 demodulator.
254 . ____________ ____________ . ____________
255 .| uC | | demod | . | tuner |
256 .|------------| |------------| . |------------|
257 .| AF9015 | | AF9013/5 | . | MXL5003 |
258 .| |--+----I2C-------|-----/ -----|-.-----I2C-------| |
259 .| | | | addr 0x38 | . | addr 0xc6 |
260 .|____________| | |____________| . |____________|
261 .................|..............................
262 | ____________ ____________
263 | | demod | | tuner |
264 | |------------| |------------|
265 | | AF9013 | | MXL5003 |
266 +----I2C-------|-----/ -----|-------I2C-------| |
267 | addr 0x3a | | addr 0xc6 |
268 |____________| |____________|
270 if (mutex_lock_interruptible(&d
->i2c_mutex
) < 0)
274 if (msg
[i
].addr
== af9015_af9013_config
[0].i2c_addr
||
275 msg
[i
].addr
== af9015_af9013_config
[1].i2c_addr
) {
276 addr
= msg
[i
].buf
[0] << 8;
277 addr
+= msg
[i
].buf
[1];
278 mbox
= msg
[i
].buf
[2];
281 addr
= msg
[i
].buf
[0];
283 /* mbox is don't care in that case */
286 if (num
> i
+ 1 && (msg
[i
+1].flags
& I2C_M_RD
)) {
287 if (msg
[i
].len
> 3 || msg
[i
+1].len
> 61) {
291 if (msg
[i
].addr
== af9015_af9013_config
[0].i2c_addr
)
292 req
.cmd
= READ_MEMORY
;
295 req
.i2c_addr
= msg
[i
].addr
;
298 req
.addr_len
= addr_len
;
299 req
.data_len
= msg
[i
+1].len
;
300 req
.data
= &msg
[i
+1].buf
[0];
301 ret
= af9015_ctrl_msg(d
, &req
);
303 } else if (msg
[i
].flags
& I2C_M_RD
) {
304 if (msg
[i
].len
> 61) {
309 af9015_af9013_config
[0].i2c_addr
) {
314 req
.i2c_addr
= msg
[i
].addr
;
317 req
.addr_len
= addr_len
;
318 req
.data_len
= msg
[i
].len
;
319 req
.data
= &msg
[i
].buf
[0];
320 ret
= af9015_ctrl_msg(d
, &req
);
323 if (msg
[i
].len
> 21) {
327 if (msg
[i
].addr
== af9015_af9013_config
[0].i2c_addr
)
328 req
.cmd
= WRITE_MEMORY
;
331 req
.i2c_addr
= msg
[i
].addr
;
334 req
.addr_len
= addr_len
;
335 req
.data_len
= msg
[i
].len
-addr_len
;
336 req
.data
= &msg
[i
].buf
[addr_len
];
337 ret
= af9015_ctrl_msg(d
, &req
);
347 mutex_unlock(&d
->i2c_mutex
);
352 static u32
af9015_i2c_func(struct i2c_adapter
*adapter
)
357 static struct i2c_algorithm af9015_i2c_algo
= {
358 .master_xfer
= af9015_i2c_xfer
,
359 .functionality
= af9015_i2c_func
,
362 static int af9015_do_reg_bit(struct dvb_usb_device
*d
, u16 addr
, u8 bit
, u8 op
)
367 ret
= af9015_read_reg(d
, addr
, &val
);
381 return af9015_write_reg(d
, addr
, val
);
384 static int af9015_set_reg_bit(struct dvb_usb_device
*d
, u16 addr
, u8 bit
)
386 return af9015_do_reg_bit(d
, addr
, bit
, 1);
389 static int af9015_clear_reg_bit(struct dvb_usb_device
*d
, u16 addr
, u8 bit
)
391 return af9015_do_reg_bit(d
, addr
, bit
, 0);
394 static int af9015_init_endpoint(struct dvb_usb_device
*d
)
399 deb_info("%s: USB speed:%d\n", __func__
, d
->udev
->speed
);
401 /* Windows driver uses packet count 21 for USB1.1 and 348 for USB2.0.
402 We use smaller - about 1/4 from the original, 5 and 87. */
403 #define TS_PACKET_SIZE 188
405 #define TS_USB20_PACKET_COUNT 87
406 #define TS_USB20_FRAME_SIZE (TS_PACKET_SIZE*TS_USB20_PACKET_COUNT)
408 #define TS_USB11_PACKET_COUNT 5
409 #define TS_USB11_FRAME_SIZE (TS_PACKET_SIZE*TS_USB11_PACKET_COUNT)
411 #define TS_USB20_MAX_PACKET_SIZE 512
412 #define TS_USB11_MAX_PACKET_SIZE 64
414 if (d
->udev
->speed
== USB_SPEED_FULL
) {
415 frame_size
= TS_USB11_FRAME_SIZE
/4;
416 packet_size
= TS_USB11_MAX_PACKET_SIZE
/4;
418 frame_size
= TS_USB20_FRAME_SIZE
/4;
419 packet_size
= TS_USB20_MAX_PACKET_SIZE
/4;
422 ret
= af9015_set_reg_bit(d
, 0xd507, 2); /* assert EP4 reset */
425 ret
= af9015_set_reg_bit(d
, 0xd50b, 1); /* assert EP5 reset */
428 ret
= af9015_clear_reg_bit(d
, 0xdd11, 5); /* disable EP4 */
431 ret
= af9015_clear_reg_bit(d
, 0xdd11, 6); /* disable EP5 */
434 ret
= af9015_set_reg_bit(d
, 0xdd11, 5); /* enable EP4 */
437 if (af9015_config
.dual_mode
) {
438 ret
= af9015_set_reg_bit(d
, 0xdd11, 6); /* enable EP5 */
442 ret
= af9015_clear_reg_bit(d
, 0xdd13, 5); /* disable EP4 NAK */
445 if (af9015_config
.dual_mode
) {
446 ret
= af9015_clear_reg_bit(d
, 0xdd13, 6); /* disable EP5 NAK */
450 /* EP4 xfer length */
451 ret
= af9015_write_reg(d
, 0xdd88, frame_size
& 0xff);
454 ret
= af9015_write_reg(d
, 0xdd89, frame_size
>> 8);
457 /* EP5 xfer length */
458 ret
= af9015_write_reg(d
, 0xdd8a, frame_size
& 0xff);
461 ret
= af9015_write_reg(d
, 0xdd8b, frame_size
>> 8);
464 ret
= af9015_write_reg(d
, 0xdd0c, packet_size
); /* EP4 packet size */
467 ret
= af9015_write_reg(d
, 0xdd0d, packet_size
); /* EP5 packet size */
470 ret
= af9015_clear_reg_bit(d
, 0xd507, 2); /* negate EP4 reset */
473 if (af9015_config
.dual_mode
) {
474 ret
= af9015_clear_reg_bit(d
, 0xd50b, 1); /* negate EP5 reset */
479 /* enable / disable mp2if2 */
480 if (af9015_config
.dual_mode
)
481 ret
= af9015_set_reg_bit(d
, 0xd50b, 0);
483 ret
= af9015_clear_reg_bit(d
, 0xd50b, 0);
487 err("endpoint init failed:%d", ret
);
491 static int af9015_copy_firmware(struct dvb_usb_device
*d
)
496 struct req_t req
= {COPY_FIRMWARE
, 0, 0x5100, 0, 0, sizeof(fw_params
),
498 deb_info("%s:\n", __func__
);
500 fw_params
[0] = af9015_config
.firmware_size
>> 8;
501 fw_params
[1] = af9015_config
.firmware_size
& 0xff;
502 fw_params
[2] = af9015_config
.firmware_checksum
>> 8;
503 fw_params
[3] = af9015_config
.firmware_checksum
& 0xff;
505 /* wait 2nd demodulator ready */
508 ret
= af9015_read_reg_i2c(d
,
509 af9015_af9013_config
[1].i2c_addr
, 0x98be, &val
);
513 deb_info("%s: firmware status:%02x\n", __func__
, val
);
515 if (val
== 0x0c) /* fw is running, no need for download */
518 /* set I2C master clock to fast (to speed up firmware copy) */
519 ret
= af9015_write_reg(d
, 0xd416, 0x04); /* 0x04 * 400ns */
526 ret
= af9015_ctrl_msg(d
, &req
);
528 err("firmware copy cmd failed:%d", ret
);
529 deb_info("%s: firmware copy done\n", __func__
);
531 /* set I2C master clock back to normal */
532 ret
= af9015_write_reg(d
, 0xd416, 0x14); /* 0x14 * 400ns */
536 /* request boot firmware */
537 ret
= af9015_write_reg_i2c(d
, af9015_af9013_config
[1].i2c_addr
,
539 deb_info("%s: firmware boot cmd status:%d\n", __func__
, ret
);
543 for (i
= 0; i
< 15; i
++) {
546 /* check firmware status */
547 ret
= af9015_read_reg_i2c(d
,
548 af9015_af9013_config
[1].i2c_addr
, 0x98be, &val
);
549 deb_info("%s: firmware status cmd status:%d fw status:%02x\n",
554 if (val
== 0x0c || val
== 0x04) /* success or fail */
559 err("firmware did not run");
561 } else if (val
!= 0x0c) {
562 err("firmware boot timeout");
571 /* hash (and dump) eeprom */
572 static int af9015_eeprom_hash(struct usb_device
*udev
)
574 static const unsigned int eeprom_size
= 256;
578 struct req_t req
= {READ_I2C
, AF9015_I2C_EEPROM
, 0, 0, 1, 1, &val
};
580 eeprom
= kmalloc(eeprom_size
, GFP_KERNEL
);
584 for (reg
= 0; reg
< eeprom_size
; reg
++) {
586 ret
= af9015_rw_udev(udev
, &req
);
592 if (dvb_usb_af9015_debug
& 0x01)
593 print_hex_dump_bytes("", DUMP_PREFIX_OFFSET
, eeprom
,
596 BUG_ON(eeprom_size
% 4);
598 af9015_config
.eeprom_sum
= 0;
599 for (reg
= 0; reg
< eeprom_size
/ sizeof(u32
); reg
++) {
600 af9015_config
.eeprom_sum
*= GOLDEN_RATIO_PRIME_32
;
601 af9015_config
.eeprom_sum
+= le32_to_cpu(((u32
*)eeprom
)[reg
]);
604 deb_info("%s: eeprom sum=%.8x\n", __func__
, af9015_config
.eeprom_sum
);
612 static int af9015_init(struct dvb_usb_device
*d
)
615 deb_info("%s:\n", __func__
);
618 ret
= af9015_write_reg(d
, 0x98e9, 0xff);
622 ret
= af9015_init_endpoint(d
);
630 static int af9015_pid_filter_ctrl(struct dvb_usb_adapter
*adap
, int onoff
)
633 deb_info("%s: onoff:%d\n", __func__
, onoff
);
636 ret
= af9015_set_reg_bit(adap
->dev
, 0xd503, 0);
638 ret
= af9015_clear_reg_bit(adap
->dev
, 0xd503, 0);
643 static int af9015_pid_filter(struct dvb_usb_adapter
*adap
, int index
, u16 pid
,
649 deb_info("%s: set pid filter, index %d, pid %x, onoff %d\n",
650 __func__
, index
, pid
, onoff
);
652 ret
= af9015_write_reg(adap
->dev
, 0xd505, (pid
& 0xff));
656 ret
= af9015_write_reg(adap
->dev
, 0xd506, (pid
>> 8));
660 idx
= ((index
& 0x1f) | (1 << 5));
661 ret
= af9015_write_reg(adap
->dev
, 0xd504, idx
);
667 static int af9015_download_firmware(struct usb_device
*udev
,
668 const struct firmware
*fw
)
670 int i
, len
, remaining
, ret
;
671 struct req_t req
= {DOWNLOAD_FIRMWARE
, 0, 0, 0, 0, 0, NULL
};
674 deb_info("%s:\n", __func__
);
677 for (i
= 0; i
< fw
->size
; i
++)
678 checksum
+= fw
->data
[i
];
680 af9015_config
.firmware_size
= fw
->size
;
681 af9015_config
.firmware_checksum
= checksum
;
683 #define FW_ADDR 0x5100 /* firmware start address */
684 #define LEN_MAX 55 /* max packet size */
685 for (remaining
= fw
->size
; remaining
> 0; remaining
-= LEN_MAX
) {
691 req
.data
= (u8
*) &fw
->data
[fw
->size
- remaining
];
692 req
.addr
= FW_ADDR
+ fw
->size
- remaining
;
694 ret
= af9015_rw_udev(udev
, &req
);
696 err("firmware download failed:%d", ret
);
701 /* firmware loaded, request boot */
703 ret
= af9015_rw_udev(udev
, &req
);
705 err("firmware boot failed:%d", ret
);
713 struct af9015_rc_setup
{
718 static char *af9015_rc_setup_match(unsigned int id
,
719 const struct af9015_rc_setup
*table
)
721 for (; table
->rc_codes
; table
++)
723 return table
->rc_codes
;
727 static const struct af9015_rc_setup af9015_rc_setup_modparam
[] = {
728 { AF9015_REMOTE_A_LINK_DTU_M
, RC_MAP_ALINK_DTU_M
},
729 { AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3
, RC_MAP_MSI_DIGIVOX_II
},
730 { AF9015_REMOTE_MYGICTV_U718
, RC_MAP_TOTAL_MEDIA_IN_HAND
},
731 { AF9015_REMOTE_DIGITTRADE_DVB_T
, RC_MAP_DIGITTRADE
},
732 { AF9015_REMOTE_AVERMEDIA_KS
, RC_MAP_AVERMEDIA_RM_KS
},
736 static const struct af9015_rc_setup af9015_rc_setup_hashes
[] = {
737 { 0xb8feb708, RC_MAP_MSI_DIGIVOX_II
},
738 { 0xa3703d00, RC_MAP_ALINK_DTU_M
},
739 { 0x9b7dc64e, RC_MAP_TOTAL_MEDIA_IN_HAND
}, /* MYGICTV U718 */
740 { 0x5d49e3db, RC_MAP_DIGITTRADE
}, /* LC-Power LC-USB-DVBT */
744 static const struct af9015_rc_setup af9015_rc_setup_usbids
[] = {
745 { (USB_VID_TERRATEC
<< 16) | USB_PID_TERRATEC_CINERGY_T_STICK_RC
,
746 RC_MAP_TERRATEC_SLIM_2
},
747 { (USB_VID_TERRATEC
<< 16) | USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC
,
748 RC_MAP_TERRATEC_SLIM
},
749 { (USB_VID_VISIONPLUS
<< 16) | USB_PID_AZUREWAVE_AD_TU700
,
750 RC_MAP_AZUREWAVE_AD_TU700
},
751 { (USB_VID_VISIONPLUS
<< 16) | USB_PID_TINYTWIN
,
752 RC_MAP_AZUREWAVE_AD_TU700
},
753 { (USB_VID_MSI_2
<< 16) | USB_PID_MSI_DIGI_VOX_MINI_III
,
754 RC_MAP_MSI_DIGIVOX_III
},
755 { (USB_VID_MSI_2
<< 16) | USB_PID_MSI_DIGIVOX_DUO
,
756 RC_MAP_MSI_DIGIVOX_III
},
757 { (USB_VID_LEADTEK
<< 16) | USB_PID_WINFAST_DTV_DONGLE_GOLD
,
758 RC_MAP_LEADTEK_Y04G0051
},
759 { (USB_VID_LEADTEK
<< 16) | USB_PID_WINFAST_DTV2000DS
,
760 RC_MAP_LEADTEK_Y04G0051
},
761 { (USB_VID_AVERMEDIA
<< 16) | USB_PID_AVERMEDIA_VOLAR_X
,
762 RC_MAP_AVERMEDIA_M135A
},
763 { (USB_VID_AFATECH
<< 16) | USB_PID_TREKSTOR_DVBT
,
765 { (USB_VID_KWORLD_2
<< 16) | USB_PID_TINYTWIN_2
,
766 RC_MAP_DIGITALNOW_TINYTWIN
},
767 { (USB_VID_GTEK
<< 16) | USB_PID_TINYTWIN_3
,
768 RC_MAP_DIGITALNOW_TINYTWIN
},
769 { (USB_VID_KWORLD_2
<< 16) | USB_PID_SVEON_STV22
,
770 RC_MAP_MSI_DIGIVOX_III
},
774 static void af9015_set_remote_config(struct usb_device
*udev
,
775 struct dvb_usb_device_properties
*props
)
777 u16 vid
= le16_to_cpu(udev
->descriptor
.idVendor
);
778 u16 pid
= le16_to_cpu(udev
->descriptor
.idProduct
);
780 /* try to load remote based module param */
781 props
->rc
.core
.rc_codes
= af9015_rc_setup_match(
782 dvb_usb_af9015_remote
, af9015_rc_setup_modparam
);
784 /* try to load remote based eeprom hash */
785 if (!props
->rc
.core
.rc_codes
)
786 props
->rc
.core
.rc_codes
= af9015_rc_setup_match(
787 af9015_config
.eeprom_sum
, af9015_rc_setup_hashes
);
789 /* try to load remote based USB ID */
790 if (!props
->rc
.core
.rc_codes
)
791 props
->rc
.core
.rc_codes
= af9015_rc_setup_match(
792 (vid
<< 16) + pid
, af9015_rc_setup_usbids
);
794 /* try to load remote based USB iManufacturer string */
795 if (!props
->rc
.core
.rc_codes
&& vid
== USB_VID_AFATECH
) {
796 /* Check USB manufacturer and product strings and try
797 to determine correct remote in case of chip vendor
798 reference IDs are used.
799 DO NOT ADD ANYTHING NEW HERE. Use hashes instead. */
800 char manufacturer
[10];
801 memset(manufacturer
, 0, sizeof(manufacturer
));
802 usb_string(udev
, udev
->descriptor
.iManufacturer
,
803 manufacturer
, sizeof(manufacturer
));
804 if (!strcmp("MSI", manufacturer
)) {
805 /* iManufacturer 1 MSI
806 iProduct 2 MSI K-VOX */
807 props
->rc
.core
.rc_codes
= af9015_rc_setup_match(
808 AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3
,
809 af9015_rc_setup_modparam
);
813 /* finally load "empty" just for leaving IR receiver enabled */
814 if (!props
->rc
.core
.rc_codes
)
815 props
->rc
.core
.rc_codes
= RC_MAP_EMPTY
;
820 static int af9015_read_config(struct usb_device
*udev
)
823 u8 val
, i
, offset
= 0;
824 struct req_t req
= {READ_I2C
, AF9015_I2C_EEPROM
, 0, 0, 1, 1, &val
};
826 /* IR remote controller */
827 req
.addr
= AF9015_EEPROM_IR_MODE
;
828 /* first message will timeout often due to possible hw bug */
829 for (i
= 0; i
< 4; i
++) {
830 ret
= af9015_rw_udev(udev
, &req
);
837 ret
= af9015_eeprom_hash(udev
);
841 deb_info("%s: IR mode=%d\n", __func__
, val
);
842 for (i
= 0; i
< af9015_properties_count
; i
++) {
843 if (val
== AF9015_IR_MODE_DISABLED
)
844 af9015_properties
[i
].rc
.core
.rc_codes
= NULL
;
846 af9015_set_remote_config(udev
, &af9015_properties
[i
]);
849 /* TS mode - one or two receivers */
850 req
.addr
= AF9015_EEPROM_TS_MODE
;
851 ret
= af9015_rw_udev(udev
, &req
);
854 af9015_config
.dual_mode
= val
;
855 deb_info("%s: TS mode=%d\n", __func__
, af9015_config
.dual_mode
);
857 /* Set adapter0 buffer size according to USB port speed, adapter1 buffer
858 size can be static because it is enabled only USB2.0 */
859 for (i
= 0; i
< af9015_properties_count
; i
++) {
860 /* USB1.1 set smaller buffersize and disable 2nd adapter */
861 if (udev
->speed
== USB_SPEED_FULL
) {
862 af9015_properties
[i
].adapter
[0].fe
[0].stream
.u
.bulk
.buffersize
863 = TS_USB11_FRAME_SIZE
;
864 /* disable 2nd adapter because we don't have
866 af9015_config
.dual_mode
= 0;
868 af9015_properties
[i
].adapter
[0].fe
[0].stream
.u
.bulk
.buffersize
869 = TS_USB20_FRAME_SIZE
;
873 if (af9015_config
.dual_mode
) {
874 /* read 2nd demodulator I2C address */
875 req
.addr
= AF9015_EEPROM_DEMOD2_I2C
;
876 ret
= af9015_rw_udev(udev
, &req
);
879 af9015_af9013_config
[1].i2c_addr
= val
;
881 /* enable 2nd adapter */
882 for (i
= 0; i
< af9015_properties_count
; i
++)
883 af9015_properties
[i
].num_adapters
= 2;
886 /* disable 2nd adapter */
887 for (i
= 0; i
< af9015_properties_count
; i
++)
888 af9015_properties
[i
].num_adapters
= 1;
891 for (i
= 0; i
< af9015_properties
[0].num_adapters
; i
++) {
893 offset
= AF9015_EEPROM_OFFSET
;
895 req
.addr
= AF9015_EEPROM_XTAL_TYPE1
+ offset
;
896 ret
= af9015_rw_udev(udev
, &req
);
901 af9015_af9013_config
[i
].clock
= 28800000;
904 af9015_af9013_config
[i
].clock
= 20480000;
907 af9015_af9013_config
[i
].clock
= 28000000;
910 af9015_af9013_config
[i
].clock
= 25000000;
913 deb_info("%s: [%d] xtal=%d set clock=%d\n", __func__
, i
,
914 val
, af9015_af9013_config
[i
].clock
);
917 req
.addr
= AF9015_EEPROM_IF1H
+ offset
;
918 ret
= af9015_rw_udev(udev
, &req
);
922 af9015_af9013_config
[i
].if_frequency
= val
<< 8;
924 req
.addr
= AF9015_EEPROM_IF1L
+ offset
;
925 ret
= af9015_rw_udev(udev
, &req
);
929 af9015_af9013_config
[i
].if_frequency
+= val
;
930 af9015_af9013_config
[i
].if_frequency
*= 1000;
931 deb_info("%s: [%d] IF frequency=%d\n", __func__
, i
,
932 af9015_af9013_config
[0].if_frequency
);
935 req
.addr
= AF9015_EEPROM_MT2060_IF1H
+ offset
;
936 ret
= af9015_rw_udev(udev
, &req
);
939 af9015_config
.mt2060_if1
[i
] = val
<< 8;
940 req
.addr
= AF9015_EEPROM_MT2060_IF1L
+ offset
;
941 ret
= af9015_rw_udev(udev
, &req
);
944 af9015_config
.mt2060_if1
[i
] += val
;
945 deb_info("%s: [%d] MT2060 IF1=%d\n", __func__
, i
,
946 af9015_config
.mt2060_if1
[i
]);
949 req
.addr
= AF9015_EEPROM_TUNER_ID1
+ offset
;
950 ret
= af9015_rw_udev(udev
, &req
);
954 case AF9013_TUNER_ENV77H11D5
:
955 case AF9013_TUNER_MT2060
:
956 case AF9013_TUNER_QT1010
:
957 case AF9013_TUNER_UNKNOWN
:
958 case AF9013_TUNER_MT2060_2
:
959 case AF9013_TUNER_TDA18271
:
960 case AF9013_TUNER_QT1010A
:
961 case AF9013_TUNER_TDA18218
:
962 af9015_af9013_config
[i
].spec_inv
= 1;
964 case AF9013_TUNER_MXL5003D
:
965 case AF9013_TUNER_MXL5005D
:
966 case AF9013_TUNER_MXL5005R
:
967 case AF9013_TUNER_MXL5007T
:
968 af9015_af9013_config
[i
].spec_inv
= 0;
970 case AF9013_TUNER_MC44S803
:
971 af9015_af9013_config
[i
].gpio
[1] = AF9013_GPIO_LO
;
972 af9015_af9013_config
[i
].spec_inv
= 1;
975 warn("tuner id=%d not supported, please report!", val
);
979 af9015_af9013_config
[i
].tuner
= val
;
980 deb_info("%s: [%d] tuner id=%d\n", __func__
, i
, val
);
985 err("eeprom read failed=%d", ret
);
987 /* AverMedia AVerTV Volar Black HD (A850) device have bad EEPROM
988 content :-( Override some wrong values here. Ditto for the
989 AVerTV Red HD+ (A850T) device. */
990 if (le16_to_cpu(udev
->descriptor
.idVendor
) == USB_VID_AVERMEDIA
&&
991 ((le16_to_cpu(udev
->descriptor
.idProduct
) ==
992 USB_PID_AVERMEDIA_A850
) ||
993 (le16_to_cpu(udev
->descriptor
.idProduct
) ==
994 USB_PID_AVERMEDIA_A850T
))) {
995 deb_info("%s: AverMedia A850: overriding config\n", __func__
);
996 /* disable dual mode */
997 af9015_config
.dual_mode
= 0;
998 /* disable 2nd adapter */
999 for (i
= 0; i
< af9015_properties_count
; i
++)
1000 af9015_properties
[i
].num_adapters
= 1;
1002 /* set correct IF */
1003 af9015_af9013_config
[0].if_frequency
= 4570000;
1009 static int af9015_identify_state(struct usb_device
*udev
,
1010 struct dvb_usb_device_properties
*props
,
1011 struct dvb_usb_device_description
**desc
,
1016 struct req_t req
= {GET_CONFIG
, 0, 0, 0, 0, 1, &reply
};
1018 ret
= af9015_rw_udev(udev
, &req
);
1022 deb_info("%s: reply:%02x\n", __func__
, reply
);
1031 static int af9015_rc_query(struct dvb_usb_device
*d
)
1033 struct af9015_state
*priv
= d
->priv
;
1037 /* read registers needed to detect remote controller code */
1038 ret
= af9015_read_regs(d
, 0x98d9, buf
, sizeof(buf
));
1042 /* If any of these are non-zero, assume invalid data */
1043 if (buf
[1] || buf
[2] || buf
[3])
1046 /* Check for repeat of previous code */
1047 if ((priv
->rc_repeat
!= buf
[6] || buf
[0]) &&
1048 !memcmp(&buf
[12], priv
->rc_last
, 4)) {
1049 deb_rc("%s: key repeated\n", __func__
);
1050 rc_keydown(d
->rc_dev
, priv
->rc_keycode
, 0);
1051 priv
->rc_repeat
= buf
[6];
1055 /* Only process key if canary killed */
1056 if (buf
[16] != 0xff && buf
[0] != 0x01) {
1057 deb_rc("%s: key pressed %02x %02x %02x %02x\n", __func__
,
1058 buf
[12], buf
[13], buf
[14], buf
[15]);
1060 /* Reset the canary */
1061 ret
= af9015_write_reg(d
, 0x98e9, 0xff);
1065 /* Remember this key */
1066 memcpy(priv
->rc_last
, &buf
[12], 4);
1067 if (buf
[14] == (u8
) ~buf
[15]) {
1068 if (buf
[12] == (u8
) ~buf
[13]) {
1070 priv
->rc_keycode
= buf
[12] << 8 | buf
[14];
1073 priv
->rc_keycode
= buf
[12] << 16 |
1074 buf
[13] << 8 | buf
[14];
1078 priv
->rc_keycode
= buf
[12] << 24 | buf
[13] << 16 |
1079 buf
[14] << 8 | buf
[15];
1081 rc_keydown(d
->rc_dev
, priv
->rc_keycode
, 0);
1083 deb_rc("%s: no key press\n", __func__
);
1084 /* Invalidate last keypress */
1085 /* Not really needed, but helps with debug */
1086 priv
->rc_last
[2] = priv
->rc_last
[3];
1089 priv
->rc_repeat
= buf
[6];
1093 err("%s: failed:%d", __func__
, ret
);
1098 /* override demod callbacks for resource locking */
1099 static int af9015_af9013_set_frontend(struct dvb_frontend
*fe
)
1102 struct dvb_usb_adapter
*adap
= fe
->dvb
->priv
;
1103 struct af9015_state
*priv
= adap
->dev
->priv
;
1105 if (mutex_lock_interruptible(&adap
->dev
->usb_mutex
))
1108 ret
= priv
->set_frontend
[adap
->id
](fe
);
1110 mutex_unlock(&adap
->dev
->usb_mutex
);
1115 /* override demod callbacks for resource locking */
1116 static int af9015_af9013_read_status(struct dvb_frontend
*fe
,
1117 fe_status_t
*status
)
1120 struct dvb_usb_adapter
*adap
= fe
->dvb
->priv
;
1121 struct af9015_state
*priv
= adap
->dev
->priv
;
1123 if (mutex_lock_interruptible(&adap
->dev
->usb_mutex
))
1126 ret
= priv
->read_status
[adap
->id
](fe
, status
);
1128 mutex_unlock(&adap
->dev
->usb_mutex
);
1133 /* override demod callbacks for resource locking */
1134 static int af9015_af9013_init(struct dvb_frontend
*fe
)
1137 struct dvb_usb_adapter
*adap
= fe
->dvb
->priv
;
1138 struct af9015_state
*priv
= adap
->dev
->priv
;
1140 if (mutex_lock_interruptible(&adap
->dev
->usb_mutex
))
1143 ret
= priv
->init
[adap
->id
](fe
);
1145 mutex_unlock(&adap
->dev
->usb_mutex
);
1150 /* override demod callbacks for resource locking */
1151 static int af9015_af9013_sleep(struct dvb_frontend
*fe
)
1154 struct dvb_usb_adapter
*adap
= fe
->dvb
->priv
;
1155 struct af9015_state
*priv
= adap
->dev
->priv
;
1157 if (mutex_lock_interruptible(&adap
->dev
->usb_mutex
))
1160 ret
= priv
->sleep
[adap
->id
](fe
);
1162 mutex_unlock(&adap
->dev
->usb_mutex
);
1167 static int af9015_af9013_frontend_attach(struct dvb_usb_adapter
*adap
)
1170 struct af9015_state
*state
= adap
->dev
->priv
;
1172 if (adap
->id
== 1) {
1173 /* copy firmware to 2nd demodulator */
1174 if (af9015_config
.dual_mode
) {
1175 ret
= af9015_copy_firmware(adap
->dev
);
1177 err("firmware copy to 2nd frontend " \
1178 "failed, will disable it");
1179 af9015_config
.dual_mode
= 0;
1187 /* attach demodulator */
1188 adap
->fe_adap
[0].fe
= dvb_attach(af9013_attach
, &af9015_af9013_config
[adap
->id
],
1189 &adap
->dev
->i2c_adap
);
1192 * AF9015 firmware does not like if it gets interrupted by I2C adapter
1193 * request on some critical phases. During normal operation I2C adapter
1194 * is used only 2nd demodulator and tuner on dual tuner devices.
1195 * Override demodulator callbacks and use mutex for limit access to
1196 * those "critical" paths to keep AF9015 happy.
1197 * Note: we abuse unused usb_mutex here.
1199 if (adap
->fe_adap
[0].fe
) {
1200 state
->set_frontend
[adap
->id
] =
1201 adap
->fe_adap
[0].fe
->ops
.set_frontend
;
1202 adap
->fe_adap
[0].fe
->ops
.set_frontend
=
1203 af9015_af9013_set_frontend
;
1205 state
->read_status
[adap
->id
] =
1206 adap
->fe_adap
[0].fe
->ops
.read_status
;
1207 adap
->fe_adap
[0].fe
->ops
.read_status
=
1208 af9015_af9013_read_status
;
1210 state
->init
[adap
->id
] = adap
->fe_adap
[0].fe
->ops
.init
;
1211 adap
->fe_adap
[0].fe
->ops
.init
= af9015_af9013_init
;
1213 state
->sleep
[adap
->id
] = adap
->fe_adap
[0].fe
->ops
.sleep
;
1214 adap
->fe_adap
[0].fe
->ops
.sleep
= af9015_af9013_sleep
;
1217 return adap
->fe_adap
[0].fe
== NULL
? -ENODEV
: 0;
1220 static struct mt2060_config af9015_mt2060_config
= {
1221 .i2c_address
= 0xc0,
1225 static struct qt1010_config af9015_qt1010_config
= {
1226 .i2c_address
= 0xc4,
1229 static struct tda18271_config af9015_tda18271_config
= {
1230 .gate
= TDA18271_GATE_DIGITAL
,
1231 .small_i2c
= TDA18271_16_BYTE_CHUNK_INIT
,
1234 static struct mxl5005s_config af9015_mxl5003_config
= {
1235 .i2c_address
= 0xc6,
1236 .if_freq
= IF_FREQ_4570000HZ
,
1237 .xtal_freq
= CRYSTAL_FREQ_16000000HZ
,
1238 .agc_mode
= MXL_SINGLE_AGC
,
1239 .tracking_filter
= MXL_TF_DEFAULT
,
1240 .rssi_enable
= MXL_RSSI_ENABLE
,
1241 .cap_select
= MXL_CAP_SEL_ENABLE
,
1242 .div_out
= MXL_DIV_OUT_4
,
1243 .clock_out
= MXL_CLOCK_OUT_DISABLE
,
1244 .output_load
= MXL5005S_IF_OUTPUT_LOAD_200_OHM
,
1245 .top
= MXL5005S_TOP_25P2
,
1246 .mod_mode
= MXL_DIGITAL_MODE
,
1247 .if_mode
= MXL_ZERO_IF
,
1248 .AgcMasterByte
= 0x00,
1251 static struct mxl5005s_config af9015_mxl5005_config
= {
1252 .i2c_address
= 0xc6,
1253 .if_freq
= IF_FREQ_4570000HZ
,
1254 .xtal_freq
= CRYSTAL_FREQ_16000000HZ
,
1255 .agc_mode
= MXL_SINGLE_AGC
,
1256 .tracking_filter
= MXL_TF_OFF
,
1257 .rssi_enable
= MXL_RSSI_ENABLE
,
1258 .cap_select
= MXL_CAP_SEL_ENABLE
,
1259 .div_out
= MXL_DIV_OUT_4
,
1260 .clock_out
= MXL_CLOCK_OUT_DISABLE
,
1261 .output_load
= MXL5005S_IF_OUTPUT_LOAD_200_OHM
,
1262 .top
= MXL5005S_TOP_25P2
,
1263 .mod_mode
= MXL_DIGITAL_MODE
,
1264 .if_mode
= MXL_ZERO_IF
,
1265 .AgcMasterByte
= 0x00,
1268 static struct mc44s803_config af9015_mc44s803_config
= {
1269 .i2c_address
= 0xc0,
1273 static struct tda18218_config af9015_tda18218_config
= {
1274 .i2c_address
= 0xc0,
1275 .i2c_wr_max
= 21, /* max wr bytes AF9015 I2C adap can handle at once */
1278 static struct mxl5007t_config af9015_mxl5007t_config
= {
1279 .xtal_freq_hz
= MxL_XTAL_24_MHZ
,
1280 .if_freq_hz
= MxL_IF_4_57_MHZ
,
1283 static int af9015_tuner_attach(struct dvb_usb_adapter
*adap
)
1286 deb_info("%s:\n", __func__
);
1288 switch (af9015_af9013_config
[adap
->id
].tuner
) {
1289 case AF9013_TUNER_MT2060
:
1290 case AF9013_TUNER_MT2060_2
:
1291 ret
= dvb_attach(mt2060_attach
, adap
->fe_adap
[0].fe
, &adap
->dev
->i2c_adap
,
1292 &af9015_mt2060_config
,
1293 af9015_config
.mt2060_if1
[adap
->id
])
1294 == NULL
? -ENODEV
: 0;
1296 case AF9013_TUNER_QT1010
:
1297 case AF9013_TUNER_QT1010A
:
1298 ret
= dvb_attach(qt1010_attach
, adap
->fe_adap
[0].fe
, &adap
->dev
->i2c_adap
,
1299 &af9015_qt1010_config
) == NULL
? -ENODEV
: 0;
1301 case AF9013_TUNER_TDA18271
:
1302 ret
= dvb_attach(tda18271_attach
, adap
->fe_adap
[0].fe
, 0xc0,
1303 &adap
->dev
->i2c_adap
,
1304 &af9015_tda18271_config
) == NULL
? -ENODEV
: 0;
1306 case AF9013_TUNER_TDA18218
:
1307 ret
= dvb_attach(tda18218_attach
, adap
->fe_adap
[0].fe
,
1308 &adap
->dev
->i2c_adap
,
1309 &af9015_tda18218_config
) == NULL
? -ENODEV
: 0;
1311 case AF9013_TUNER_MXL5003D
:
1312 ret
= dvb_attach(mxl5005s_attach
, adap
->fe_adap
[0].fe
,
1313 &adap
->dev
->i2c_adap
,
1314 &af9015_mxl5003_config
) == NULL
? -ENODEV
: 0;
1316 case AF9013_TUNER_MXL5005D
:
1317 case AF9013_TUNER_MXL5005R
:
1318 ret
= dvb_attach(mxl5005s_attach
, adap
->fe_adap
[0].fe
,
1319 &adap
->dev
->i2c_adap
,
1320 &af9015_mxl5005_config
) == NULL
? -ENODEV
: 0;
1322 case AF9013_TUNER_ENV77H11D5
:
1323 ret
= dvb_attach(dvb_pll_attach
, adap
->fe_adap
[0].fe
, 0xc0,
1324 &adap
->dev
->i2c_adap
,
1325 DVB_PLL_TDA665X
) == NULL
? -ENODEV
: 0;
1327 case AF9013_TUNER_MC44S803
:
1328 ret
= dvb_attach(mc44s803_attach
, adap
->fe_adap
[0].fe
,
1329 &adap
->dev
->i2c_adap
,
1330 &af9015_mc44s803_config
) == NULL
? -ENODEV
: 0;
1332 case AF9013_TUNER_MXL5007T
:
1333 ret
= dvb_attach(mxl5007t_attach
, adap
->fe_adap
[0].fe
,
1334 &adap
->dev
->i2c_adap
,
1335 0xc0, &af9015_mxl5007t_config
) == NULL
? -ENODEV
: 0;
1337 case AF9013_TUNER_UNKNOWN
:
1340 err("Unknown tuner id:%d",
1341 af9015_af9013_config
[adap
->id
].tuner
);
1346 enum af9015_usb_table_entry
{
1355 KWORLD_PLUSTV_PC160
,
1359 AVERTV_VOLAR_X_REV2
,
1360 TELESTAR_STARSTICK_2
,
1362 MSI_DIGIVOX_MINI_III
,
1369 CONCEPTRONIC_CTVDIGRCU
,
1371 GENIUS_TVGO_DVB_T03
,
1387 static struct usb_device_id af9015_usb_table
[] = {
1389 {USB_DEVICE(USB_VID_AFATECH
, USB_PID_AFATECH_AF9015_9015
)},
1391 {USB_DEVICE(USB_VID_AFATECH
, USB_PID_AFATECH_AF9015_9016
)},
1392 [WINFAST_DTV_GOLD
] =
1393 {USB_DEVICE(USB_VID_LEADTEK
, USB_PID_WINFAST_DTV_DONGLE_GOLD
)},
1394 [PINNACLE_PCTV_71E
] =
1395 {USB_DEVICE(USB_VID_PINNACLE
, USB_PID_PINNACLE_PCTV71E
)},
1396 [KWORLD_PLUSTV_399U
] =
1397 {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_399U
)},
1398 [TINYTWIN
] = {USB_DEVICE(USB_VID_VISIONPLUS
, USB_PID_TINYTWIN
)},
1400 {USB_DEVICE(USB_VID_VISIONPLUS
, USB_PID_AZUREWAVE_AD_TU700
)},
1401 [TERRATEC_AF9015
] = {USB_DEVICE(USB_VID_TERRATEC
,
1402 USB_PID_TERRATEC_CINERGY_T_USB_XE_REV2
)},
1403 [KWORLD_PLUSTV_PC160
] =
1404 {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_PC160_2T
)},
1406 {USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_VOLAR_X
)},
1408 {USB_DEVICE(USB_VID_XTENSIONS
, USB_PID_XTENSIONS_XD_380
)},
1410 {USB_DEVICE(USB_VID_MSI_2
, USB_PID_MSI_DIGIVOX_DUO
)},
1411 [AVERTV_VOLAR_X_REV2
] =
1412 {USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_VOLAR_X_2
)},
1413 [TELESTAR_STARSTICK_2
] =
1414 {USB_DEVICE(USB_VID_TELESTAR
, USB_PID_TELESTAR_STARSTICK_2
)},
1415 [AVERMEDIA_A309_USB
] =
1416 {USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_A309
)},
1417 [MSI_DIGIVOX_MINI_III
] =
1418 {USB_DEVICE(USB_VID_MSI_2
, USB_PID_MSI_DIGI_VOX_MINI_III
)},
1419 [KWORLD_E396
] = {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_395U
)},
1420 [KWORLD_E39B
] = {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_395U_2
)},
1421 [KWORLD_E395
] = {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_395U_3
)},
1422 [TREKSTOR_DVBT
] = {USB_DEVICE(USB_VID_AFATECH
, USB_PID_TREKSTOR_DVBT
)},
1423 [AVERTV_A850
] = {USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_A850
)},
1424 [AVERTV_A805
] = {USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_A805
)},
1425 [CONCEPTRONIC_CTVDIGRCU
] =
1426 {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_CONCEPTRONIC_CTVDIGRCU
)},
1427 [KWORLD_MC810
] = {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_MC810
)},
1428 [GENIUS_TVGO_DVB_T03
] =
1429 {USB_DEVICE(USB_VID_KYE
, USB_PID_GENIUS_TVGO_DVB_T03
)},
1430 [KWORLD_399U_2
] = {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_399U_2
)},
1432 {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_PC160_T
)},
1433 [SVEON_STV20
] = {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_SVEON_STV20
)},
1434 [TINYTWIN_2
] = {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_TINYTWIN_2
)},
1435 [WINFAST_DTV2000DS
] =
1436 {USB_DEVICE(USB_VID_LEADTEK
, USB_PID_WINFAST_DTV2000DS
)},
1438 {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_UB383_T
)},
1440 {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_395U_4
)},
1442 {USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_A815M
)},
1443 [CINERGY_T_STICK_RC
] = {USB_DEVICE(USB_VID_TERRATEC
,
1444 USB_PID_TERRATEC_CINERGY_T_STICK_RC
)},
1445 [CINERGY_T_DUAL_RC
] = {USB_DEVICE(USB_VID_TERRATEC
,
1446 USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC
)},
1448 {USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_A850T
)},
1449 [TINYTWIN_3
] = {USB_DEVICE(USB_VID_GTEK
, USB_PID_TINYTWIN_3
)},
1450 [SVEON_STV22
] = {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_SVEON_STV22
)},
1453 MODULE_DEVICE_TABLE(usb
, af9015_usb_table
);
1455 #define AF9015_RC_INTERVAL 500
1456 static struct dvb_usb_device_properties af9015_properties
[] = {
1458 .caps
= DVB_USB_IS_AN_I2C_ADAPTER
,
1460 .usb_ctrl
= DEVICE_SPECIFIC
,
1461 .download_firmware
= af9015_download_firmware
,
1462 .firmware
= "dvb-usb-af9015.fw",
1465 .size_of_priv
= sizeof(struct af9015_state
),
1472 .caps
= DVB_USB_ADAP_HAS_PID_FILTER
|
1473 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF
,
1475 .pid_filter_count
= 32,
1476 .pid_filter
= af9015_pid_filter
,
1477 .pid_filter_ctrl
= af9015_pid_filter_ctrl
,
1480 af9015_af9013_frontend_attach
,
1481 .tuner_attach
= af9015_tuner_attach
,
1493 af9015_af9013_frontend_attach
,
1494 .tuner_attach
= af9015_tuner_attach
,
1502 TS_USB20_FRAME_SIZE
,
1510 .identify_state
= af9015_identify_state
,
1513 .protocol
= RC_TYPE_NEC
,
1514 .module_name
= "af9015",
1515 .rc_query
= af9015_rc_query
,
1516 .rc_interval
= AF9015_RC_INTERVAL
,
1517 .allowed_protos
= RC_TYPE_NEC
,
1520 .i2c_algo
= &af9015_i2c_algo
,
1522 .num_device_descs
= 12, /* check max from dvb-usb.h */
1525 .name
= "Afatech AF9015 DVB-T USB2.0 stick",
1527 &af9015_usb_table
[AFATECH_9015
],
1528 &af9015_usb_table
[AFATECH_9016
],
1534 .name
= "Leadtek WinFast DTV Dongle Gold",
1536 &af9015_usb_table
[WINFAST_DTV_GOLD
],
1542 .name
= "Pinnacle PCTV 71e",
1544 &af9015_usb_table
[PINNACLE_PCTV_71E
],
1550 .name
= "KWorld PlusTV Dual DVB-T Stick " \
1553 &af9015_usb_table
[KWORLD_PLUSTV_399U
],
1554 &af9015_usb_table
[KWORLD_399U_2
],
1560 .name
= "DigitalNow TinyTwin DVB-T Receiver",
1562 &af9015_usb_table
[TINYTWIN
],
1563 &af9015_usb_table
[TINYTWIN_2
],
1564 &af9015_usb_table
[TINYTWIN_3
],
1570 .name
= "TwinHan AzureWave AD-TU700(704J)",
1572 &af9015_usb_table
[AZUREWAVE_TU700
],
1578 .name
= "TerraTec Cinergy T USB XE",
1580 &af9015_usb_table
[TERRATEC_AF9015
],
1586 .name
= "KWorld PlusTV Dual DVB-T PCI " \
1589 &af9015_usb_table
[KWORLD_PLUSTV_PC160
],
1595 .name
= "AVerMedia AVerTV DVB-T Volar X",
1597 &af9015_usb_table
[AVERTV_VOLAR_X
],
1603 .name
= "TerraTec Cinergy T Stick RC",
1605 &af9015_usb_table
[CINERGY_T_STICK_RC
],
1611 .name
= "TerraTec Cinergy T Stick Dual RC",
1613 &af9015_usb_table
[CINERGY_T_DUAL_RC
],
1619 .name
= "AverMedia AVerTV Red HD+ (A850T)",
1621 &af9015_usb_table
[AVERTV_A850T
],
1628 .caps
= DVB_USB_IS_AN_I2C_ADAPTER
,
1630 .usb_ctrl
= DEVICE_SPECIFIC
,
1631 .download_firmware
= af9015_download_firmware
,
1632 .firmware
= "dvb-usb-af9015.fw",
1635 .size_of_priv
= sizeof(struct af9015_state
),
1642 .caps
= DVB_USB_ADAP_HAS_PID_FILTER
|
1643 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF
,
1645 .pid_filter_count
= 32,
1646 .pid_filter
= af9015_pid_filter
,
1647 .pid_filter_ctrl
= af9015_pid_filter_ctrl
,
1650 af9015_af9013_frontend_attach
,
1651 .tuner_attach
= af9015_tuner_attach
,
1663 af9015_af9013_frontend_attach
,
1664 .tuner_attach
= af9015_tuner_attach
,
1672 TS_USB20_FRAME_SIZE
,
1680 .identify_state
= af9015_identify_state
,
1683 .protocol
= RC_TYPE_NEC
,
1684 .module_name
= "af9015",
1685 .rc_query
= af9015_rc_query
,
1686 .rc_interval
= AF9015_RC_INTERVAL
,
1687 .allowed_protos
= RC_TYPE_NEC
,
1690 .i2c_algo
= &af9015_i2c_algo
,
1692 .num_device_descs
= 10, /* check max from dvb-usb.h */
1695 .name
= "Xtensions XD-380",
1697 &af9015_usb_table
[XTENSIONS_380U
],
1703 .name
= "MSI DIGIVOX Duo",
1705 &af9015_usb_table
[MSI_DIGIVOX_DUO
],
1711 .name
= "Fujitsu-Siemens Slim Mobile USB DVB-T",
1713 &af9015_usb_table
[AVERTV_VOLAR_X_REV2
],
1719 .name
= "Telestar Starstick 2",
1721 &af9015_usb_table
[TELESTAR_STARSTICK_2
],
1727 .name
= "AVerMedia A309",
1729 &af9015_usb_table
[AVERMEDIA_A309_USB
],
1735 .name
= "MSI Digi VOX mini III",
1737 &af9015_usb_table
[MSI_DIGIVOX_MINI_III
],
1743 .name
= "KWorld USB DVB-T TV Stick II " \
1746 &af9015_usb_table
[KWORLD_E396
],
1747 &af9015_usb_table
[KWORLD_E39B
],
1748 &af9015_usb_table
[KWORLD_E395
],
1749 &af9015_usb_table
[KWORLD_E39A
],
1755 .name
= "TrekStor DVB-T USB Stick",
1757 &af9015_usb_table
[TREKSTOR_DVBT
],
1763 .name
= "AverMedia AVerTV Volar Black HD " \
1766 &af9015_usb_table
[AVERTV_A850
],
1772 .name
= "Sveon STV22 Dual USB DVB-T Tuner HDTV",
1774 &af9015_usb_table
[SVEON_STV22
],
1781 .caps
= DVB_USB_IS_AN_I2C_ADAPTER
,
1783 .usb_ctrl
= DEVICE_SPECIFIC
,
1784 .download_firmware
= af9015_download_firmware
,
1785 .firmware
= "dvb-usb-af9015.fw",
1788 .size_of_priv
= sizeof(struct af9015_state
),
1795 .caps
= DVB_USB_ADAP_HAS_PID_FILTER
|
1796 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF
,
1798 .pid_filter_count
= 32,
1799 .pid_filter
= af9015_pid_filter
,
1800 .pid_filter_ctrl
= af9015_pid_filter_ctrl
,
1803 af9015_af9013_frontend_attach
,
1804 .tuner_attach
= af9015_tuner_attach
,
1816 af9015_af9013_frontend_attach
,
1817 .tuner_attach
= af9015_tuner_attach
,
1825 TS_USB20_FRAME_SIZE
,
1833 .identify_state
= af9015_identify_state
,
1836 .protocol
= RC_TYPE_NEC
,
1837 .module_name
= "af9015",
1838 .rc_query
= af9015_rc_query
,
1839 .rc_interval
= AF9015_RC_INTERVAL
,
1840 .allowed_protos
= RC_TYPE_NEC
,
1843 .i2c_algo
= &af9015_i2c_algo
,
1845 .num_device_descs
= 9, /* check max from dvb-usb.h */
1848 .name
= "AverMedia AVerTV Volar GPS 805 (A805)",
1850 &af9015_usb_table
[AVERTV_A805
],
1856 .name
= "Conceptronic USB2.0 DVB-T CTVDIGRCU " \
1859 &af9015_usb_table
[CONCEPTRONIC_CTVDIGRCU
],
1865 .name
= "KWorld Digial MC-810",
1867 &af9015_usb_table
[KWORLD_MC810
],
1873 .name
= "Genius TVGo DVB-T03",
1875 &af9015_usb_table
[GENIUS_TVGO_DVB_T03
],
1881 .name
= "KWorld PlusTV DVB-T PCI Pro Card " \
1884 &af9015_usb_table
[KWORLD_PC160_T
],
1890 .name
= "Sveon STV20 Tuner USB DVB-T HDTV",
1892 &af9015_usb_table
[SVEON_STV20
],
1898 .name
= "Leadtek WinFast DTV2000DS",
1900 &af9015_usb_table
[WINFAST_DTV2000DS
],
1906 .name
= "KWorld USB DVB-T Stick Mobile " \
1909 &af9015_usb_table
[KWORLD_UB383_T
],
1915 .name
= "AverMedia AVerTV Volar M (A815Mac)",
1917 &af9015_usb_table
[AVERMEDIA_A815M
],
1926 static int af9015_usb_probe(struct usb_interface
*intf
,
1927 const struct usb_device_id
*id
)
1930 struct dvb_usb_device
*d
= NULL
;
1931 struct usb_device
*udev
= interface_to_usbdev(intf
);
1934 deb_info("%s: interface:%d\n", __func__
,
1935 intf
->cur_altsetting
->desc
.bInterfaceNumber
);
1937 /* interface 0 is used by DVB-T receiver and
1938 interface 1 is for remote controller (HID) */
1939 if (intf
->cur_altsetting
->desc
.bInterfaceNumber
== 0) {
1940 ret
= af9015_read_config(udev
);
1944 for (i
= 0; i
< af9015_properties_count
; i
++) {
1945 ret
= dvb_usb_device_init(intf
, &af9015_properties
[i
],
1946 THIS_MODULE
, &d
, adapter_nr
);
1956 ret
= af9015_init(d
);
1962 /* usb specific object needed to register this driver with the usb subsystem */
1963 static struct usb_driver af9015_usb_driver
= {
1964 .name
= "dvb_usb_af9015",
1965 .probe
= af9015_usb_probe
,
1966 .disconnect
= dvb_usb_device_exit
,
1967 .id_table
= af9015_usb_table
,
1970 module_usb_driver(af9015_usb_driver
);
1972 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1973 MODULE_DESCRIPTION("Driver for Afatech AF9015 DVB-T");
1974 MODULE_LICENSE("GPL");