2     Driver for VES1893 and VES1993 QPSK Demodulators
 
   4     Copyright (C) 1999 Convergence Integrated Media GmbH <ralph@convergence.de>
 
   5     Copyright (C) 2001 Ronny Strutz <3des@elitedvb.de>
 
   6     Copyright (C) 2002 Dennis Noermann <dennis.noermann@noernet.de>
 
   7     Copyright (C) 2002-2003 Andreas Oberritter <obi@linuxtv.org>
 
   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
 
  18     GNU General Public License for more details.
 
  20     You should have received a copy of the GNU General Public License
 
  21     along with this program; if not, write to the Free Software
 
  22     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
  26 #include <linux/kernel.h>
 
  27 #include <linux/module.h>
 
  28 #include <linux/init.h>
 
  29 #include <linux/string.h>
 
  30 #include <linux/slab.h>
 
  31 #include <linux/delay.h>
 
  33 #include "dvb_frontend.h"
 
  37 struct ves1x93_state {
 
  38         struct i2c_adapter* i2c;
 
  39         /* configuration settings */
 
  40         const struct ves1x93_config* config;
 
  41         struct dvb_frontend frontend;
 
  43         /* previous uncorrected block counter */
 
  44         fe_spectral_inversion_t inversion;
 
  52 #define dprintk if (debug) printk
 
  54 #define DEMOD_VES1893           0
 
  55 #define DEMOD_VES1993           1
 
  57 static u8 init_1893_tab [] = {
 
  58         0x01, 0xa4, 0x35, 0x80, 0x2a, 0x0b, 0x55, 0xc4,
 
  59         0x09, 0x69, 0x00, 0x86, 0x4c, 0x28, 0x7f, 0x00,
 
  60         0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  61         0x80, 0x00, 0x21, 0xb0, 0x14, 0x00, 0xdc, 0x00,
 
  62         0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  63         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  64         0x00, 0x55, 0x00, 0x00, 0x7f, 0x00
 
  67 static u8 init_1993_tab [] = {
 
  68         0x00, 0x9c, 0x35, 0x80, 0x6a, 0x09, 0x72, 0x8c,
 
  69         0x09, 0x6b, 0x00, 0x00, 0x4c, 0x08, 0x00, 0x00,
 
  70         0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  71         0x80, 0x40, 0x21, 0xb0, 0x00, 0x00, 0x00, 0x10,
 
  72         0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  73         0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00,
 
  74         0x00, 0x55, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03,
 
  75         0x00, 0x00, 0x0e, 0x80, 0x00
 
  78 static u8 init_1893_wtab[] =
 
  80         1,1,1,1,1,1,1,1, 1,1,0,0,1,1,0,0,
 
  81         0,1,0,0,0,0,0,0, 1,0,1,1,0,0,0,1,
 
  82         1,1,1,0,0,0,0,0, 0,0,1,1,0,0,0,0,
 
  86 static u8 init_1993_wtab[] =
 
  88         1,1,1,1,1,1,1,1, 1,1,0,0,1,1,0,0,
 
  89         0,1,0,0,0,0,0,0, 1,1,1,1,0,0,0,1,
 
  90         1,1,1,0,0,0,0,0, 0,0,1,1,0,0,0,0,
 
  91         1,1,1,0,1,1,1,1, 1,1,1,1,1
 
  94 static int ves1x93_writereg (struct ves1x93_state* state, u8 reg, u8 data)
 
  96         u8 buf [] = { 0x00, reg, data };
 
  97         struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 3 };
 
 100         if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) {
 
 101                 dprintk ("%s: writereg error (err == %i, reg == 0x%02x, data == 0x%02x)\n", __FUNCTION__, err, reg, data);
 
 108 static u8 ves1x93_readreg (struct ves1x93_state* state, u8 reg)
 
 111         u8 b0 [] = { 0x00, reg };
 
 113         struct i2c_msg msg [] = { { .addr = state->config->demod_address, .flags = 0, .buf = b0, .len = 2 },
 
 114                            { .addr = state->config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
 
 116         ret = i2c_transfer (state->i2c, msg, 2);
 
 118         if (ret != 2) return ret;
 
 123 static int ves1x93_clr_bit (struct ves1x93_state* state)
 
 126         ves1x93_writereg (state, 0, state->init_1x93_tab[0] & 0xfe);
 
 127         ves1x93_writereg (state, 0, state->init_1x93_tab[0]);
 
 132 static int ves1x93_set_inversion (struct ves1x93_state* state, fe_spectral_inversion_t inversion)
 
 137          * inversion on/off are interchanged because i and q seem to
 
 138          * be swapped on the hardware
 
 155         return ves1x93_writereg (state, 0x0c, (state->init_1x93_tab[0x0c] & 0x3f) | val);
 
 158 static int ves1x93_set_fec (struct ves1x93_state* state, fe_code_rate_t fec)
 
 161                 return ves1x93_writereg (state, 0x0d, 0x08);
 
 162         else if (fec < FEC_1_2 || fec > FEC_8_9)
 
 165                 return ves1x93_writereg (state, 0x0d, fec - FEC_1_2);
 
 168 static fe_code_rate_t ves1x93_get_fec (struct ves1x93_state* state)
 
 170         return FEC_1_2 + ((ves1x93_readreg (state, 0x0d) >> 4) & 0x7);
 
 173 static int ves1x93_set_symbolrate (struct ves1x93_state* state, u32 srate)
 
 177         u8  ADCONF, FCONF, FNR, AGCR;
 
 182         dprintk("%s: srate == %d\n", __FUNCTION__, (unsigned int) srate);
 
 184         if (srate > state->config->xin/2)
 
 185                 srate = state->config->xin/2;
 
 190 #define MUL (1UL<<26)
 
 192         FIN = (state->config->xin + 6000) >> 4;
 
 197         tmp = (tmp % FIN) << 8;
 
 198         ratio = (ratio << 8) + tmp / FIN;
 
 200         tmp = (tmp % FIN) << 8;
 
 201         ratio = (ratio << 8) + tmp / FIN;
 
 205         if (ratio < MUL/3)           FNR = 0;
 
 206         if (ratio < (MUL*11)/50)     FNR = 1;
 
 207         if (ratio < MUL/6)           FNR = 2;
 
 208         if (ratio < MUL/9)           FNR = 3;
 
 209         if (ratio < MUL/12)          FNR = 4;
 
 210         if (ratio < (MUL*11)/200)    FNR = 5;
 
 211         if (ratio < MUL/24)          FNR = 6;
 
 212         if (ratio < (MUL*27)/1000)   FNR = 7;
 
 213         if (ratio < MUL/48)          FNR = 8;
 
 214         if (ratio < (MUL*137)/10000) FNR = 9;
 
 222                 FCONF  = 0x88 | (FNR >> 1) | ((FNR & 0x01) << 5);
 
 223                 /*FCONF  = 0x80 | ((FNR & 0x01) << 5) | (((FNR > 1) & 0x03) << 3) | ((FNR >> 1) & 0x07);*/
 
 226         BDR = (( (ratio << (FNR >> 1)) >> 4) + 1) >> 1;
 
 227         BDRI = ( ((FIN << 8) / ((srate << (FNR >> 1)) >> 2)) + 1) >> 1;
 
 229         dprintk("FNR= %d\n", FNR);
 
 230         dprintk("ratio= %08x\n", (unsigned int) ratio);
 
 231         dprintk("BDR= %08x\n", (unsigned int) BDR);
 
 232         dprintk("BDRI= %02x\n", (unsigned int) BDRI);
 
 237         ves1x93_writereg (state, 0x06, 0xff & BDR);
 
 238         ves1x93_writereg (state, 0x07, 0xff & (BDR >> 8));
 
 239         ves1x93_writereg (state, 0x08, 0x0f & (BDR >> 16));
 
 241         ves1x93_writereg (state, 0x09, BDRI);
 
 242         ves1x93_writereg (state, 0x20, ADCONF);
 
 243         ves1x93_writereg (state, 0x21, FCONF);
 
 245         AGCR = state->init_1x93_tab[0x05];
 
 246         if (state->config->invert_pwm)
 
 254         ves1x93_writereg (state, 0x05, AGCR);
 
 256         /* ves1993 hates this, will lose lock */
 
 257         if (state->demod_type != DEMOD_VES1993)
 
 258                 ves1x93_clr_bit (state);
 
 263 static int ves1x93_init (struct dvb_frontend* fe)
 
 265         struct ves1x93_state* state = fe->demodulator_priv;
 
 269         dprintk("%s: init chip\n", __FUNCTION__);
 
 271         for (i = 0; i < state->tab_size; i++) {
 
 272                 if (state->init_1x93_wtab[i]) {
 
 273                         val = state->init_1x93_tab[i];
 
 275                         if (state->config->invert_pwm && (i == 0x05)) val |= 0x20; /* invert PWM */
 
 276                         ves1x93_writereg (state, i, val);
 
 283 static int ves1x93_set_voltage (struct dvb_frontend* fe, fe_sec_voltage_t voltage)
 
 285         struct ves1x93_state* state = fe->demodulator_priv;
 
 289                 return ves1x93_writereg (state, 0x1f, 0x20);
 
 291                 return ves1x93_writereg (state, 0x1f, 0x30);
 
 292         case SEC_VOLTAGE_OFF:
 
 293                 return ves1x93_writereg (state, 0x1f, 0x00);
 
 299 static int ves1x93_read_status(struct dvb_frontend* fe, fe_status_t* status)
 
 301         struct ves1x93_state* state = fe->demodulator_priv;
 
 303         u8 sync = ves1x93_readreg (state, 0x0e);
 
 306          * The ves1893 sometimes returns sync values that make no sense,
 
 307          * because, e.g., the SIGNAL bit is 0, while some of the higher
 
 308          * bits are 1 (and how can there be a CARRIER w/o a SIGNAL?).
 
 309          * Tests showed that the VITERBI and SYNC bits are returned
 
 310          * reliably, while the SIGNAL and CARRIER bits ar sometimes wrong.
 
 311          * If such a case occurs, we read the value again, until we get a
 
 314         int maxtry = 10; /* just for safety - let's not get stuck here */
 
 315         while ((sync & 0x03) != 0x03 && (sync & 0x0c) && maxtry--) {
 
 317                 sync = ves1x93_readreg (state, 0x0e);
 
 323                 *status |= FE_HAS_SIGNAL;
 
 326                 *status |= FE_HAS_CARRIER;
 
 329                 *status |= FE_HAS_VITERBI;
 
 332                 *status |= FE_HAS_SYNC;
 
 334         if ((sync & 0x1f) == 0x1f)
 
 335                 *status |= FE_HAS_LOCK;
 
 340 static int ves1x93_read_ber(struct dvb_frontend* fe, u32* ber)
 
 342         struct ves1x93_state* state = fe->demodulator_priv;
 
 344         *ber = ves1x93_readreg (state, 0x15);
 
 345         *ber |= (ves1x93_readreg (state, 0x16) << 8);
 
 346         *ber |= ((ves1x93_readreg (state, 0x17) & 0x0F) << 16);
 
 352 static int ves1x93_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 
 354         struct ves1x93_state* state = fe->demodulator_priv;
 
 356         u8 signal = ~ves1x93_readreg (state, 0x0b);
 
 357         *strength = (signal << 8) | signal;
 
 362 static int ves1x93_read_snr(struct dvb_frontend* fe, u16* snr)
 
 364         struct ves1x93_state* state = fe->demodulator_priv;
 
 366         u8 _snr = ~ves1x93_readreg (state, 0x1c);
 
 367         *snr = (_snr << 8) | _snr;
 
 372 static int ves1x93_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 
 374         struct ves1x93_state* state = fe->demodulator_priv;
 
 376         *ucblocks = ves1x93_readreg (state, 0x18) & 0x7f;
 
 378         if (*ucblocks == 0x7f)
 
 379                 *ucblocks = 0xffffffff;   /* counter overflow... */
 
 381         ves1x93_writereg (state, 0x18, 0x00);  /* reset the counter */
 
 382         ves1x93_writereg (state, 0x18, 0x80);  /* dto. */
 
 387 static int ves1x93_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 
 389         struct ves1x93_state* state = fe->demodulator_priv;
 
 391         if (fe->ops.tuner_ops.set_params) {
 
 392                 fe->ops.tuner_ops.set_params(fe, p);
 
 393                 if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0);
 
 395         ves1x93_set_inversion (state, p->inversion);
 
 396         ves1x93_set_fec (state, p->u.qpsk.fec_inner);
 
 397         ves1x93_set_symbolrate (state, p->u.qpsk.symbol_rate);
 
 398         state->inversion = p->inversion;
 
 403 static int ves1x93_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 
 405         struct ves1x93_state* state = fe->demodulator_priv;
 
 408         afc = ((int)((char)(ves1x93_readreg (state, 0x0a) << 1)))/2;
 
 409         afc = (afc * (int)(p->u.qpsk.symbol_rate/1000/8))/16;
 
 414          * inversion indicator is only valid
 
 415          * if auto inversion was used
 
 417         if (state->inversion == INVERSION_AUTO)
 
 418                 p->inversion = (ves1x93_readreg (state, 0x0f) & 2) ?
 
 419                                 INVERSION_OFF : INVERSION_ON;
 
 420         p->u.qpsk.fec_inner = ves1x93_get_fec (state);
 
 421         /*  XXX FIXME: timing offset !! */
 
 426 static int ves1x93_sleep(struct dvb_frontend* fe)
 
 428         struct ves1x93_state* state = fe->demodulator_priv;
 
 430         return ves1x93_writereg (state, 0x00, 0x08);
 
 433 static void ves1x93_release(struct dvb_frontend* fe)
 
 435         struct ves1x93_state* state = fe->demodulator_priv;
 
 439 static int ves1x93_i2c_gate_ctrl(struct dvb_frontend* fe, int enable)
 
 441         struct ves1x93_state* state = fe->demodulator_priv;
 
 444                 return ves1x93_writereg(state, 0x00, 0x11);
 
 446                 return ves1x93_writereg(state, 0x00, 0x01);
 
 450 static struct dvb_frontend_ops ves1x93_ops;
 
 452 struct dvb_frontend* ves1x93_attach(const struct ves1x93_config* config,
 
 453                                     struct i2c_adapter* i2c)
 
 455         struct ves1x93_state* state = NULL;
 
 458         /* allocate memory for the internal state */
 
 459         state = kmalloc(sizeof(struct ves1x93_state), GFP_KERNEL);
 
 460         if (state == NULL) goto error;
 
 462         /* setup the state */
 
 463         state->config = config;
 
 465         state->inversion = INVERSION_OFF;
 
 467         /* check if the demod is there + identify it */
 
 468         identity = ves1x93_readreg(state, 0x1e);
 
 470         case 0xdc: /* VES1893A rev1 */
 
 471                 printk("ves1x93: Detected ves1893a rev1\n");
 
 472                 state->demod_type = DEMOD_VES1893;
 
 473                 state->init_1x93_tab = init_1893_tab;
 
 474                 state->init_1x93_wtab = init_1893_wtab;
 
 475                 state->tab_size = sizeof(init_1893_tab);
 
 478         case 0xdd: /* VES1893A rev2 */
 
 479                 printk("ves1x93: Detected ves1893a rev2\n");
 
 480                 state->demod_type = DEMOD_VES1893;
 
 481                 state->init_1x93_tab = init_1893_tab;
 
 482                 state->init_1x93_wtab = init_1893_wtab;
 
 483                 state->tab_size = sizeof(init_1893_tab);
 
 486         case 0xde: /* VES1993 */
 
 487                 printk("ves1x93: Detected ves1993\n");
 
 488                 state->demod_type = DEMOD_VES1993;
 
 489                 state->init_1x93_tab = init_1993_tab;
 
 490                 state->init_1x93_wtab = init_1993_wtab;
 
 491                 state->tab_size = sizeof(init_1993_tab);
 
 498         /* create dvb_frontend */
 
 499         memcpy(&state->frontend.ops, &ves1x93_ops, sizeof(struct dvb_frontend_ops));
 
 500         state->frontend.demodulator_priv = state;
 
 501         return &state->frontend;
 
 508 static struct dvb_frontend_ops ves1x93_ops = {
 
 511                 .name                   = "VLSI VES1x93 DVB-S",
 
 513                 .frequency_min          = 950000,
 
 514                 .frequency_max          = 2150000,
 
 515                 .frequency_stepsize     = 125,           /* kHz for QPSK frontends */
 
 516                 .frequency_tolerance    = 29500,
 
 517                 .symbol_rate_min        = 1000000,
 
 518                 .symbol_rate_max        = 45000000,
 
 519         /*      .symbol_rate_tolerance  =       ???,*/
 
 520                 .caps = FE_CAN_INVERSION_AUTO |
 
 521                         FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
 
 522                         FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
 
 526         .release = ves1x93_release,
 
 528         .init = ves1x93_init,
 
 529         .sleep = ves1x93_sleep,
 
 530         .i2c_gate_ctrl = ves1x93_i2c_gate_ctrl,
 
 532         .set_frontend = ves1x93_set_frontend,
 
 533         .get_frontend = ves1x93_get_frontend,
 
 535         .read_status = ves1x93_read_status,
 
 536         .read_ber = ves1x93_read_ber,
 
 537         .read_signal_strength = ves1x93_read_signal_strength,
 
 538         .read_snr = ves1x93_read_snr,
 
 539         .read_ucblocks = ves1x93_read_ucblocks,
 
 541         .set_voltage = ves1x93_set_voltage,
 
 544 module_param(debug, int, 0644);
 
 546 MODULE_DESCRIPTION("VLSI VES1x93 DVB-S Demodulator driver");
 
 547 MODULE_AUTHOR("Ralph Metzler");
 
 548 MODULE_LICENSE("GPL");
 
 550 EXPORT_SYMBOL(ves1x93_attach);