lmedm04.c 29.3 KB
Newer Older
1 2 3
/* DVB USB compliant linux driver for
 *
 * 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
8 9 10 11
 *
 * MVB7395 (LME2510C+SHARP:BS2F7HZ7395)
 * SHARP:BS2F7HZ7395 = (STV0288+Sharp IX2505V)
 *
12
 * MV001F (LME2510+LGTDQY-P001F)
13 14
 * LG TDQY - P001F =(TDA8263 + TDA10086H)
 *
15 16
 * MVB0001F (LME2510C+LGTDQT-P001F)
 *
17 18 19 20 21
 * MV0194 (LME2510+SHARP:BS2F7HZ0194)
 * SHARP:BS2F7HZ0194 = (STV0299+IX2410)
 *
 * MVB0194 (LME2510C+SHARP0194)
 *
22 23
 * LME2510C + M88RS2000
 *
24 25 26 27 28
 * For firmware see Documentation/dvb/lmedm04.txt
 *
 * I2C addresses:
 * 0xd0 - STV0288	- Demodulator
 * 0xc0 - Sharp IX2505V	- Tuner
29
 * --
30 31
 * 0x1c - TDA10086   - Demodulator
 * 0xc0 - TDA8263    - Tuner
32 33 34
 * --
 * 0xd0 - STV0299	- Demodulator
 * 0xc0 - IX2410	- Tuner
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
 *
 *
 * VID = 3344  PID LME2510=1122 LME2510C=1120
 *
 * Copyright (C) 2010 Malcolm Priestley (tvboxspy@gmail.com)
 * LME2510(C)(C) Leaguerme (Shenzhen) MicroElectronics Co., Ltd.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License Version 2, as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *
 * see Documentation/dvb/README.dvb-usb for more information
 *
 * Known Issues :
 *	LME2510: Non Intel USB chipsets fail to maintain High Speed on
 * Boot or Hot Plug.
 *
62
 * QQbox suffers from noise on LNB voltage.
63
 *
64 65 66
 *	LME2510: SHARP:BS2F7HZ0194(MV0194) cannot cold reset and share system
 * with other tuners. After a cold reset streaming will not start.
 *
67
 * M88RS2000 suffers from loss of lock.
68 69 70 71
 */
#define DVB_USB_LOG_PREFIX "LME2510(C)"
#include <linux/usb.h>
#include <linux/usb/input.h>
72
#include <media/rc-core.h>
73

74
#include "dvb_usb.h"
75 76 77 78 79
#include "lmedm04.h"
#include "tda826x.h"
#include "tda10086.h"
#include "stv0288.h"
#include "ix2505v.h"
80 81 82
#include "stv0299.h"
#include "dvb-pll.h"
#include "z0194a.h"
83
#include "m88rs2000.h"
84
#include "ts2020.h"
85 86


87 88 89 90 91 92
#define LME2510_C_S7395	"dvb-usb-lme2510c-s7395.fw";
#define LME2510_C_LG	"dvb-usb-lme2510c-lg.fw";
#define LME2510_C_S0194	"dvb-usb-lme2510c-s0194.fw";
#define LME2510_C_RS2000 "dvb-usb-lme2510c-rs2000.fw";
#define LME2510_LG	"dvb-usb-lme2510-lg.fw";
#define LME2510_S0194	"dvb-usb-lme2510-s0194.fw";
93 94 95

/* debug */
static int dvb_usb_lme2510_debug;
96
#define lme_debug(var, level, args...) do { \
97
	if ((var >= level)) \
98
		pr_debug(DVB_USB_LOG_PREFIX": " args); \
99
} while (0)
100
#define deb_info(level, args...) lme_debug(dvb_usb_lme2510_debug, level, args)
101 102 103 104
#define debug_data_snipet(level, name, p) \
	 deb_info(level, name" (%02x%02x%02x%02x%02x%02x%02x%02x)", \
		*p, *(p+1), *(p+2), *(p+3), *(p+4), \
			*(p+5), *(p+6), *(p+7));
105
#define info(args...) pr_info(DVB_USB_LOG_PREFIX": "args)
106 107

module_param_named(debug, dvb_usb_lme2510_debug, int, 0644);
108
MODULE_PARM_DESC(debug, "set debugging level (1=info (or-able)).");
109

110 111 112 113
static int dvb_usb_lme2510_firmware;
module_param_named(firmware, dvb_usb_lme2510_firmware, int, 0644);
MODULE_PARM_DESC(firmware, "set default firmware 0=Sharp7395 1=LG");

114 115
static int pid_filter;
module_param_named(pid, pid_filter, int, 0644);
116
MODULE_PARM_DESC(pid, "set default 0=default 1=off 2=on");
117

118

119
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
120 121

#define TUNER_DEFAULT	0x0
122 123
#define TUNER_LG	0x1
#define TUNER_S7395	0x2
124
#define TUNER_S0194	0x3
125
#define TUNER_RS2000	0x4
126 127

struct lme2510_state {
128
	unsigned long int_urb_due;
129
	fe_status_t lock_status;
130 131 132 133 134 135 136 137 138 139
	u8 id;
	u8 tuner_config;
	u8 signal_level;
	u8 signal_sn;
	u8 time_key;
	u8 i2c_talk_onoff;
	u8 i2c_gate;
	u8 i2c_tuner_gate_w;
	u8 i2c_tuner_gate_r;
	u8 i2c_tuner_addr;
140
	u8 stream_on;
141
	u8 pid_size;
142
	u8 pid_off;
143 144 145
	void *buffer;
	struct urb *lme_urb;
	void *usb_buffer;
146 147
	/* Frontend original calls */
	int (*fe_read_status)(struct dvb_frontend *, fe_status_t *);
148 149
	int (*fe_set_voltage)(struct dvb_frontend *, fe_sec_voltage_t);
	u8 dvb_usb_lme2510_firmware;
150 151 152 153 154 155
};

static int lme2510_bulk_write(struct usb_device *dev,
				u8 *snd, int len, u8 pipe)
{
	int ret, actual_l;
156

157
	ret = usb_bulk_msg(dev, usb_sndbulkpipe(dev, pipe),
158
				snd, len , &actual_l, 100);
159 160 161 162 163 164 165 166 167
	return ret;
}

static int lme2510_bulk_read(struct usb_device *dev,
				u8 *rev, int len, u8 pipe)
{
	int ret, actual_l;

	ret = usb_bulk_msg(dev, usb_rcvbulkpipe(dev, pipe),
168
				 rev, len , &actual_l, 200);
169 170 171 172 173 174 175 176 177 178 179
	return ret;
}

static int lme2510_usb_talk(struct dvb_usb_device *d,
		u8 *wbuf, int wlen, u8 *rbuf, int rlen)
{
	struct lme2510_state *st = d->priv;
	u8 *buff;
	int ret = 0;

	if (st->usb_buffer == NULL) {
180
		st->usb_buffer = kmalloc(64, GFP_KERNEL);
181 182 183 184 185 186 187 188 189 190 191 192
		if (st->usb_buffer == NULL) {
			info("MEM Error no memory");
			return -ENOMEM;
		}
	}
	buff = st->usb_buffer;

	ret = mutex_lock_interruptible(&d->usb_mutex);

	if (ret < 0)
		return -EAGAIN;

193 194
	/* the read/write capped at 64 */
	memcpy(buff, wbuf, (wlen < 64) ? wlen : 64);
195

196 197
	ret |= lme2510_bulk_write(d->udev, buff, wlen , 0x01);

198 199
	ret |= lme2510_bulk_read(d->udev, buff, (rlen < 64) ?
			rlen : 64 , 0x01);
200 201 202 203 204 205 206 207 208

	if (rlen > 0)
		memcpy(rbuf, buff, rlen);

	mutex_unlock(&d->usb_mutex);

	return (ret < 0) ? -ENODEV : 0;
}

209 210
static int lme2510_stream_restart(struct dvb_usb_device *d)
{
211 212 213
	struct lme2510_state *st = d->priv;
	u8 all_pids[] = LME_ALL_PIDS;
	u8 stream_on[] = LME_ST_ON_W;
214
	int ret;
215 216 217 218
	u8 rbuff[1];
	if (st->pid_off)
		ret = lme2510_usb_talk(d, all_pids, sizeof(all_pids),
			rbuff, sizeof(rbuff));
219
	/*Restart Stream Command*/
220
	ret = lme2510_usb_talk(d, stream_on, sizeof(stream_on),
221 222 223
			rbuff, sizeof(rbuff));
	return ret;
}
224

225 226 227 228 229 230
static int lme2510_enable_pid(struct dvb_usb_device *d, u8 index, u16 pid_out)
{
	struct lme2510_state *st = d->priv;
	static u8 pid_buff[] = LME_ZERO_PID;
	static u8 rbuf[1];
	u8 pid_no = index * 2;
231
	u8 pid_len = pid_no + 2;
232 233 234
	int ret = 0;
	deb_info(1, "PID Setting Pid %04x", pid_out);

235 236 237
	if (st->pid_size == 0)
		ret |= lme2510_stream_restart(d);

238 239 240 241 242
	pid_buff[2] = pid_no;
	pid_buff[3] = (u8)pid_out & 0xff;
	pid_buff[4] = pid_no + 1;
	pid_buff[5] = (u8)(pid_out >> 8);

243 244 245
	if (pid_len > st->pid_size)
		st->pid_size = pid_len;
	pid_buff[7] = 0x80 + st->pid_size;
246 247 248 249

	ret |= lme2510_usb_talk(d, pid_buff ,
		sizeof(pid_buff) , rbuf, sizeof(rbuf));

250
	if (st->stream_on)
251 252 253 254 255
		ret |= lme2510_stream_restart(d);

	return ret;
}

256 257 258
static void lme2510_int_response(struct urb *lme_urb)
{
	struct dvb_usb_adapter *adap = lme_urb->context;
259
	struct lme2510_state *st = adap_to_priv(adap);
260 261
	static u8 *ibuf, *rbuf;
	int i = 0, offset;
262
	u32 key;
263
	u8 signal_lock = 0;
264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289

	switch (lme_urb->status) {
	case 0:
	case -ETIMEDOUT:
		break;
	case -ECONNRESET:
	case -ENOENT:
	case -ESHUTDOWN:
		return;
	default:
		info("Error %x", lme_urb->status);
		break;
	}

	rbuf = (u8 *) lme_urb->transfer_buffer;

	offset = ((lme_urb->actual_length/8) > 4)
			? 4 : (lme_urb->actual_length/8) ;

	for (i = 0; i < offset; ++i) {
		ibuf = (u8 *)&rbuf[i*8];
		deb_info(5, "INT O/S C =%02x C/O=%02x Type =%02x%02x",
		offset, i, ibuf[0], ibuf[1]);

		switch (ibuf[0]) {
		case 0xaa:
290 291
			debug_data_snipet(1, "INT Remote data snipet", ibuf);
			if ((ibuf[4] + ibuf[5]) == 0xff) {
292 293 294
				key = RC_SCANCODE_NECX((ibuf[2] ^ 0xff) << 8 |
						       (ibuf[3] > 0) ? (ibuf[3] ^ 0xff) : 0,
						       ibuf[5]);
295
				deb_info(1, "INT Key =%08x", key);
296 297
				if (adap_to_d(adap)->rc_dev != NULL)
					rc_keydown(adap_to_d(adap)->rc_dev,
298
						   RC_TYPE_NEC, key, 0);
299
			}
300 301 302 303
			break;
		case 0xbb:
			switch (st->tuner_config) {
			case TUNER_LG:
304
				signal_lock = ibuf[2] & BIT(5);
305 306 307 308 309
				st->signal_level = ibuf[4];
				st->signal_sn = ibuf[3];
				st->time_key = ibuf[7];
				break;
			case TUNER_S7395:
310
			case TUNER_S0194:
311 312
				/* Tweak for earlier firmware*/
				if (ibuf[1] == 0x03) {
313
					signal_lock = ibuf[2] & BIT(4);
314
					st->signal_level = ibuf[3];
315
					st->signal_sn = ibuf[4];
316 317 318 319 320
				} else {
					st->signal_level = ibuf[4];
					st->signal_sn = ibuf[5];
				}
				break;
321
			case TUNER_RS2000:
322
				signal_lock = ibuf[2] & 0xee;
323 324
				st->signal_level = ibuf[5];
				st->signal_sn = ibuf[4];
325
				st->time_key = ibuf[7];
326 327 328
			default:
				break;
			}
329 330 331 332 333 334 335

			/* Interrupt will also throw just BIT 0 as lock */
			signal_lock |= ibuf[2] & BIT(0);

			if (!signal_lock)
				st->lock_status &= ~FE_HAS_LOCK;

336 337 338 339 340 341 342 343 344 345
			debug_data_snipet(5, "INT Remote data snipet in", ibuf);
		break;
		case 0xcc:
			debug_data_snipet(1, "INT Control data snipet", ibuf);
			break;
		default:
			debug_data_snipet(1, "INT Unknown data snipet", ibuf);
		break;
		}
	}
346

347
	usb_submit_urb(lme_urb, GFP_ATOMIC);
348

349 350 351 352
	/* Interrupt urb is due every 48 msecs while streaming the buffer
	 * stores up to 4 periods if missed. Allow 200 msec for next interrupt.
	 */
	st->int_urb_due = jiffies + msecs_to_jiffies(200);
353 354 355 356
}

static int lme2510_int_read(struct dvb_usb_adapter *adap)
{
357 358
	struct dvb_usb_device *d = adap_to_d(adap);
	struct lme2510_state *lme_int = adap_to_priv(adap);
359
	struct usb_host_endpoint *ep;
360 361 362 363 364 365

	lme_int->lme_urb = usb_alloc_urb(0, GFP_ATOMIC);

	if (lme_int->lme_urb == NULL)
			return -ENOMEM;

366
	lme_int->buffer = usb_alloc_coherent(d->udev, 128, GFP_ATOMIC,
367 368 369 370 371 372
					&lme_int->lme_urb->transfer_dma);

	if (lme_int->buffer == NULL)
			return -ENOMEM;

	usb_fill_int_urb(lme_int->lme_urb,
373 374
				d->udev,
				usb_rcvintpipe(d->udev, 0xa),
375
				lme_int->buffer,
376
				128,
377 378
				lme2510_int_response,
				adap,
379
				8);
380

381 382 383 384 385 386
	/* Quirk of pipe reporting PIPE_BULK but behaves as interrupt */
	ep = usb_pipe_endpoint(d->udev, lme_int->lme_urb->pipe);

	if (usb_endpoint_type(&ep->desc) == USB_ENDPOINT_XFER_BULK)
		lme_int->lme_urb->pipe = usb_rcvbulkpipe(d->udev, 0xa),

387 388 389
	lme_int->lme_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;

	usb_submit_urb(lme_int->lme_urb, GFP_ATOMIC);
L
Lucas De Marchi 已提交
390
	info("INT Interrupt Service Started");
391 392 393 394

	return 0;
}

395 396
static int lme2510_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
{
397 398
	struct dvb_usb_device *d = adap_to_d(adap);
	struct lme2510_state *st = adap_to_priv(adap);
399
	static u8 clear_pid_reg[] = LME_ALL_PIDS;
400
	static u8 rbuf[1];
401
	int ret = 0;
402 403 404

	deb_info(1, "PID Clearing Filter");

405
	mutex_lock(&d->i2c_mutex);
406

407
	if (!onoff) {
408
		ret |= lme2510_usb_talk(d, clear_pid_reg,
409
			sizeof(clear_pid_reg), rbuf, sizeof(rbuf));
410 411 412
		st->pid_off = true;
	} else
		st->pid_off = false;
413

414 415
	st->pid_size = 0;

416
	mutex_unlock(&d->i2c_mutex);
417 418 419 420 421 422 423

	return 0;
}

static int lme2510_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
	int onoff)
{
424
	struct dvb_usb_device *d = adap_to_d(adap);
425 426 427 428 429
	int ret = 0;

	deb_info(3, "%s PID=%04x Index=%04x onoff=%02x", __func__,
		pid, index, onoff);

430
	if (onoff) {
431 432 433
		mutex_lock(&d->i2c_mutex);
		ret |= lme2510_enable_pid(d, index, pid);
		mutex_unlock(&d->i2c_mutex);
434 435
	}

436 437 438 439 440

	return ret;
}


441
static int lme2510_return_status(struct dvb_usb_device *d)
442 443
{
	int ret = 0;
444 445 446 447 448
	u8 *data;

	data = kzalloc(10, GFP_KERNEL);
	if (!data)
		return -ENOMEM;
449

450
	ret |= usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0),
451 452 453
			0x06, 0x80, 0x0302, 0x00, data, 0x0006, 200);
	info("Firmware Status: %x (%x)", ret , data[2]);

454 455 456
	ret = (ret < 0) ? -ENODEV : data[2];
	kfree(data);
	return ret;
457 458 459 460 461 462 463
}

static int lme2510_msg(struct dvb_usb_device *d,
		u8 *wbuf, int wlen, u8 *rbuf, int rlen)
{
	struct lme2510_state *st = d->priv;

464
	st->i2c_talk_onoff = 1;
465

466
	return lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
467 468 469 470 471 472 473
}

static int lme2510_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
				 int num)
{
	struct dvb_usb_device *d = i2c_get_adapdata(adap);
	struct lme2510_state *st = d->priv;
474
	static u8 obuf[64], ibuf[64];
475 476 477 478
	int i, read, read_o;
	u16 len;
	u8 gate = st->i2c_gate;

479 480
	mutex_lock(&d->i2c_mutex);

481 482 483 484
	if (gate == 0)
		gate = 5;

	for (i = 0; i < num; i++) {
485 486
		read_o = msg[i].flags & I2C_M_RD;
		read = i + 1 < num && msg[i + 1].flags & I2C_M_RD;
487 488 489 490 491 492 493 494 495 496 497 498
		read |= read_o;
		gate = (msg[i].addr == st->i2c_tuner_addr)
			? (read)	? st->i2c_tuner_gate_r
					: st->i2c_tuner_gate_w
			: st->i2c_gate;
		obuf[0] = gate | (read << 7);

		if (gate == 5)
			obuf[1] = (read) ? 2 : msg[i].len + 1;
		else
			obuf[1] = msg[i].len + read + 1;

499 500
		obuf[2] = msg[i].addr << 1;

501 502 503 504 505 506 507 508 509 510 511 512 513
		if (read) {
			if (read_o)
				len = 3;
			else {
				memcpy(&obuf[3], msg[i].buf, msg[i].len);
				obuf[msg[i].len+3] = msg[i+1].len;
				len = msg[i].len+4;
			}
		} else {
			memcpy(&obuf[3], msg[i].buf, msg[i].len);
			len = msg[i].len+3;
		}

514
		if (lme2510_msg(d, obuf, len, ibuf, 64) < 0) {
515
			deb_info(1, "i2c transfer failed.");
516
			mutex_unlock(&d->i2c_mutex);
517 518 519 520 521 522 523 524 525 526 527 528
			return -EAGAIN;
		}

		if (read) {
			if (read_o)
				memcpy(msg[i].buf, &ibuf[1], msg[i].len);
			else {
				memcpy(msg[i+1].buf, &ibuf[1], msg[i+1].len);
				i++;
			}
		}
	}
529 530

	mutex_unlock(&d->i2c_mutex);
531 532 533 534 535 536 537 538 539 540 541 542 543
	return i;
}

static u32 lme2510_i2c_func(struct i2c_adapter *adapter)
{
	return I2C_FUNC_I2C;
}

static struct i2c_algorithm lme2510_i2c_algo = {
	.master_xfer   = lme2510_i2c_xfer,
	.functionality = lme2510_i2c_func,
};

544
static int lme2510_streaming_ctrl(struct dvb_frontend *fe, int onoff)
545
{
546 547 548
	struct dvb_usb_adapter *adap = fe_to_adap(fe);
	struct dvb_usb_device *d = adap_to_d(adap);
	struct lme2510_state *st = adap_to_priv(adap);
549
	static u8 clear_reg_3[] = LME_ALL_PIDS;
550
	static u8 rbuf[1];
551
	int ret = 0, rlen = sizeof(rbuf);
552 553 554

	deb_info(1, "STM  (%02x)", onoff);

555 556
	/* Streaming is started by FE_HAS_LOCK */
	if (onoff == 1)
557
		st->stream_on = 1;
558
	else {
559
		deb_info(1, "STM Steam Off");
560
		/* mutex is here only to avoid collision with I2C */
561
		mutex_lock(&d->i2c_mutex);
562

563
		ret = lme2510_usb_talk(d, clear_reg_3,
564
				sizeof(clear_reg_3), rbuf, rlen);
565
		st->stream_on = 0;
566
		st->i2c_talk_onoff = 1;
567

568
		mutex_unlock(&d->i2c_mutex);
569 570 571 572 573 574 575 576 577 578 579 580 581
	}

	return (ret < 0) ? -ENODEV : 0;
}

static u8 check_sum(u8 *p, u8 len)
{
	u8 sum = 0;
	while (len--)
		sum += *p++;
	return sum;
}

582
static int lme2510_download_firmware(struct dvb_usb_device *d,
583 584 585
					const struct firmware *fw)
{
	int ret = 0;
586
	u8 *data;
587 588 589 590 591 592 593
	u16 j, wlen, len_in, start, end;
	u8 packet_size, dlen, i;
	u8 *fw_data;

	packet_size = 0x31;
	len_in = 1;

594
	data = kzalloc(128, GFP_KERNEL);
595
	if (!data) {
596 597
		info("FRM Could not start Firmware Download"\
			"(Buffer allocation failed)");
598 599
		return -ENOMEM;
	}
600 601 602 603 604 605 606 607 608 609 610 611 612 613 614

	info("FRM Starting Firmware Download");

	for (i = 1; i < 3; i++) {
		start = (i == 1) ? 0 : 512;
		end = (i == 1) ? 512 : fw->size;
		for (j = start; j < end; j += (packet_size+1)) {
			fw_data = (u8 *)(fw->data + j);
			if ((end - j) > packet_size) {
				data[0] = i;
				dlen = packet_size;
			} else {
				data[0] = i | 0x80;
				dlen = (u8)(end - j)-1;
			}
615 616 617 618 619
			data[1] = dlen;
			memcpy(&data[2], fw_data, dlen+1);
			wlen = (u8) dlen + 4;
			data[wlen-1] = check_sum(fw_data, dlen+1);
			deb_info(1, "Data S=%02x:E=%02x CS= %02x", data[3],
620
				data[dlen+2], data[dlen+3]);
621
			lme2510_usb_talk(d, data, wlen, data, len_in);
622
			ret |= (data[0] == 0x88) ? 0 : -1;
623 624
		}
	}
625

626 627 628
	data[0] = 0x8a;
	len_in = 1;
	msleep(2000);
629
	lme2510_usb_talk(d, data, len_in, data, len_in);
630 631 632 633 634 635 636
	msleep(400);

	if (ret < 0)
		info("FRM Firmware Download Failed (%04x)" , ret);
	else
		info("FRM Firmware Download Completed - Resetting Device");

637
	kfree(data);
638
	return RECONNECTS_USB;
639 640
}

641
static void lme_coldreset(struct dvb_usb_device *d)
642
{
643
	u8 data[1] = {0};
644 645
	data[0] = 0x0a;
	info("FRM Firmware Cold Reset");
646 647

	lme2510_usb_talk(d, data, sizeof(data), data, sizeof(data));
648

649 650 651
	return;
}

652 653 654 655 656 657 658
static const char fw_c_s7395[] = LME2510_C_S7395;
static const char fw_c_lg[] = LME2510_C_LG;
static const char fw_c_s0194[] = LME2510_C_S0194;
static const char fw_c_rs2000[] = LME2510_C_RS2000;
static const char fw_lg[] = LME2510_LG;
static const char fw_s0194[] = LME2510_S0194;

659
static const char *lme_firmware_switch(struct dvb_usb_device *d, int cold)
660
{
661 662
	struct lme2510_state *st = d->priv;
	struct usb_device *udev = d->udev;
663
	const struct firmware *fw = NULL;
664
	const char *fw_lme;
665
	int ret = 0;
666

667 668
	cold = (cold > 0) ? (cold & 1) : 0;

669 670
	switch (le16_to_cpu(udev->descriptor.idProduct)) {
	case 0x1122:
671
		switch (st->dvb_usb_lme2510_firmware) {
672 673 674 675 676
		default:
		case TUNER_S0194:
			fw_lme = fw_s0194;
			ret = request_firmware(&fw, fw_lme, &udev->dev);
			if (ret == 0) {
677
				st->dvb_usb_lme2510_firmware = TUNER_S0194;
678
				cold = 0;
679 680
				break;
			}
681
			/* fall through */
682 683 684
		case TUNER_LG:
			fw_lme = fw_lg;
			ret = request_firmware(&fw, fw_lme, &udev->dev);
685 686
			if (ret == 0) {
				st->dvb_usb_lme2510_firmware = TUNER_LG;
687
				break;
688
			}
689
			st->dvb_usb_lme2510_firmware = TUNER_DEFAULT;
690 691
			break;
		}
692 693
		break;
	case 0x1120:
694
		switch (st->dvb_usb_lme2510_firmware) {
695 696 697 698
		default:
		case TUNER_S7395:
			fw_lme = fw_c_s7395;
			ret = request_firmware(&fw, fw_lme, &udev->dev);
699
			if (ret == 0) {
700
				st->dvb_usb_lme2510_firmware = TUNER_S7395;
701
				cold = 0;
702
				break;
703
			}
704
			/* fall through */
705 706 707
		case TUNER_LG:
			fw_lme = fw_c_lg;
			ret = request_firmware(&fw, fw_lme, &udev->dev);
708 709
			if (ret == 0) {
				st->dvb_usb_lme2510_firmware = TUNER_LG;
710
				break;
711 712
			}
			/* fall through */
713 714 715
		case TUNER_S0194:
			fw_lme = fw_c_s0194;
			ret = request_firmware(&fw, fw_lme, &udev->dev);
716 717
			if (ret == 0) {
				st->dvb_usb_lme2510_firmware = TUNER_S0194;
718
				break;
719
			}
720
			st->dvb_usb_lme2510_firmware = TUNER_DEFAULT;
721 722 723
			cold = 0;
			break;
		}
724 725 726
		break;
	case 0x22f0:
		fw_lme = fw_c_rs2000;
727
		st->dvb_usb_lme2510_firmware = TUNER_RS2000;
728 729 730
		break;
	default:
		fw_lme = fw_c_s7395;
731
	}
732

733 734
	release_firmware(fw);

735
	if (cold) {
736
		dvb_usb_lme2510_firmware = st->dvb_usb_lme2510_firmware;
737
		info("FRM Changing to %s firmware", fw_lme);
738 739
		lme_coldreset(d);
		return NULL;
740
	}
741

742
	return fw_lme;
743
}
744 745 746 747

static int lme2510_kill_urb(struct usb_data_stream *stream)
{
	int i;
748

749 750 751 752 753 754
	for (i = 0; i < stream->urbs_submitted; i++) {
		deb_info(3, "killing URB no. %d.", i);
		/* stop the URB */
		usb_kill_urb(stream->urb_list[i]);
	}
	stream->urbs_submitted = 0;
755

756 757 758 759
	return 0;
}

static struct tda10086_config tda10086_config = {
760
	.demod_address = 0x0e,
761 762 763 764 765 766
	.invert = 0,
	.diseqc_tone = 1,
	.xtal_freq = TDA10086_XTAL_16M,
};

static struct stv0288_config lme_config = {
767
	.demod_address = 0x68,
768 769 770 771 772
	.min_delay_ms = 15,
	.inittab = s7395_inittab,
};

static struct ix2505v_config lme_tuner = {
773
	.tuner_address = 0x60,
774 775 776 777 778
	.min_delay_ms = 100,
	.tuner_gain = 0x0,
	.tuner_chargepump = 0x3,
};

779
static struct stv0299_config sharp_z0194_config = {
780
	.demod_address = 0x68,
781 782 783 784 785 786 787 788 789 790
	.inittab = sharp_z0194a_inittab,
	.mclk = 88000000UL,
	.invert = 0,
	.skip_reinit = 0,
	.lock_output = STV0299_LOCKOUTPUT_1,
	.volt13_op0_op1 = STV0299_VOLT13_OP1,
	.min_delay_ms = 100,
	.set_symbol_rate = sharp_z0194a_set_symbol_rate,
};

791
static struct m88rs2000_config m88rs2000_config = {
792
	.demod_addr = 0x68
793 794
};

795 796 797 798 799
static struct ts2020_config ts2020_config = {
	.tuner_address = 0x60,
	.clk_out_div = 7,
};

800 801 802
static int dm04_lme2510_set_voltage(struct dvb_frontend *fe,
					fe_sec_voltage_t voltage)
{
803 804 805
	struct dvb_usb_device *d = fe_to_d(fe);
	struct lme2510_state *st = fe_to_priv(fe);
	static u8 voltage_low[] = LME_VOLTAGE_L;
806 807 808 809
	static u8 voltage_high[] = LME_VOLTAGE_H;
	static u8 rbuf[1];
	int ret = 0, len = 3, rlen = 1;

810
	mutex_lock(&d->i2c_mutex);
811

812 813
	switch (voltage) {
	case SEC_VOLTAGE_18:
814
		ret |= lme2510_usb_talk(d,
815
			voltage_high, len, rbuf, rlen);
816 817
		break;

818 819 820
	case SEC_VOLTAGE_OFF:
	case SEC_VOLTAGE_13:
	default:
821
		ret |= lme2510_usb_talk(d,
822 823
				voltage_low, len, rbuf, rlen);
		break;
824
	}
825

826 827 828 829 830 831
	mutex_unlock(&d->i2c_mutex);

	if (st->tuner_config == TUNER_RS2000)
		if (st->fe_set_voltage)
			st->fe_set_voltage(fe, voltage);

832 833 834 835

	return (ret < 0) ? -ENODEV : 0;
}

836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875
static int dm04_read_status(struct dvb_frontend *fe, fe_status_t *status)
{
	struct dvb_usb_device *d = fe_to_d(fe);
	struct lme2510_state *st = d->priv;
	int ret = 0;

	if (st->i2c_talk_onoff) {
		if (st->fe_read_status) {
			ret = st->fe_read_status(fe, status);
			if (ret < 0)
				return ret;
		}

		st->lock_status = *status;

		if (*status & FE_HAS_LOCK && st->stream_on) {
			mutex_lock(&d->i2c_mutex);

			st->i2c_talk_onoff = 0;
			ret = lme2510_stream_restart(d);

			mutex_unlock(&d->i2c_mutex);
		}

		return ret;
	}

	/* Timeout of interrupt reached on RS2000 */
	if (st->tuner_config == TUNER_RS2000 &&
	    time_after(jiffies, st->int_urb_due))
		st->lock_status &= ~FE_HAS_LOCK;

	*status = st->lock_status;

	if (!(*status & FE_HAS_LOCK))
		st->i2c_talk_onoff = 1;

	return ret;
}

876
static int dm04_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
877
{
878 879
	struct lme2510_state *st = fe_to_priv(fe);

880 881 882 883 884 885 886 887 888 889 890 891 892
	switch (st->tuner_config) {
	case TUNER_LG:
		*strength = 0xff - st->signal_level;
		*strength |= *strength << 8;
		break;
	/* fall through */
	case TUNER_S7395:
	case TUNER_S0194:
		*strength = 0xffff - (((st->signal_level * 2) << 8) * 5 / 4);
		break;
	case TUNER_RS2000:
		*strength = (u16)((u32)st->signal_level * 0xffff / 0xff);
	}
893 894 895 896

	return 0;
}

897
static int dm04_read_snr(struct dvb_frontend *fe, u16 *snr)
898
{
899 900
	struct lme2510_state *st = fe_to_priv(fe);

901 902 903 904 905 906 907 908 909 910 911 912 913
	switch (st->tuner_config) {
	case TUNER_LG:
		*snr = 0xff - st->signal_sn;
		*snr |= *snr << 8;
		break;
	/* fall through */
	case TUNER_S7395:
	case TUNER_S0194:
		*snr = (u16)((0xff - st->signal_sn - 0xa1) * 3) << 8;
		break;
	case TUNER_RS2000:
		*snr = (u16)((u32)st->signal_sn * 0xffff / 0x7f);
	}
914 915 916 917 918 919 920 921 922 923 924 925 926 927

	return 0;
}

static int dm04_read_ber(struct dvb_frontend *fe, u32 *ber)
{
	*ber = 0;

	return 0;
}

static int dm04_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
{
	*ucblocks = 0;
928 929 930 931

	return 0;
}

932 933
static int lme_name(struct dvb_usb_adapter *adap)
{
934 935 936
	struct dvb_usb_device *d = adap_to_d(adap);
	struct lme2510_state *st = adap_to_priv(adap);
	const char *desc = d->name;
937
	char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395",
938
				" SHARP:BS2F7HZ0194", " RS2000"};
939
	char *name = adap->fe[0]->ops.info.name;
940 941 942 943 944 945 946

	strlcpy(name, desc, 128);
	strlcat(name, fe_name[st->tuner_config], 128);

	return 0;
}

947 948
static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
{
949 950
	struct dvb_usb_device *d = adap_to_d(adap);
	struct lme2510_state *st = d->priv;
951
	int ret = 0;
952 953

	st->i2c_talk_onoff = 1;
954
	switch (le16_to_cpu(d->udev->descriptor.idProduct)) {
955 956 957
	case 0x1122:
	case 0x1120:
		st->i2c_gate = 4;
958 959 960
		adap->fe[0] = dvb_attach(tda10086_attach,
			&tda10086_config, &d->i2c_adap);
		if (adap->fe[0]) {
961 962 963
			info("TUN Found Frontend TDA10086");
			st->i2c_tuner_gate_w = 4;
			st->i2c_tuner_gate_r = 4;
964
			st->i2c_tuner_addr = 0x60;
965
			st->tuner_config = TUNER_LG;
966 967 968
			if (st->dvb_usb_lme2510_firmware != TUNER_LG) {
				st->dvb_usb_lme2510_firmware = TUNER_LG;
				ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV;
969 970 971
			}
			break;
		}
972

973
		st->i2c_gate = 4;
974 975 976
		adap->fe[0] = dvb_attach(stv0299_attach,
				&sharp_z0194_config, &d->i2c_adap);
		if (adap->fe[0]) {
977 978 979
			info("FE Found Stv0299");
			st->i2c_tuner_gate_w = 4;
			st->i2c_tuner_gate_r = 5;
980
			st->i2c_tuner_addr = 0x60;
981
			st->tuner_config = TUNER_S0194;
982 983 984
			if (st->dvb_usb_lme2510_firmware != TUNER_S0194) {
				st->dvb_usb_lme2510_firmware = TUNER_S0194;
				ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV;
985 986
			}
			break;
987 988
		}

989
		st->i2c_gate = 5;
990 991
		adap->fe[0] = dvb_attach(stv0288_attach, &lme_config,
			&d->i2c_adap);
992

993
		if (adap->fe[0]) {
994 995 996
			info("FE Found Stv0288");
			st->i2c_tuner_gate_w = 4;
			st->i2c_tuner_gate_r = 5;
997
			st->i2c_tuner_addr = 0x60;
998
			st->tuner_config = TUNER_S7395;
999 1000 1001
			if (st->dvb_usb_lme2510_firmware != TUNER_S7395) {
				st->dvb_usb_lme2510_firmware = TUNER_S7395;
				ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV;
1002 1003
			}
			break;
1004
		}
1005 1006
	case 0x22f0:
		st->i2c_gate = 5;
1007 1008
		adap->fe[0] = dvb_attach(m88rs2000_attach,
			&m88rs2000_config, &d->i2c_adap);
1009

1010
		if (adap->fe[0]) {
1011
			info("FE Found M88RS2000");
1012 1013
			dvb_attach(ts2020_attach, adap->fe[0], &ts2020_config,
					&d->i2c_adap);
1014 1015
			st->i2c_tuner_gate_w = 5;
			st->i2c_tuner_gate_r = 5;
1016
			st->i2c_tuner_addr = 0x60;
1017
			st->tuner_config = TUNER_RS2000;
1018 1019
			st->fe_set_voltage =
				adap->fe[0]->ops.set_voltage;
1020
		}
1021
		break;
1022 1023
	}

1024 1025 1026
	if (adap->fe[0] == NULL) {
		info("DM04/QQBOX Not Powered up or not Supported");
		return -ENODEV;
1027
	}
1028

1029
	if (ret) {
1030 1031 1032
		if (adap->fe[0]) {
			dvb_frontend_detach(adap->fe[0]);
			adap->fe[0] = NULL;
1033
		}
1034
		d->rc_map = NULL;
1035
		return -ENODEV;
1036 1037
	}

1038 1039 1040
	st->fe_read_status = adap->fe[0]->ops.read_status;

	adap->fe[0]->ops.read_status = dm04_read_status;
1041 1042 1043 1044
	adap->fe[0]->ops.read_signal_strength = dm04_read_signal_strength;
	adap->fe[0]->ops.read_snr = dm04_read_snr;
	adap->fe[0]->ops.read_ber = dm04_read_ber;
	adap->fe[0]->ops.read_ucblocks = dm04_read_ucblocks;
1045
	adap->fe[0]->ops.set_voltage = dm04_lme2510_set_voltage;
1046

1047 1048 1049 1050 1051 1052
	ret = lme_name(adap);
	return ret;
}

static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap)
{
1053 1054
	struct dvb_usb_device *d = adap_to_d(adap);
	struct lme2510_state *st = adap_to_priv(adap);
1055
	char *tun_msg[] = {"", "TDA8263", "IX2505V", "DVB_PLL_OPERA", "RS2000"};
1056 1057 1058 1059
	int ret = 0;

	switch (st->tuner_config) {
	case TUNER_LG:
1060
		if (dvb_attach(tda826x_attach, adap->fe[0], 0x60,
1061
			&d->i2c_adap, 1))
1062 1063 1064
			ret = st->tuner_config;
		break;
	case TUNER_S7395:
1065 1066
		if (dvb_attach(ix2505v_attach , adap->fe[0], &lme_tuner,
			&d->i2c_adap))
1067 1068
			ret = st->tuner_config;
		break;
1069
	case TUNER_S0194:
1070
		if (dvb_attach(dvb_pll_attach , adap->fe[0], 0x60,
1071
			&d->i2c_adap, DVB_PLL_OPERA1))
1072 1073
			ret = st->tuner_config;
		break;
1074 1075 1076
	case TUNER_RS2000:
		ret = st->tuner_config;
		break;
1077 1078 1079 1080 1081 1082 1083
	default:
		break;
	}

	if (ret)
		info("TUN Found %s tuner", tun_msg[ret]);
	else {
1084
		info("TUN No tuner found --- resetting device");
1085
		lme_coldreset(d);
1086 1087 1088
		return -ENODEV;
	}

1089 1090 1091 1092 1093 1094
	/* Start the Interrupt*/
	ret = lme2510_int_read(adap);
	if (ret < 0) {
		info("INT Unable to start Interrupt Service");
		return -ENODEV;
	}
1095 1096

	return ret;
1097 1098 1099 1100 1101
}

static int lme2510_powerup(struct dvb_usb_device *d, int onoff)
{
	struct lme2510_state *st = d->priv;
1102 1103 1104
	static u8 lnb_on[] = LNB_ON;
	static u8 lnb_off[] = LNB_OFF;
	static u8 rbuf[1];
1105
	int ret = 0, len = 3, rlen = 1;
1106

1107
	mutex_lock(&d->i2c_mutex);
1108 1109

	if (onoff)
1110
		ret = lme2510_usb_talk(d, lnb_on, len, rbuf, rlen);
1111
	else
1112
		ret = lme2510_usb_talk(d, lnb_off, len, rbuf, rlen);
1113

1114
	st->i2c_talk_onoff = 1;
1115 1116 1117 1118

	mutex_unlock(&d->i2c_mutex);

	return ret;
1119 1120
}

1121
static int lme2510_get_adapter_count(struct dvb_usb_device *d)
1122
{
1123 1124
	return 1;
}
1125

1126 1127 1128
static int lme2510_identify_state(struct dvb_usb_device *d, const char **name)
{
	struct lme2510_state *st = d->priv;
1129

1130
	usb_reset_configuration(d->udev);
1131

1132
	usb_set_interface(d->udev,
1133
		d->props->bInterfaceNumber, 1);
1134

1135
	st->dvb_usb_lme2510_firmware = dvb_usb_lme2510_firmware;
1136

1137 1138 1139
	if (lme2510_return_status(d) == 0x44) {
		*name = lme_firmware_switch(d, 0);
		return COLD;
1140 1141
	}

1142
	return 0;
1143 1144
}

1145 1146 1147 1148
static int lme2510_get_stream_config(struct dvb_frontend *fe, u8 *ts_type,
		struct usb_data_stream_properties *stream)
{
	struct dvb_usb_adapter *adap = fe_to_adap(fe);
1149
	struct dvb_usb_device *d;
1150

1151 1152
	if (adap == NULL)
		return 0;
1153 1154 1155

	d = adap_to_d(adap);

1156 1157
	/* Turn PID filter on the fly by module option */
	if (pid_filter == 2) {
1158
		adap->pid_filtering  = true;
1159
		adap->max_feed_count = 15;
1160 1161
	}

1162 1163 1164
	if (!(le16_to_cpu(d->udev->descriptor.idProduct)
		== 0x1122))
		stream->endpoint = 0x8;
1165

1166 1167 1168 1169 1170 1171
	return 0;
}

static int lme2510_get_rc_config(struct dvb_usb_device *d,
	struct dvb_usb_rc *rc)
{
1172
	rc->allowed_protos = RC_BIT_NEC;
1173 1174
	return 0;
}
1175

1176
static void *lme2510_exit_int(struct dvb_usb_device *d)
1177 1178
{
	struct lme2510_state *st = d->priv;
1179 1180 1181 1182
	struct dvb_usb_adapter *adap = &d->adapter[0];
	void *buffer = NULL;

	if (adap != NULL) {
1183
		lme2510_kill_urb(&adap->stream);
1184 1185
	}

1186
	if (st->usb_buffer != NULL) {
1187
		st->i2c_talk_onoff = 1;
1188 1189
		st->signal_level = 0;
		st->signal_sn = 0;
1190
		buffer = st->usb_buffer;
1191 1192 1193
	}

	if (st->lme_urb != NULL) {
1194
		usb_kill_urb(st->lme_urb);
1195
		usb_free_coherent(d->udev, 128, st->buffer,
1196
				  st->lme_urb->transfer_dma);
L
Lucas De Marchi 已提交
1197
		info("Interrupt Service Stopped");
1198
	}
1199

1200
	return buffer;
1201 1202
}

1203
static void lme2510_exit(struct dvb_usb_device *d)
1204
{
1205 1206
	void *usb_buffer;

1207
	if (d != NULL) {
1208
		usb_buffer = lme2510_exit_int(d);
1209
		kfree(usb_buffer);
1210 1211 1212
	}
}

1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261
static struct dvb_usb_device_properties lme2510_props = {
	.driver_name = KBUILD_MODNAME,
	.owner = THIS_MODULE,
	.bInterfaceNumber = 0,
	.adapter_nr = adapter_nr,
	.size_of_priv = sizeof(struct lme2510_state),

	.download_firmware = lme2510_download_firmware,

	.power_ctrl       = lme2510_powerup,
	.identify_state   = lme2510_identify_state,
	.i2c_algo         = &lme2510_i2c_algo,

	.frontend_attach  = dm04_lme2510_frontend_attach,
	.tuner_attach = dm04_lme2510_tuner,
	.get_stream_config = lme2510_get_stream_config,
	.get_adapter_count = lme2510_get_adapter_count,
	.streaming_ctrl   = lme2510_streaming_ctrl,

	.get_rc_config = lme2510_get_rc_config,

	.exit = lme2510_exit,
	.adapter = {
		{
			.caps = DVB_USB_ADAP_HAS_PID_FILTER|
				DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
			.pid_filter_count = 15,
			.pid_filter = lme2510_pid_filter,
			.pid_filter_ctrl  = lme2510_pid_filter_ctrl,
			.stream =
			DVB_USB_STREAM_BULK(0x86, 10, 4096),
		},
		{
		}
	},
};

static const struct usb_device_id lme2510_id_table[] = {
	{	DVB_USB_DEVICE(0x3344, 0x1122, &lme2510_props,
		"DM04_LME2510_DVB-S", RC_MAP_LME2510)	},
	{	DVB_USB_DEVICE(0x3344, 0x1120, &lme2510_props,
		"DM04_LME2510C_DVB-S", RC_MAP_LME2510)	},
	{	DVB_USB_DEVICE(0x3344, 0x22f0, &lme2510_props,
		"DM04_LME2510C_DVB-S RS2000", RC_MAP_LME2510)	},
	{}		/* Terminating entry */
};

MODULE_DEVICE_TABLE(usb, lme2510_id_table);

1262
static struct usb_driver lme2510_driver = {
1263 1264 1265 1266 1267 1268
	.name		= KBUILD_MODNAME,
	.probe		= dvb_usbv2_probe,
	.disconnect	= dvb_usbv2_disconnect,
	.id_table	= lme2510_id_table,
	.no_dynamic_id = 1,
	.soft_unbind = 1,
1269 1270
};

1271
module_usb_driver(lme2510_driver);
1272 1273

MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
1274
MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0");
1275
MODULE_VERSION("2.06");
1276
MODULE_LICENSE("GPL");
1277 1278 1279 1280 1281 1282 1283
MODULE_FIRMWARE(LME2510_C_S7395);
MODULE_FIRMWARE(LME2510_C_LG);
MODULE_FIRMWARE(LME2510_C_S0194);
MODULE_FIRMWARE(LME2510_C_RS2000);
MODULE_FIRMWARE(LME2510_LG);
MODULE_FIRMWARE(LME2510_S0194);