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;
 
  57         struct dvb_frontend_ops ops;
 
  59         /* Configuration settings */
 
  60         const struct or51211_config* config;
 
  62         struct dvb_frontend frontend;
 
  65         /* Demodulator private data */
 
  68         /* Tuner private data */
 
  69         u32 current_frequency;
 
  72 static int i2c_writebytes (struct or51211_state* state, u8 reg, u8 *buf,
 
  82         if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) {
 
  83                 printk(KERN_WARNING "or51211: i2c_writebytes error "
 
  84                        "(addr %02x, err == %i)\n", reg, err);
 
  91 static u8 i2c_readbytes (struct or51211_state* state, u8 reg, u8* buf, int len)
 
 100         if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) {
 
 101                 printk(KERN_WARNING "or51211: i2c_readbytes error "
 
 102                        "(addr %02x, err == %i)\n", reg, err);
 
 109 static int or51211_load_firmware (struct dvb_frontend* fe,
 
 110                                   const struct firmware *fw)
 
 112         struct or51211_state* state = fe->demodulator_priv;
 
 116         dprintk("Firmware is %zd bytes\n",fw->size);
 
 120         if (i2c_writebytes(state,0x50,tudata,1)) {
 
 121                 printk(KERN_WARNING "or51211:load_firmware error eprom addr\n");
 
 124         if (i2c_readbytes(state,0x50,&tudata[145],192)) {
 
 125                 printk(KERN_WARNING "or51211: load_firmware error eprom\n");
 
 129         /* Create firmware buffer */
 
 130         for (i = 0; i < 145; i++)
 
 131                 tudata[i] = fw->data[i];
 
 133         for (i = 0; i < 248; i++)
 
 134                 tudata[i+337] = fw->data[145+i];
 
 136         state->config->reset(fe);
 
 138         if (i2c_writebytes(state,state->config->demod_address,tudata,585)) {
 
 139                 printk(KERN_WARNING "or51211: load_firmware error 1\n");
 
 144         if (i2c_writebytes(state,state->config->demod_address,
 
 145                            &fw->data[393],8125)) {
 
 146                 printk(KERN_WARNING "or51211: load_firmware error 2\n");
 
 151         if (i2c_writebytes(state,state->config->demod_address,run_buf,2)) {
 
 152                 printk(KERN_WARNING "or51211: load_firmware error 3\n");
 
 156         /* Wait at least 5 msec */
 
 158         if (i2c_writebytes(state,state->config->demod_address,run_buf,2)) {
 
 159                 printk(KERN_WARNING "or51211: load_firmware error 4\n");
 
 164         printk("or51211: Done.\n");
 
 168 static int or51211_setmode(struct dvb_frontend* fe, int mode)
 
 170         struct or51211_state* state = fe->demodulator_priv;
 
 173         state->config->setmode(fe, mode);
 
 175         if (i2c_writebytes(state,state->config->demod_address,run_buf,2)) {
 
 176                 printk(KERN_WARNING "or51211: setmode error 1\n");
 
 180         /* Wait at least 5 msec */
 
 182         if (i2c_writebytes(state,state->config->demod_address,run_buf,2)) {
 
 183                 printk(KERN_WARNING "or51211: setmode error 2\n");
 
 189         /* Set operation mode in Receiver 1 register;
 
 191          * data 0x50h  Automatic sets receiver channel conditions
 
 192          *             Automatic NTSC rejection filter
 
 193          *             Enable  MPEG serial data output
 
 195          *             High tuner phase noise
 
 196          *             normal +/-150kHz Carrier acquisition range
 
 198         if (i2c_writebytes(state,state->config->demod_address,cmd_buf,3)) {
 
 199                 printk(KERN_WARNING "or51211: setmode error 3\n");
 
 208         if (i2c_writebytes(state,state->config->demod_address,rec_buf,3)) {
 
 209                 printk(KERN_WARNING "or51211: setmode error 5\n");
 
 212         if (i2c_readbytes(state,state->config->demod_address,&rec_buf[10],2)) {
 
 213                 printk(KERN_WARNING "or51211: setmode error 6");
 
 216         dprintk("setmode rec status %02x %02x\n",rec_buf[10],rec_buf[11]);
 
 221 static int or51211_set_parameters(struct dvb_frontend* fe,
 
 222                                   struct dvb_frontend_parameters *param)
 
 224         struct or51211_state* state = fe->demodulator_priv;
 
 229         /* Change only if we are actually changing the channel */
 
 230         if (state->current_frequency != param->frequency) {
 
 231                 freq = 44000 + (param->frequency/1000);
 
 232                 tunerfreq = freq * 16/1000;
 
 234                 dprintk("set_parameters frequency = %d (tunerfreq = %d)\n",
 
 235                         param->frequency,tunerfreq);
 
 237                 buf[0] = (tunerfreq >> 8) & 0x7F;
 
 238                 buf[1] = (tunerfreq & 0xFF);
 
 241                 if (param->frequency < 157250000) {
 
 243                         dprintk("set_parameters VHF low range\n");
 
 244                 } else if (param->frequency < 454000000) {
 
 246                         dprintk("set_parameters VHF high range\n");
 
 249                         dprintk("set_parameters UHF range\n");
 
 251                 dprintk("set_parameters tuner bytes: 0x%02x 0x%02x "
 
 252                         "0x%02x 0x%02x\n",buf[0],buf[1],buf[2],buf[3]);
 
 254                 if (i2c_writebytes(state,0xC2>>1,buf,4))
 
 255                         printk(KERN_WARNING "or51211:set_parameters error "
 
 256                                "writing to tuner\n");
 
 258                 /* Set to ATSC mode */
 
 259                 or51211_setmode(fe,0);
 
 261                 /* Update current frequency */
 
 262                 state->current_frequency = param->frequency;
 
 267 static int or51211_read_status(struct dvb_frontend* fe, fe_status_t* status)
 
 269         struct or51211_state* state = fe->demodulator_priv;
 
 270         unsigned char rec_buf[2];
 
 271         unsigned char snd_buf[] = {0x04,0x00,0x03,0x00};
 
 274         /* Receiver Status */
 
 275         if (i2c_writebytes(state,state->config->demod_address,snd_buf,3)) {
 
 276                 printk(KERN_WARNING "or51132: read_status write error\n");
 
 280         if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
 
 281                 printk(KERN_WARNING "or51132: read_status read error\n");
 
 284         dprintk("read_status %x %x\n",rec_buf[0],rec_buf[1]);
 
 286         if (rec_buf[0] &  0x01) { /* Receiver Lock */
 
 287                 *status |= FE_HAS_SIGNAL;
 
 288                 *status |= FE_HAS_CARRIER;
 
 289                 *status |= FE_HAS_VITERBI;
 
 290                 *status |= FE_HAS_SYNC;
 
 291                 *status |= FE_HAS_LOCK;
 
 296 /* log10-1 table at .5 increments from 1 to 100.5 */
 
 297 static unsigned int i100x20log10[] = {
 
 298                 0,  352,  602,  795,  954, 1088, 1204, 1306, 1397, 1480,
 
 299          1556, 1625, 1690, 1750, 1806, 1858, 1908, 1955, 2000, 2042,
 
 300          2082, 2121, 2158, 2193, 2227, 2260, 2292, 2322, 2352, 2380,
 
 301          2408, 2434, 2460, 2486, 2510, 2534, 2557, 2580, 2602, 2623,
 
 302          2644, 2664, 2684, 2704, 2723, 2742, 2760, 2778, 2795, 2813,
 
 303          2829, 2846, 2862, 2878, 2894, 2909, 2924, 2939, 2954, 2968,
 
 304          2982, 2996, 3010, 3023, 3037, 3050, 3062, 3075, 3088, 3100,
 
 305          3112, 3124, 3136, 3148, 3159, 3170, 3182, 3193, 3204, 3214,
 
 306          3225, 3236, 3246, 3256, 3266, 3276, 3286, 3296, 3306, 3316,
 
 307          3325, 3334, 3344, 3353, 3362, 3371, 3380, 3389, 3397, 3406,
 
 308          3415, 3423, 3432, 3440, 3448, 3456, 3464, 3472, 3480, 3488,
 
 309          3496, 3504, 3511, 3519, 3526, 3534, 3541, 3549, 3556, 3563,
 
 310          3570, 3577, 3584, 3591, 3598, 3605, 3612, 3619, 3625, 3632,
 
 311          3639, 3645, 3652, 3658, 3665, 3671, 3677, 3683, 3690, 3696,
 
 312          3702, 3708, 3714, 3720, 3726, 3732, 3738, 3744, 3750, 3755,
 
 313          3761, 3767, 3772, 3778, 3784, 3789, 3795, 3800, 3806, 3811,
 
 314          3816, 3822, 3827, 3832, 3838, 3843, 3848, 3853, 3858, 3863,
 
 315          3868, 3874, 3879, 3884, 3888, 3893, 3898, 3903, 3908, 3913,
 
 316          3918, 3922, 3927, 3932, 3936, 3941, 3946, 3950, 3955, 3960,
 
 317          3964, 3969, 3973, 3978, 3982, 3986, 3991, 3995, 4000, 4004,
 
 320 static unsigned int denom[] = {1,1,100,1000,10000,100000,1000000,10000000,100000000};
 
 322 static unsigned int i20Log10(unsigned short val)
 
 324         unsigned int rntval = 100;
 
 325         unsigned int tmp = val;
 
 326         unsigned int exp = 1;
 
 328         while(tmp > 100) {tmp /= 100; exp++;}
 
 330         val = (2 * val)/denom[exp];
 
 331         if (exp > 1) rntval = 2000*exp;
 
 333         rntval += i100x20log10[val];
 
 337 static int or51211_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 
 339         struct or51211_state* state = fe->demodulator_priv;
 
 345         /* SNR after Equalizer */
 
 351         if (i2c_writebytes(state,state->config->demod_address,snd_buf,3)) {
 
 352                 printk(KERN_WARNING "or51211: read_status write error\n");
 
 356         if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
 
 357                 printk(KERN_WARNING "or51211: read_status read error\n");
 
 360         snr_equ = rec_buf[0] & 0xff;
 
 362         /* The value reported back from the frontend will be FFFF=100% 0000=0% */
 
 363         signal_strength = (((5334 - i20Log10(snr_equ))/3+5)*65535)/1000;
 
 364         if (signal_strength > 0xffff)
 
 367                 *strength = signal_strength;
 
 368         dprintk("read_signal_strength %i\n",*strength);
 
 373 static int or51211_read_snr(struct dvb_frontend* fe, u16* snr)
 
 375         struct or51211_state* state = fe->demodulator_priv;
 
 379         /* SNR after Equalizer */
 
 385         if (i2c_writebytes(state,state->config->demod_address,snd_buf,3)) {
 
 386                 printk(KERN_WARNING "or51211: read_status write error\n");
 
 390         if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
 
 391                 printk(KERN_WARNING "or51211: read_status read error\n");
 
 394         *snr = rec_buf[0] & 0xff;
 
 396         dprintk("read_snr %i\n",*snr);
 
 401 static int or51211_read_ber(struct dvb_frontend* fe, u32* ber)
 
 407 static int or51211_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 
 413 static int or51211_sleep(struct dvb_frontend* fe)
 
 418 static int or51211_init(struct dvb_frontend* fe)
 
 420         struct or51211_state* state = fe->demodulator_priv;
 
 421         const struct or51211_config* config = state->config;
 
 422         const struct firmware* fw;
 
 423         unsigned char get_ver_buf[] = {0x04,0x00,0x30,0x00,0x00};
 
 424         unsigned char rec_buf[14];
 
 427         if (!state->initialized) {
 
 428                 /* Request the firmware, this will block until it uploads */
 
 429                 printk(KERN_INFO "or51211: Waiting for firmware upload "
 
 430                        "(%s)...\n", OR51211_DEFAULT_FIRMWARE);
 
 431                 ret = config->request_firmware(fe, &fw,
 
 432                                                OR51211_DEFAULT_FIRMWARE);
 
 433                 printk(KERN_INFO "or51211:Got Hotplug firmware\n");
 
 435                         printk(KERN_WARNING "or51211: No firmware uploaded "
 
 436                                "(timeout or file not found?)\n");
 
 440                 ret = or51211_load_firmware(fe, fw);
 
 442                         printk(KERN_WARNING "or51211: Writing firmware to "
 
 444                         release_firmware(fw);
 
 447                 printk(KERN_INFO "or51211: Firmware upload complete.\n");
 
 449                 /* Set operation mode in Receiver 1 register;
 
 451                  * data 0x50h  Automatic sets receiver channel conditions
 
 452                  *             Automatic NTSC rejection filter
 
 453                  *             Enable  MPEG serial data output
 
 455                  *             High tuner phase noise
 
 456                  *             normal +/-150kHz Carrier acquisition range
 
 458                 if (i2c_writebytes(state,state->config->demod_address,
 
 460                         printk(KERN_WARNING "or51211: Load DVR Error 5\n");
 
 464                 /* Read back ucode version to besure we loaded correctly */
 
 465                 /* and are really up and running */
 
 471                 if (i2c_writebytes(state,state->config->demod_address,
 
 473                         printk(KERN_WARNING "or51211: Load DVR Error A\n");
 
 477                 if (i2c_readbytes(state,state->config->demod_address,
 
 479                         printk(KERN_WARNING "or51211: Load DVR Error B\n");
 
 488                 if (i2c_writebytes(state,state->config->demod_address,
 
 490                         printk(KERN_WARNING "or51211: Load DVR Error C\n");
 
 494                 if (i2c_readbytes(state,state->config->demod_address,
 
 496                         printk(KERN_WARNING "or51211: Load DVR Error D\n");
 
 500                 for (i = 0; i < 8; i++)
 
 503                 for (i = 0; i < 5; i++) {
 
 505                         get_ver_buf[4] = i+1;
 
 506                         if (i2c_writebytes(state,state->config->demod_address,
 
 508                                 printk(KERN_WARNING "or51211:Load DVR Error 6"
 
 514                         if (i2c_readbytes(state,state->config->demod_address,
 
 516                                 printk(KERN_WARNING "or51211:Load DVR Error 7"
 
 520                         /* If we didn't receive the right index, try again */
 
 521                         if ((int)rec_buf[i*2+1]!=i+1){
 
 525                 dprintk("read_fwbits %x %x %x %x %x %x %x %x %x %x\n",
 
 526                         rec_buf[0], rec_buf[1], rec_buf[2], rec_buf[3],
 
 527                         rec_buf[4], rec_buf[5], rec_buf[6], rec_buf[7],
 
 528                         rec_buf[8], rec_buf[9]);
 
 530                 printk(KERN_INFO "or51211: ver TU%02x%02x%02x VSB mode %02x"
 
 532                        rec_buf[2], rec_buf[4],rec_buf[6],
 
 533                        rec_buf[12],rec_buf[10]);
 
 540                 if (i2c_writebytes(state,state->config->demod_address,
 
 542                         printk(KERN_WARNING "or51211: Load DVR Error 8\n");
 
 546                 if (i2c_readbytes(state,state->config->demod_address,
 
 548                         printk(KERN_WARNING "or51211: Load DVR Error 9\n");
 
 551                 state->initialized = 1;
 
 557 static int or51211_get_tune_settings(struct dvb_frontend* fe,
 
 558                                      struct dvb_frontend_tune_settings* fesettings)
 
 560         fesettings->min_delay_ms = 500;
 
 561         fesettings->step_size = 0;
 
 562         fesettings->max_drift = 0;
 
 566 static void or51211_release(struct dvb_frontend* fe)
 
 568         struct or51211_state* state = fe->demodulator_priv;
 
 569         state->config->sleep(fe);
 
 573 static struct dvb_frontend_ops or51211_ops;
 
 575 struct dvb_frontend* or51211_attach(const struct or51211_config* config,
 
 576                                     struct i2c_adapter* i2c)
 
 578         struct or51211_state* state = NULL;
 
 580         /* Allocate memory for the internal state */
 
 581         state = kmalloc(sizeof(struct or51211_state), GFP_KERNEL);
 
 585         /* Setup the state */
 
 586         state->config = config;
 
 588         memcpy(&state->ops, &or51211_ops, sizeof(struct dvb_frontend_ops));
 
 589         state->initialized = 0;
 
 590         state->current_frequency = 0;
 
 592         /* Create dvb_frontend */
 
 593         state->frontend.ops = &state->ops;
 
 594         state->frontend.demodulator_priv = state;
 
 595         return &state->frontend;
 
 602 static struct dvb_frontend_ops or51211_ops = {
 
 605                 .name               = "Oren OR51211 VSB Frontend",
 
 607                 .frequency_min      = 44000000,
 
 608                 .frequency_max      = 958000000,
 
 609                 .frequency_stepsize = 166666,
 
 610                 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
 
 611                         FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
 
 615         .release = or51211_release,
 
 617         .init = or51211_init,
 
 618         .sleep = or51211_sleep,
 
 620         .set_frontend = or51211_set_parameters,
 
 621         .get_tune_settings = or51211_get_tune_settings,
 
 623         .read_status = or51211_read_status,
 
 624         .read_ber = or51211_read_ber,
 
 625         .read_signal_strength = or51211_read_signal_strength,
 
 626         .read_snr = or51211_read_snr,
 
 627         .read_ucblocks = or51211_read_ucblocks,
 
 630 module_param(debug, int, 0644);
 
 631 MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
 
 633 MODULE_DESCRIPTION("Oren OR51211 VSB [pcHDTV HD-2000] Demodulator Driver");
 
 634 MODULE_AUTHOR("Kirk Lapray");
 
 635 MODULE_LICENSE("GPL");
 
 637 EXPORT_SYMBOL(or51211_attach);