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
29 * or /lib/firmware (depending on configuration of firmware hotplug).
31 #define OR51211_DEFAULT_FIRMWARE "dvb-fe-or51211.fw"
33 #include <linux/kernel.h>
34 #include <linux/module.h>
35 #include <linux/moduleparam.h>
36 #include <linux/device.h>
37 #include <linux/firmware.h>
38 #include <linux/string.h>
39 #include <linux/slab.h>
40 #include <asm/byteorder.h>
42 #include "dvb_frontend.h"
46 #define dprintk(args...) \
48 if (debug) printk(KERN_DEBUG "or51211: " args); \
51 static u8 run_buf[] = {0x7f,0x01};
52 static u8 cmd_buf[] = {0x04,0x01,0x50,0x80,0x06}; // ATSC
54 struct or51211_state {
56 struct i2c_adapter* i2c;
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 %zd 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;
344 /* SNR after Equalizer */
350 if (i2c_writebytes(state,state->config->demod_address,snd_buf,3)) {
351 printk(KERN_WARNING "or51211: read_status write error\n");
355 if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
356 printk(KERN_WARNING "or51211: read_status read error\n");
359 snr_equ = rec_buf[0] & 0xff;
361 /* The value reported back from the frontend will be FFFF=100% 0000=0% */
362 signal_strength = (((5334 - i20Log10(snr_equ))/3+5)*65535)/1000;
363 if (signal_strength > 0xffff)
366 *strength = signal_strength;
367 dprintk("read_signal_strength %i\n",*strength);
372 static int or51211_read_snr(struct dvb_frontend* fe, u16* snr)
374 struct or51211_state* state = fe->demodulator_priv;
378 /* SNR after Equalizer */
384 if (i2c_writebytes(state,state->config->demod_address,snd_buf,3)) {
385 printk(KERN_WARNING "or51211: read_status write error\n");
389 if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
390 printk(KERN_WARNING "or51211: read_status read error\n");
393 *snr = rec_buf[0] & 0xff;
395 dprintk("read_snr %i\n",*snr);
400 static int or51211_read_ber(struct dvb_frontend* fe, u32* ber)
406 static int or51211_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
412 static int or51211_sleep(struct dvb_frontend* fe)
417 static int or51211_init(struct dvb_frontend* fe)
419 struct or51211_state* state = fe->demodulator_priv;
420 const struct or51211_config* config = state->config;
421 const struct firmware* fw;
422 unsigned char get_ver_buf[] = {0x04,0x00,0x30,0x00,0x00};
423 unsigned char rec_buf[14];
426 if (!state->initialized) {
427 /* Request the firmware, this will block until it uploads */
428 printk(KERN_INFO "or51211: Waiting for firmware upload "
429 "(%s)...\n", OR51211_DEFAULT_FIRMWARE);
430 ret = config->request_firmware(fe, &fw,
431 OR51211_DEFAULT_FIRMWARE);
432 printk(KERN_INFO "or51211:Got Hotplug firmware\n");
434 printk(KERN_WARNING "or51211: No firmware uploaded "
435 "(timeout or file not found?)\n");
439 ret = or51211_load_firmware(fe, fw);
441 printk(KERN_WARNING "or51211: Writing firmware to "
443 release_firmware(fw);
446 printk(KERN_INFO "or51211: Firmware upload complete.\n");
448 /* Set operation mode in Receiver 1 register;
450 * data 0x50h Automatic sets receiver channel conditions
451 * Automatic NTSC rejection filter
452 * Enable MPEG serial data output
454 * High tuner phase noise
455 * normal +/-150kHz Carrier acquisition range
457 if (i2c_writebytes(state,state->config->demod_address,
459 printk(KERN_WARNING "or51211: Load DVR Error 5\n");
463 /* Read back ucode version to besure we loaded correctly */
464 /* and are really up and running */
470 if (i2c_writebytes(state,state->config->demod_address,
472 printk(KERN_WARNING "or51211: Load DVR Error A\n");
476 if (i2c_readbytes(state,state->config->demod_address,
478 printk(KERN_WARNING "or51211: Load DVR Error B\n");
487 if (i2c_writebytes(state,state->config->demod_address,
489 printk(KERN_WARNING "or51211: Load DVR Error C\n");
493 if (i2c_readbytes(state,state->config->demod_address,
495 printk(KERN_WARNING "or51211: Load DVR Error D\n");
499 for (i = 0; i < 8; i++)
502 for (i = 0; i < 5; i++) {
504 get_ver_buf[4] = i+1;
505 if (i2c_writebytes(state,state->config->demod_address,
507 printk(KERN_WARNING "or51211:Load DVR Error 6"
513 if (i2c_readbytes(state,state->config->demod_address,
515 printk(KERN_WARNING "or51211:Load DVR Error 7"
519 /* If we didn't receive the right index, try again */
520 if ((int)rec_buf[i*2+1]!=i+1){
524 dprintk("read_fwbits %x %x %x %x %x %x %x %x %x %x\n",
525 rec_buf[0], rec_buf[1], rec_buf[2], rec_buf[3],
526 rec_buf[4], rec_buf[5], rec_buf[6], rec_buf[7],
527 rec_buf[8], rec_buf[9]);
529 printk(KERN_INFO "or51211: ver TU%02x%02x%02x VSB mode %02x"
531 rec_buf[2], rec_buf[4],rec_buf[6],
532 rec_buf[12],rec_buf[10]);
539 if (i2c_writebytes(state,state->config->demod_address,
541 printk(KERN_WARNING "or51211: Load DVR Error 8\n");
545 if (i2c_readbytes(state,state->config->demod_address,
547 printk(KERN_WARNING "or51211: Load DVR Error 9\n");
550 state->initialized = 1;
556 static int or51211_get_tune_settings(struct dvb_frontend* fe,
557 struct dvb_frontend_tune_settings* fesettings)
559 fesettings->min_delay_ms = 500;
560 fesettings->step_size = 0;
561 fesettings->max_drift = 0;
565 static void or51211_release(struct dvb_frontend* fe)
567 struct or51211_state* state = fe->demodulator_priv;
568 state->config->sleep(fe);
572 static struct dvb_frontend_ops or51211_ops;
574 struct dvb_frontend* or51211_attach(const struct or51211_config* config,
575 struct i2c_adapter* i2c)
577 struct or51211_state* state = NULL;
579 /* Allocate memory for the internal state */
580 state = kmalloc(sizeof(struct or51211_state), GFP_KERNEL);
584 /* Setup the state */
585 state->config = config;
587 state->initialized = 0;
588 state->current_frequency = 0;
590 /* Create dvb_frontend */
591 memcpy(&state->frontend.ops, &or51211_ops, sizeof(struct dvb_frontend_ops));
592 state->frontend.demodulator_priv = state;
593 return &state->frontend;
600 static struct dvb_frontend_ops or51211_ops = {
603 .name = "Oren OR51211 VSB Frontend",
605 .frequency_min = 44000000,
606 .frequency_max = 958000000,
607 .frequency_stepsize = 166666,
608 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
609 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
613 .release = or51211_release,
615 .init = or51211_init,
616 .sleep = or51211_sleep,
618 .set_frontend = or51211_set_parameters,
619 .get_tune_settings = or51211_get_tune_settings,
621 .read_status = or51211_read_status,
622 .read_ber = or51211_read_ber,
623 .read_signal_strength = or51211_read_signal_strength,
624 .read_snr = or51211_read_snr,
625 .read_ucblocks = or51211_read_ucblocks,
628 module_param(debug, int, 0644);
629 MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
631 MODULE_DESCRIPTION("Oren OR51211 VSB [pcHDTV HD-2000] Demodulator Driver");
632 MODULE_AUTHOR("Kirk Lapray");
633 MODULE_LICENSE("GPL");
635 EXPORT_SYMBOL(or51211_attach);