0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/types.h>
0010 #include <linux/spi/spi.h>
0011
0012 #include "rf69.h"
0013 #include "rf69_registers.h"
0014
0015 #define F_OSC 32000000
0016 #define FIFO_SIZE 66
0017
0018
0019
0020 u8 rf69_read_reg(struct spi_device *spi, u8 addr)
0021 {
0022 return spi_w8r8(spi, addr);
0023 }
0024
0025 static int rf69_write_reg(struct spi_device *spi, u8 addr, u8 value)
0026 {
0027 char buffer[2];
0028
0029 buffer[0] = addr | WRITE_BIT;
0030 buffer[1] = value;
0031
0032 return spi_write(spi, &buffer, ARRAY_SIZE(buffer));
0033 }
0034
0035
0036
0037 static int rf69_set_bit(struct spi_device *spi, u8 reg, u8 mask)
0038 {
0039 u8 tmp;
0040
0041 tmp = rf69_read_reg(spi, reg);
0042 tmp = tmp | mask;
0043 return rf69_write_reg(spi, reg, tmp);
0044 }
0045
0046 static int rf69_clear_bit(struct spi_device *spi, u8 reg, u8 mask)
0047 {
0048 u8 tmp;
0049
0050 tmp = rf69_read_reg(spi, reg);
0051 tmp = tmp & ~mask;
0052 return rf69_write_reg(spi, reg, tmp);
0053 }
0054
0055 static inline int rf69_read_mod_write(struct spi_device *spi, u8 reg,
0056 u8 mask, u8 value)
0057 {
0058 u8 tmp;
0059
0060 tmp = rf69_read_reg(spi, reg);
0061 tmp = (tmp & ~mask) | value;
0062 return rf69_write_reg(spi, reg, tmp);
0063 }
0064
0065
0066
0067 int rf69_get_version(struct spi_device *spi)
0068 {
0069 return rf69_read_reg(spi, REG_VERSION);
0070 }
0071
0072 int rf69_set_mode(struct spi_device *spi, enum mode mode)
0073 {
0074 static const u8 mode_map[] = {
0075 [transmit] = OPMODE_MODE_TRANSMIT,
0076 [receive] = OPMODE_MODE_RECEIVE,
0077 [synthesizer] = OPMODE_MODE_SYNTHESIZER,
0078 [standby] = OPMODE_MODE_STANDBY,
0079 [mode_sleep] = OPMODE_MODE_SLEEP,
0080 };
0081
0082 if (unlikely(mode >= ARRAY_SIZE(mode_map))) {
0083 dev_dbg(&spi->dev, "set: illegal mode %u\n", mode);
0084 return -EINVAL;
0085 }
0086
0087 return rf69_read_mod_write(spi, REG_OPMODE, MASK_OPMODE_MODE,
0088 mode_map[mode]);
0089
0090
0091
0092
0093
0094
0095
0096
0097 }
0098
0099 int rf69_set_data_mode(struct spi_device *spi, u8 data_mode)
0100 {
0101 return rf69_read_mod_write(spi, REG_DATAMODUL, MASK_DATAMODUL_MODE,
0102 data_mode);
0103 }
0104
0105 int rf69_set_modulation(struct spi_device *spi, enum modulation modulation)
0106 {
0107 static const u8 modulation_map[] = {
0108 [OOK] = DATAMODUL_MODULATION_TYPE_OOK,
0109 [FSK] = DATAMODUL_MODULATION_TYPE_FSK,
0110 };
0111
0112 if (unlikely(modulation >= ARRAY_SIZE(modulation_map))) {
0113 dev_dbg(&spi->dev, "set: illegal modulation %u\n", modulation);
0114 return -EINVAL;
0115 }
0116
0117 return rf69_read_mod_write(spi, REG_DATAMODUL,
0118 MASK_DATAMODUL_MODULATION_TYPE,
0119 modulation_map[modulation]);
0120 }
0121
0122 static enum modulation rf69_get_modulation(struct spi_device *spi)
0123 {
0124 u8 modulation_reg;
0125
0126 modulation_reg = rf69_read_reg(spi, REG_DATAMODUL);
0127
0128 switch (modulation_reg & MASK_DATAMODUL_MODULATION_TYPE) {
0129 case DATAMODUL_MODULATION_TYPE_OOK:
0130 return OOK;
0131 case DATAMODUL_MODULATION_TYPE_FSK:
0132 return FSK;
0133 default:
0134 return UNDEF;
0135 }
0136 }
0137
0138 int rf69_set_modulation_shaping(struct spi_device *spi,
0139 enum mod_shaping mod_shaping)
0140 {
0141 switch (rf69_get_modulation(spi)) {
0142 case FSK:
0143 switch (mod_shaping) {
0144 case SHAPING_OFF:
0145 return rf69_read_mod_write(spi, REG_DATAMODUL,
0146 MASK_DATAMODUL_MODULATION_SHAPE,
0147 DATAMODUL_MODULATION_SHAPE_NONE);
0148 case SHAPING_1_0:
0149 return rf69_read_mod_write(spi, REG_DATAMODUL,
0150 MASK_DATAMODUL_MODULATION_SHAPE,
0151 DATAMODUL_MODULATION_SHAPE_1_0);
0152 case SHAPING_0_5:
0153 return rf69_read_mod_write(spi, REG_DATAMODUL,
0154 MASK_DATAMODUL_MODULATION_SHAPE,
0155 DATAMODUL_MODULATION_SHAPE_0_5);
0156 case SHAPING_0_3:
0157 return rf69_read_mod_write(spi, REG_DATAMODUL,
0158 MASK_DATAMODUL_MODULATION_SHAPE,
0159 DATAMODUL_MODULATION_SHAPE_0_3);
0160 default:
0161 dev_dbg(&spi->dev, "set: illegal mod shaping for FSK %u\n", mod_shaping);
0162 return -EINVAL;
0163 }
0164 case OOK:
0165 switch (mod_shaping) {
0166 case SHAPING_OFF:
0167 return rf69_read_mod_write(spi, REG_DATAMODUL,
0168 MASK_DATAMODUL_MODULATION_SHAPE,
0169 DATAMODUL_MODULATION_SHAPE_NONE);
0170 case SHAPING_BR:
0171 return rf69_read_mod_write(spi, REG_DATAMODUL,
0172 MASK_DATAMODUL_MODULATION_SHAPE,
0173 DATAMODUL_MODULATION_SHAPE_BR);
0174 case SHAPING_2BR:
0175 return rf69_read_mod_write(spi, REG_DATAMODUL,
0176 MASK_DATAMODUL_MODULATION_SHAPE,
0177 DATAMODUL_MODULATION_SHAPE_2BR);
0178 default:
0179 dev_dbg(&spi->dev, "set: illegal mod shaping for OOK %u\n", mod_shaping);
0180 return -EINVAL;
0181 }
0182 default:
0183 dev_dbg(&spi->dev, "set: modulation undefined\n");
0184 return -EINVAL;
0185 }
0186 }
0187
0188 int rf69_set_bit_rate(struct spi_device *spi, u16 bit_rate)
0189 {
0190 int retval;
0191 u32 bit_rate_reg;
0192 u8 msb;
0193 u8 lsb;
0194 enum modulation mod;
0195
0196
0197 mod = rf69_get_modulation(spi);
0198 if (mod == UNDEF) {
0199 dev_dbg(&spi->dev, "setBitRate: modulation is undefined\n");
0200 return -EINVAL;
0201 }
0202
0203
0204 if (bit_rate < 1200 || (mod == OOK && bit_rate > 32768)) {
0205 dev_dbg(&spi->dev, "setBitRate: illegal input param\n");
0206 return -EINVAL;
0207 }
0208
0209
0210 bit_rate_reg = (F_OSC / bit_rate);
0211
0212 msb = (bit_rate_reg & 0xff00) >> 8;
0213 lsb = (bit_rate_reg & 0xff);
0214
0215
0216 retval = rf69_write_reg(spi, REG_BITRATE_MSB, msb);
0217 if (retval)
0218 return retval;
0219 retval = rf69_write_reg(spi, REG_BITRATE_LSB, lsb);
0220 if (retval)
0221 return retval;
0222
0223 return 0;
0224 }
0225
0226 int rf69_set_deviation(struct spi_device *spi, u32 deviation)
0227 {
0228 int retval;
0229 u64 f_reg;
0230 u64 f_step;
0231 u32 bit_rate_reg;
0232 u32 bit_rate;
0233 u8 msb;
0234 u8 lsb;
0235 u64 factor = 1000000;
0236
0237
0238 bit_rate_reg = rf69_read_reg(spi, REG_BITRATE_MSB) << 8;
0239 bit_rate_reg |= rf69_read_reg(spi, REG_BITRATE_LSB);
0240 bit_rate = F_OSC / bit_rate_reg;
0241
0242
0243
0244
0245
0246
0247 if (deviation < 600 || (deviation + (bit_rate / 2)) > 500000) {
0248 dev_dbg(&spi->dev,
0249 "set_deviation: illegal input param: %u\n", deviation);
0250 return -EINVAL;
0251 }
0252
0253
0254 f_step = F_OSC * factor;
0255 do_div(f_step, 524288);
0256
0257
0258 f_reg = deviation * factor;
0259 do_div(f_reg, f_step);
0260
0261 msb = (f_reg & 0xff00) >> 8;
0262 lsb = (f_reg & 0xff);
0263
0264
0265 if (msb & ~FDEVMASB_MASK) {
0266 dev_dbg(&spi->dev, "set_deviation: err in calc of msb\n");
0267 return -EINVAL;
0268 }
0269
0270
0271 retval = rf69_write_reg(spi, REG_FDEV_MSB, msb);
0272 if (retval)
0273 return retval;
0274 retval = rf69_write_reg(spi, REG_FDEV_LSB, lsb);
0275 if (retval)
0276 return retval;
0277
0278 return 0;
0279 }
0280
0281 int rf69_set_frequency(struct spi_device *spi, u32 frequency)
0282 {
0283 int retval;
0284 u32 f_max;
0285 u64 f_reg;
0286 u64 f_step;
0287 u8 msb;
0288 u8 mid;
0289 u8 lsb;
0290 u64 factor = 1000000;
0291
0292
0293 f_step = F_OSC * factor;
0294 do_div(f_step, 524288);
0295
0296
0297 f_max = div_u64(f_step * 8388608, factor);
0298 if (frequency > f_max) {
0299 dev_dbg(&spi->dev, "setFrequency: illegal input param\n");
0300 return -EINVAL;
0301 }
0302
0303
0304 f_reg = frequency * factor;
0305 do_div(f_reg, f_step);
0306
0307 msb = (f_reg & 0xff0000) >> 16;
0308 mid = (f_reg & 0xff00) >> 8;
0309 lsb = (f_reg & 0xff);
0310
0311
0312 retval = rf69_write_reg(spi, REG_FRF_MSB, msb);
0313 if (retval)
0314 return retval;
0315 retval = rf69_write_reg(spi, REG_FRF_MID, mid);
0316 if (retval)
0317 return retval;
0318 retval = rf69_write_reg(spi, REG_FRF_LSB, lsb);
0319 if (retval)
0320 return retval;
0321
0322 return 0;
0323 }
0324
0325 int rf69_enable_amplifier(struct spi_device *spi, u8 amplifier_mask)
0326 {
0327 return rf69_set_bit(spi, REG_PALEVEL, amplifier_mask);
0328 }
0329
0330 int rf69_disable_amplifier(struct spi_device *spi, u8 amplifier_mask)
0331 {
0332 return rf69_clear_bit(spi, REG_PALEVEL, amplifier_mask);
0333 }
0334
0335 int rf69_set_output_power_level(struct spi_device *spi, u8 power_level)
0336 {
0337 u8 pa_level, ocp, test_pa1, test_pa2;
0338 bool pa0, pa1, pa2, high_power;
0339 u8 min_power_level;
0340
0341
0342 pa_level = rf69_read_reg(spi, REG_PALEVEL);
0343 pa0 = pa_level & MASK_PALEVEL_PA0;
0344 pa1 = pa_level & MASK_PALEVEL_PA1;
0345 pa2 = pa_level & MASK_PALEVEL_PA2;
0346
0347
0348 ocp = rf69_read_reg(spi, REG_OCP);
0349 test_pa1 = rf69_read_reg(spi, REG_TESTPA1);
0350 test_pa2 = rf69_read_reg(spi, REG_TESTPA2);
0351 high_power = (ocp == 0x0f) && (test_pa1 == 0x5d) && (test_pa2 == 0x7c);
0352
0353 if (pa0 && !pa1 && !pa2) {
0354 power_level += 18;
0355 min_power_level = 0;
0356 } else if (!pa0 && pa1 && !pa2) {
0357 power_level += 18;
0358 min_power_level = 16;
0359 } else if (!pa0 && pa1 && pa2) {
0360 if (high_power)
0361 power_level += 11;
0362 else
0363 power_level += 14;
0364 min_power_level = 16;
0365 } else {
0366 goto failed;
0367 }
0368
0369
0370 if (power_level > 0x1f)
0371 goto failed;
0372
0373 if (power_level < min_power_level)
0374 goto failed;
0375
0376
0377 return rf69_read_mod_write(spi, REG_PALEVEL, MASK_PALEVEL_OUTPUT_POWER,
0378 power_level);
0379 failed:
0380 dev_dbg(&spi->dev, "set: illegal power level %u\n", power_level);
0381 return -EINVAL;
0382 }
0383
0384 int rf69_set_pa_ramp(struct spi_device *spi, enum pa_ramp pa_ramp)
0385 {
0386 static const u8 pa_ramp_map[] = {
0387 [ramp3400] = PARAMP_3400,
0388 [ramp2000] = PARAMP_2000,
0389 [ramp1000] = PARAMP_1000,
0390 [ramp500] = PARAMP_500,
0391 [ramp250] = PARAMP_250,
0392 [ramp125] = PARAMP_125,
0393 [ramp100] = PARAMP_100,
0394 [ramp62] = PARAMP_62,
0395 [ramp50] = PARAMP_50,
0396 [ramp40] = PARAMP_40,
0397 [ramp31] = PARAMP_31,
0398 [ramp25] = PARAMP_25,
0399 [ramp20] = PARAMP_20,
0400 [ramp15] = PARAMP_15,
0401 [ramp10] = PARAMP_10,
0402 };
0403
0404 if (unlikely(pa_ramp >= ARRAY_SIZE(pa_ramp_map))) {
0405 dev_dbg(&spi->dev, "set: illegal pa_ramp %u\n", pa_ramp);
0406 return -EINVAL;
0407 }
0408
0409 return rf69_write_reg(spi, REG_PARAMP, pa_ramp_map[pa_ramp]);
0410 }
0411
0412 int rf69_set_antenna_impedance(struct spi_device *spi,
0413 enum antenna_impedance antenna_impedance)
0414 {
0415 switch (antenna_impedance) {
0416 case fifty_ohm:
0417 return rf69_clear_bit(spi, REG_LNA, MASK_LNA_ZIN);
0418 case two_hundred_ohm:
0419 return rf69_set_bit(spi, REG_LNA, MASK_LNA_ZIN);
0420 default:
0421 dev_dbg(&spi->dev, "set: illegal antenna impedance %u\n", antenna_impedance);
0422 return -EINVAL;
0423 }
0424 }
0425
0426 int rf69_set_lna_gain(struct spi_device *spi, enum lna_gain lna_gain)
0427 {
0428 static const u8 lna_gain_map[] = {
0429 [automatic] = LNA_GAIN_AUTO,
0430 [max] = LNA_GAIN_MAX,
0431 [max_minus_6] = LNA_GAIN_MAX_MINUS_6,
0432 [max_minus_12] = LNA_GAIN_MAX_MINUS_12,
0433 [max_minus_24] = LNA_GAIN_MAX_MINUS_24,
0434 [max_minus_36] = LNA_GAIN_MAX_MINUS_36,
0435 [max_minus_48] = LNA_GAIN_MAX_MINUS_48,
0436 };
0437
0438 if (unlikely(lna_gain >= ARRAY_SIZE(lna_gain_map))) {
0439 dev_dbg(&spi->dev, "set: illegal lna gain %u\n", lna_gain);
0440 return -EINVAL;
0441 }
0442
0443 return rf69_read_mod_write(spi, REG_LNA, MASK_LNA_GAIN,
0444 lna_gain_map[lna_gain]);
0445 }
0446
0447 static int rf69_set_bandwidth_intern(struct spi_device *spi, u8 reg,
0448 enum mantisse mantisse, u8 exponent)
0449 {
0450 u8 bandwidth;
0451
0452
0453 if (exponent > 7) {
0454 dev_dbg(&spi->dev, "set: illegal bandwidth exponent %u\n", exponent);
0455 return -EINVAL;
0456 }
0457
0458 if (mantisse != mantisse16 &&
0459 mantisse != mantisse20 &&
0460 mantisse != mantisse24) {
0461 dev_dbg(&spi->dev, "set: illegal bandwidth mantisse %u\n", mantisse);
0462 return -EINVAL;
0463 }
0464
0465
0466 bandwidth = rf69_read_reg(spi, reg);
0467
0468
0469 bandwidth = bandwidth & MASK_BW_DCC_FREQ;
0470
0471
0472 switch (mantisse) {
0473 case mantisse16:
0474 bandwidth = bandwidth | BW_MANT_16;
0475 break;
0476 case mantisse20:
0477 bandwidth = bandwidth | BW_MANT_20;
0478 break;
0479 case mantisse24:
0480 bandwidth = bandwidth | BW_MANT_24;
0481 break;
0482 }
0483
0484
0485 bandwidth = bandwidth | exponent;
0486
0487
0488 return rf69_write_reg(spi, reg, bandwidth);
0489 }
0490
0491 int rf69_set_bandwidth(struct spi_device *spi, enum mantisse mantisse,
0492 u8 exponent)
0493 {
0494 return rf69_set_bandwidth_intern(spi, REG_RXBW, mantisse, exponent);
0495 }
0496
0497 int rf69_set_bandwidth_during_afc(struct spi_device *spi,
0498 enum mantisse mantisse,
0499 u8 exponent)
0500 {
0501 return rf69_set_bandwidth_intern(spi, REG_AFCBW, mantisse, exponent);
0502 }
0503
0504 int rf69_set_ook_threshold_dec(struct spi_device *spi,
0505 enum threshold_decrement threshold_decrement)
0506 {
0507 static const u8 td_map[] = {
0508 [dec_every8th] = OOKPEAK_THRESHDEC_EVERY_8TH,
0509 [dec_every4th] = OOKPEAK_THRESHDEC_EVERY_4TH,
0510 [dec_every2nd] = OOKPEAK_THRESHDEC_EVERY_2ND,
0511 [dec_once] = OOKPEAK_THRESHDEC_ONCE,
0512 [dec_twice] = OOKPEAK_THRESHDEC_TWICE,
0513 [dec_4times] = OOKPEAK_THRESHDEC_4_TIMES,
0514 [dec_8times] = OOKPEAK_THRESHDEC_8_TIMES,
0515 [dec_16times] = OOKPEAK_THRESHDEC_16_TIMES,
0516 };
0517
0518 if (unlikely(threshold_decrement >= ARRAY_SIZE(td_map))) {
0519 dev_dbg(&spi->dev, "set: illegal OOK threshold decrement %u\n",
0520 threshold_decrement);
0521 return -EINVAL;
0522 }
0523
0524 return rf69_read_mod_write(spi, REG_OOKPEAK, MASK_OOKPEAK_THRESDEC,
0525 td_map[threshold_decrement]);
0526 }
0527
0528 int rf69_set_dio_mapping(struct spi_device *spi, u8 dio_number, u8 value)
0529 {
0530 u8 mask;
0531 u8 shift;
0532 u8 dio_addr;
0533 u8 dio_value;
0534
0535 switch (dio_number) {
0536 case 0:
0537 mask = MASK_DIO0;
0538 shift = SHIFT_DIO0;
0539 dio_addr = REG_DIOMAPPING1;
0540 break;
0541 case 1:
0542 mask = MASK_DIO1;
0543 shift = SHIFT_DIO1;
0544 dio_addr = REG_DIOMAPPING1;
0545 break;
0546 case 2:
0547 mask = MASK_DIO2;
0548 shift = SHIFT_DIO2;
0549 dio_addr = REG_DIOMAPPING1;
0550 break;
0551 case 3:
0552 mask = MASK_DIO3;
0553 shift = SHIFT_DIO3;
0554 dio_addr = REG_DIOMAPPING1;
0555 break;
0556 case 4:
0557 mask = MASK_DIO4;
0558 shift = SHIFT_DIO4;
0559 dio_addr = REG_DIOMAPPING2;
0560 break;
0561 case 5:
0562 mask = MASK_DIO5;
0563 shift = SHIFT_DIO5;
0564 dio_addr = REG_DIOMAPPING2;
0565 break;
0566 default:
0567 dev_dbg(&spi->dev, "set: illegal dio number %u\n", dio_number);
0568 return -EINVAL;
0569 }
0570
0571
0572 dio_value = rf69_read_reg(spi, dio_addr);
0573
0574 dio_value = dio_value & ~mask;
0575
0576 dio_value = dio_value | value << shift;
0577
0578 return rf69_write_reg(spi, dio_addr, dio_value);
0579 }
0580
0581 int rf69_set_rssi_threshold(struct spi_device *spi, u8 threshold)
0582 {
0583
0584
0585 return rf69_write_reg(spi, REG_RSSITHRESH, threshold);
0586 }
0587
0588 int rf69_set_preamble_length(struct spi_device *spi, u16 preamble_length)
0589 {
0590 int retval;
0591 u8 msb, lsb;
0592
0593
0594
0595
0596 msb = (preamble_length & 0xff00) >> 8;
0597 lsb = (preamble_length & 0xff);
0598
0599
0600 retval = rf69_write_reg(spi, REG_PREAMBLE_MSB, msb);
0601 if (retval)
0602 return retval;
0603 return rf69_write_reg(spi, REG_PREAMBLE_LSB, lsb);
0604 }
0605
0606 int rf69_enable_sync(struct spi_device *spi)
0607 {
0608 return rf69_set_bit(spi, REG_SYNC_CONFIG, MASK_SYNC_CONFIG_SYNC_ON);
0609 }
0610
0611 int rf69_disable_sync(struct spi_device *spi)
0612 {
0613 return rf69_clear_bit(spi, REG_SYNC_CONFIG, MASK_SYNC_CONFIG_SYNC_ON);
0614 }
0615
0616 int rf69_set_fifo_fill_condition(struct spi_device *spi,
0617 enum fifo_fill_condition fifo_fill_condition)
0618 {
0619 switch (fifo_fill_condition) {
0620 case always:
0621 return rf69_set_bit(spi, REG_SYNC_CONFIG,
0622 MASK_SYNC_CONFIG_FIFO_FILL_CONDITION);
0623 case after_sync_interrupt:
0624 return rf69_clear_bit(spi, REG_SYNC_CONFIG,
0625 MASK_SYNC_CONFIG_FIFO_FILL_CONDITION);
0626 default:
0627 dev_dbg(&spi->dev, "set: illegal fifo fill condition %u\n", fifo_fill_condition);
0628 return -EINVAL;
0629 }
0630 }
0631
0632 int rf69_set_sync_size(struct spi_device *spi, u8 sync_size)
0633 {
0634
0635 if (sync_size > 0x07) {
0636 dev_dbg(&spi->dev, "set: illegal sync size %u\n", sync_size);
0637 return -EINVAL;
0638 }
0639
0640
0641 return rf69_read_mod_write(spi, REG_SYNC_CONFIG,
0642 MASK_SYNC_CONFIG_SYNC_SIZE,
0643 (sync_size << 3));
0644 }
0645
0646 int rf69_set_sync_values(struct spi_device *spi, u8 sync_values[8])
0647 {
0648 int retval = 0;
0649
0650 retval += rf69_write_reg(spi, REG_SYNCVALUE1, sync_values[0]);
0651 retval += rf69_write_reg(spi, REG_SYNCVALUE2, sync_values[1]);
0652 retval += rf69_write_reg(spi, REG_SYNCVALUE3, sync_values[2]);
0653 retval += rf69_write_reg(spi, REG_SYNCVALUE4, sync_values[3]);
0654 retval += rf69_write_reg(spi, REG_SYNCVALUE5, sync_values[4]);
0655 retval += rf69_write_reg(spi, REG_SYNCVALUE6, sync_values[5]);
0656 retval += rf69_write_reg(spi, REG_SYNCVALUE7, sync_values[6]);
0657 retval += rf69_write_reg(spi, REG_SYNCVALUE8, sync_values[7]);
0658
0659 return retval;
0660 }
0661
0662 int rf69_set_packet_format(struct spi_device *spi,
0663 enum packet_format packet_format)
0664 {
0665 switch (packet_format) {
0666 case packet_length_var:
0667 return rf69_set_bit(spi, REG_PACKETCONFIG1,
0668 MASK_PACKETCONFIG1_PACKET_FORMAT_VARIABLE);
0669 case packet_length_fix:
0670 return rf69_clear_bit(spi, REG_PACKETCONFIG1,
0671 MASK_PACKETCONFIG1_PACKET_FORMAT_VARIABLE);
0672 default:
0673 dev_dbg(&spi->dev, "set: illegal packet format %u\n", packet_format);
0674 return -EINVAL;
0675 }
0676 }
0677
0678 int rf69_enable_crc(struct spi_device *spi)
0679 {
0680 return rf69_set_bit(spi, REG_PACKETCONFIG1, MASK_PACKETCONFIG1_CRC_ON);
0681 }
0682
0683 int rf69_disable_crc(struct spi_device *spi)
0684 {
0685 return rf69_clear_bit(spi, REG_PACKETCONFIG1, MASK_PACKETCONFIG1_CRC_ON);
0686 }
0687
0688 int rf69_set_address_filtering(struct spi_device *spi,
0689 enum address_filtering address_filtering)
0690 {
0691 static const u8 af_map[] = {
0692 [filtering_off] = PACKETCONFIG1_ADDRESSFILTERING_OFF,
0693 [node_address] = PACKETCONFIG1_ADDRESSFILTERING_NODE,
0694 [node_or_broadcast_address] =
0695 PACKETCONFIG1_ADDRESSFILTERING_NODEBROADCAST,
0696 };
0697
0698 if (unlikely(address_filtering >= ARRAY_SIZE(af_map))) {
0699 dev_dbg(&spi->dev, "set: illegal address filtering %u\n", address_filtering);
0700 return -EINVAL;
0701 }
0702
0703 return rf69_read_mod_write(spi, REG_PACKETCONFIG1,
0704 MASK_PACKETCONFIG1_ADDRESSFILTERING,
0705 af_map[address_filtering]);
0706 }
0707
0708 int rf69_set_payload_length(struct spi_device *spi, u8 payload_length)
0709 {
0710 return rf69_write_reg(spi, REG_PAYLOAD_LENGTH, payload_length);
0711 }
0712
0713 int rf69_set_node_address(struct spi_device *spi, u8 node_address)
0714 {
0715 return rf69_write_reg(spi, REG_NODEADRS, node_address);
0716 }
0717
0718 int rf69_set_broadcast_address(struct spi_device *spi, u8 broadcast_address)
0719 {
0720 return rf69_write_reg(spi, REG_BROADCASTADRS, broadcast_address);
0721 }
0722
0723 int rf69_set_tx_start_condition(struct spi_device *spi,
0724 enum tx_start_condition tx_start_condition)
0725 {
0726 switch (tx_start_condition) {
0727 case fifo_level:
0728 return rf69_clear_bit(spi, REG_FIFO_THRESH,
0729 MASK_FIFO_THRESH_TXSTART);
0730 case fifo_not_empty:
0731 return rf69_set_bit(spi, REG_FIFO_THRESH,
0732 MASK_FIFO_THRESH_TXSTART);
0733 default:
0734 dev_dbg(&spi->dev, "set: illegal tx start condition %u\n", tx_start_condition);
0735 return -EINVAL;
0736 }
0737 }
0738
0739 int rf69_set_fifo_threshold(struct spi_device *spi, u8 threshold)
0740 {
0741 int retval;
0742
0743
0744 if (threshold & ~MASK_FIFO_THRESH_VALUE) {
0745 dev_dbg(&spi->dev, "set: illegal fifo threshold %u\n", threshold);
0746 return -EINVAL;
0747 }
0748
0749
0750 retval = rf69_read_mod_write(spi, REG_FIFO_THRESH,
0751 MASK_FIFO_THRESH_VALUE,
0752 threshold);
0753 if (retval)
0754 return retval;
0755
0756
0757
0758
0759
0760 return rf69_read_fifo(spi, (u8 *)&retval, 1);
0761 }
0762
0763 int rf69_set_dagc(struct spi_device *spi, enum dagc dagc)
0764 {
0765 static const u8 dagc_map[] = {
0766 [normal_mode] = DAGC_NORMAL,
0767 [improve] = DAGC_IMPROVED_LOWBETA0,
0768 [improve_for_low_modulation_index] = DAGC_IMPROVED_LOWBETA1,
0769 };
0770
0771 if (unlikely(dagc >= ARRAY_SIZE(dagc_map))) {
0772 dev_dbg(&spi->dev, "set: illegal dagc %u\n", dagc);
0773 return -EINVAL;
0774 }
0775
0776 return rf69_write_reg(spi, REG_TESTDAGC, dagc_map[dagc]);
0777 }
0778
0779
0780
0781 int rf69_read_fifo(struct spi_device *spi, u8 *buffer, unsigned int size)
0782 {
0783 int i;
0784 struct spi_transfer transfer;
0785 u8 local_buffer[FIFO_SIZE + 1] = {};
0786 int retval;
0787
0788 if (size > FIFO_SIZE) {
0789 dev_dbg(&spi->dev,
0790 "read fifo: passed in buffer bigger then internal buffer\n");
0791 return -EMSGSIZE;
0792 }
0793
0794
0795 local_buffer[0] = REG_FIFO;
0796 memset(&transfer, 0, sizeof(transfer));
0797 transfer.tx_buf = local_buffer;
0798 transfer.rx_buf = local_buffer;
0799 transfer.len = size + 1;
0800
0801 retval = spi_sync_transfer(spi, &transfer, 1);
0802
0803
0804 for (i = 0; i < size; i++)
0805 dev_dbg(&spi->dev, "%d - 0x%x\n", i, local_buffer[i + 1]);
0806
0807 memcpy(buffer, &local_buffer[1], size);
0808
0809 return retval;
0810 }
0811
0812 int rf69_write_fifo(struct spi_device *spi, u8 *buffer, unsigned int size)
0813 {
0814 int i;
0815 u8 local_buffer[FIFO_SIZE + 1];
0816
0817 if (size > FIFO_SIZE) {
0818 dev_dbg(&spi->dev,
0819 "read fifo: passed in buffer bigger then internal buffer\n");
0820 return -EMSGSIZE;
0821 }
0822
0823 local_buffer[0] = REG_FIFO | WRITE_BIT;
0824 memcpy(&local_buffer[1], buffer, size);
0825
0826
0827 for (i = 0; i < size; i++)
0828 dev_dbg(&spi->dev, "%d - 0x%x\n", i, buffer[i]);
0829
0830 return spi_write(spi, local_buffer, size + 1);
0831 }
0832