2 * Support for OR51132 (pcHDTV HD-3000) - VSB/QAM
4 * Copyright (C) 2005 Kirk Lapray <kirk_lapray@bigfoot.com>
6 * Based on code from Jack Kelliher (kelliher@xmission.com)
7 * Copyright (C) 2002 & pcHDTV, inc.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 * This driver needs two external firmware files. Please copy
27 * "dvb-fe-or51132-vsb.fw" and "dvb-fe-or51132-qam.fw" to
28 * /usr/lib/hotplug/firmware/ or /lib/firmware/
29 * (depending on configuration of firmware hotplug).
31 #define OR51132_VSB_FIRMWARE "dvb-fe-or51132-vsb.fw"
32 #define OR51132_QAM_FIRMWARE "dvb-fe-or51132-qam.fw"
34 #include <linux/kernel.h>
35 #include <linux/module.h>
36 #include <linux/moduleparam.h>
37 #include <linux/init.h>
38 #include <linux/delay.h>
39 #include <linux/string.h>
40 #include <linux/slab.h>
41 #include <asm/byteorder.h>
43 #include "dvb_frontend.h"
48 #define dprintk(args...) \
50 if (debug) printk(KERN_DEBUG "or51132: " args); \
56 struct i2c_adapter* i2c;
58 /* Configuration settings */
59 const struct or51132_config* config;
61 struct dvb_frontend frontend;
63 /* Demodulator private data */
64 fe_modulation_t current_modulation;
66 /* Tuner private data */
67 u32 current_frequency;
70 static int i2c_writebytes (struct or51132_state* state, u8 reg, u8 *buf, int len)
79 if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
80 printk(KERN_WARNING "or51132: i2c_writebytes error (addr %02x, err == %i)\n", reg, err);
87 static u8 i2c_readbytes (struct or51132_state* state, u8 reg, u8* buf, int len)
96 if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
97 printk(KERN_WARNING "or51132: i2c_readbytes error (addr %02x, err == %i)\n", reg, err);
104 static int or51132_load_firmware (struct dvb_frontend* fe, const struct firmware *fw)
106 struct or51132_state* state = fe->demodulator_priv;
107 static u8 run_buf[] = {0x7F,0x01};
110 u32 firmwareAsize, firmwareBsize;
113 dprintk("Firmware is %Zd bytes\n",fw->size);
115 /* Get size of firmware A and B */
116 firmwareAsize = le32_to_cpu(*((u32*)fw->data));
117 dprintk("FirmwareA is %i bytes\n",firmwareAsize);
118 firmwareBsize = le32_to_cpu(*((u32*)(fw->data+4)));
119 dprintk("FirmwareB is %i bytes\n",firmwareBsize);
121 /* Upload firmware */
122 if ((ret = i2c_writebytes(state,state->config->demod_address,
123 &fw->data[8],firmwareAsize))) {
124 printk(KERN_WARNING "or51132: load_firmware error 1\n");
128 if ((ret = i2c_writebytes(state,state->config->demod_address,
129 &fw->data[8+firmwareAsize],firmwareBsize))) {
130 printk(KERN_WARNING "or51132: load_firmware error 2\n");
135 if ((ret = i2c_writebytes(state,state->config->demod_address,
137 printk(KERN_WARNING "or51132: load_firmware error 3\n");
141 /* Wait at least 5 msec */
142 msleep(20); /* 10ms */
144 if ((ret = i2c_writebytes(state,state->config->demod_address,
146 printk(KERN_WARNING "or51132: load_firmware error 4\n");
150 /* 50ms for operation to begin */
153 /* Read back ucode version to besure we loaded correctly and are really up and running */
154 /* Get uCode version */
158 msleep(20); /* 20ms */
159 if ((ret = i2c_writebytes(state,state->config->demod_address,
161 printk(KERN_WARNING "or51132: load_firmware error a\n");
167 msleep(20); /* 20ms */
168 if ((ret = i2c_writebytes(state,state->config->demod_address,
170 printk(KERN_WARNING "or51132: load_firmware error b\n");
176 msleep(20); /* 20ms */
177 if ((ret = i2c_writebytes(state,state->config->demod_address,
179 printk(KERN_WARNING "or51132: load_firmware error c\n");
184 msleep(20); /* 20ms */
185 /* Once upon a time, this command might have had something
186 to do with getting the firmware version, but it's
188 {0x04,0x00,0x30,0x00,i+1} */
189 /* Read 8 bytes, two bytes at a time */
190 if ((ret = i2c_readbytes(state,state->config->demod_address,
193 "or51132: load_firmware error d - %d\n",i);
199 "or51132: Version: %02X%02X%02X%02X-%02X%02X%02X%02X (%02X%01X-%01X-%02X%01X-%01X)\n",
200 rec_buf[1],rec_buf[0],rec_buf[3],rec_buf[2],
201 rec_buf[5],rec_buf[4],rec_buf[7],rec_buf[6],
202 rec_buf[3],rec_buf[2]>>4,rec_buf[2]&0x0f,
203 rec_buf[5],rec_buf[4]>>4,rec_buf[4]&0x0f);
208 msleep(20); /* 20ms */
209 if ((ret = i2c_writebytes(state,state->config->demod_address,
211 printk(KERN_WARNING "or51132: load_firmware error e\n");
217 static int or51132_init(struct dvb_frontend* fe)
222 static int or51132_read_ber(struct dvb_frontend* fe, u32* ber)
228 static int or51132_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
234 static int or51132_sleep(struct dvb_frontend* fe)
239 static int or51132_setmode(struct dvb_frontend* fe)
241 struct or51132_state* state = fe->demodulator_priv;
242 unsigned char cmd_buf[3];
244 dprintk("setmode %d\n",(int)state->current_modulation);
245 /* set operation mode in Receiver 1 register; */
248 switch (state->current_modulation) {
252 /* Auto-deinterleave; MPEG ser, MPEG2tr, phase noise-high*/
256 /* Auto CH, Auto NTSC rej, MPEGser, MPEG2tr, phase noise-high*/
260 printk("setmode:Modulation set to unsupported value\n");
262 if (i2c_writebytes(state,state->config->demod_address,
264 printk(KERN_WARNING "or51132: set_mode error 1\n");
267 dprintk("or51132: set #1 to %02x\n", cmd_buf[2]);
269 /* Set operation mode in Receiver 6 register */
271 switch (state->current_modulation) {
273 /* REC MODE Normal Carrier Lock */
275 /* Channel MODE Auto QAM64/256 */
279 /* REC MODE Normal Carrier Lock */
281 /* Channel MODE QAM256 */
285 /* REC MODE Normal Carrier Lock */
287 /* Channel MODE QAM64 */
291 /* REC MODE inv IF spectrum, Normal */
293 /* Channel MODE ATSC/VSB8 */
297 printk("setmode: Modulation set to unsupported value\n");
299 msleep(20); /* 20ms */
300 if (i2c_writebytes(state,state->config->demod_address,
302 printk(KERN_WARNING "or51132: set_mode error 2\n");
305 dprintk("or51132: set #6 to 0x%02x%02x\n", cmd_buf[1], cmd_buf[2]);
310 /* Some modulations use the same firmware. This classifies modulations
311 by the firmware they use. */
312 #define MOD_FWCLASS_UNKNOWN 0
313 #define MOD_FWCLASS_VSB 1
314 #define MOD_FWCLASS_QAM 2
315 static int modulation_fw_class(fe_modulation_t modulation)
319 return MOD_FWCLASS_VSB;
323 return MOD_FWCLASS_QAM;
325 return MOD_FWCLASS_UNKNOWN;
329 static int or51132_set_parameters(struct dvb_frontend* fe,
330 struct dvb_frontend_parameters *param)
333 struct or51132_state* state = fe->demodulator_priv;
334 const struct firmware *fw;
338 /* Upload new firmware only if we need a different one */
339 if (modulation_fw_class(state->current_modulation) !=
340 modulation_fw_class(param->u.vsb.modulation)) {
341 switch(modulation_fw_class(param->u.vsb.modulation)) {
342 case MOD_FWCLASS_VSB:
343 dprintk("set_parameters VSB MODE\n");
344 fwname = OR51132_VSB_FIRMWARE;
346 /* Set non-punctured clock for VSB */
349 case MOD_FWCLASS_QAM:
350 dprintk("set_parameters QAM MODE\n");
351 fwname = OR51132_QAM_FIRMWARE;
353 /* Set punctured clock for QAM */
357 printk("or51132: Modulation type(%d) UNSUPPORTED\n",
358 param->u.vsb.modulation);
361 printk("or51132: Waiting for firmware upload(%s)...\n",
363 ret = request_firmware(&fw, fwname, &state->i2c->dev);
365 printk(KERN_WARNING "or51132: No firmware up"
366 "loaded(timeout or file not found?)\n");
369 ret = or51132_load_firmware(fe, fw);
370 release_firmware(fw);
372 printk(KERN_WARNING "or51132: Writing firmware to "
376 printk("or51132: Firmware upload complete.\n");
377 state->config->set_ts_params(fe, clock_mode);
379 /* Change only if we are actually changing the modulation */
380 if (state->current_modulation != param->u.vsb.modulation) {
381 state->current_modulation = param->u.vsb.modulation;
385 if (fe->ops.tuner_ops.set_params) {
386 fe->ops.tuner_ops.set_params(fe, param);
387 if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0);
390 /* Set to current mode */
393 /* Update current frequency */
394 state->current_frequency = param->frequency;
398 static int or51132_get_parameters(struct dvb_frontend* fe,
399 struct dvb_frontend_parameters *param)
401 struct or51132_state* state = fe->demodulator_priv;
404 /* Receiver Status */
407 msleep(30); /* 30ms */
408 if (i2c_writebytes(state,state->config->demod_address,buf,2)) {
409 printk(KERN_WARNING "or51132: get_parameters write error\n");
412 msleep(30); /* 30ms */
413 if (i2c_readbytes(state,state->config->demod_address,buf,2)) {
414 printk(KERN_WARNING "or51132: get_parameters read error\n");
418 case 0x06: param->u.vsb.modulation = VSB_8; break;
419 case 0x43: param->u.vsb.modulation = QAM_64; break;
420 case 0x45: param->u.vsb.modulation = QAM_256; break;
422 printk(KERN_WARNING "or51132: unknown status 0x%02x\n",
427 /* FIXME: Read frequency from frontend, take AFC into account */
428 param->frequency = state->current_frequency;
430 /* FIXME: How to read inversion setting? Receiver 6 register? */
431 param->inversion = INVERSION_AUTO;
436 static int or51132_read_status(struct dvb_frontend* fe, fe_status_t* status)
438 struct or51132_state* state = fe->demodulator_priv;
439 unsigned char rec_buf[2];
440 unsigned char snd_buf[2];
443 /* Receiver Status */
446 msleep(30); /* 30ms */
447 if (i2c_writebytes(state,state->config->demod_address,snd_buf,2)) {
448 printk(KERN_WARNING "or51132: read_status write error\n");
451 msleep(30); /* 30ms */
452 if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
453 printk(KERN_WARNING "or51132: read_status read error\n");
456 dprintk("read_status %x %x\n",rec_buf[0],rec_buf[1]);
458 if (rec_buf[1] & 0x01) { /* Receiver Lock */
459 *status |= FE_HAS_SIGNAL;
460 *status |= FE_HAS_CARRIER;
461 *status |= FE_HAS_VITERBI;
462 *status |= FE_HAS_SYNC;
463 *status |= FE_HAS_LOCK;
468 /* log10-1 table at .5 increments from 1 to 100.5 */
469 static unsigned int i100x20log10[] = {
470 0, 352, 602, 795, 954, 1088, 1204, 1306, 1397, 1480,
471 1556, 1625, 1690, 1750, 1806, 1858, 1908, 1955, 2000, 2042,
472 2082, 2121, 2158, 2193, 2227, 2260, 2292, 2322, 2352, 2380,
473 2408, 2434, 2460, 2486, 2510, 2534, 2557, 2580, 2602, 2623,
474 2644, 2664, 2684, 2704, 2723, 2742, 2760, 2778, 2795, 2813,
475 2829, 2846, 2862, 2878, 2894, 2909, 2924, 2939, 2954, 2968,
476 2982, 2996, 3010, 3023, 3037, 3050, 3062, 3075, 3088, 3100,
477 3112, 3124, 3136, 3148, 3159, 3170, 3182, 3193, 3204, 3214,
478 3225, 3236, 3246, 3256, 3266, 3276, 3286, 3296, 3306, 3316,
479 3325, 3334, 3344, 3353, 3362, 3371, 3380, 3389, 3397, 3406,
480 3415, 3423, 3432, 3440, 3448, 3456, 3464, 3472, 3480, 3488,
481 3496, 3504, 3511, 3519, 3526, 3534, 3541, 3549, 3556, 3563,
482 3570, 3577, 3584, 3591, 3598, 3605, 3612, 3619, 3625, 3632,
483 3639, 3645, 3652, 3658, 3665, 3671, 3677, 3683, 3690, 3696,
484 3702, 3708, 3714, 3720, 3726, 3732, 3738, 3744, 3750, 3755,
485 3761, 3767, 3772, 3778, 3784, 3789, 3795, 3800, 3806, 3811,
486 3816, 3822, 3827, 3832, 3838, 3843, 3848, 3853, 3858, 3863,
487 3868, 3874, 3879, 3884, 3888, 3893, 3898, 3903, 3908, 3913,
488 3918, 3922, 3927, 3932, 3936, 3941, 3946, 3950, 3955, 3960,
489 3964, 3969, 3973, 3978, 3982, 3986, 3991, 3995, 4000, 4004,
492 static unsigned int denom[] = {1,1,100,1000,10000,100000,1000000,10000000,100000000};
494 static unsigned int i20Log10(unsigned short val)
496 unsigned int rntval = 100;
497 unsigned int tmp = val;
498 unsigned int exp = 1;
500 while(tmp > 100) {tmp /= 100; exp++;}
502 val = (2 * val)/denom[exp];
503 if (exp > 1) rntval = 2000*exp;
505 rntval += i100x20log10[val];
509 static int or51132_read_signal_strength(struct dvb_frontend* fe, u16* strength)
511 struct or51132_state* state = fe->demodulator_priv;
512 unsigned char rec_buf[2];
513 unsigned char snd_buf[2];
520 snd_buf[1]=0x02; /* SNR after Equalizer */
521 msleep(30); /* 30ms */
522 if (i2c_writebytes(state,state->config->demod_address,snd_buf,2)) {
523 printk(KERN_WARNING "or51132: read_status write error\n");
526 msleep(30); /* 30ms */
527 if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
528 printk(KERN_WARNING "or51132: read_status read error\n");
531 snr_equ = rec_buf[0] | (rec_buf[1] << 8);
532 dprintk("read_signal_strength snr_equ %x %x (%i)\n",rec_buf[0],rec_buf[1],snr_equ);
534 /* Receiver Status */
537 msleep(30); /* 30ms */
538 if (i2c_writebytes(state,state->config->demod_address,snd_buf,2)) {
539 printk(KERN_WARNING "or51132: read_signal_strength read_status write error\n");
542 msleep(30); /* 30ms */
543 if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
544 printk(KERN_WARNING "or51132: read_signal_strength read_status read error\n");
547 dprintk("read_signal_strength read_status %x %x\n",rec_buf[0],rec_buf[1]);
548 rcvr_stat = rec_buf[1];
549 usK = (rcvr_stat & 0x10) ? 3 : 0;
551 /* The value reported back from the frontend will be FFFF=100% 0000=0% */
552 signal_strength = (((8952 - i20Log10(snr_equ) - usK*100)/3+5)*65535)/1000;
553 if (signal_strength > 0xffff)
556 *strength = signal_strength;
557 dprintk("read_signal_strength %i\n",*strength);
562 static int or51132_read_snr(struct dvb_frontend* fe, u16* snr)
564 struct or51132_state* state = fe->demodulator_priv;
565 unsigned char rec_buf[2];
566 unsigned char snd_buf[2];
570 snd_buf[1]=0x02; /* SNR after Equalizer */
571 msleep(30); /* 30ms */
572 if (i2c_writebytes(state,state->config->demod_address,snd_buf,2)) {
573 printk(KERN_WARNING "or51132: read_snr write error\n");
576 msleep(30); /* 30ms */
577 if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
578 printk(KERN_WARNING "or51132: read_snr dvr read error\n");
581 snr_equ = rec_buf[0] | (rec_buf[1] << 8);
582 dprintk("read_snr snr_equ %x %x (%i)\n",rec_buf[0],rec_buf[1],snr_equ);
584 *snr = 0xFFFF - snr_equ;
585 dprintk("read_snr %i\n",*snr);
590 static int or51132_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fe_tune_settings)
592 fe_tune_settings->min_delay_ms = 500;
593 fe_tune_settings->step_size = 0;
594 fe_tune_settings->max_drift = 0;
599 static void or51132_release(struct dvb_frontend* fe)
601 struct or51132_state* state = fe->demodulator_priv;
605 static struct dvb_frontend_ops or51132_ops;
607 struct dvb_frontend* or51132_attach(const struct or51132_config* config,
608 struct i2c_adapter* i2c)
610 struct or51132_state* state = NULL;
612 /* Allocate memory for the internal state */
613 state = kmalloc(sizeof(struct or51132_state), GFP_KERNEL);
617 /* Setup the state */
618 state->config = config;
620 state->current_frequency = -1;
621 state->current_modulation = -1;
623 /* Create dvb_frontend */
624 memcpy(&state->frontend.ops, &or51132_ops, sizeof(struct dvb_frontend_ops));
625 state->frontend.demodulator_priv = state;
626 return &state->frontend;
633 static struct dvb_frontend_ops or51132_ops = {
636 .name = "Oren OR51132 VSB/QAM Frontend",
638 .frequency_min = 44000000,
639 .frequency_max = 958000000,
640 .frequency_stepsize = 166666,
641 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
642 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
643 FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_QAM_AUTO |
647 .release = or51132_release,
649 .init = or51132_init,
650 .sleep = or51132_sleep,
652 .set_frontend = or51132_set_parameters,
653 .get_frontend = or51132_get_parameters,
654 .get_tune_settings = or51132_get_tune_settings,
656 .read_status = or51132_read_status,
657 .read_ber = or51132_read_ber,
658 .read_signal_strength = or51132_read_signal_strength,
659 .read_snr = or51132_read_snr,
660 .read_ucblocks = or51132_read_ucblocks,
663 module_param(debug, int, 0644);
664 MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
666 MODULE_DESCRIPTION("OR51132 ATSC [pcHDTV HD-3000] (8VSB & ITU J83 AnnexB FEC QAM64/256) Demodulator Driver");
667 MODULE_AUTHOR("Kirk Lapray");
668 MODULE_LICENSE("GPL");
670 EXPORT_SYMBOL(or51132_attach);