0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/slab.h>
0011 #include <linux/kernel.h>
0012 #include <linux/module.h>
0013 #include <linux/moduleparam.h>
0014 #include <linux/init.h>
0015 #include <linux/firmware.h>
0016
0017 #include <media/dvb_frontend.h>
0018 #include "ts2020.h"
0019 #include "ds3000.h"
0020
0021 static int debug;
0022
0023 #define dprintk(args...) \
0024 do { \
0025 if (debug) \
0026 printk(args); \
0027 } while (0)
0028
0029
0030
0031 #define DS3000_DEFAULT_FIRMWARE "dvb-fe-ds3000.fw"
0032
0033 #define DS3000_SAMPLE_RATE 96000
0034
0035
0036 static u8 ds3000_dvbs_init_tab[] = {
0037 0x23, 0x05,
0038 0x08, 0x03,
0039 0x0c, 0x00,
0040 0x21, 0x54,
0041 0x25, 0x82,
0042 0x27, 0x31,
0043 0x30, 0x08,
0044 0x31, 0x40,
0045 0x32, 0x32,
0046 0x33, 0x35,
0047 0x35, 0xff,
0048 0x3a, 0x00,
0049 0x37, 0x10,
0050 0x38, 0x10,
0051 0x39, 0x02,
0052 0x42, 0x60,
0053 0x4a, 0x40,
0054 0x4b, 0x04,
0055 0x4d, 0x91,
0056 0x5d, 0xc8,
0057 0x50, 0x77,
0058 0x51, 0x77,
0059 0x52, 0x36,
0060 0x53, 0x36,
0061 0x56, 0x01,
0062 0x63, 0x43,
0063 0x64, 0x30,
0064 0x65, 0x40,
0065 0x68, 0x26,
0066 0x69, 0x4c,
0067 0x70, 0x20,
0068 0x71, 0x70,
0069 0x72, 0x04,
0070 0x73, 0x00,
0071 0x70, 0x40,
0072 0x71, 0x70,
0073 0x72, 0x04,
0074 0x73, 0x00,
0075 0x70, 0x60,
0076 0x71, 0x70,
0077 0x72, 0x04,
0078 0x73, 0x00,
0079 0x70, 0x80,
0080 0x71, 0x70,
0081 0x72, 0x04,
0082 0x73, 0x00,
0083 0x70, 0xa0,
0084 0x71, 0x70,
0085 0x72, 0x04,
0086 0x73, 0x00,
0087 0x70, 0x1f,
0088 0x76, 0x00,
0089 0x77, 0xd1,
0090 0x78, 0x0c,
0091 0x79, 0x80,
0092 0x7f, 0x04,
0093 0x7c, 0x00,
0094 0x80, 0x86,
0095 0x81, 0xa6,
0096 0x85, 0x04,
0097 0xcd, 0xf4,
0098 0x90, 0x33,
0099 0xa0, 0x44,
0100 0xc0, 0x18,
0101 0xc3, 0x10,
0102 0xc4, 0x08,
0103 0xc5, 0x80,
0104 0xc6, 0x80,
0105 0xc7, 0x0a,
0106 0xc8, 0x1a,
0107 0xc9, 0x80,
0108 0xfe, 0x92,
0109 0xe0, 0xf8,
0110 0xe6, 0x8b,
0111 0xd0, 0x40,
0112 0xf8, 0x20,
0113 0xfa, 0x0f,
0114 0xfd, 0x20,
0115 0xad, 0x20,
0116 0xae, 0x07,
0117 0xb8, 0x00,
0118 };
0119
0120
0121 static u8 ds3000_dvbs2_init_tab[] = {
0122 0x23, 0x0f,
0123 0x08, 0x07,
0124 0x0c, 0x00,
0125 0x21, 0x54,
0126 0x25, 0x82,
0127 0x27, 0x31,
0128 0x30, 0x08,
0129 0x31, 0x32,
0130 0x32, 0x32,
0131 0x33, 0x35,
0132 0x35, 0xff,
0133 0x3a, 0x00,
0134 0x37, 0x10,
0135 0x38, 0x10,
0136 0x39, 0x02,
0137 0x42, 0x60,
0138 0x4a, 0x80,
0139 0x4b, 0x04,
0140 0x4d, 0x81,
0141 0x5d, 0x88,
0142 0x50, 0x36,
0143 0x51, 0x36,
0144 0x52, 0x36,
0145 0x53, 0x36,
0146 0x63, 0x60,
0147 0x64, 0x10,
0148 0x65, 0x10,
0149 0x68, 0x04,
0150 0x69, 0x29,
0151 0x70, 0x20,
0152 0x71, 0x70,
0153 0x72, 0x04,
0154 0x73, 0x00,
0155 0x70, 0x40,
0156 0x71, 0x70,
0157 0x72, 0x04,
0158 0x73, 0x00,
0159 0x70, 0x60,
0160 0x71, 0x70,
0161 0x72, 0x04,
0162 0x73, 0x00,
0163 0x70, 0x80,
0164 0x71, 0x70,
0165 0x72, 0x04,
0166 0x73, 0x00,
0167 0x70, 0xa0,
0168 0x71, 0x70,
0169 0x72, 0x04,
0170 0x73, 0x00,
0171 0x70, 0x1f,
0172 0xa0, 0x44,
0173 0xc0, 0x08,
0174 0xc1, 0x10,
0175 0xc2, 0x08,
0176 0xc3, 0x10,
0177 0xc4, 0x08,
0178 0xc5, 0xf0,
0179 0xc6, 0xf0,
0180 0xc7, 0x0a,
0181 0xc8, 0x1a,
0182 0xc9, 0x80,
0183 0xca, 0x23,
0184 0xcb, 0x24,
0185 0xce, 0x74,
0186 0x90, 0x03,
0187 0x76, 0x80,
0188 0x77, 0x42,
0189 0x78, 0x0a,
0190 0x79, 0x80,
0191 0xad, 0x40,
0192 0xae, 0x07,
0193 0x7f, 0xd4,
0194 0x7c, 0x00,
0195 0x80, 0xa8,
0196 0x81, 0xda,
0197 0x7c, 0x01,
0198 0x80, 0xda,
0199 0x81, 0xec,
0200 0x7c, 0x02,
0201 0x80, 0xca,
0202 0x81, 0xeb,
0203 0x7c, 0x03,
0204 0x80, 0xba,
0205 0x81, 0xdb,
0206 0x85, 0x08,
0207 0x86, 0x00,
0208 0x87, 0x02,
0209 0x89, 0x80,
0210 0x8b, 0x44,
0211 0x8c, 0xaa,
0212 0x8a, 0x10,
0213 0xba, 0x00,
0214 0xf5, 0x04,
0215 0xfe, 0x44,
0216 0xd2, 0x32,
0217 0xb8, 0x00,
0218 };
0219
0220 struct ds3000_state {
0221 struct i2c_adapter *i2c;
0222 const struct ds3000_config *config;
0223 struct dvb_frontend frontend;
0224
0225 u16 prevUCBS2;
0226 };
0227
0228 static int ds3000_writereg(struct ds3000_state *state, int reg, int data)
0229 {
0230 u8 buf[] = { reg, data };
0231 struct i2c_msg msg = { .addr = state->config->demod_address,
0232 .flags = 0, .buf = buf, .len = 2 };
0233 int err;
0234
0235 dprintk("%s: write reg 0x%02x, value 0x%02x\n", __func__, reg, data);
0236
0237 err = i2c_transfer(state->i2c, &msg, 1);
0238 if (err != 1) {
0239 printk(KERN_ERR "%s: writereg error(err == %i, reg == 0x%02x, value == 0x%02x)\n",
0240 __func__, err, reg, data);
0241 return -EREMOTEIO;
0242 }
0243
0244 return 0;
0245 }
0246
0247 static int ds3000_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
0248 {
0249 struct ds3000_state *state = fe->demodulator_priv;
0250
0251 if (enable)
0252 ds3000_writereg(state, 0x03, 0x12);
0253 else
0254 ds3000_writereg(state, 0x03, 0x02);
0255
0256 return 0;
0257 }
0258
0259
0260 static int ds3000_writeFW(struct ds3000_state *state, int reg,
0261 const u8 *data, u16 len)
0262 {
0263 int i, ret = 0;
0264 struct i2c_msg msg;
0265 u8 *buf;
0266
0267 buf = kmalloc(33, GFP_KERNEL);
0268 if (!buf)
0269 return -ENOMEM;
0270
0271 *(buf) = reg;
0272
0273 msg.addr = state->config->demod_address;
0274 msg.flags = 0;
0275 msg.buf = buf;
0276 msg.len = 33;
0277
0278 for (i = 0; i < len; i += 32) {
0279 memcpy(buf + 1, data + i, 32);
0280
0281 dprintk("%s: write reg 0x%02x, len = %d\n", __func__, reg, len);
0282
0283 ret = i2c_transfer(state->i2c, &msg, 1);
0284 if (ret != 1) {
0285 printk(KERN_ERR "%s: write error(err == %i, reg == 0x%02x\n",
0286 __func__, ret, reg);
0287 ret = -EREMOTEIO;
0288 goto error;
0289 }
0290 }
0291 ret = 0;
0292
0293 error:
0294 kfree(buf);
0295
0296 return ret;
0297 }
0298
0299 static int ds3000_readreg(struct ds3000_state *state, u8 reg)
0300 {
0301 int ret;
0302 u8 b0[] = { reg };
0303 u8 b1[] = { 0 };
0304 struct i2c_msg msg[] = {
0305 {
0306 .addr = state->config->demod_address,
0307 .flags = 0,
0308 .buf = b0,
0309 .len = 1
0310 }, {
0311 .addr = state->config->demod_address,
0312 .flags = I2C_M_RD,
0313 .buf = b1,
0314 .len = 1
0315 }
0316 };
0317
0318 ret = i2c_transfer(state->i2c, msg, 2);
0319
0320 if (ret != 2) {
0321 printk(KERN_ERR "%s: reg=0x%x(error=%d)\n", __func__, reg, ret);
0322 return ret;
0323 }
0324
0325 dprintk("%s: read reg 0x%02x, value 0x%02x\n", __func__, reg, b1[0]);
0326
0327 return b1[0];
0328 }
0329
0330 static int ds3000_load_firmware(struct dvb_frontend *fe,
0331 const struct firmware *fw);
0332
0333 static int ds3000_firmware_ondemand(struct dvb_frontend *fe)
0334 {
0335 struct ds3000_state *state = fe->demodulator_priv;
0336 const struct firmware *fw;
0337 int ret = 0;
0338
0339 dprintk("%s()\n", __func__);
0340
0341 ret = ds3000_readreg(state, 0xb2);
0342 if (ret < 0)
0343 return ret;
0344
0345
0346
0347 printk(KERN_INFO "%s: Waiting for firmware upload (%s)...\n", __func__,
0348 DS3000_DEFAULT_FIRMWARE);
0349 ret = request_firmware(&fw, DS3000_DEFAULT_FIRMWARE,
0350 state->i2c->dev.parent);
0351 printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n", __func__);
0352 if (ret) {
0353 printk(KERN_ERR "%s: No firmware uploaded (timeout or file not found?)\n",
0354 __func__);
0355 return ret;
0356 }
0357
0358 ret = ds3000_load_firmware(fe, fw);
0359 if (ret)
0360 printk("%s: Writing firmware to device failed\n", __func__);
0361
0362 release_firmware(fw);
0363
0364 dprintk("%s: Firmware upload %s\n", __func__,
0365 ret == 0 ? "complete" : "failed");
0366
0367 return ret;
0368 }
0369
0370 static int ds3000_load_firmware(struct dvb_frontend *fe,
0371 const struct firmware *fw)
0372 {
0373 struct ds3000_state *state = fe->demodulator_priv;
0374 int ret = 0;
0375
0376 dprintk("%s\n", __func__);
0377 dprintk("Firmware is %zu bytes (%02x %02x .. %02x %02x)\n",
0378 fw->size,
0379 fw->data[0],
0380 fw->data[1],
0381 fw->data[fw->size - 2],
0382 fw->data[fw->size - 1]);
0383
0384
0385 ds3000_writereg(state, 0xb2, 0x01);
0386
0387 ret = ds3000_writeFW(state, 0xb0, fw->data, fw->size);
0388 ds3000_writereg(state, 0xb2, 0x00);
0389
0390 return ret;
0391 }
0392
0393 static int ds3000_set_voltage(struct dvb_frontend *fe,
0394 enum fe_sec_voltage voltage)
0395 {
0396 struct ds3000_state *state = fe->demodulator_priv;
0397 u8 data;
0398
0399 dprintk("%s(%d)\n", __func__, voltage);
0400
0401 data = ds3000_readreg(state, 0xa2);
0402 data |= 0x03;
0403
0404 switch (voltage) {
0405 case SEC_VOLTAGE_18:
0406 data &= ~0x03;
0407 break;
0408 case SEC_VOLTAGE_13:
0409 data &= ~0x03;
0410 data |= 0x01;
0411 break;
0412 case SEC_VOLTAGE_OFF:
0413 break;
0414 }
0415
0416 ds3000_writereg(state, 0xa2, data);
0417
0418 return 0;
0419 }
0420
0421 static int ds3000_read_status(struct dvb_frontend *fe, enum fe_status *status)
0422 {
0423 struct ds3000_state *state = fe->demodulator_priv;
0424 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
0425 int lock;
0426
0427 *status = 0;
0428
0429 switch (c->delivery_system) {
0430 case SYS_DVBS:
0431 lock = ds3000_readreg(state, 0xd1);
0432 if ((lock & 0x07) == 0x07)
0433 *status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
0434 FE_HAS_VITERBI | FE_HAS_SYNC |
0435 FE_HAS_LOCK;
0436
0437 break;
0438 case SYS_DVBS2:
0439 lock = ds3000_readreg(state, 0x0d);
0440 if ((lock & 0x8f) == 0x8f)
0441 *status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
0442 FE_HAS_VITERBI | FE_HAS_SYNC |
0443 FE_HAS_LOCK;
0444
0445 break;
0446 default:
0447 return -EINVAL;
0448 }
0449
0450 if (state->config->set_lock_led)
0451 state->config->set_lock_led(fe, *status == 0 ? 0 : 1);
0452
0453 dprintk("%s: status = 0x%02x\n", __func__, lock);
0454
0455 return 0;
0456 }
0457
0458
0459 static int ds3000_read_ber(struct dvb_frontend *fe, u32* ber)
0460 {
0461 struct ds3000_state *state = fe->demodulator_priv;
0462 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
0463 u8 data;
0464 u32 ber_reading, lpdc_frames;
0465
0466 dprintk("%s()\n", __func__);
0467
0468 switch (c->delivery_system) {
0469 case SYS_DVBS:
0470
0471
0472 ds3000_writereg(state, 0xf9, 0x04);
0473
0474 data = ds3000_readreg(state, 0xf8);
0475
0476 if ((data & 0x10) == 0) {
0477
0478
0479
0480 *ber = (ds3000_readreg(state, 0xf7) << 8) |
0481 ds3000_readreg(state, 0xf6);
0482
0483
0484
0485 data |= 0x10;
0486 ds3000_writereg(state, 0xf8, data);
0487 ds3000_writereg(state, 0xf8, data);
0488 } else
0489
0490
0491 *ber = 0xffffffff;
0492 break;
0493 case SYS_DVBS2:
0494
0495 lpdc_frames = (ds3000_readreg(state, 0xd7) << 16) |
0496 (ds3000_readreg(state, 0xd6) << 8) |
0497 ds3000_readreg(state, 0xd5);
0498
0499 ber_reading = (ds3000_readreg(state, 0xf8) << 8) |
0500 ds3000_readreg(state, 0xf7);
0501 if (lpdc_frames > 750) {
0502
0503 ds3000_writereg(state, 0xd1, 0x01);
0504
0505 ds3000_writereg(state, 0xf9, 0x01);
0506
0507 ds3000_writereg(state, 0xf9, 0x00);
0508
0509 ds3000_writereg(state, 0xd1, 0x00);
0510 *ber = ber_reading;
0511 } else
0512
0513
0514 *ber = 0xffffffff;
0515 break;
0516 default:
0517 return -EINVAL;
0518 }
0519
0520 return 0;
0521 }
0522
0523 static int ds3000_read_signal_strength(struct dvb_frontend *fe,
0524 u16 *signal_strength)
0525 {
0526 if (fe->ops.tuner_ops.get_rf_strength)
0527 fe->ops.tuner_ops.get_rf_strength(fe, signal_strength);
0528
0529 return 0;
0530 }
0531
0532
0533 static int ds3000_read_snr(struct dvb_frontend *fe, u16 *snr)
0534 {
0535 struct ds3000_state *state = fe->demodulator_priv;
0536 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
0537 u8 snr_reading, snr_value;
0538 u32 dvbs2_signal_reading, dvbs2_noise_reading, tmp;
0539 static const u16 dvbs_snr_tab[] = {
0540 0x0000, 0x1b13, 0x2aea, 0x3627, 0x3ede, 0x45fe, 0x4c03,
0541 0x513a, 0x55d4, 0x59f2, 0x5dab, 0x6111, 0x6431, 0x6717,
0542 0x69c9, 0x6c4e, 0x6eac, 0x70e8, 0x7304, 0x7505
0543 };
0544 static const u16 dvbs2_snr_tab[] = {
0545 0x0000, 0x0bc2, 0x12a3, 0x1785, 0x1b4e, 0x1e65, 0x2103,
0546 0x2347, 0x2546, 0x2710, 0x28ae, 0x2a28, 0x2b83, 0x2cc5,
0547 0x2df1, 0x2f09, 0x3010, 0x3109, 0x31f4, 0x32d2, 0x33a6,
0548 0x3470, 0x3531, 0x35ea, 0x369b, 0x3746, 0x37ea, 0x3888,
0549 0x3920, 0x39b3, 0x3a42, 0x3acc, 0x3b51, 0x3bd3, 0x3c51,
0550 0x3ccb, 0x3d42, 0x3db6, 0x3e27, 0x3e95, 0x3f00, 0x3f68,
0551 0x3fcf, 0x4033, 0x4094, 0x40f4, 0x4151, 0x41ac, 0x4206,
0552 0x425e, 0x42b4, 0x4308, 0x435b, 0x43ac, 0x43fc, 0x444a,
0553 0x4497, 0x44e2, 0x452d, 0x4576, 0x45bd, 0x4604, 0x4649,
0554 0x468e, 0x46d1, 0x4713, 0x4755, 0x4795, 0x47d4, 0x4813,
0555 0x4851, 0x488d, 0x48c9, 0x4904, 0x493f, 0x4978, 0x49b1,
0556 0x49e9, 0x4a20, 0x4a57
0557 };
0558
0559 dprintk("%s()\n", __func__);
0560
0561 switch (c->delivery_system) {
0562 case SYS_DVBS:
0563 snr_reading = ds3000_readreg(state, 0xff);
0564 snr_reading /= 8;
0565 if (snr_reading == 0)
0566 *snr = 0x0000;
0567 else {
0568 if (snr_reading > 20)
0569 snr_reading = 20;
0570 snr_value = dvbs_snr_tab[snr_reading - 1] * 10 / 23026;
0571
0572
0573 *snr = snr_value * 8 * 655;
0574 }
0575 dprintk("%s: raw / cooked = 0x%02x / 0x%04x\n", __func__,
0576 snr_reading, *snr);
0577 break;
0578 case SYS_DVBS2:
0579 dvbs2_noise_reading = (ds3000_readreg(state, 0x8c) & 0x3f) +
0580 (ds3000_readreg(state, 0x8d) << 4);
0581 dvbs2_signal_reading = ds3000_readreg(state, 0x8e);
0582 tmp = dvbs2_signal_reading * dvbs2_signal_reading >> 1;
0583 if (tmp == 0) {
0584 *snr = 0x0000;
0585 return 0;
0586 }
0587 if (dvbs2_noise_reading == 0) {
0588 snr_value = 0x0013;
0589
0590
0591 *snr = 0xffff;
0592 return 0;
0593 }
0594 if (tmp > dvbs2_noise_reading) {
0595 snr_reading = tmp / dvbs2_noise_reading;
0596 if (snr_reading > 80)
0597 snr_reading = 80;
0598 snr_value = dvbs2_snr_tab[snr_reading - 1] / 1000;
0599
0600
0601 *snr = snr_value * 5 * 655;
0602 } else {
0603 snr_reading = dvbs2_noise_reading / tmp;
0604 if (snr_reading > 80)
0605 snr_reading = 80;
0606 *snr = -(dvbs2_snr_tab[snr_reading - 1] / 1000);
0607 }
0608 dprintk("%s: raw / cooked = 0x%02x / 0x%04x\n", __func__,
0609 snr_reading, *snr);
0610 break;
0611 default:
0612 return -EINVAL;
0613 }
0614
0615 return 0;
0616 }
0617
0618
0619 static int ds3000_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
0620 {
0621 struct ds3000_state *state = fe->demodulator_priv;
0622 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
0623 u8 data;
0624 u16 _ucblocks;
0625
0626 dprintk("%s()\n", __func__);
0627
0628 switch (c->delivery_system) {
0629 case SYS_DVBS:
0630 *ucblocks = (ds3000_readreg(state, 0xf5) << 8) |
0631 ds3000_readreg(state, 0xf4);
0632 data = ds3000_readreg(state, 0xf8);
0633
0634 data &= ~0x20;
0635 ds3000_writereg(state, 0xf8, data);
0636
0637 data |= 0x20;
0638 ds3000_writereg(state, 0xf8, data);
0639 break;
0640 case SYS_DVBS2:
0641 _ucblocks = (ds3000_readreg(state, 0xe2) << 8) |
0642 ds3000_readreg(state, 0xe1);
0643 if (_ucblocks > state->prevUCBS2)
0644 *ucblocks = _ucblocks - state->prevUCBS2;
0645 else
0646 *ucblocks = state->prevUCBS2 - _ucblocks;
0647 state->prevUCBS2 = _ucblocks;
0648 break;
0649 default:
0650 return -EINVAL;
0651 }
0652
0653 return 0;
0654 }
0655
0656 static int ds3000_set_tone(struct dvb_frontend *fe, enum fe_sec_tone_mode tone)
0657 {
0658 struct ds3000_state *state = fe->demodulator_priv;
0659 u8 data;
0660
0661 dprintk("%s(%d)\n", __func__, tone);
0662 if ((tone != SEC_TONE_ON) && (tone != SEC_TONE_OFF)) {
0663 printk(KERN_ERR "%s: Invalid, tone=%d\n", __func__, tone);
0664 return -EINVAL;
0665 }
0666
0667 data = ds3000_readreg(state, 0xa2);
0668 data &= ~0xc0;
0669 ds3000_writereg(state, 0xa2, data);
0670
0671 switch (tone) {
0672 case SEC_TONE_ON:
0673 dprintk("%s: setting tone on\n", __func__);
0674 data = ds3000_readreg(state, 0xa1);
0675 data &= ~0x43;
0676 data |= 0x04;
0677 ds3000_writereg(state, 0xa1, data);
0678 break;
0679 case SEC_TONE_OFF:
0680 dprintk("%s: setting tone off\n", __func__);
0681 data = ds3000_readreg(state, 0xa2);
0682 data |= 0x80;
0683 ds3000_writereg(state, 0xa2, data);
0684 break;
0685 }
0686
0687 return 0;
0688 }
0689
0690 static int ds3000_send_diseqc_msg(struct dvb_frontend *fe,
0691 struct dvb_diseqc_master_cmd *d)
0692 {
0693 struct ds3000_state *state = fe->demodulator_priv;
0694 int i;
0695 u8 data;
0696
0697
0698 dprintk("%s(", __func__);
0699 for (i = 0 ; i < d->msg_len;) {
0700 dprintk("0x%02x", d->msg[i]);
0701 if (++i < d->msg_len)
0702 dprintk(", ");
0703 }
0704
0705
0706 data = ds3000_readreg(state, 0xa2);
0707 data &= ~0xc0;
0708 ds3000_writereg(state, 0xa2, data);
0709
0710
0711 for (i = 0; i < d->msg_len; i++)
0712 ds3000_writereg(state, 0xa3 + i, d->msg[i]);
0713
0714 data = ds3000_readreg(state, 0xa1);
0715
0716
0717 data &= ~0xf8;
0718
0719
0720 data |= ((d->msg_len - 1) << 3) | 0x07;
0721 ds3000_writereg(state, 0xa1, data);
0722
0723
0724 for (i = 0; i < 15; i++) {
0725 data = ds3000_readreg(state, 0xa1);
0726 if ((data & 0x40) == 0)
0727 break;
0728 msleep(10);
0729 }
0730
0731
0732 if (i == 15) {
0733 data = ds3000_readreg(state, 0xa1);
0734 data &= ~0x80;
0735 data |= 0x40;
0736 ds3000_writereg(state, 0xa1, data);
0737
0738 data = ds3000_readreg(state, 0xa2);
0739 data &= ~0xc0;
0740 data |= 0x80;
0741 ds3000_writereg(state, 0xa2, data);
0742
0743 return -ETIMEDOUT;
0744 }
0745
0746 data = ds3000_readreg(state, 0xa2);
0747 data &= ~0xc0;
0748 data |= 0x80;
0749 ds3000_writereg(state, 0xa2, data);
0750
0751 return 0;
0752 }
0753
0754
0755 static int ds3000_diseqc_send_burst(struct dvb_frontend *fe,
0756 enum fe_sec_mini_cmd burst)
0757 {
0758 struct ds3000_state *state = fe->demodulator_priv;
0759 int i;
0760 u8 data;
0761
0762 dprintk("%s()\n", __func__);
0763
0764 data = ds3000_readreg(state, 0xa2);
0765 data &= ~0xc0;
0766 ds3000_writereg(state, 0xa2, data);
0767
0768
0769 if (burst == SEC_MINI_A)
0770
0771 ds3000_writereg(state, 0xa1, 0x02);
0772 else if (burst == SEC_MINI_B)
0773
0774 ds3000_writereg(state, 0xa1, 0x01);
0775 else
0776 return -EINVAL;
0777
0778 msleep(13);
0779 for (i = 0; i < 5; i++) {
0780 data = ds3000_readreg(state, 0xa1);
0781 if ((data & 0x40) == 0)
0782 break;
0783 msleep(1);
0784 }
0785
0786 if (i == 5) {
0787 data = ds3000_readreg(state, 0xa1);
0788 data &= ~0x80;
0789 data |= 0x40;
0790 ds3000_writereg(state, 0xa1, data);
0791
0792 data = ds3000_readreg(state, 0xa2);
0793 data &= ~0xc0;
0794 data |= 0x80;
0795 ds3000_writereg(state, 0xa2, data);
0796
0797 return -ETIMEDOUT;
0798 }
0799
0800 data = ds3000_readreg(state, 0xa2);
0801 data &= ~0xc0;
0802 data |= 0x80;
0803 ds3000_writereg(state, 0xa2, data);
0804
0805 return 0;
0806 }
0807
0808 static void ds3000_release(struct dvb_frontend *fe)
0809 {
0810 struct ds3000_state *state = fe->demodulator_priv;
0811
0812 if (state->config->set_lock_led)
0813 state->config->set_lock_led(fe, 0);
0814
0815 dprintk("%s\n", __func__);
0816 kfree(state);
0817 }
0818
0819 static const struct dvb_frontend_ops ds3000_ops;
0820
0821 struct dvb_frontend *ds3000_attach(const struct ds3000_config *config,
0822 struct i2c_adapter *i2c)
0823 {
0824 struct ds3000_state *state;
0825 int ret;
0826
0827 dprintk("%s\n", __func__);
0828
0829
0830 state = kzalloc(sizeof(*state), GFP_KERNEL);
0831 if (!state)
0832 return NULL;
0833
0834 state->config = config;
0835 state->i2c = i2c;
0836 state->prevUCBS2 = 0;
0837
0838
0839 ret = ds3000_readreg(state, 0x00) & 0xfe;
0840 if (ret != 0xe0) {
0841 kfree(state);
0842 printk(KERN_ERR "Invalid probe, probably not a DS3000\n");
0843 return NULL;
0844 }
0845
0846 printk(KERN_INFO "DS3000 chip version: %d.%d attached.\n",
0847 ds3000_readreg(state, 0x02),
0848 ds3000_readreg(state, 0x01));
0849
0850 memcpy(&state->frontend.ops, &ds3000_ops,
0851 sizeof(struct dvb_frontend_ops));
0852 state->frontend.demodulator_priv = state;
0853
0854
0855
0856
0857
0858
0859 ds3000_set_voltage(&state->frontend, SEC_VOLTAGE_OFF);
0860 return &state->frontend;
0861 }
0862 EXPORT_SYMBOL(ds3000_attach);
0863
0864 static int ds3000_set_carrier_offset(struct dvb_frontend *fe,
0865 s32 carrier_offset_khz)
0866 {
0867 struct ds3000_state *state = fe->demodulator_priv;
0868 s32 tmp;
0869
0870 tmp = carrier_offset_khz;
0871 tmp *= 65536;
0872 tmp = (2 * tmp + DS3000_SAMPLE_RATE) / (2 * DS3000_SAMPLE_RATE);
0873
0874 if (tmp < 0)
0875 tmp += 65536;
0876
0877 ds3000_writereg(state, 0x5f, tmp >> 8);
0878 ds3000_writereg(state, 0x5e, tmp & 0xff);
0879
0880 return 0;
0881 }
0882
0883 static int ds3000_set_frontend(struct dvb_frontend *fe)
0884 {
0885 struct ds3000_state *state = fe->demodulator_priv;
0886 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
0887
0888 int i;
0889 enum fe_status status;
0890 s32 offset_khz;
0891 u32 frequency;
0892 u16 value;
0893
0894 dprintk("%s() ", __func__);
0895
0896 if (state->config->set_ts_params)
0897 state->config->set_ts_params(fe, 0);
0898
0899 if (fe->ops.tuner_ops.set_params)
0900 fe->ops.tuner_ops.set_params(fe);
0901
0902
0903 ds3000_writereg(state, 0x07, 0x80);
0904 ds3000_writereg(state, 0x07, 0x00);
0905
0906 ds3000_writereg(state, 0xb2, 0x01);
0907
0908 ds3000_writereg(state, 0x00, 0x01);
0909
0910 switch (c->delivery_system) {
0911 case SYS_DVBS:
0912
0913 for (i = 0; i < sizeof(ds3000_dvbs_init_tab); i += 2)
0914 ds3000_writereg(state,
0915 ds3000_dvbs_init_tab[i],
0916 ds3000_dvbs_init_tab[i + 1]);
0917 value = ds3000_readreg(state, 0xfe);
0918 value &= 0xc0;
0919 value |= 0x1b;
0920 ds3000_writereg(state, 0xfe, value);
0921 break;
0922 case SYS_DVBS2:
0923
0924 for (i = 0; i < sizeof(ds3000_dvbs2_init_tab); i += 2)
0925 ds3000_writereg(state,
0926 ds3000_dvbs2_init_tab[i],
0927 ds3000_dvbs2_init_tab[i + 1]);
0928 if (c->symbol_rate >= 30000000)
0929 ds3000_writereg(state, 0xfe, 0x54);
0930 else
0931 ds3000_writereg(state, 0xfe, 0x98);
0932 break;
0933 default:
0934 return -EINVAL;
0935 }
0936
0937
0938 ds3000_writereg(state, 0x29, 0x80);
0939
0940 ds3000_writereg(state, 0x25, 0x8a);
0941
0942 if ((c->symbol_rate < ds3000_ops.info.symbol_rate_min) ||
0943 (c->symbol_rate > ds3000_ops.info.symbol_rate_max)) {
0944 dprintk("%s() symbol_rate %u out of range (%u ... %u)\n",
0945 __func__, c->symbol_rate,
0946 ds3000_ops.info.symbol_rate_min,
0947 ds3000_ops.info.symbol_rate_max);
0948 return -EINVAL;
0949 }
0950
0951
0952 if ((c->symbol_rate / 1000) <= 5000) {
0953 value = 29777 / (c->symbol_rate / 1000) + 1;
0954 if (value % 2 != 0)
0955 value++;
0956 ds3000_writereg(state, 0xc3, 0x0d);
0957 ds3000_writereg(state, 0xc8, value);
0958 ds3000_writereg(state, 0xc4, 0x10);
0959 ds3000_writereg(state, 0xc7, 0x0e);
0960 } else if ((c->symbol_rate / 1000) <= 10000) {
0961 value = 92166 / (c->symbol_rate / 1000) + 1;
0962 if (value % 2 != 0)
0963 value++;
0964 ds3000_writereg(state, 0xc3, 0x07);
0965 ds3000_writereg(state, 0xc8, value);
0966 ds3000_writereg(state, 0xc4, 0x09);
0967 ds3000_writereg(state, 0xc7, 0x12);
0968 } else if ((c->symbol_rate / 1000) <= 20000) {
0969 value = 64516 / (c->symbol_rate / 1000) + 1;
0970 ds3000_writereg(state, 0xc3, value);
0971 ds3000_writereg(state, 0xc8, 0x0e);
0972 ds3000_writereg(state, 0xc4, 0x07);
0973 ds3000_writereg(state, 0xc7, 0x18);
0974 } else {
0975 value = 129032 / (c->symbol_rate / 1000) + 1;
0976 ds3000_writereg(state, 0xc3, value);
0977 ds3000_writereg(state, 0xc8, 0x0a);
0978 ds3000_writereg(state, 0xc4, 0x05);
0979 ds3000_writereg(state, 0xc7, 0x24);
0980 }
0981
0982
0983 value = (((c->symbol_rate / 1000) << 16) +
0984 (DS3000_SAMPLE_RATE / 2)) / DS3000_SAMPLE_RATE;
0985 ds3000_writereg(state, 0x61, value & 0x00ff);
0986 ds3000_writereg(state, 0x62, (value & 0xff00) >> 8);
0987
0988
0989 ds3000_writereg(state, 0x56, 0x00);
0990
0991
0992 ds3000_writereg(state, 0x76, 0x00);
0993
0994
0995
0996
0997
0998
0999
1000 if (state->config->ci_mode) {
1001 switch (c->delivery_system) {
1002 case SYS_DVBS:
1003 default:
1004 ds3000_writereg(state, 0xfd, 0x80);
1005 break;
1006 case SYS_DVBS2:
1007 ds3000_writereg(state, 0xfd, 0x01);
1008 break;
1009 }
1010 }
1011
1012
1013 ds3000_writereg(state, 0x00, 0x00);
1014
1015 ds3000_writereg(state, 0xb2, 0x00);
1016
1017 if (fe->ops.tuner_ops.get_frequency) {
1018 fe->ops.tuner_ops.get_frequency(fe, &frequency);
1019 offset_khz = frequency - c->frequency;
1020 ds3000_set_carrier_offset(fe, offset_khz);
1021 }
1022
1023 for (i = 0; i < 30 ; i++) {
1024 ds3000_read_status(fe, &status);
1025 if (status & FE_HAS_LOCK)
1026 break;
1027
1028 msleep(10);
1029 }
1030
1031 return 0;
1032 }
1033
1034 static int ds3000_tune(struct dvb_frontend *fe,
1035 bool re_tune,
1036 unsigned int mode_flags,
1037 unsigned int *delay,
1038 enum fe_status *status)
1039 {
1040 if (re_tune) {
1041 int ret = ds3000_set_frontend(fe);
1042 if (ret)
1043 return ret;
1044 }
1045
1046 *delay = HZ / 5;
1047
1048 return ds3000_read_status(fe, status);
1049 }
1050
1051 static enum dvbfe_algo ds3000_get_algo(struct dvb_frontend *fe)
1052 {
1053 struct ds3000_state *state = fe->demodulator_priv;
1054
1055 if (state->config->set_lock_led)
1056 state->config->set_lock_led(fe, 0);
1057
1058 dprintk("%s()\n", __func__);
1059 return DVBFE_ALGO_HW;
1060 }
1061
1062
1063
1064
1065
1066
1067 static int ds3000_initfe(struct dvb_frontend *fe)
1068 {
1069 struct ds3000_state *state = fe->demodulator_priv;
1070 int ret;
1071
1072 dprintk("%s()\n", __func__);
1073
1074 ds3000_writereg(state, 0x08, 0x01 | ds3000_readreg(state, 0x08));
1075 msleep(1);
1076
1077
1078 ret = ds3000_firmware_ondemand(fe);
1079 if (ret != 0) {
1080 printk(KERN_ERR "%s: Unable initialize firmware\n", __func__);
1081 return ret;
1082 }
1083
1084 return 0;
1085 }
1086
1087 static const struct dvb_frontend_ops ds3000_ops = {
1088 .delsys = { SYS_DVBS, SYS_DVBS2 },
1089 .info = {
1090 .name = "Montage Technology DS3000",
1091 .frequency_min_hz = 950 * MHz,
1092 .frequency_max_hz = 2150 * MHz,
1093 .frequency_stepsize_hz = 1011 * kHz,
1094 .frequency_tolerance_hz = 5 * MHz,
1095 .symbol_rate_min = 1000000,
1096 .symbol_rate_max = 45000000,
1097 .caps = FE_CAN_INVERSION_AUTO |
1098 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
1099 FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
1100 FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
1101 FE_CAN_2G_MODULATION |
1102 FE_CAN_QPSK | FE_CAN_RECOVER
1103 },
1104
1105 .release = ds3000_release,
1106
1107 .init = ds3000_initfe,
1108 .i2c_gate_ctrl = ds3000_i2c_gate_ctrl,
1109 .read_status = ds3000_read_status,
1110 .read_ber = ds3000_read_ber,
1111 .read_signal_strength = ds3000_read_signal_strength,
1112 .read_snr = ds3000_read_snr,
1113 .read_ucblocks = ds3000_read_ucblocks,
1114 .set_voltage = ds3000_set_voltage,
1115 .set_tone = ds3000_set_tone,
1116 .diseqc_send_master_cmd = ds3000_send_diseqc_msg,
1117 .diseqc_send_burst = ds3000_diseqc_send_burst,
1118 .get_frontend_algo = ds3000_get_algo,
1119
1120 .set_frontend = ds3000_set_frontend,
1121 .tune = ds3000_tune,
1122 };
1123
1124 module_param(debug, int, 0644);
1125 MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)");
1126
1127 MODULE_DESCRIPTION("DVB Frontend module for Montage Technology DS3000 hardware");
1128 MODULE_AUTHOR("Konstantin Dimitrov <kosio.dimitrov@gmail.com>");
1129 MODULE_LICENSE("GPL");
1130 MODULE_FIRMWARE(DS3000_DEFAULT_FIRMWARE);