1 /* DVB USB compliant linux driver for
3 * DM04/QQBOX DVB-S USB BOX LME2510C + SHARP:BS2F7HZ7395
4 * LME2510C + LG TDQY-P001F
5 * LME2510C + BS2F7HZ0194
6 * LME2510 + LG TDQY-P001F
7 * LME2510 + BS2F7HZ0194
9 * MVB7395 (LME2510C+SHARP:BS2F7HZ7395)
10 * SHARP:BS2F7HZ7395 = (STV0288+Sharp IX2505V)
12 * MV001F (LME2510+LGTDQY-P001F)
13 * LG TDQY - P001F =(TDA8263 + TDA10086H)
15 * MVB0001F (LME2510C+LGTDQT-P001F)
17 * MV0194 (LME2510+SHARP:BS2F7HZ0194)
18 * SHARP:BS2F7HZ0194 = (STV0299+IX2410)
20 * MVB0194 (LME2510C+SHARP0194)
22 * LME2510C + M88RS2000
24 * For firmware see Documentation/dvb/lmedm04.txt
27 * 0xd0 - STV0288 - Demodulator
28 * 0xc0 - Sharp IX2505V - Tuner
30 * 0x1c - TDA10086 - Demodulator
31 * 0xc0 - TDA8263 - Tuner
33 * 0xd0 - STV0299 - Demodulator
34 * 0xc0 - IX2410 - Tuner
37 * VID = 3344 PID LME2510=1122 LME2510C=1120
39 * Copyright (C) 2010 Malcolm Priestley (tvboxspy@gmail.com)
40 * LME2510(C)(C) Leaguerme (Shenzhen) MicroElectronics Co., Ltd.
42 * This program is free software; you can redistribute it and/or modify
43 * it under the terms of the GNU General Public License Version 2, as
44 * published by the Free Software Foundation.
46 * This program is distributed in the hope that it will be useful,
47 * but WITHOUT ANY WARRANTY; without even the implied warranty of
48 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
49 * GNU General Public License for more details.
51 * You should have received a copy of the GNU General Public License
52 * along with this program; if not, write to the Free Software
53 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
56 * see Documentation/dvb/README.dvb-usb for more information
59 * LME2510: Non Intel USB chipsets fail to maintain High Speed on
62 * QQbox suffers from noise on LNB voltage.
64 * LME2510: SHARP:BS2F7HZ0194(MV0194) cannot cold reset and share system
65 * with other tuners. After a cold reset streaming will not start.
67 * M88RS2000 suffers from loss of lock.
69 #define DVB_USB_LOG_PREFIX "LME2510(C)"
70 #include <linux/usb.h>
71 #include <linux/usb/input.h>
72 #include <media/rc-core.h>
83 #include "m88rs2000.h"
87 #define LME2510_C_S7395 "dvb-usb-lme2510c-s7395.fw";
88 #define LME2510_C_LG "dvb-usb-lme2510c-lg.fw";
89 #define LME2510_C_S0194 "dvb-usb-lme2510c-s0194.fw";
90 #define LME2510_C_RS2000 "dvb-usb-lme2510c-rs2000.fw";
91 #define LME2510_LG "dvb-usb-lme2510-lg.fw";
92 #define LME2510_S0194 "dvb-usb-lme2510-s0194.fw";
95 static int dvb_usb_lme2510_debug
;
96 #define lme_debug(var, level, args...) do { \
98 pr_debug(DVB_USB_LOG_PREFIX": " args); \
100 #define deb_info(level, args...) lme_debug(dvb_usb_lme2510_debug, level, args)
101 #define debug_data_snipet(level, name, p) \
102 deb_info(level, name" (%02x%02x%02x%02x%02x%02x%02x%02x)", \
103 *p, *(p+1), *(p+2), *(p+3), *(p+4), \
104 *(p+5), *(p+6), *(p+7));
105 #define info(args...) pr_info(DVB_USB_LOG_PREFIX": "args)
107 module_param_named(debug
, dvb_usb_lme2510_debug
, int, 0644);
108 MODULE_PARM_DESC(debug
, "set debugging level (1=info (or-able)).");
110 static int dvb_usb_lme2510_firmware
;
111 module_param_named(firmware
, dvb_usb_lme2510_firmware
, int, 0644);
112 MODULE_PARM_DESC(firmware
, "set default firmware 0=Sharp7395 1=LG");
114 static int pid_filter
;
115 module_param_named(pid
, pid_filter
, int, 0644);
116 MODULE_PARM_DESC(pid
, "set default 0=default 1=off 2=on");
119 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr
);
121 #define TUNER_DEFAULT 0x0
123 #define TUNER_S7395 0x2
124 #define TUNER_S0194 0x3
125 #define TUNER_RS2000 0x4
127 struct lme2510_state
{
147 int (*fe_set_voltage
)(struct dvb_frontend
*, fe_sec_voltage_t
);
148 u8 dvb_usb_lme2510_firmware
;
151 static int lme2510_bulk_write(struct usb_device
*dev
,
152 u8
*snd
, int len
, u8 pipe
)
156 ret
= usb_bulk_msg(dev
, usb_sndbulkpipe(dev
, pipe
),
157 snd
, len
, &actual_l
, 100);
161 static int lme2510_bulk_read(struct usb_device
*dev
,
162 u8
*rev
, int len
, u8 pipe
)
166 ret
= usb_bulk_msg(dev
, usb_rcvbulkpipe(dev
, pipe
),
167 rev
, len
, &actual_l
, 200);
171 static int lme2510_usb_talk(struct dvb_usb_device
*d
,
172 u8
*wbuf
, int wlen
, u8
*rbuf
, int rlen
)
174 struct lme2510_state
*st
= d
->priv
;
178 if (st
->usb_buffer
== NULL
) {
179 st
->usb_buffer
= kmalloc(64, GFP_KERNEL
);
180 if (st
->usb_buffer
== NULL
) {
181 info("MEM Error no memory");
185 buff
= st
->usb_buffer
;
187 ret
= mutex_lock_interruptible(&d
->usb_mutex
);
192 /* the read/write capped at 64 */
193 memcpy(buff
, wbuf
, (wlen
< 64) ? wlen
: 64);
195 ret
|= lme2510_bulk_write(d
->udev
, buff
, wlen
, 0x01);
197 ret
|= lme2510_bulk_read(d
->udev
, buff
, (rlen
< 64) ?
201 memcpy(rbuf
, buff
, rlen
);
203 mutex_unlock(&d
->usb_mutex
);
205 return (ret
< 0) ? -ENODEV
: 0;
208 static int lme2510_stream_restart(struct dvb_usb_device
*d
)
210 struct lme2510_state
*st
= d
->priv
;
211 u8 all_pids
[] = LME_ALL_PIDS
;
212 u8 stream_on
[] = LME_ST_ON_W
;
216 ret
= lme2510_usb_talk(d
, all_pids
, sizeof(all_pids
),
217 rbuff
, sizeof(rbuff
));
218 /*Restart Stream Command*/
219 ret
= lme2510_usb_talk(d
, stream_on
, sizeof(stream_on
),
220 rbuff
, sizeof(rbuff
));
224 static int lme2510_enable_pid(struct dvb_usb_device
*d
, u8 index
, u16 pid_out
)
226 struct lme2510_state
*st
= d
->priv
;
227 static u8 pid_buff
[] = LME_ZERO_PID
;
229 u8 pid_no
= index
* 2;
230 u8 pid_len
= pid_no
+ 2;
232 deb_info(1, "PID Setting Pid %04x", pid_out
);
234 if (st
->pid_size
== 0)
235 ret
|= lme2510_stream_restart(d
);
237 pid_buff
[2] = pid_no
;
238 pid_buff
[3] = (u8
)pid_out
& 0xff;
239 pid_buff
[4] = pid_no
+ 1;
240 pid_buff
[5] = (u8
)(pid_out
>> 8);
242 if (pid_len
> st
->pid_size
)
243 st
->pid_size
= pid_len
;
244 pid_buff
[7] = 0x80 + st
->pid_size
;
246 ret
|= lme2510_usb_talk(d
, pid_buff
,
247 sizeof(pid_buff
) , rbuf
, sizeof(rbuf
));
250 ret
|= lme2510_stream_restart(d
);
255 static void lme2510_int_response(struct urb
*lme_urb
)
257 struct dvb_usb_adapter
*adap
= lme_urb
->context
;
258 struct lme2510_state
*st
= adap_to_priv(adap
);
259 static u8
*ibuf
, *rbuf
;
263 switch (lme_urb
->status
) {
272 info("Error %x", lme_urb
->status
);
276 rbuf
= (u8
*) lme_urb
->transfer_buffer
;
278 offset
= ((lme_urb
->actual_length
/8) > 4)
279 ? 4 : (lme_urb
->actual_length
/8) ;
281 for (i
= 0; i
< offset
; ++i
) {
282 ibuf
= (u8
*)&rbuf
[i
*8];
283 deb_info(5, "INT O/S C =%02x C/O=%02x Type =%02x%02x",
284 offset
, i
, ibuf
[0], ibuf
[1]);
288 debug_data_snipet(1, "INT Remote data snipet", ibuf
);
289 if ((ibuf
[4] + ibuf
[5]) == 0xff) {
292 ? (ibuf
[3] ^ 0xff) << 8 : 0;
293 key
+= (ibuf
[2] ^ 0xff) << 16;
294 deb_info(1, "INT Key =%08x", key
);
295 if (adap_to_d(adap
)->rc_dev
!= NULL
)
296 rc_keydown(adap_to_d(adap
)->rc_dev
,
301 switch (st
->tuner_config
) {
304 st
->signal_lock
= ibuf
[2];
305 st
->signal_level
= ibuf
[4];
306 st
->signal_sn
= ibuf
[3];
307 st
->time_key
= ibuf
[7];
311 /* Tweak for earlier firmware*/
312 if (ibuf
[1] == 0x03) {
314 st
->signal_lock
= ibuf
[2];
315 st
->signal_level
= ibuf
[3];
316 st
->signal_sn
= ibuf
[4];
318 st
->signal_level
= ibuf
[4];
319 st
->signal_sn
= ibuf
[5];
321 (st
->signal_lock
& 0xf7) +
322 ((ibuf
[2] & 0x01) << 0x03);
326 if (ibuf
[1] == 0x3 && ibuf
[6] == 0xff)
327 st
->signal_lock
= 0xff;
329 st
->signal_lock
= 0x00;
330 st
->signal_level
= ibuf
[5];
331 st
->signal_sn
= ibuf
[4];
332 st
->time_key
= ibuf
[7];
336 debug_data_snipet(5, "INT Remote data snipet in", ibuf
);
339 debug_data_snipet(1, "INT Control data snipet", ibuf
);
342 debug_data_snipet(1, "INT Unknown data snipet", ibuf
);
346 usb_submit_urb(lme_urb
, GFP_ATOMIC
);
349 static int lme2510_int_read(struct dvb_usb_adapter
*adap
)
351 struct dvb_usb_device
*d
= adap_to_d(adap
);
352 struct lme2510_state
*lme_int
= adap_to_priv(adap
);
354 lme_int
->lme_urb
= usb_alloc_urb(0, GFP_ATOMIC
);
356 if (lme_int
->lme_urb
== NULL
)
359 lme_int
->buffer
= usb_alloc_coherent(d
->udev
, 128, GFP_ATOMIC
,
360 &lme_int
->lme_urb
->transfer_dma
);
362 if (lme_int
->buffer
== NULL
)
365 usb_fill_int_urb(lme_int
->lme_urb
,
367 usb_rcvintpipe(d
->udev
, 0xa),
370 lme2510_int_response
,
374 lme_int
->lme_urb
->transfer_flags
|= URB_NO_TRANSFER_DMA_MAP
;
376 usb_submit_urb(lme_int
->lme_urb
, GFP_ATOMIC
);
377 info("INT Interrupt Service Started");
382 static int lme2510_pid_filter_ctrl(struct dvb_usb_adapter
*adap
, int onoff
)
384 struct dvb_usb_device
*d
= adap_to_d(adap
);
385 struct lme2510_state
*st
= adap_to_priv(adap
);
386 static u8 clear_pid_reg
[] = LME_ALL_PIDS
;
390 deb_info(1, "PID Clearing Filter");
392 mutex_lock(&d
->i2c_mutex
);
395 ret
|= lme2510_usb_talk(d
, clear_pid_reg
,
396 sizeof(clear_pid_reg
), rbuf
, sizeof(rbuf
));
403 mutex_unlock(&d
->i2c_mutex
);
408 static int lme2510_pid_filter(struct dvb_usb_adapter
*adap
, int index
, u16 pid
,
411 struct dvb_usb_device
*d
= adap_to_d(adap
);
414 deb_info(3, "%s PID=%04x Index=%04x onoff=%02x", __func__
,
418 mutex_lock(&d
->i2c_mutex
);
419 ret
|= lme2510_enable_pid(d
, index
, pid
);
420 mutex_unlock(&d
->i2c_mutex
);
428 static int lme2510_return_status(struct dvb_usb_device
*d
)
433 data
= kzalloc(10, GFP_KERNEL
);
437 ret
|= usb_control_msg(d
->udev
, usb_rcvctrlpipe(d
->udev
, 0),
438 0x06, 0x80, 0x0302, 0x00, data
, 0x0006, 200);
439 info("Firmware Status: %x (%x)", ret
, data
[2]);
441 ret
= (ret
< 0) ? -ENODEV
: data
[2];
446 static int lme2510_msg(struct dvb_usb_device
*d
,
447 u8
*wbuf
, int wlen
, u8
*rbuf
, int rlen
)
450 struct lme2510_state
*st
= d
->priv
;
452 if (st
->i2c_talk_onoff
== 1) {
454 ret
= lme2510_usb_talk(d
, wbuf
, wlen
, rbuf
, rlen
);
456 switch (st
->tuner_config
) {
458 if (wbuf
[2] == 0x1c) {
459 if (wbuf
[3] == 0x0e) {
460 st
->signal_lock
= rbuf
[1];
461 if ((st
->stream_on
& 1) &&
462 (st
->signal_lock
& 0x10)) {
463 lme2510_stream_restart(d
);
464 st
->i2c_talk_onoff
= 0;
471 if (wbuf
[2] == 0xd0) {
472 if (wbuf
[3] == 0x24) {
473 st
->signal_lock
= rbuf
[1];
474 if ((st
->stream_on
& 1) &&
475 (st
->signal_lock
& 0x8)) {
476 lme2510_stream_restart(d
);
477 st
->i2c_talk_onoff
= 0;
483 if (wbuf
[2] == 0xd0) {
484 if (wbuf
[3] == 0x1b) {
485 st
->signal_lock
= rbuf
[1];
486 if ((st
->stream_on
& 1) &&
487 (st
->signal_lock
& 0x8)) {
488 lme2510_stream_restart(d
);
489 st
->i2c_talk_onoff
= 0;
499 /* TODO rewrite this section */
500 switch (st
->tuner_config
) {
505 rbuf
[1] = st
->signal_lock
;
509 rbuf
[1] = st
->signal_level
;
513 rbuf
[1] = st
->signal_sn
;
523 lme2510_usb_talk(d
, wbuf
, wlen
, rbuf
, rlen
);
524 st
->i2c_talk_onoff
= 1;
532 rbuf
[1] = (st
->signal_level
& 0x80)
533 ? 0 : (st
->signal_level
* 2);
537 rbuf
[1] = st
->signal_sn
;
541 rbuf
[1] = st
->signal_lock
;
550 lme2510_usb_talk(d
, wbuf
, wlen
, rbuf
, rlen
);
551 st
->i2c_talk_onoff
= 1;
559 rbuf
[1] = (st
->signal_level
& 0x80)
560 ? 0 : (st
->signal_level
* 2);
564 rbuf
[1] = st
->signal_sn
;
568 rbuf
[1] = st
->signal_lock
;
578 lme2510_usb_talk(d
, wbuf
, wlen
, rbuf
, rlen
);
579 st
->i2c_talk_onoff
= 1;
588 if (st
->last_key
== st
->time_key
) {
590 if (st
->key_timeout
> 5)
594 st
->last_key
= st
->time_key
;
597 lme2510_usb_talk(d
, wbuf
, wlen
, rbuf
, rlen
);
598 st
->i2c_talk_onoff
= 1;
605 deb_info(4, "I2C From Interrupt Message out(%02x) in(%02x)",
614 static int lme2510_i2c_xfer(struct i2c_adapter
*adap
, struct i2c_msg msg
[],
617 struct dvb_usb_device
*d
= i2c_get_adapdata(adap
);
618 struct lme2510_state
*st
= d
->priv
;
619 static u8 obuf
[64], ibuf
[64];
622 u8 gate
= st
->i2c_gate
;
624 mutex_lock(&d
->i2c_mutex
);
629 for (i
= 0; i
< num
; i
++) {
630 read_o
= msg
[i
].flags
& I2C_M_RD
;
631 read
= i
+ 1 < num
&& msg
[i
+ 1].flags
& I2C_M_RD
;
633 gate
= (msg
[i
].addr
== st
->i2c_tuner_addr
)
634 ? (read
) ? st
->i2c_tuner_gate_r
635 : st
->i2c_tuner_gate_w
637 obuf
[0] = gate
| (read
<< 7);
640 obuf
[1] = (read
) ? 2 : msg
[i
].len
+ 1;
642 obuf
[1] = msg
[i
].len
+ read
+ 1;
644 obuf
[2] = msg
[i
].addr
<< 1;
650 memcpy(&obuf
[3], msg
[i
].buf
, msg
[i
].len
);
651 obuf
[msg
[i
].len
+3] = msg
[i
+1].len
;
655 memcpy(&obuf
[3], msg
[i
].buf
, msg
[i
].len
);
659 if (lme2510_msg(d
, obuf
, len
, ibuf
, 64) < 0) {
660 deb_info(1, "i2c transfer failed.");
661 mutex_unlock(&d
->i2c_mutex
);
667 memcpy(msg
[i
].buf
, &ibuf
[1], msg
[i
].len
);
669 memcpy(msg
[i
+1].buf
, &ibuf
[1], msg
[i
+1].len
);
675 mutex_unlock(&d
->i2c_mutex
);
679 static u32
lme2510_i2c_func(struct i2c_adapter
*adapter
)
684 static struct i2c_algorithm lme2510_i2c_algo
= {
685 .master_xfer
= lme2510_i2c_xfer
,
686 .functionality
= lme2510_i2c_func
,
689 static int lme2510_streaming_ctrl(struct dvb_frontend
*fe
, int onoff
)
691 struct dvb_usb_adapter
*adap
= fe_to_adap(fe
);
692 struct dvb_usb_device
*d
= adap_to_d(adap
);
693 struct lme2510_state
*st
= adap_to_priv(adap
);
694 static u8 clear_reg_3
[] = LME_ALL_PIDS
;
696 int ret
= 0, rlen
= sizeof(rbuf
);
698 deb_info(1, "STM (%02x)", onoff
);
700 /* Streaming is started by FE_HAS_LOCK */
704 deb_info(1, "STM Steam Off");
705 /* mutex is here only to avoid collision with I2C */
706 mutex_lock(&d
->i2c_mutex
);
708 ret
= lme2510_usb_talk(d
, clear_reg_3
,
709 sizeof(clear_reg_3
), rbuf
, rlen
);
711 st
->i2c_talk_onoff
= 1;
713 mutex_unlock(&d
->i2c_mutex
);
716 return (ret
< 0) ? -ENODEV
: 0;
719 static u8
check_sum(u8
*p
, u8 len
)
727 static int lme2510_download_firmware(struct dvb_usb_device
*d
,
728 const struct firmware
*fw
)
732 u16 j
, wlen
, len_in
, start
, end
;
733 u8 packet_size
, dlen
, i
;
739 data
= kzalloc(128, GFP_KERNEL
);
741 info("FRM Could not start Firmware Download"\
742 "(Buffer allocation failed)");
746 info("FRM Starting Firmware Download");
748 for (i
= 1; i
< 3; i
++) {
749 start
= (i
== 1) ? 0 : 512;
750 end
= (i
== 1) ? 512 : fw
->size
;
751 for (j
= start
; j
< end
; j
+= (packet_size
+1)) {
752 fw_data
= (u8
*)(fw
->data
+ j
);
753 if ((end
- j
) > packet_size
) {
758 dlen
= (u8
)(end
- j
)-1;
761 memcpy(&data
[2], fw_data
, dlen
+1);
762 wlen
= (u8
) dlen
+ 4;
763 data
[wlen
-1] = check_sum(fw_data
, dlen
+1);
764 deb_info(1, "Data S=%02x:E=%02x CS= %02x", data
[3],
765 data
[dlen
+2], data
[dlen
+3]);
766 lme2510_usb_talk(d
, data
, wlen
, data
, len_in
);
767 ret
|= (data
[0] == 0x88) ? 0 : -1;
774 lme2510_usb_talk(d
, data
, len_in
, data
, len_in
);
778 info("FRM Firmware Download Failed (%04x)" , ret
);
780 info("FRM Firmware Download Completed - Resetting Device");
783 return RECONNECTS_USB
;
786 static void lme_coldreset(struct dvb_usb_device
*d
)
790 info("FRM Firmware Cold Reset");
792 lme2510_usb_talk(d
, data
, sizeof(data
), data
, sizeof(data
));
797 static const char fw_c_s7395
[] = LME2510_C_S7395
;
798 static const char fw_c_lg
[] = LME2510_C_LG
;
799 static const char fw_c_s0194
[] = LME2510_C_S0194
;
800 static const char fw_c_rs2000
[] = LME2510_C_RS2000
;
801 static const char fw_lg
[] = LME2510_LG
;
802 static const char fw_s0194
[] = LME2510_S0194
;
804 static const char *lme_firmware_switch(struct dvb_usb_device
*d
, int cold
)
806 struct lme2510_state
*st
= d
->priv
;
807 struct usb_device
*udev
= d
->udev
;
808 const struct firmware
*fw
= NULL
;
812 cold
= (cold
> 0) ? (cold
& 1) : 0;
814 switch (le16_to_cpu(udev
->descriptor
.idProduct
)) {
816 switch (st
->dvb_usb_lme2510_firmware
) {
818 st
->dvb_usb_lme2510_firmware
= TUNER_S0194
;
821 ret
= request_firmware(&fw
, fw_lme
, &udev
->dev
);
826 st
->dvb_usb_lme2510_firmware
= TUNER_LG
;
829 ret
= request_firmware(&fw
, fw_lme
, &udev
->dev
);
832 st
->dvb_usb_lme2510_firmware
= TUNER_DEFAULT
;
837 switch (st
->dvb_usb_lme2510_firmware
) {
839 st
->dvb_usb_lme2510_firmware
= TUNER_S7395
;
842 ret
= request_firmware(&fw
, fw_lme
, &udev
->dev
);
847 st
->dvb_usb_lme2510_firmware
= TUNER_LG
;
850 ret
= request_firmware(&fw
, fw_lme
, &udev
->dev
);
853 st
->dvb_usb_lme2510_firmware
= TUNER_S0194
;
856 ret
= request_firmware(&fw
, fw_lme
, &udev
->dev
);
859 st
->dvb_usb_lme2510_firmware
= TUNER_DEFAULT
;
865 fw_lme
= fw_c_rs2000
;
866 st
->dvb_usb_lme2510_firmware
= TUNER_RS2000
;
872 release_firmware(fw
);
875 dvb_usb_lme2510_firmware
= st
->dvb_usb_lme2510_firmware
;
876 info("FRM Changing to %s firmware", fw_lme
);
884 static int lme2510_kill_urb(struct usb_data_stream
*stream
)
888 for (i
= 0; i
< stream
->urbs_submitted
; i
++) {
889 deb_info(3, "killing URB no. %d.", i
);
891 usb_kill_urb(stream
->urb_list
[i
]);
893 stream
->urbs_submitted
= 0;
898 static struct tda10086_config tda10086_config
= {
899 .demod_address
= 0x0e,
902 .xtal_freq
= TDA10086_XTAL_16M
,
905 static struct stv0288_config lme_config
= {
906 .demod_address
= 0x68,
908 .inittab
= s7395_inittab
,
911 static struct ix2505v_config lme_tuner
= {
912 .tuner_address
= 0x60,
915 .tuner_chargepump
= 0x3,
918 static struct stv0299_config sharp_z0194_config
= {
919 .demod_address
= 0x68,
920 .inittab
= sharp_z0194a_inittab
,
924 .lock_output
= STV0299_LOCKOUTPUT_1
,
925 .volt13_op0_op1
= STV0299_VOLT13_OP1
,
927 .set_symbol_rate
= sharp_z0194a_set_symbol_rate
,
930 static int dm04_rs2000_set_ts_param(struct dvb_frontend
*fe
,
933 struct dvb_usb_adapter
*adap
= fe_to_adap(fe
);
934 struct dvb_usb_device
*d
= adap_to_d(adap
);
935 struct lme2510_state
*st
= d
->priv
;
937 mutex_lock(&d
->i2c_mutex
);
938 if ((st
->i2c_talk_onoff
== 1) && (st
->stream_on
& 1)) {
939 st
->i2c_talk_onoff
= 0;
940 lme2510_stream_restart(d
);
942 mutex_unlock(&d
->i2c_mutex
);
947 static struct m88rs2000_config m88rs2000_config
= {
949 .set_ts_params
= dm04_rs2000_set_ts_param
,
952 static struct ts2020_config ts2020_config
= {
953 .tuner_address
= 0x60,
957 static int dm04_lme2510_set_voltage(struct dvb_frontend
*fe
,
958 fe_sec_voltage_t voltage
)
960 struct dvb_usb_device
*d
= fe_to_d(fe
);
961 struct lme2510_state
*st
= fe_to_priv(fe
);
962 static u8 voltage_low
[] = LME_VOLTAGE_L
;
963 static u8 voltage_high
[] = LME_VOLTAGE_H
;
965 int ret
= 0, len
= 3, rlen
= 1;
967 mutex_lock(&d
->i2c_mutex
);
971 ret
|= lme2510_usb_talk(d
,
972 voltage_high
, len
, rbuf
, rlen
);
975 case SEC_VOLTAGE_OFF
:
978 ret
|= lme2510_usb_talk(d
,
979 voltage_low
, len
, rbuf
, rlen
);
983 mutex_unlock(&d
->i2c_mutex
);
985 if (st
->tuner_config
== TUNER_RS2000
)
986 if (st
->fe_set_voltage
)
987 st
->fe_set_voltage(fe
, voltage
);
990 return (ret
< 0) ? -ENODEV
: 0;
993 static int dm04_rs2000_read_signal_strength(struct dvb_frontend
*fe
,
996 struct lme2510_state
*st
= fe_to_priv(fe
);
998 *strength
= (u16
)((u32
)st
->signal_level
* 0xffff / 0xff);
1003 static int dm04_rs2000_read_snr(struct dvb_frontend
*fe
, u16
*snr
)
1005 struct lme2510_state
*st
= fe_to_priv(fe
);
1007 *snr
= (u16
)((u32
)st
->signal_sn
* 0xffff / 0x7f);
1012 static int dm04_read_ber(struct dvb_frontend
*fe
, u32
*ber
)
1019 static int dm04_read_ucblocks(struct dvb_frontend
*fe
, u32
*ucblocks
)
1026 static int lme_name(struct dvb_usb_adapter
*adap
)
1028 struct dvb_usb_device
*d
= adap_to_d(adap
);
1029 struct lme2510_state
*st
= adap_to_priv(adap
);
1030 const char *desc
= d
->name
;
1031 char *fe_name
[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395",
1032 " SHARP:BS2F7HZ0194", " RS2000"};
1033 char *name
= adap
->fe
[0]->ops
.info
.name
;
1035 strlcpy(name
, desc
, 128);
1036 strlcat(name
, fe_name
[st
->tuner_config
], 128);
1041 static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter
*adap
)
1043 struct dvb_usb_device
*d
= adap_to_d(adap
);
1044 struct lme2510_state
*st
= d
->priv
;
1047 st
->i2c_talk_onoff
= 1;
1048 switch (le16_to_cpu(d
->udev
->descriptor
.idProduct
)) {
1052 adap
->fe
[0] = dvb_attach(tda10086_attach
,
1053 &tda10086_config
, &d
->i2c_adap
);
1055 info("TUN Found Frontend TDA10086");
1056 st
->i2c_tuner_gate_w
= 4;
1057 st
->i2c_tuner_gate_r
= 4;
1058 st
->i2c_tuner_addr
= 0x60;
1059 st
->tuner_config
= TUNER_LG
;
1060 if (st
->dvb_usb_lme2510_firmware
!= TUNER_LG
) {
1061 st
->dvb_usb_lme2510_firmware
= TUNER_LG
;
1062 ret
= lme_firmware_switch(d
, 1) ? 0 : -ENODEV
;
1068 adap
->fe
[0] = dvb_attach(stv0299_attach
,
1069 &sharp_z0194_config
, &d
->i2c_adap
);
1071 info("FE Found Stv0299");
1072 st
->i2c_tuner_gate_w
= 4;
1073 st
->i2c_tuner_gate_r
= 5;
1074 st
->i2c_tuner_addr
= 0x60;
1075 st
->tuner_config
= TUNER_S0194
;
1076 if (st
->dvb_usb_lme2510_firmware
!= TUNER_S0194
) {
1077 st
->dvb_usb_lme2510_firmware
= TUNER_S0194
;
1078 ret
= lme_firmware_switch(d
, 1) ? 0 : -ENODEV
;
1084 adap
->fe
[0] = dvb_attach(stv0288_attach
, &lme_config
,
1088 info("FE Found Stv0288");
1089 st
->i2c_tuner_gate_w
= 4;
1090 st
->i2c_tuner_gate_r
= 5;
1091 st
->i2c_tuner_addr
= 0x60;
1092 st
->tuner_config
= TUNER_S7395
;
1093 if (st
->dvb_usb_lme2510_firmware
!= TUNER_S7395
) {
1094 st
->dvb_usb_lme2510_firmware
= TUNER_S7395
;
1095 ret
= lme_firmware_switch(d
, 1) ? 0 : -ENODEV
;
1101 adap
->fe
[0] = dvb_attach(m88rs2000_attach
,
1102 &m88rs2000_config
, &d
->i2c_adap
);
1105 info("FE Found M88RS2000");
1106 dvb_attach(ts2020_attach
, adap
->fe
[0], &ts2020_config
,
1108 st
->i2c_tuner_gate_w
= 5;
1109 st
->i2c_tuner_gate_r
= 5;
1110 st
->i2c_tuner_addr
= 0x60;
1111 st
->tuner_config
= TUNER_RS2000
;
1112 st
->fe_set_voltage
=
1113 adap
->fe
[0]->ops
.set_voltage
;
1115 adap
->fe
[0]->ops
.read_signal_strength
=
1116 dm04_rs2000_read_signal_strength
;
1117 adap
->fe
[0]->ops
.read_snr
=
1118 dm04_rs2000_read_snr
;
1119 adap
->fe
[0]->ops
.read_ber
=
1121 adap
->fe
[0]->ops
.read_ucblocks
=
1127 if (adap
->fe
[0] == NULL
) {
1128 info("DM04/QQBOX Not Powered up or not Supported");
1134 dvb_frontend_detach(adap
->fe
[0]);
1141 adap
->fe
[0]->ops
.set_voltage
= dm04_lme2510_set_voltage
;
1142 ret
= lme_name(adap
);
1146 static int dm04_lme2510_tuner(struct dvb_usb_adapter
*adap
)
1148 struct dvb_usb_device
*d
= adap_to_d(adap
);
1149 struct lme2510_state
*st
= adap_to_priv(adap
);
1150 char *tun_msg
[] = {"", "TDA8263", "IX2505V", "DVB_PLL_OPERA", "RS2000"};
1153 switch (st
->tuner_config
) {
1155 if (dvb_attach(tda826x_attach
, adap
->fe
[0], 0x60,
1157 ret
= st
->tuner_config
;
1160 if (dvb_attach(ix2505v_attach
, adap
->fe
[0], &lme_tuner
,
1162 ret
= st
->tuner_config
;
1165 if (dvb_attach(dvb_pll_attach
, adap
->fe
[0], 0x60,
1166 &d
->i2c_adap
, DVB_PLL_OPERA1
))
1167 ret
= st
->tuner_config
;
1170 ret
= st
->tuner_config
;
1177 info("TUN Found %s tuner", tun_msg
[ret
]);
1179 info("TUN No tuner found --- resetting device");
1184 /* Start the Interrupt*/
1185 ret
= lme2510_int_read(adap
);
1187 info("INT Unable to start Interrupt Service");
1194 static int lme2510_powerup(struct dvb_usb_device
*d
, int onoff
)
1196 struct lme2510_state
*st
= d
->priv
;
1197 static u8 lnb_on
[] = LNB_ON
;
1198 static u8 lnb_off
[] = LNB_OFF
;
1200 int ret
= 0, len
= 3, rlen
= 1;
1202 mutex_lock(&d
->i2c_mutex
);
1205 ret
= lme2510_usb_talk(d
, lnb_on
, len
, rbuf
, rlen
);
1207 ret
= lme2510_usb_talk(d
, lnb_off
, len
, rbuf
, rlen
);
1209 st
->i2c_talk_onoff
= 1;
1211 mutex_unlock(&d
->i2c_mutex
);
1216 static int lme2510_get_adapter_count(struct dvb_usb_device
*d
)
1221 static int lme2510_identify_state(struct dvb_usb_device
*d
, const char **name
)
1223 struct lme2510_state
*st
= d
->priv
;
1225 usb_reset_configuration(d
->udev
);
1227 usb_set_interface(d
->udev
,
1228 d
->props
->bInterfaceNumber
, 1);
1230 st
->dvb_usb_lme2510_firmware
= dvb_usb_lme2510_firmware
;
1232 if (lme2510_return_status(d
) == 0x44) {
1233 *name
= lme_firmware_switch(d
, 0);
1240 static int lme2510_get_stream_config(struct dvb_frontend
*fe
, u8
*ts_type
,
1241 struct usb_data_stream_properties
*stream
)
1243 struct dvb_usb_adapter
*adap
= fe_to_adap(fe
);
1244 struct dvb_usb_device
*d
;
1249 d
= adap_to_d(adap
);
1251 /* Turn PID filter on the fly by module option */
1252 if (pid_filter
== 2) {
1253 adap
->pid_filtering
= 1;
1254 adap
->max_feed_count
= 15;
1257 if (!(le16_to_cpu(d
->udev
->descriptor
.idProduct
)
1259 stream
->endpoint
= 0x8;
1264 static int lme2510_get_rc_config(struct dvb_usb_device
*d
,
1265 struct dvb_usb_rc
*rc
)
1267 rc
->allowed_protos
= RC_BIT_NEC
;
1271 static void *lme2510_exit_int(struct dvb_usb_device
*d
)
1273 struct lme2510_state
*st
= d
->priv
;
1274 struct dvb_usb_adapter
*adap
= &d
->adapter
[0];
1275 void *buffer
= NULL
;
1278 lme2510_kill_urb(&adap
->stream
);
1281 if (st
->usb_buffer
!= NULL
) {
1282 st
->i2c_talk_onoff
= 1;
1283 st
->signal_lock
= 0;
1284 st
->signal_level
= 0;
1286 buffer
= st
->usb_buffer
;
1289 if (st
->lme_urb
!= NULL
) {
1290 usb_kill_urb(st
->lme_urb
);
1291 usb_free_coherent(d
->udev
, 128, st
->buffer
,
1292 st
->lme_urb
->transfer_dma
);
1293 info("Interrupt Service Stopped");
1299 static void lme2510_exit(struct dvb_usb_device
*d
)
1304 usb_buffer
= lme2510_exit_int(d
);
1309 static struct dvb_usb_device_properties lme2510_props
= {
1310 .driver_name
= KBUILD_MODNAME
,
1311 .owner
= THIS_MODULE
,
1312 .bInterfaceNumber
= 0,
1313 .adapter_nr
= adapter_nr
,
1314 .size_of_priv
= sizeof(struct lme2510_state
),
1316 .download_firmware
= lme2510_download_firmware
,
1318 .power_ctrl
= lme2510_powerup
,
1319 .identify_state
= lme2510_identify_state
,
1320 .i2c_algo
= &lme2510_i2c_algo
,
1322 .frontend_attach
= dm04_lme2510_frontend_attach
,
1323 .tuner_attach
= dm04_lme2510_tuner
,
1324 .get_stream_config
= lme2510_get_stream_config
,
1325 .get_adapter_count
= lme2510_get_adapter_count
,
1326 .streaming_ctrl
= lme2510_streaming_ctrl
,
1328 .get_rc_config
= lme2510_get_rc_config
,
1330 .exit
= lme2510_exit
,
1333 .caps
= DVB_USB_ADAP_HAS_PID_FILTER
|
1334 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF
,
1335 .pid_filter_count
= 15,
1336 .pid_filter
= lme2510_pid_filter
,
1337 .pid_filter_ctrl
= lme2510_pid_filter_ctrl
,
1339 DVB_USB_STREAM_BULK(0x86, 10, 4096),
1346 static const struct usb_device_id lme2510_id_table
[] = {
1347 { DVB_USB_DEVICE(0x3344, 0x1122, &lme2510_props
,
1348 "DM04_LME2510_DVB-S", RC_MAP_LME2510
) },
1349 { DVB_USB_DEVICE(0x3344, 0x1120, &lme2510_props
,
1350 "DM04_LME2510C_DVB-S", RC_MAP_LME2510
) },
1351 { DVB_USB_DEVICE(0x3344, 0x22f0, &lme2510_props
,
1352 "DM04_LME2510C_DVB-S RS2000", RC_MAP_LME2510
) },
1353 {} /* Terminating entry */
1356 MODULE_DEVICE_TABLE(usb
, lme2510_id_table
);
1358 static struct usb_driver lme2510_driver
= {
1359 .name
= KBUILD_MODNAME
,
1360 .probe
= dvb_usbv2_probe
,
1361 .disconnect
= dvb_usbv2_disconnect
,
1362 .id_table
= lme2510_id_table
,
1367 module_usb_driver(lme2510_driver
);
1369 MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
1370 MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0");
1371 MODULE_VERSION("2.06");
1372 MODULE_LICENSE("GPL");
1373 MODULE_FIRMWARE(LME2510_C_S7395
);
1374 MODULE_FIRMWARE(LME2510_C_LG
);
1375 MODULE_FIRMWARE(LME2510_C_S0194
);
1376 MODULE_FIRMWARE(LME2510_C_RS2000
);
1377 MODULE_FIRMWARE(LME2510_LG
);
1378 MODULE_FIRMWARE(LME2510_S0194
);