lgdt330x.c 22.0 KB
Newer Older
1
/*
2
 *    Support for LGDT3302 and LGDT3303 - VSB/QAM
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 *
 *    Copyright (C) 2005 Wilson Michaels <wilsonmichaels@earthlink.net>
 *
 *    This program is free software; you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation; either version 2 of the License, or
 *    (at your option) any later version.
 *
 *    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.
 *
 */

/*
 *                      NOTES ABOUT THIS DRIVER
 *
25 26 27 28
 * This Linux driver supports:
 *   DViCO FusionHDTV 3 Gold-Q
 *   DViCO FusionHDTV 3 Gold-T
 *   DViCO FusionHDTV 5 Gold
29
 *   DViCO FusionHDTV 5 Lite
30
 *   DViCO FusionHDTV 5 USB Gold
31
 *   Air2PC/AirStar 2 ATSC 3rd generation (HD5000)
32
 *   pcHDTV HD5500
33 34 35 36 37 38 39 40
 *
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/delay.h>
T
Tim Schmielau 已提交
41 42
#include <linux/string.h>
#include <linux/slab.h>
43 44 45
#include <asm/byteorder.h>

#include "dvb_frontend.h"
46
#include "dvb_math.h"
47 48
#include "lgdt330x_priv.h"
#include "lgdt330x.h"
49

50 51 52
/* Use Equalizer Mean Squared Error instead of Phaser Tracker MSE */
/* #define USE_EQMSE */

53 54
static int debug = 0;
module_param(debug, int, 0644);
55
MODULE_PARM_DESC(debug,"Turn on/off lgdt330x frontend debugging (default:off).");
56 57
#define dprintk(args...) \
do { \
58
if (debug) printk(KERN_DEBUG "lgdt330x: " args); \
59 60
} while (0)

61
struct lgdt330x_state
62 63 64 65
{
	struct i2c_adapter* i2c;

	/* Configuration settings */
66
	const struct lgdt330x_config* config;
67 68 69 70 71

	struct dvb_frontend frontend;

	/* Demodulator private data */
	fe_modulation_t current_modulation;
72
	u32 snr; /* Result of last SNR calculation */
73 74 75 76 77

	/* Tuner private data */
	u32 current_frequency;
};

78
static int i2c_write_demod_bytes (struct lgdt330x_state* state,
79 80
				  u8 *buf, /* data bytes to send */
				  int len  /* number of bytes to send */ )
81
{
82
	struct i2c_msg msg =
83 84 85 86
		{ .addr = state->config->demod_address,
		  .flags = 0,
		  .buf = buf,
		  .len = 2 };
87
	int i;
88
	int err;
89

90
	for (i=0; i<len-1; i+=2){
91
		if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
92
			printk(KERN_WARNING "lgdt330x: %s error (addr %02x <- %02x, err = %i)\n", __FUNCTION__, msg.buf[0], msg.buf[1], err);
93 94 95 96
			if (err < 0)
				return err;
			else
				return -EREMOTEIO;
97
		}
98
		msg.buf += 2;
99 100 101 102 103 104 105 106 107
	}
	return 0;
}

/*
 * This routine writes the register (reg) to the demod bus
 * then reads the data returned for (len) bytes.
 */

108
static u8 i2c_read_demod_bytes (struct lgdt330x_state* state,
109 110 111 112 113 114 115 116 117 118 119 120
			       enum I2C_REG reg, u8* buf, int len)
{
	u8 wr [] = { reg };
	struct i2c_msg msg [] = {
		{ .addr = state->config->demod_address,
		  .flags = 0, .buf = wr,  .len = 1 },
		{ .addr = state->config->demod_address,
		  .flags = I2C_M_RD, .buf = buf, .len = len },
	};
	int ret;
	ret = i2c_transfer(state->i2c, msg, 2);
	if (ret != 2) {
121
		printk(KERN_WARNING "lgdt330x: %s: addr 0x%02x select 0x%02x error (ret == %i)\n", __FUNCTION__, state->config->demod_address, reg, ret);
122 123 124 125 126 127 128
	} else {
		ret = 0;
	}
	return ret;
}

/* Software reset */
129
static int lgdt3302_SwReset(struct lgdt330x_state* state)
130 131 132 133 134 135 136 137
{
	u8 ret;
	u8 reset[] = {
		IRQ_MASK,
		0x00 /* bit 6 is active low software reset
		      *	bits 5-0 are 1 to mask interrupts */
	};

138
	ret = i2c_write_demod_bytes(state,
139
				    reset, sizeof(reset));
140
	if (ret == 0) {
141 142 143 144

		/* force reset high (inactive) and unmask interrupts */
		reset[1] = 0x7f;
		ret = i2c_write_demod_bytes(state,
145
					    reset, sizeof(reset));
146 147 148 149
	}
	return ret;
}

150 151 152 153 154 155 156 157 158
static int lgdt3303_SwReset(struct lgdt330x_state* state)
{
	u8 ret;
	u8 reset[] = {
		0x02,
		0x00 /* bit 0 is active low software reset */
	};

	ret = i2c_write_demod_bytes(state,
159
				    reset, sizeof(reset));
160 161 162 163 164
	if (ret == 0) {

		/* force reset high (inactive) */
		reset[1] = 0x01;
		ret = i2c_write_demod_bytes(state,
165
					    reset, sizeof(reset));
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
	}
	return ret;
}

static int lgdt330x_SwReset(struct lgdt330x_state* state)
{
	switch (state->config->demod_chip) {
	case LGDT3302:
		return lgdt3302_SwReset(state);
	case LGDT3303:
		return lgdt3303_SwReset(state);
	default:
		return -ENODEV;
	}
}

182
static int lgdt330x_init(struct dvb_frontend* fe)
183 184 185 186 187 188 189
{
	/* Hardware reset is done using gpio[0] of cx23880x chip.
	 * I'd like to do it here, but don't know how to find chip address.
	 * cx88-cards.c arranges for the reset bit to be inactive (high).
	 * Maybe there needs to be a callable function in cx88-core or
	 * the caller of this function needs to do it. */

190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
	/*
	 * Array of byte pairs <address, value>
	 * to initialize each different chip
	 */
	static u8 lgdt3302_init_data[] = {
		/* Use 50MHz parameter values from spec sheet since xtal is 50 */
		/* Change the value of NCOCTFV[25:0] of carrier
		   recovery center frequency register */
		VSB_CARRIER_FREQ0, 0x00,
		VSB_CARRIER_FREQ1, 0x87,
		VSB_CARRIER_FREQ2, 0x8e,
		VSB_CARRIER_FREQ3, 0x01,
		/* Change the TPCLK pin polarity
		   data is valid on falling clock */
		DEMUX_CONTROL, 0xfb,
		/* Change the value of IFBW[11:0] of
		   AGC IF/RF loop filter bandwidth register */
		AGC_RF_BANDWIDTH0, 0x40,
		AGC_RF_BANDWIDTH1, 0x93,
		AGC_RF_BANDWIDTH2, 0x00,
		/* Change the value of bit 6, 'nINAGCBY' and
		   'NSSEL[1:0] of ACG function control register 2 */
		AGC_FUNC_CTRL2, 0xc6,
		/* Change the value of bit 6 'RFFIX'
		   of AGC function control register 3 */
		AGC_FUNC_CTRL3, 0x40,
		/* Set the value of 'INLVTHD' register 0x2a/0x2c
		   to 0x7fe */
		AGC_DELAY0, 0x07,
		AGC_DELAY2, 0xfe,
		/* Change the value of IAGCBW[15:8]
A
Adrian Bunk 已提交
221
		   of inner AGC loop filter bandwidth */
222 223 224 225 226 227 228 229
		AGC_LOOP_BANDWIDTH0, 0x08,
		AGC_LOOP_BANDWIDTH1, 0x9a
	};

	static u8 lgdt3303_init_data[] = {
		0x4c, 0x14
	};

230 231 232 233 234
	static u8 flip_lgdt3303_init_data[] = {
		0x4c, 0x14,
		0x87, 0xf3
	};

235 236 237 238 239 240 241 242
	struct lgdt330x_state* state = fe->demodulator_priv;
	char  *chip_name;
	int    err;

	switch (state->config->demod_chip) {
	case LGDT3302:
		chip_name = "LGDT3302";
		err = i2c_write_demod_bytes(state, lgdt3302_init_data,
243 244
					    sizeof(lgdt3302_init_data));
		break;
245 246
	case LGDT3303:
		chip_name = "LGDT3303";
247 248 249 250 251 252 253
		if (state->config->clock_polarity_flip) {
			err = i2c_write_demod_bytes(state, flip_lgdt3303_init_data,
						    sizeof(flip_lgdt3303_init_data));
		} else {
			err = i2c_write_demod_bytes(state, lgdt3303_init_data,
						    sizeof(lgdt3303_init_data));
		}
254
		break;
255 256 257 258 259 260 261 262 263
	default:
		chip_name = "undefined";
		printk (KERN_WARNING "Only LGDT3302 and LGDT3303 are supported chips.\n");
		err = -ENODEV;
	}
	dprintk("%s entered as %s\n", __FUNCTION__, chip_name);
	if (err < 0)
		return err;
	return lgdt330x_SwReset(state);
264 265
}

266
static int lgdt330x_read_ber(struct dvb_frontend* fe, u32* ber)
267
{
268
	*ber = 0; /* Not supplied by the demod chips */
269 270 271
	return 0;
}

272
static int lgdt330x_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
273
{
274 275
	struct lgdt330x_state* state = fe->demodulator_priv;
	int err;
276 277
	u8 buf[2];

278 279 280
	switch (state->config->demod_chip) {
	case LGDT3302:
		err = i2c_read_demod_bytes(state, LGDT3302_PACKET_ERR_COUNTER1,
281 282
					   buf, sizeof(buf));
		break;
283 284
	case LGDT3303:
		err = i2c_read_demod_bytes(state, LGDT3303_PACKET_ERR_COUNTER1,
285 286
					   buf, sizeof(buf));
		break;
287 288
	default:
		printk(KERN_WARNING
289
		       "Only LGDT3302 and LGDT3303 are supported chips.\n");
290 291
		err = -ENODEV;
	}
292 293 294 295 296

	*ucblocks = (buf[0] << 8) | buf[1];
	return 0;
}

297
static int lgdt330x_set_parameters(struct dvb_frontend* fe,
298 299
				   struct dvb_frontend_parameters *param)
{
300 301 302 303 304 305 306
	/*
	 * Array of byte pairs <address, value>
	 * to initialize 8VSB for lgdt3303 chip 50 MHz IF
	 */
	static u8 lgdt3303_8vsb_44_data[] = {
		0x04, 0x00,
		0x0d, 0x40,
307 308 309 310
	0x0e, 0x87,
	0x0f, 0x8e,
	0x10, 0x01,
	0x47, 0x8b };
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329

	/*
	 * Array of byte pairs <address, value>
	 * to initialize QAM for lgdt3303 chip
	 */
	static u8 lgdt3303_qam_data[] = {
		0x04, 0x00,
		0x0d, 0x00,
		0x0e, 0x00,
		0x0f, 0x00,
		0x10, 0x00,
		0x51, 0x63,
		0x47, 0x66,
		0x48, 0x66,
		0x4d, 0x1a,
		0x49, 0x08,
		0x4a, 0x9b };

	struct lgdt330x_state* state = fe->demodulator_priv;
330 331 332

	static u8 top_ctrl_cfg[]   = { TOP_CONTROL, 0x03 };

333
	int err;
334 335 336 337 338 339
	/* Change only if we are actually changing the modulation */
	if (state->current_modulation != param->u.vsb.modulation) {
		switch(param->u.vsb.modulation) {
		case VSB_8:
			dprintk("%s: VSB_8 MODE\n", __FUNCTION__);

340 341
			/* Select VSB mode */
			top_ctrl_cfg[1] = 0x03;
342 343 344 345

			/* Select ANT connector if supported by card */
			if (state->config->pll_rf_set)
				state->config->pll_rf_set(fe, 1);
346 347 348

			if (state->config->demod_chip == LGDT3303) {
				err = i2c_write_demod_bytes(state, lgdt3303_8vsb_44_data,
349
							    sizeof(lgdt3303_8vsb_44_data));
350
			}
351 352 353 354 355
			break;

		case QAM_64:
			dprintk("%s: QAM_64 MODE\n", __FUNCTION__);

356 357
			/* Select QAM_64 mode */
			top_ctrl_cfg[1] = 0x00;
358 359 360 361

			/* Select CABLE connector if supported by card */
			if (state->config->pll_rf_set)
				state->config->pll_rf_set(fe, 0);
362 363 364 365 366

			if (state->config->demod_chip == LGDT3303) {
				err = i2c_write_demod_bytes(state, lgdt3303_qam_data,
											sizeof(lgdt3303_qam_data));
			}
367 368 369 370 371
			break;

		case QAM_256:
			dprintk("%s: QAM_256 MODE\n", __FUNCTION__);

372 373
			/* Select QAM_256 mode */
			top_ctrl_cfg[1] = 0x01;
374 375 376 377

			/* Select CABLE connector if supported by card */
			if (state->config->pll_rf_set)
				state->config->pll_rf_set(fe, 0);
378 379 380 381 382

			if (state->config->demod_chip == LGDT3303) {
				err = i2c_write_demod_bytes(state, lgdt3303_qam_data,
											sizeof(lgdt3303_qam_data));
			}
383 384
			break;
		default:
385
			printk(KERN_WARNING "lgdt330x: %s: Modulation type(%d) UNSUPPORTED\n", __FUNCTION__, param->u.vsb.modulation);
386 387
			return -1;
		}
388 389 390 391 392 393
		/*
		 * select serial or parallel MPEG harware interface
		 * Serial:   0x04 for LGDT3302 or 0x40 for LGDT3303
		 * Parallel: 0x00
		 */
		top_ctrl_cfg[1] |= state->config->serial_mpeg;
394 395

		/* Select the requested mode */
396
		i2c_write_demod_bytes(state, top_ctrl_cfg,
397 398 399
				      sizeof(top_ctrl_cfg));
		if (state->config->set_ts_params)
			state->config->set_ts_params(fe, 0);
400 401 402
		state->current_modulation = param->u.vsb.modulation;
	}

403
	/* Tune to the specified frequency */
404 405 406
	if (fe->ops.tuner_ops.set_params) {
		fe->ops.tuner_ops.set_params(fe, param);
		if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0);
407
	}
408 409

	/* Keep track of the new frequency */
410 411
	/* FIXME this is the wrong way to do this...           */
	/* The tuner is shared with the video4linux analog API */
412 413
	state->current_frequency = param->frequency;

414
	lgdt330x_SwReset(state);
415 416 417
	return 0;
}

418
static int lgdt330x_get_frontend(struct dvb_frontend* fe,
419 420
				 struct dvb_frontend_parameters* param)
{
421
	struct lgdt330x_state *state = fe->demodulator_priv;
422 423 424 425
	param->frequency = state->current_frequency;
	return 0;
}

426
static int lgdt3302_read_status(struct dvb_frontend* fe, fe_status_t* status)
427
{
428
	struct lgdt330x_state* state = fe->demodulator_priv;
429 430 431 432
	u8 buf[3];

	*status = 0; /* Reset status result */

433
	/* AGC status register */
434
	i2c_read_demod_bytes(state, AGC_STATUS, buf, 1);
435 436 437 438 439 440 441 442 443 444
	dprintk("%s: AGC_STATUS = 0x%02x\n", __FUNCTION__, buf[0]);
	if ((buf[0] & 0x0c) == 0x8){
		/* Test signal does not exist flag */
		/* as well as the AGC lock flag.   */
		*status |= FE_HAS_SIGNAL;
	} else {
		/* Without a signal all other status bits are meaningless */
		return 0;
	}

445 446 447 448 449
	/*
	 * You must set the Mask bits to 1 in the IRQ_MASK in order
	 * to see that status bit in the IRQ_STATUS register.
	 * This is done in SwReset();
	 */
450
	/* signal status */
451
	i2c_read_demod_bytes(state, TOP_CONTROL, buf, sizeof(buf));
452
	dprintk("%s: TOP_CONTROL = 0x%02x, IRO_MASK = 0x%02x, IRQ_STATUS = 0x%02x\n", __FUNCTION__, buf[0], buf[1], buf[2]);
453

454 455 456 457 458 459 460 461 462 463 464 465 466

	/* sync status */
	if ((buf[2] & 0x03) == 0x01) {
		*status |= FE_HAS_SYNC;
	}

	/* FEC error status */
	if ((buf[2] & 0x0c) == 0x08) {
		*status |= FE_HAS_LOCK;
		*status |= FE_HAS_VITERBI;
	}

	/* Carrier Recovery Lock Status Register */
467
	i2c_read_demod_bytes(state, CARRIER_LOCK, buf, 1);
468 469 470 471 472 473 474 475 476 477 478 479 480
	dprintk("%s: CARRIER_LOCK = 0x%02x\n", __FUNCTION__, buf[0]);
	switch (state->current_modulation) {
	case QAM_256:
	case QAM_64:
		/* Need to undestand why there are 3 lock levels here */
		if ((buf[0] & 0x07) == 0x07)
			*status |= FE_HAS_CARRIER;
		break;
	case VSB_8:
		if ((buf[0] & 0x80) == 0x80)
			*status |= FE_HAS_CARRIER;
		break;
	default:
481
		printk("KERN_WARNING lgdt330x: %s: Modulation set to unsupported value\n", __FUNCTION__);
482 483 484 485 486
	}

	return 0;
}

487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547
static int lgdt3303_read_status(struct dvb_frontend* fe, fe_status_t* status)
{
	struct lgdt330x_state* state = fe->demodulator_priv;
	int err;
	u8 buf[3];

	*status = 0; /* Reset status result */

	/* lgdt3303 AGC status register */
	err = i2c_read_demod_bytes(state, 0x58, buf, 1);
	if (err < 0)
		return err;

	dprintk("%s: AGC_STATUS = 0x%02x\n", __FUNCTION__, buf[0]);
	if ((buf[0] & 0x21) == 0x01){
		/* Test input signal does not exist flag */
		/* as well as the AGC lock flag.   */
		*status |= FE_HAS_SIGNAL;
	} else {
		/* Without a signal all other status bits are meaningless */
		return 0;
	}

	/* Carrier Recovery Lock Status Register */
	i2c_read_demod_bytes(state, CARRIER_LOCK, buf, 1);
	dprintk("%s: CARRIER_LOCK = 0x%02x\n", __FUNCTION__, buf[0]);
	switch (state->current_modulation) {
	case QAM_256:
	case QAM_64:
		/* Need to undestand why there are 3 lock levels here */
		if ((buf[0] & 0x07) == 0x07)
			*status |= FE_HAS_CARRIER;
		else
			break;
		i2c_read_demod_bytes(state, 0x8a, buf, 1);
		if ((buf[0] & 0x04) == 0x04)
			*status |= FE_HAS_SYNC;
		if ((buf[0] & 0x01) == 0x01)
			*status |= FE_HAS_LOCK;
		if ((buf[0] & 0x08) == 0x08)
			*status |= FE_HAS_VITERBI;
		break;
	case VSB_8:
		if ((buf[0] & 0x80) == 0x80)
			*status |= FE_HAS_CARRIER;
		else
			break;
		i2c_read_demod_bytes(state, 0x38, buf, 1);
		if ((buf[0] & 0x02) == 0x00)
			*status |= FE_HAS_SYNC;
		if ((buf[0] & 0x01) == 0x01) {
			*status |= FE_HAS_LOCK;
			*status |= FE_HAS_VITERBI;
		}
		break;
	default:
		printk("KERN_WARNING lgdt330x: %s: Modulation set to unsupported value\n", __FUNCTION__);
	}
	return 0;
}

548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571
/* Calculate SNR estimation (scaled by 2^24)

   8-VSB SNR equations from LGDT3302 and LGDT3303 datasheets, QAM
   equations from LGDT3303 datasheet.  VSB is the same between the '02
   and '03, so maybe QAM is too?  Perhaps someone with a newer datasheet
   that has QAM information could verify?

   For 8-VSB: (two ways, take your pick)
   LGDT3302:
     SNR_EQ = 10 * log10(25 * 24^2 / EQ_MSE)
   LGDT3303:
     SNR_EQ = 10 * log10(25 * 32^2 / EQ_MSE)
   LGDT3302 & LGDT3303:
     SNR_PT = 10 * log10(25 * 32^2 / PT_MSE)  (we use this one)
   For 64-QAM:
     SNR    = 10 * log10( 688128   / MSEQAM)
   For 256-QAM:
     SNR    = 10 * log10( 696320   / MSEQAM)

   We re-write the snr equation as:
     SNR * 2^24 = 10*(c - intlog10(MSE))
   Where for 256-QAM, c = log10(696320) * 2^24, and so on. */

static u32 calculate_snr(u32 mse, u32 c)
572
{
573 574 575 576 577 578 579 580 581 582 583
	if (mse == 0) /* No signal */
		return 0;

	mse = intlog10(mse);
	if (mse > c) {
		/* Negative SNR, which is possible, but realisticly the
		demod will lose lock before the signal gets this bad.  The
		API only allows for unsigned values, so just return 0 */
		return 0;
	}
	return 10*(c - mse);
584 585
}

586
static int lgdt3302_read_snr(struct dvb_frontend* fe, u16* snr)
587
{
588
	struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
589 590 591
	u8 buf[5];	/* read data buffer */
	u32 noise;	/* noise value */
	u32 c;		/* per-modulation SNR calculation constant */
592

593 594 595 596 597 598
	switch(state->current_modulation) {
	case VSB_8:
		i2c_read_demod_bytes(state, LGDT3302_EQPH_ERR0, buf, 5);
#ifdef USE_EQMSE
		/* Use Equalizer Mean-Square Error Register */
		/* SNR for ranges from -15.61 to +41.58 */
599
		noise = ((buf[0] & 7) << 16) | (buf[1] << 8) | buf[2];
600
		c = 69765745; /* log10(25*24^2)*2^24 */
601
#else
602 603
		/* Use Phase Tracker Mean-Square Error Register */
		/* SNR for ranges from -13.11 to +44.08 */
604
		noise = ((buf[0] & 7<<3) << 13) | (buf[3] << 8) | buf[4];
605 606 607 608 609 610
		c = 73957994; /* log10(25*32^2)*2^24 */
#endif
		break;
	case QAM_64:
	case QAM_256:
		i2c_read_demod_bytes(state, CARRIER_MSEQAM1, buf, 2);
611
		noise = ((buf[0] & 3) << 8) | buf[1];
612 613 614 615 616 617 618
		c = state->current_modulation == QAM_64 ? 97939837 : 98026066;
		/* log10(688128)*2^24 and log10(696320)*2^24 */
		break;
	default:
		printk(KERN_ERR "lgdt330x: %s: Modulation set to unsupported value\n",
		       __FUNCTION__);
		return -EREMOTEIO; /* return -EDRIVER_IS_GIBBERED; */
619 620
	}

621 622
	state->snr = calculate_snr(noise, c);
	*snr = (state->snr) >> 16; /* Convert from 8.24 fixed-point to 8.8 */
623

624 625
	dprintk("%s: noise = 0x%08x, snr = %d.%02d dB\n", __FUNCTION__, noise,
		state->snr >> 24, (((state->snr>>8) & 0xffff) * 100) >> 16);
626 627 628 629

	return 0;
}

630 631 632
static int lgdt3303_read_snr(struct dvb_frontend* fe, u16* snr)
{
	struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
633 634 635
	u8 buf[5];	/* read data buffer */
	u32 noise;	/* noise value */
	u32 c;		/* per-modulation SNR calculation constant */
636

637 638 639 640 641 642 643 644 645 646 647
	switch(state->current_modulation) {
	case VSB_8:
		i2c_read_demod_bytes(state, LGDT3303_EQPH_ERR0, buf, 5);
#ifdef USE_EQMSE
		/* Use Equalizer Mean-Square Error Register */
		/* SNR for ranges from -16.12 to +44.08 */
		noise = ((buf[0] & 0x78) << 13) | (buf[1] << 8) | buf[2];
		c = 73957994; /* log10(25*32^2)*2^24 */
#else
		/* Use Phase Tracker Mean-Square Error Register */
		/* SNR for ranges from -13.11 to +44.08 */
648
		noise = ((buf[0] & 7) << 16) | (buf[3] << 8) | buf[4];
649 650 651 652 653 654
		c = 73957994; /* log10(25*32^2)*2^24 */
#endif
		break;
	case QAM_64:
	case QAM_256:
		i2c_read_demod_bytes(state, CARRIER_MSEQAM1, buf, 2);
655
		noise = (buf[0] << 8) | buf[1];
656 657 658 659 660 661 662
		c = state->current_modulation == QAM_64 ? 97939837 : 98026066;
		/* log10(688128)*2^24 and log10(696320)*2^24 */
		break;
	default:
		printk(KERN_ERR "lgdt330x: %s: Modulation set to unsupported value\n",
		       __FUNCTION__);
		return -EREMOTEIO; /* return -EDRIVER_IS_GIBBERED; */
663 664
	}

665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681
	state->snr = calculate_snr(noise, c);
	*snr = (state->snr) >> 16; /* Convert from 8.24 fixed-point to 8.8 */

	dprintk("%s: noise = 0x%08x, snr = %d.%02d dB\n", __FUNCTION__, noise,
		state->snr >> 24, (((state->snr >> 8) & 0xffff) * 100) >> 16);

	return 0;
}

static int lgdt330x_read_signal_strength(struct dvb_frontend* fe, u16* strength)
{
	/* Calculate Strength from SNR up to 35dB */
	/* Even though the SNR can go higher than 35dB, there is some comfort */
	/* factor in having a range of strong signals that can show at 100%   */
	struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
	u16 snr;
	int ret;
682

683 684 685 686 687 688 689 690 691
	ret = fe->ops.read_snr(fe, &snr);
	if (ret != 0)
		return ret;
	/* Rather than use the 8.8 value snr, use state->snr which is 8.24 */
	/* scale the range 0 - 35*2^24 into 0 - 65535 */
	if (state->snr >= 8960 * 0x10000)
		*strength = 0xffff;
	else
		*strength = state->snr / 8960;
692 693 694 695

	return 0;
}

696
static int lgdt330x_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fe_tune_settings)
697 698 699 700 701 702 703 704
{
	/* I have no idea about this - it may not be needed */
	fe_tune_settings->min_delay_ms = 500;
	fe_tune_settings->step_size = 0;
	fe_tune_settings->max_drift = 0;
	return 0;
}

705
static void lgdt330x_release(struct dvb_frontend* fe)
706
{
707
	struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
708 709 710
	kfree(state);
}

711 712
static struct dvb_frontend_ops lgdt3302_ops;
static struct dvb_frontend_ops lgdt3303_ops;
713

714
struct dvb_frontend* lgdt330x_attach(const struct lgdt330x_config* config,
715 716
				     struct i2c_adapter* i2c)
{
717
	struct lgdt330x_state* state = NULL;
718 719 720
	u8 buf[1];

	/* Allocate memory for the internal state */
P
 
Panagiotis Issaris 已提交
721
	state = kzalloc(sizeof(struct lgdt330x_state), GFP_KERNEL);
722 723 724 725 726 727
	if (state == NULL)
		goto error;

	/* Setup the state */
	state->config = config;
	state->i2c = i2c;
728 729

	/* Create dvb_frontend */
730 731
	switch (config->demod_chip) {
	case LGDT3302:
732
		memcpy(&state->frontend.ops, &lgdt3302_ops, sizeof(struct dvb_frontend_ops));
733 734
		break;
	case LGDT3303:
735
		memcpy(&state->frontend.ops, &lgdt3303_ops, sizeof(struct dvb_frontend_ops));
736 737 738 739
		break;
	default:
		goto error;
	}
740
	state->frontend.demodulator_priv = state;
741

742
	/* Verify communication with demod chip */
743
	if (i2c_read_demod_bytes(state, 2, buf, 1))
744 745 746 747 748 749 750 751
		goto error;

	state->current_frequency = -1;
	state->current_modulation = -1;

	return &state->frontend;

error:
J
Jesper Juhl 已提交
752
	kfree(state);
753 754 755 756
	dprintk("%s: ERROR\n",__FUNCTION__);
	return NULL;
}

757 758
static struct dvb_frontend_ops lgdt3302_ops = {
	.info = {
759
		.name= "LG Electronics LGDT3302 VSB/QAM Frontend",
760 761 762 763
		.type = FE_ATSC,
		.frequency_min= 54000000,
		.frequency_max= 858000000,
		.frequency_stepsize= 62500,
764 765
		.symbol_rate_min    = 5056941,	/* QAM 64 */
		.symbol_rate_max    = 10762000,	/* VSB 8  */
766 767 768 769 770 771 772 773 774 775 776 777 778 779 780
		.caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
	},
	.init                 = lgdt330x_init,
	.set_frontend         = lgdt330x_set_parameters,
	.get_frontend         = lgdt330x_get_frontend,
	.get_tune_settings    = lgdt330x_get_tune_settings,
	.read_status          = lgdt3302_read_status,
	.read_ber             = lgdt330x_read_ber,
	.read_signal_strength = lgdt330x_read_signal_strength,
	.read_snr             = lgdt3302_read_snr,
	.read_ucblocks        = lgdt330x_read_ucblocks,
	.release              = lgdt330x_release,
};

static struct dvb_frontend_ops lgdt3303_ops = {
781
	.info = {
782
		.name= "LG Electronics LGDT3303 VSB/QAM Frontend",
783 784 785 786
		.type = FE_ATSC,
		.frequency_min= 54000000,
		.frequency_max= 858000000,
		.frequency_stepsize= 62500,
787 788
		.symbol_rate_min    = 5056941,	/* QAM 64 */
		.symbol_rate_max    = 10762000,	/* VSB 8  */
789 790
		.caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
	},
791 792 793 794
	.init                 = lgdt330x_init,
	.set_frontend         = lgdt330x_set_parameters,
	.get_frontend         = lgdt330x_get_frontend,
	.get_tune_settings    = lgdt330x_get_tune_settings,
795
	.read_status          = lgdt3303_read_status,
796 797
	.read_ber             = lgdt330x_read_ber,
	.read_signal_strength = lgdt330x_read_signal_strength,
798
	.read_snr             = lgdt3303_read_snr,
799 800
	.read_ucblocks        = lgdt330x_read_ucblocks,
	.release              = lgdt330x_release,
801 802
};

803
MODULE_DESCRIPTION("LGDT330X (ATSC 8VSB & ITU-T J.83 AnnexB 64/256 QAM) Demodulator Driver");
804 805 806
MODULE_AUTHOR("Wilson Michaels");
MODULE_LICENSE("GPL");

807
EXPORT_SYMBOL(lgdt330x_attach);
808 809 810 811 812 813

/*
 * Local variables:
 * c-basic-offset: 8
 * End:
 */