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 <asm/byteorder.h>
41 #include "dvb_frontend.h"
46 #define dprintk(args...) \
48 if (debug) printk(KERN_DEBUG "or51132: " args); \
54 struct i2c_adapter* i2c;
55 struct dvb_frontend_ops ops;
57 /* Configuration settings */
58 const struct or51132_config* config;
60 struct dvb_frontend frontend;
62 /* Demodulator private data */
63 fe_modulation_t current_modulation;
65 /* Tuner private data */
66 u32 current_frequency;
69 static int i2c_writebytes (struct or51132_state* state, u8 reg, u8 *buf, int len)
78 if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
79 printk(KERN_WARNING "or51132: i2c_writebytes error (addr %02x, err == %i)\n", reg, err);
86 static u8 i2c_readbytes (struct or51132_state* state, u8 reg, u8* buf, int len)
95 if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
96 printk(KERN_WARNING "or51132: i2c_readbytes error (addr %02x, err == %i)\n", reg, err);
103 static int or51132_load_firmware (struct dvb_frontend* fe, const struct firmware *fw)
105 struct or51132_state* state = fe->demodulator_priv;
106 static u8 run_buf[] = {0x7F,0x01};
107 static u8 get_ver_buf[] = {0x04,0x00,0x30,0x00,0x00};
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 */
159 msleep(20); /* 20ms */
160 if ((ret = i2c_writebytes(state,state->config->demod_address,
162 printk(KERN_WARNING "or51132: load_firmware error a\n");
170 msleep(20); /* 20ms */
171 if ((ret = i2c_writebytes(state,state->config->demod_address,
173 printk(KERN_WARNING "or51132: load_firmware error b\n");
181 msleep(20); /* 20ms */
182 if ((ret = i2c_writebytes(state,state->config->demod_address,
184 printk(KERN_WARNING "or51132: load_firmware error c\n");
189 msleep(20); /* 20ms */
190 get_ver_buf[4] = i+1;
191 if ((ret = i2c_readbytes(state,state->config->demod_address,
194 "or51132: load_firmware error d - %d\n",i);
200 "or51132: Version: %02X%02X%02X%02X-%02X%02X%02X%02X (%02X%01X-%01X-%02X%01X-%01X)\n",
201 rec_buf[1],rec_buf[0],rec_buf[3],rec_buf[2],
202 rec_buf[5],rec_buf[4],rec_buf[7],rec_buf[6],
203 rec_buf[3],rec_buf[2]>>4,rec_buf[2]&0x0f,
204 rec_buf[5],rec_buf[4]>>4,rec_buf[4]&0x0f);
210 msleep(20); /* 20ms */
211 if ((ret = i2c_writebytes(state,state->config->demod_address,
213 printk(KERN_WARNING "or51132: load_firmware error e\n");
219 static int or51132_init(struct dvb_frontend* fe)
224 static int or51132_read_ber(struct dvb_frontend* fe, u32* ber)
230 static int or51132_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
236 static int or51132_sleep(struct dvb_frontend* fe)
241 static int or51132_setmode(struct dvb_frontend* fe)
243 struct or51132_state* state = fe->demodulator_priv;
244 unsigned char cmd_buf[4];
246 dprintk("setmode %d\n",(int)state->current_modulation);
247 /* set operation mode in Receiver 1 register; */
250 switch (state->current_modulation) {
254 /* Auto-deinterleave; MPEG ser, MPEG2tr, phase noise-high*/
258 /* Auto CH, Auto NTSC rej, MPEGser, MPEG2tr, phase noise-high*/
262 printk("setmode:Modulation set to unsupported value\n");
265 if (i2c_writebytes(state,state->config->demod_address,
267 printk(KERN_WARNING "or51132: set_mode error 1\n");
270 dprintk("or51132: set #1 to %02x\n", cmd_buf[2]);
272 /* Set operation mode in Receiver 6 register */
274 switch (state->current_modulation) {
276 /* REC MODE Normal Carrier Lock */
278 /* Channel MODE Auto QAM64/256 */
282 /* REC MODE Normal Carrier Lock */
284 /* Channel MODE QAM256 */
288 /* REC MODE Normal Carrier Lock */
290 /* Channel MODE QAM64 */
294 /* REC MODE inv IF spectrum, Normal */
296 /* Channel MODE ATSC/VSB8 */
300 printk("setmode: Modulation set to unsupported value\n");
303 msleep(20); /* 20ms */
304 if (i2c_writebytes(state,state->config->demod_address,
306 printk(KERN_WARNING "or51132: set_mode error 2\n");
309 dprintk("or51132: set #6 to 0x%02x%02x\n", cmd_buf[1], cmd_buf[2]);
314 static int or51132_set_parameters(struct dvb_frontend* fe,
315 struct dvb_frontend_parameters *param)
319 struct or51132_state* state = fe->demodulator_priv;
320 const struct firmware *fw;
322 /* Change only if we are actually changing the modulation */
323 if (state->current_modulation != param->u.vsb.modulation) {
324 switch(param->u.vsb.modulation) {
326 dprintk("set_parameters VSB MODE\n");
327 printk("or51132: Waiting for firmware upload(%s)...\n",
328 OR51132_VSB_FIRMWARE);
329 ret = request_firmware(&fw, OR51132_VSB_FIRMWARE,
332 printk(KERN_WARNING "or51132: No firmware up"
333 "loaded(timeout or file not found?)\n");
336 /* Set non-punctured clock for VSB */
337 state->config->set_ts_params(fe, 0);
342 dprintk("set_parameters QAM MODE\n");
343 printk("or51132: Waiting for firmware upload(%s)...\n",
344 OR51132_QAM_FIRMWARE);
345 ret = request_firmware(&fw, OR51132_QAM_FIRMWARE,
348 printk(KERN_WARNING "or51132: No firmware up"
349 "loaded(timeout or file not found?)\n");
352 /* Set punctured clock for QAM */
353 state->config->set_ts_params(fe, 1);
356 printk("or51132:Modulation type(%d) UNSUPPORTED\n",
357 param->u.vsb.modulation);
360 ret = or51132_load_firmware(fe, fw);
361 release_firmware(fw);
363 printk(KERN_WARNING "or51132: Writing firmware to "
367 printk("or51132: Firmware upload complete.\n");
369 state->current_modulation = param->u.vsb.modulation;
373 /* Change only if we are actually changing the channel */
374 if (state->current_frequency != param->frequency) {
375 dvb_pll_configure(state->config->pll_desc, buf,
376 param->frequency, 0);
377 dprintk("set_parameters tuner bytes: 0x%02x 0x%02x "
378 "0x%02x 0x%02x\n",buf[0],buf[1],buf[2],buf[3]);
379 if (i2c_writebytes(state, state->config->pll_address ,buf, 4))
380 printk(KERN_WARNING "or51132: set_parameters error "
381 "writing to tuner\n");
383 /* Set to current mode */
386 /* Update current frequency */
387 state->current_frequency = param->frequency;
392 static int or51132_read_status(struct dvb_frontend* fe, fe_status_t* status)
394 struct or51132_state* state = fe->demodulator_priv;
395 unsigned char rec_buf[2];
396 unsigned char snd_buf[2];
399 /* Receiver Status */
402 msleep(30); /* 30ms */
403 if (i2c_writebytes(state,state->config->demod_address,snd_buf,2)) {
404 printk(KERN_WARNING "or51132: read_status write error\n");
407 msleep(30); /* 30ms */
408 if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
409 printk(KERN_WARNING "or51132: read_status read error\n");
412 dprintk("read_status %x %x\n",rec_buf[0],rec_buf[1]);
414 if (rec_buf[1] & 0x01) { /* Receiver Lock */
415 *status |= FE_HAS_SIGNAL;
416 *status |= FE_HAS_CARRIER;
417 *status |= FE_HAS_VITERBI;
418 *status |= FE_HAS_SYNC;
419 *status |= FE_HAS_LOCK;
424 /* log10-1 table at .5 increments from 1 to 100.5 */
425 static unsigned int i100x20log10[] = {
426 0, 352, 602, 795, 954, 1088, 1204, 1306, 1397, 1480,
427 1556, 1625, 1690, 1750, 1806, 1858, 1908, 1955, 2000, 2042,
428 2082, 2121, 2158, 2193, 2227, 2260, 2292, 2322, 2352, 2380,
429 2408, 2434, 2460, 2486, 2510, 2534, 2557, 2580, 2602, 2623,
430 2644, 2664, 2684, 2704, 2723, 2742, 2760, 2778, 2795, 2813,
431 2829, 2846, 2862, 2878, 2894, 2909, 2924, 2939, 2954, 2968,
432 2982, 2996, 3010, 3023, 3037, 3050, 3062, 3075, 3088, 3100,
433 3112, 3124, 3136, 3148, 3159, 3170, 3182, 3193, 3204, 3214,
434 3225, 3236, 3246, 3256, 3266, 3276, 3286, 3296, 3306, 3316,
435 3325, 3334, 3344, 3353, 3362, 3371, 3380, 3389, 3397, 3406,
436 3415, 3423, 3432, 3440, 3448, 3456, 3464, 3472, 3480, 3488,
437 3496, 3504, 3511, 3519, 3526, 3534, 3541, 3549, 3556, 3563,
438 3570, 3577, 3584, 3591, 3598, 3605, 3612, 3619, 3625, 3632,
439 3639, 3645, 3652, 3658, 3665, 3671, 3677, 3683, 3690, 3696,
440 3702, 3708, 3714, 3720, 3726, 3732, 3738, 3744, 3750, 3755,
441 3761, 3767, 3772, 3778, 3784, 3789, 3795, 3800, 3806, 3811,
442 3816, 3822, 3827, 3832, 3838, 3843, 3848, 3853, 3858, 3863,
443 3868, 3874, 3879, 3884, 3888, 3893, 3898, 3903, 3908, 3913,
444 3918, 3922, 3927, 3932, 3936, 3941, 3946, 3950, 3955, 3960,
445 3964, 3969, 3973, 3978, 3982, 3986, 3991, 3995, 4000, 4004,
448 static unsigned int denom[] = {1,1,100,1000,10000,100000,1000000,10000000,100000000};
450 static unsigned int i20Log10(unsigned short val)
452 unsigned int rntval = 100;
453 unsigned int tmp = val;
454 unsigned int exp = 1;
456 while(tmp > 100) {tmp /= 100; exp++;}
458 val = (2 * val)/denom[exp];
459 if (exp > 1) rntval = 2000*exp;
461 rntval += i100x20log10[val];
465 static int or51132_read_signal_strength(struct dvb_frontend* fe, u16* strength)
467 struct or51132_state* state = fe->demodulator_priv;
468 unsigned char rec_buf[2];
469 unsigned char snd_buf[2];
475 snd_buf[1]=0x02; /* SNR after Equalizer */
476 msleep(30); /* 30ms */
477 if (i2c_writebytes(state,state->config->demod_address,snd_buf,2)) {
478 printk(KERN_WARNING "or51132: read_status write error\n");
481 msleep(30); /* 30ms */
482 if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
483 printk(KERN_WARNING "or51132: read_status read error\n");
486 snr_equ = rec_buf[0] | (rec_buf[1] << 8);
487 dprintk("read_signal_strength snr_equ %x %x (%i)\n",rec_buf[0],rec_buf[1],snr_equ);
489 /* Receiver Status */
492 msleep(30); /* 30ms */
493 if (i2c_writebytes(state,state->config->demod_address,snd_buf,2)) {
494 printk(KERN_WARNING "or51132: read_signal_strength read_status write error\n");
497 msleep(30); /* 30ms */
498 if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
499 printk(KERN_WARNING "or51132: read_signal_strength read_status read error\n");
502 dprintk("read_signal_strength read_status %x %x\n",rec_buf[0],rec_buf[1]);
503 rcvr_stat = rec_buf[1];
504 usK = (rcvr_stat & 0x10) ? 3 : 0;
506 /* The value reported back from the frontend will be FFFF=100% 0000=0% */
507 *strength = (((8952 - i20Log10(snr_equ) - usK*100)/3+5)*65535)/1000;
508 dprintk("read_signal_strength %i\n",*strength);
513 static int or51132_read_snr(struct dvb_frontend* fe, u16* snr)
515 struct or51132_state* state = fe->demodulator_priv;
516 unsigned char rec_buf[2];
517 unsigned char snd_buf[2];
521 snd_buf[1]=0x02; /* SNR after Equalizer */
522 msleep(30); /* 30ms */
523 if (i2c_writebytes(state,state->config->demod_address,snd_buf,2)) {
524 printk(KERN_WARNING "or51132: read_snr write error\n");
527 msleep(30); /* 30ms */
528 if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
529 printk(KERN_WARNING "or51132: read_snr dvr read error\n");
532 snr_equ = rec_buf[0] | (rec_buf[1] << 8);
533 dprintk("read_snr snr_equ %x %x (%i)\n",rec_buf[0],rec_buf[1],snr_equ);
535 *snr = 0xFFFF - snr_equ;
536 dprintk("read_snr %i\n",*snr);
541 static int or51132_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fe_tune_settings)
543 fe_tune_settings->min_delay_ms = 500;
544 fe_tune_settings->step_size = 0;
545 fe_tune_settings->max_drift = 0;
550 static void or51132_release(struct dvb_frontend* fe)
552 struct or51132_state* state = fe->demodulator_priv;
556 static struct dvb_frontend_ops or51132_ops;
558 struct dvb_frontend* or51132_attach(const struct or51132_config* config,
559 struct i2c_adapter* i2c)
561 struct or51132_state* state = NULL;
563 /* Allocate memory for the internal state */
564 state = kmalloc(sizeof(struct or51132_state), GFP_KERNEL);
568 /* Setup the state */
569 state->config = config;
571 memcpy(&state->ops, &or51132_ops, sizeof(struct dvb_frontend_ops));
572 state->current_frequency = -1;
573 state->current_modulation = -1;
575 /* Create dvb_frontend */
576 state->frontend.ops = &state->ops;
577 state->frontend.demodulator_priv = state;
578 return &state->frontend;
586 static struct dvb_frontend_ops or51132_ops = {
589 .name = "Oren OR51132 VSB/QAM Frontend",
591 .frequency_min = 44000000,
592 .frequency_max = 958000000,
593 .frequency_stepsize = 166666,
594 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
595 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
596 FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_QAM_AUTO |
600 .release = or51132_release,
602 .init = or51132_init,
603 .sleep = or51132_sleep,
605 .set_frontend = or51132_set_parameters,
606 .get_tune_settings = or51132_get_tune_settings,
608 .read_status = or51132_read_status,
609 .read_ber = or51132_read_ber,
610 .read_signal_strength = or51132_read_signal_strength,
611 .read_snr = or51132_read_snr,
612 .read_ucblocks = or51132_read_ucblocks,
615 module_param(debug, int, 0644);
616 MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
618 MODULE_DESCRIPTION("OR51132 ATSC [pcHDTV HD-3000] (8VSB & ITU J83 AnnexB FEC QAM64/256) Demodulator Driver");
619 MODULE_AUTHOR("Kirk Lapray");
620 MODULE_LICENSE("GPL");
622 EXPORT_SYMBOL(or51132_attach);