2 * Support for OR51211 (pcHDTV HD-2000) - VSB
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 external firmware. Please use the command
27 * "<kerneldir>/Documentation/dvb/get_dvb_firmware or51211" to
28 * download/extract it, and then copy it to /usr/lib/hotplug/firmware.
30 #define OR51211_DEFAULT_FIRMWARE "dvb-fe-or51211.fw"
32 #include <linux/kernel.h>
33 #include <linux/module.h>
34 #include <linux/moduleparam.h>
35 #include <linux/device.h>
36 #include <linux/firmware.h>
37 #include <linux/string.h>
38 #include <linux/slab.h>
39 #include <asm/byteorder.h>
41 #include "dvb_frontend.h"
45 #define dprintk(args...) \
47 if (debug) printk(KERN_DEBUG "or51211: " args); \
50 static u8 run_buf[] = {0x7f,0x01};
51 static u8 cmd_buf[] = {0x04,0x01,0x50,0x80,0x06}; // ATSC
53 struct or51211_state {
55 struct i2c_adapter* i2c;
56 struct dvb_frontend_ops ops;
58 /* Configuration settings */
59 const struct or51211_config* config;
61 struct dvb_frontend frontend;
64 /* Demodulator private data */
67 /* Tuner private data */
68 u32 current_frequency;
71 static int i2c_writebytes (struct or51211_state* state, u8 reg, u8 *buf,
81 if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) {
82 printk(KERN_WARNING "or51211: i2c_writebytes error "
83 "(addr %02x, err == %i)\n", reg, err);
90 static u8 i2c_readbytes (struct or51211_state* state, u8 reg, u8* buf, int len)
99 if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) {
100 printk(KERN_WARNING "or51211: i2c_readbytes error "
101 "(addr %02x, err == %i)\n", reg, err);
108 static int or51211_load_firmware (struct dvb_frontend* fe,
109 const struct firmware *fw)
111 struct or51211_state* state = fe->demodulator_priv;
115 dprintk("Firmware is %d bytes\n",fw->size);
119 if (i2c_writebytes(state,0x50,tudata,1)) {
120 printk(KERN_WARNING "or51211:load_firmware error eprom addr\n");
123 if (i2c_readbytes(state,0x50,&tudata[145],192)) {
124 printk(KERN_WARNING "or51211: load_firmware error eprom\n");
128 /* Create firmware buffer */
129 for (i = 0; i < 145; i++)
130 tudata[i] = fw->data[i];
132 for (i = 0; i < 248; i++)
133 tudata[i+337] = fw->data[145+i];
135 state->config->reset(fe);
137 if (i2c_writebytes(state,state->config->demod_address,tudata,585)) {
138 printk(KERN_WARNING "or51211: load_firmware error 1\n");
143 if (i2c_writebytes(state,state->config->demod_address,
144 &fw->data[393],8125)) {
145 printk(KERN_WARNING "or51211: load_firmware error 2\n");
150 if (i2c_writebytes(state,state->config->demod_address,run_buf,2)) {
151 printk(KERN_WARNING "or51211: load_firmware error 3\n");
155 /* Wait at least 5 msec */
157 if (i2c_writebytes(state,state->config->demod_address,run_buf,2)) {
158 printk(KERN_WARNING "or51211: load_firmware error 4\n");
163 printk("or51211: Done.\n");
167 static int or51211_setmode(struct dvb_frontend* fe, int mode)
169 struct or51211_state* state = fe->demodulator_priv;
172 state->config->setmode(fe, mode);
174 if (i2c_writebytes(state,state->config->demod_address,run_buf,2)) {
175 printk(KERN_WARNING "or51211: setmode error 1\n");
179 /* Wait at least 5 msec */
181 if (i2c_writebytes(state,state->config->demod_address,run_buf,2)) {
182 printk(KERN_WARNING "or51211: setmode error 2\n");
188 /* Set operation mode in Receiver 1 register;
190 * data 0x50h Automatic sets receiver channel conditions
191 * Automatic NTSC rejection filter
192 * Enable MPEG serial data output
194 * High tuner phase noise
195 * normal +/-150kHz Carrier acquisition range
197 if (i2c_writebytes(state,state->config->demod_address,cmd_buf,3)) {
198 printk(KERN_WARNING "or51211: setmode error 3\n");
207 if (i2c_writebytes(state,state->config->demod_address,rec_buf,3)) {
208 printk(KERN_WARNING "or51211: setmode error 5\n");
211 if (i2c_readbytes(state,state->config->demod_address,&rec_buf[10],2)) {
212 printk(KERN_WARNING "or51211: setmode error 6");
215 dprintk("setmode rec status %02x %02x\n",rec_buf[10],rec_buf[11]);
220 static int or51211_set_parameters(struct dvb_frontend* fe,
221 struct dvb_frontend_parameters *param)
223 struct or51211_state* state = fe->demodulator_priv;
228 /* Change only if we are actually changing the channel */
229 if (state->current_frequency != param->frequency) {
230 freq = 44000 + (param->frequency/1000);
231 tunerfreq = freq * 16/1000;
233 dprintk("set_parameters frequency = %d (tunerfreq = %d)\n",
234 param->frequency,tunerfreq);
236 buf[0] = (tunerfreq >> 8) & 0x7F;
237 buf[1] = (tunerfreq & 0xFF);
240 if (param->frequency < 157250000) {
242 dprintk("set_parameters VHF low range\n");
243 } else if (param->frequency < 454000000) {
245 dprintk("set_parameters VHF high range\n");
248 dprintk("set_parameters UHF range\n");
250 dprintk("set_parameters tuner bytes: 0x%02x 0x%02x "
251 "0x%02x 0x%02x\n",buf[0],buf[1],buf[2],buf[3]);
253 if (i2c_writebytes(state,0xC2>>1,buf,4))
254 printk(KERN_WARNING "or51211:set_parameters error "
255 "writing to tuner\n");
257 /* Set to ATSC mode */
258 or51211_setmode(fe,0);
260 /* Update current frequency */
261 state->current_frequency = param->frequency;
266 static int or51211_read_status(struct dvb_frontend* fe, fe_status_t* status)
268 struct or51211_state* state = fe->demodulator_priv;
269 unsigned char rec_buf[2];
270 unsigned char snd_buf[] = {0x04,0x00,0x03,0x00};
273 /* Receiver Status */
274 if (i2c_writebytes(state,state->config->demod_address,snd_buf,3)) {
275 printk(KERN_WARNING "or51132: read_status write error\n");
279 if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
280 printk(KERN_WARNING "or51132: read_status read error\n");
283 dprintk("read_status %x %x\n",rec_buf[0],rec_buf[1]);
285 if (rec_buf[0] & 0x01) { /* Receiver Lock */
286 *status |= FE_HAS_SIGNAL;
287 *status |= FE_HAS_CARRIER;
288 *status |= FE_HAS_VITERBI;
289 *status |= FE_HAS_SYNC;
290 *status |= FE_HAS_LOCK;
295 /* log10-1 table at .5 increments from 1 to 100.5 */
296 static unsigned int i100x20log10[] = {
297 0, 352, 602, 795, 954, 1088, 1204, 1306, 1397, 1480,
298 1556, 1625, 1690, 1750, 1806, 1858, 1908, 1955, 2000, 2042,
299 2082, 2121, 2158, 2193, 2227, 2260, 2292, 2322, 2352, 2380,
300 2408, 2434, 2460, 2486, 2510, 2534, 2557, 2580, 2602, 2623,
301 2644, 2664, 2684, 2704, 2723, 2742, 2760, 2778, 2795, 2813,
302 2829, 2846, 2862, 2878, 2894, 2909, 2924, 2939, 2954, 2968,
303 2982, 2996, 3010, 3023, 3037, 3050, 3062, 3075, 3088, 3100,
304 3112, 3124, 3136, 3148, 3159, 3170, 3182, 3193, 3204, 3214,
305 3225, 3236, 3246, 3256, 3266, 3276, 3286, 3296, 3306, 3316,
306 3325, 3334, 3344, 3353, 3362, 3371, 3380, 3389, 3397, 3406,
307 3415, 3423, 3432, 3440, 3448, 3456, 3464, 3472, 3480, 3488,
308 3496, 3504, 3511, 3519, 3526, 3534, 3541, 3549, 3556, 3563,
309 3570, 3577, 3584, 3591, 3598, 3605, 3612, 3619, 3625, 3632,
310 3639, 3645, 3652, 3658, 3665, 3671, 3677, 3683, 3690, 3696,
311 3702, 3708, 3714, 3720, 3726, 3732, 3738, 3744, 3750, 3755,
312 3761, 3767, 3772, 3778, 3784, 3789, 3795, 3800, 3806, 3811,
313 3816, 3822, 3827, 3832, 3838, 3843, 3848, 3853, 3858, 3863,
314 3868, 3874, 3879, 3884, 3888, 3893, 3898, 3903, 3908, 3913,
315 3918, 3922, 3927, 3932, 3936, 3941, 3946, 3950, 3955, 3960,
316 3964, 3969, 3973, 3978, 3982, 3986, 3991, 3995, 4000, 4004,
319 static unsigned int denom[] = {1,1,100,1000,10000,100000,1000000,10000000,100000000};
321 static unsigned int i20Log10(unsigned short val)
323 unsigned int rntval = 100;
324 unsigned int tmp = val;
325 unsigned int exp = 1;
327 while(tmp > 100) {tmp /= 100; exp++;}
329 val = (2 * val)/denom[exp];
330 if (exp > 1) rntval = 2000*exp;
332 rntval += i100x20log10[val];
336 static int or51211_read_signal_strength(struct dvb_frontend* fe, u16* strength)
338 struct or51211_state* state = fe->demodulator_priv;
343 /* SNR after Equalizer */
349 if (i2c_writebytes(state,state->config->demod_address,snd_buf,3)) {
350 printk(KERN_WARNING "or51211: read_status write error\n");
354 if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
355 printk(KERN_WARNING "or51211: read_status read error\n");
358 snr_equ = rec_buf[0] & 0xff;
360 /* The value reported back from the frontend will be FFFF=100% 0000=0% */
361 *strength = (((5334 - i20Log10(snr_equ))/3+5)*65535)/1000;
363 dprintk("read_signal_strength %i\n",*strength);
368 static int or51211_read_snr(struct dvb_frontend* fe, u16* snr)
370 struct or51211_state* state = fe->demodulator_priv;
374 /* SNR after Equalizer */
380 if (i2c_writebytes(state,state->config->demod_address,snd_buf,3)) {
381 printk(KERN_WARNING "or51211: read_status write error\n");
385 if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
386 printk(KERN_WARNING "or51211: read_status read error\n");
389 *snr = rec_buf[0] & 0xff;
391 dprintk("read_snr %i\n",*snr);
396 static int or51211_read_ber(struct dvb_frontend* fe, u32* ber)
402 static int or51211_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
408 static int or51211_sleep(struct dvb_frontend* fe)
413 static int or51211_init(struct dvb_frontend* fe)
415 struct or51211_state* state = fe->demodulator_priv;
416 const struct or51211_config* config = state->config;
417 const struct firmware* fw;
418 unsigned char get_ver_buf[] = {0x04,0x00,0x30,0x00,0x00};
419 unsigned char rec_buf[14];
422 if (!state->initialized) {
423 /* Request the firmware, this will block until it uploads */
424 printk(KERN_INFO "or51211: Waiting for firmware upload "
425 "(%s)...\n", OR51211_DEFAULT_FIRMWARE);
426 ret = config->request_firmware(fe, &fw,
427 OR51211_DEFAULT_FIRMWARE);
428 printk(KERN_INFO "or51211:Got Hotplug firmware\n");
430 printk(KERN_WARNING "or51211: No firmware uploaded "
431 "(timeout or file not found?)\n");
435 ret = or51211_load_firmware(fe, fw);
437 printk(KERN_WARNING "or51211: Writing firmware to "
439 release_firmware(fw);
442 printk(KERN_INFO "or51211: Firmware upload complete.\n");
444 /* Set operation mode in Receiver 1 register;
446 * data 0x50h Automatic sets receiver channel conditions
447 * Automatic NTSC rejection filter
448 * Enable MPEG serial data output
450 * High tuner phase noise
451 * normal +/-150kHz Carrier acquisition range
453 if (i2c_writebytes(state,state->config->demod_address,
455 printk(KERN_WARNING "or51211: Load DVR Error 5\n");
459 /* Read back ucode version to besure we loaded correctly */
460 /* and are really up and running */
466 if (i2c_writebytes(state,state->config->demod_address,
468 printk(KERN_WARNING "or51211: Load DVR Error A\n");
472 if (i2c_readbytes(state,state->config->demod_address,
474 printk(KERN_WARNING "or51211: Load DVR Error B\n");
483 if (i2c_writebytes(state,state->config->demod_address,
485 printk(KERN_WARNING "or51211: Load DVR Error C\n");
489 if (i2c_readbytes(state,state->config->demod_address,
491 printk(KERN_WARNING "or51211: Load DVR Error D\n");
495 for (i = 0; i < 8; i++)
498 for (i = 0; i < 5; i++) {
500 get_ver_buf[4] = i+1;
501 if (i2c_writebytes(state,state->config->demod_address,
503 printk(KERN_WARNING "or51211:Load DVR Error 6"
509 if (i2c_readbytes(state,state->config->demod_address,
511 printk(KERN_WARNING "or51211:Load DVR Error 7"
515 /* If we didn't receive the right index, try again */
516 if ((int)rec_buf[i*2+1]!=i+1){
520 dprintk("read_fwbits %x %x %x %x %x %x %x %x %x %x\n",
521 rec_buf[0], rec_buf[1], rec_buf[2], rec_buf[3],
522 rec_buf[4], rec_buf[5], rec_buf[6], rec_buf[7],
523 rec_buf[8], rec_buf[9]);
525 printk(KERN_INFO "or51211: ver TU%02x%02x%02x VSB mode %02x"
527 rec_buf[2], rec_buf[4],rec_buf[6],
528 rec_buf[12],rec_buf[10]);
535 if (i2c_writebytes(state,state->config->demod_address,
537 printk(KERN_WARNING "or51211: Load DVR Error 8\n");
541 if (i2c_readbytes(state,state->config->demod_address,
543 printk(KERN_WARNING "or51211: Load DVR Error 9\n");
546 state->initialized = 1;
552 static int or51211_get_tune_settings(struct dvb_frontend* fe,
553 struct dvb_frontend_tune_settings* fesettings)
555 fesettings->min_delay_ms = 500;
556 fesettings->step_size = 0;
557 fesettings->max_drift = 0;
561 static void or51211_release(struct dvb_frontend* fe)
563 struct or51211_state* state = fe->demodulator_priv;
564 state->config->sleep(fe);
568 static struct dvb_frontend_ops or51211_ops;
570 struct dvb_frontend* or51211_attach(const struct or51211_config* config,
571 struct i2c_adapter* i2c)
573 struct or51211_state* state = NULL;
575 /* Allocate memory for the internal state */
576 state = kmalloc(sizeof(struct or51211_state), GFP_KERNEL);
580 /* Setup the state */
581 state->config = config;
583 memcpy(&state->ops, &or51211_ops, sizeof(struct dvb_frontend_ops));
584 state->initialized = 0;
585 state->current_frequency = 0;
587 /* Create dvb_frontend */
588 state->frontend.ops = &state->ops;
589 state->frontend.demodulator_priv = state;
590 return &state->frontend;
597 static struct dvb_frontend_ops or51211_ops = {
600 .name = "Oren OR51211 VSB Frontend",
602 .frequency_min = 44000000,
603 .frequency_max = 958000000,
604 .frequency_stepsize = 166666,
605 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
606 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
610 .release = or51211_release,
612 .init = or51211_init,
613 .sleep = or51211_sleep,
615 .set_frontend = or51211_set_parameters,
616 .get_tune_settings = or51211_get_tune_settings,
618 .read_status = or51211_read_status,
619 .read_ber = or51211_read_ber,
620 .read_signal_strength = or51211_read_signal_strength,
621 .read_snr = or51211_read_snr,
622 .read_ucblocks = or51211_read_ucblocks,
625 module_param(debug, int, 0644);
626 MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
628 MODULE_DESCRIPTION("Oren OR51211 VSB [pcHDTV HD-2000] Demodulator Driver");
629 MODULE_AUTHOR("Kirk Lapray");
630 MODULE_LICENSE("GPL");
632 EXPORT_SYMBOL(or51211_attach);