linux/drivers/staging/pi433/rf69.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * abstraction of the spi interface of HopeRf rf69 radio module
   4 *
   5 * Copyright (C) 2016 Wolf-Entwicklungen
   6 *      Marcus Wolf <linux@wolf-entwicklungen.de>
   7 */
   8
   9/* enable prosa debug info */
  10#undef DEBUG
  11/* enable print of values on reg access */
  12#undef DEBUG_VALUES
  13/* enable print of values on fifo access */
  14#undef DEBUG_FIFO_ACCESS
  15
  16#include <linux/types.h>
  17#include <linux/spi/spi.h>
  18
  19#include "rf69.h"
  20#include "rf69_registers.h"
  21
  22#define F_OSC     32000000 /* in Hz */
  23#define FIFO_SIZE 66       /* in byte */
  24
  25/*-------------------------------------------------------------------------*/
  26
  27static u8 rf69_read_reg(struct spi_device *spi, u8 addr)
  28{
  29        int retval;
  30
  31        retval = spi_w8r8(spi, addr);
  32
  33#ifdef DEBUG_VALUES
  34        if (retval < 0)
  35                /*
  36                 * should never happen, since we already checked,
  37                 * that module is connected. Therefore no error
  38                 * handling, just an optional error message...
  39                 */
  40                dev_dbg(&spi->dev, "read 0x%x FAILED\n", addr);
  41        else
  42                dev_dbg(&spi->dev, "read 0x%x from reg 0x%x\n", retval, addr);
  43#endif
  44
  45        return retval;
  46}
  47
  48static int rf69_write_reg(struct spi_device *spi, u8 addr, u8 value)
  49{
  50        int retval;
  51        char buffer[2];
  52
  53        buffer[0] = addr | WRITE_BIT;
  54        buffer[1] = value;
  55
  56        retval = spi_write(spi, &buffer, 2);
  57
  58#ifdef DEBUG_VALUES
  59        if (retval < 0)
  60                /*
  61                 * should never happen, since we already checked,
  62                 * that module is connected. Therefore no error
  63                 * handling, just an optional error message...
  64                 */
  65                dev_dbg(&spi->dev, "write 0x%x to 0x%x FAILED\n", value, addr);
  66        else
  67                dev_dbg(&spi->dev, "wrote 0x%x to reg 0x%x\n", value, addr);
  68#endif
  69
  70        return retval;
  71}
  72
  73/*-------------------------------------------------------------------------*/
  74
  75static int rf69_set_bit(struct spi_device *spi, u8 reg, u8 mask)
  76{
  77        u8 tmp;
  78
  79        tmp = rf69_read_reg(spi, reg);
  80        tmp = tmp | mask;
  81        return rf69_write_reg(spi, reg, tmp);
  82}
  83
  84static int rf69_clear_bit(struct spi_device *spi, u8 reg, u8 mask)
  85{
  86        u8 tmp;
  87
  88        tmp = rf69_read_reg(spi, reg);
  89        tmp = tmp & ~mask;
  90        return rf69_write_reg(spi, reg, tmp);
  91}
  92
  93static inline int rf69_read_mod_write(struct spi_device *spi, u8 reg,
  94                                      u8 mask, u8 value)
  95{
  96        u8 tmp;
  97
  98        tmp = rf69_read_reg(spi, reg);
  99        tmp = (tmp & ~mask) | value;
 100        return rf69_write_reg(spi, reg, tmp);
 101}
 102
 103/*-------------------------------------------------------------------------*/
 104
 105int rf69_set_mode(struct spi_device *spi, enum mode mode)
 106{
 107        static const u8 mode_map[] = {
 108                [transmit] = OPMODE_MODE_TRANSMIT,
 109                [receive] = OPMODE_MODE_RECEIVE,
 110                [synthesizer] = OPMODE_MODE_SYNTHESIZER,
 111                [standby] = OPMODE_MODE_STANDBY,
 112                [mode_sleep] = OPMODE_MODE_SLEEP,
 113        };
 114
 115        if (unlikely(mode >= ARRAY_SIZE(mode_map))) {
 116                dev_dbg(&spi->dev, "set: illegal mode %u", mode);
 117                return -EINVAL;
 118        }
 119
 120        return rf69_read_mod_write(spi, REG_OPMODE, MASK_OPMODE_MODE,
 121                                   mode_map[mode]);
 122
 123        /*
 124         * we are using packet mode, so this check is not really needed
 125         * but waiting for mode ready is necessary when going from sleep
 126         * because the FIFO may not be immediately available from previous mode
 127         * while (_mode == RF69_MODE_SLEEP && (READ_REG(REG_IRQFLAGS1) &
 128                  RF_IRQFLAGS1_MODEREADY) == 0x00); // Wait for ModeReady
 129         */
 130}
 131
 132int rf69_set_data_mode(struct spi_device *spi, u8 data_mode)
 133{
 134        return rf69_read_mod_write(spi, REG_DATAMODUL, MASK_DATAMODUL_MODE,
 135                                   data_mode);
 136}
 137
 138int rf69_set_modulation(struct spi_device *spi, enum modulation modulation)
 139{
 140        static const u8 modulation_map[] = {
 141                [OOK] = DATAMODUL_MODULATION_TYPE_OOK,
 142                [FSK] = DATAMODUL_MODULATION_TYPE_FSK,
 143        };
 144
 145        if (unlikely(modulation >= ARRAY_SIZE(modulation_map))) {
 146                dev_dbg(&spi->dev, "set: illegal modulation %u", modulation);
 147                return -EINVAL;
 148        }
 149
 150        return rf69_read_mod_write(spi, REG_DATAMODUL,
 151                                   MASK_DATAMODUL_MODULATION_TYPE,
 152                                   modulation_map[modulation]);
 153}
 154
 155static enum modulation rf69_get_modulation(struct spi_device *spi)
 156{
 157        u8 modulation_reg;
 158
 159        modulation_reg = rf69_read_reg(spi, REG_DATAMODUL);
 160
 161        switch (modulation_reg & MASK_DATAMODUL_MODULATION_TYPE) {
 162        case DATAMODUL_MODULATION_TYPE_OOK:
 163                return OOK;
 164        case DATAMODUL_MODULATION_TYPE_FSK:
 165                return FSK;
 166        default:
 167                return UNDEF;
 168        }
 169}
 170
 171int rf69_set_modulation_shaping(struct spi_device *spi,
 172                                enum mod_shaping mod_shaping)
 173{
 174        switch (rf69_get_modulation(spi)) {
 175        case FSK:
 176                switch (mod_shaping) {
 177                case SHAPING_OFF:
 178                        return rf69_read_mod_write(spi, REG_DATAMODUL,
 179                                                   MASK_DATAMODUL_MODULATION_SHAPE,
 180                                                   DATAMODUL_MODULATION_SHAPE_NONE);
 181                case SHAPING_1_0:
 182                        return rf69_read_mod_write(spi, REG_DATAMODUL,
 183                                                   MASK_DATAMODUL_MODULATION_SHAPE,
 184                                                   DATAMODUL_MODULATION_SHAPE_1_0);
 185                case SHAPING_0_5:
 186                        return rf69_read_mod_write(spi, REG_DATAMODUL,
 187                                                   MASK_DATAMODUL_MODULATION_SHAPE,
 188                                                   DATAMODUL_MODULATION_SHAPE_0_5);
 189                case SHAPING_0_3:
 190                        return rf69_read_mod_write(spi, REG_DATAMODUL,
 191                                                   MASK_DATAMODUL_MODULATION_SHAPE,
 192                                                   DATAMODUL_MODULATION_SHAPE_0_3);
 193                default:
 194                        dev_dbg(&spi->dev, "set: illegal mod shaping for FSK %u", mod_shaping);
 195                        return -EINVAL;
 196                }
 197        case OOK:
 198                switch (mod_shaping) {
 199                case SHAPING_OFF:
 200                        return rf69_read_mod_write(spi, REG_DATAMODUL,
 201                                                   MASK_DATAMODUL_MODULATION_SHAPE,
 202                                                   DATAMODUL_MODULATION_SHAPE_NONE);
 203                case SHAPING_BR:
 204                        return rf69_read_mod_write(spi, REG_DATAMODUL,
 205                                                   MASK_DATAMODUL_MODULATION_SHAPE,
 206                                                   DATAMODUL_MODULATION_SHAPE_BR);
 207                case SHAPING_2BR:
 208                        return rf69_read_mod_write(spi, REG_DATAMODUL,
 209                                                   MASK_DATAMODUL_MODULATION_SHAPE,
 210                                                   DATAMODUL_MODULATION_SHAPE_2BR);
 211                default:
 212                        dev_dbg(&spi->dev, "set: illegal mod shaping for OOK %u", mod_shaping);
 213                        return -EINVAL;
 214                }
 215        default:
 216                dev_dbg(&spi->dev, "set: modulation undefined");
 217                return -EINVAL;
 218        }
 219}
 220
 221int rf69_set_bit_rate(struct spi_device *spi, u16 bit_rate)
 222{
 223        int retval;
 224        u32 bit_rate_min;
 225        u32 bit_rate_reg;
 226        u8 msb;
 227        u8 lsb;
 228
 229        // check input value
 230        bit_rate_min = F_OSC / 8388608; // 8388608 = 2^23;
 231        if (bit_rate < bit_rate_min) {
 232                dev_dbg(&spi->dev, "setBitRate: illegal input param");
 233                return -EINVAL;
 234        }
 235
 236        // calculate reg settings
 237        bit_rate_reg = (F_OSC / bit_rate);
 238
 239        msb = (bit_rate_reg & 0xff00) >> 8;
 240        lsb = (bit_rate_reg & 0xff);
 241
 242        // transmit to RF 69
 243        retval = rf69_write_reg(spi, REG_BITRATE_MSB, msb);
 244        if (retval)
 245                return retval;
 246        retval = rf69_write_reg(spi, REG_BITRATE_LSB, lsb);
 247        if (retval)
 248                return retval;
 249
 250        return 0;
 251}
 252
 253int rf69_set_deviation(struct spi_device *spi, u32 deviation)
 254{
 255        int retval;
 256        u64 f_reg;
 257        u64 f_step;
 258        u32 bit_rate_reg;
 259        u32 bit_rate;
 260        u8 msb;
 261        u8 lsb;
 262        u64 factor = 1000000; // to improve precision of calculation
 263
 264        // calculate bit rate
 265        bit_rate_reg = rf69_read_reg(spi, REG_BITRATE_MSB) << 8;
 266        bit_rate_reg |= rf69_read_reg(spi, REG_BITRATE_LSB);
 267        bit_rate = F_OSC / bit_rate_reg;
 268
 269        /*
 270         * frequency deviation must exceed 600 Hz but not exceed
 271         * 500kHz when taking bitrate dependency into consideration
 272         * to ensure proper modulation
 273         */
 274        if (deviation < 600 || (deviation + (bit_rate / 2)) > 500000) {
 275                dev_dbg(&spi->dev,
 276                        "set_deviation: illegal input param: %u", deviation);
 277                return -EINVAL;
 278        }
 279
 280        // calculat f step
 281        f_step = F_OSC * factor;
 282        do_div(f_step, 524288); //  524288 = 2^19
 283
 284        // calculate register settings
 285        f_reg = deviation * factor;
 286        do_div(f_reg, f_step);
 287
 288        msb = (f_reg & 0xff00) >> 8;
 289        lsb = (f_reg & 0xff);
 290
 291        // check msb
 292        if (msb & ~FDEVMASB_MASK) {
 293                dev_dbg(&spi->dev, "set_deviation: err in calc of msb");
 294                return -EINVAL;
 295        }
 296
 297        // write to chip
 298        retval = rf69_write_reg(spi, REG_FDEV_MSB, msb);
 299        if (retval)
 300                return retval;
 301        retval = rf69_write_reg(spi, REG_FDEV_LSB, lsb);
 302        if (retval)
 303                return retval;
 304
 305        return 0;
 306}
 307
 308int rf69_set_frequency(struct spi_device *spi, u32 frequency)
 309{
 310        int retval;
 311        u32 f_max;
 312        u64 f_reg;
 313        u64 f_step;
 314        u8 msb;
 315        u8 mid;
 316        u8 lsb;
 317        u64 factor = 1000000; // to improve precision of calculation
 318
 319        // calculat f step
 320        f_step = F_OSC * factor;
 321        do_div(f_step, 524288); //  524288 = 2^19
 322
 323        // check input value
 324        f_max = div_u64(f_step * 8388608, factor);
 325        if (frequency > f_max) {
 326                dev_dbg(&spi->dev, "setFrequency: illegal input param");
 327                return -EINVAL;
 328        }
 329
 330        // calculate reg settings
 331        f_reg = frequency * factor;
 332        do_div(f_reg, f_step);
 333
 334        msb = (f_reg & 0xff0000) >> 16;
 335        mid = (f_reg & 0xff00)   >>  8;
 336        lsb = (f_reg & 0xff);
 337
 338        // write to chip
 339        retval = rf69_write_reg(spi, REG_FRF_MSB, msb);
 340        if (retval)
 341                return retval;
 342        retval = rf69_write_reg(spi, REG_FRF_MID, mid);
 343        if (retval)
 344                return retval;
 345        retval = rf69_write_reg(spi, REG_FRF_LSB, lsb);
 346        if (retval)
 347                return retval;
 348
 349        return 0;
 350}
 351
 352int rf69_enable_amplifier(struct spi_device *spi, u8 amplifier_mask)
 353{
 354        return rf69_set_bit(spi, REG_PALEVEL, amplifier_mask);
 355}
 356
 357int rf69_disable_amplifier(struct spi_device *spi, u8 amplifier_mask)
 358{
 359        return rf69_clear_bit(spi, REG_PALEVEL, amplifier_mask);
 360}
 361
 362int rf69_set_output_power_level(struct spi_device *spi, u8 power_level)
 363{
 364        u8 pa_level, ocp, test_pa1, test_pa2;
 365        bool pa0, pa1, pa2, high_power;
 366        u8 min_power_level;
 367
 368        // check register pa_level
 369        pa_level = rf69_read_reg(spi, REG_PALEVEL);
 370        pa0 = pa_level & MASK_PALEVEL_PA0;
 371        pa1 = pa_level & MASK_PALEVEL_PA1;
 372        pa2 = pa_level & MASK_PALEVEL_PA2;
 373
 374        // check high power mode
 375        ocp = rf69_read_reg(spi, REG_OCP);
 376        test_pa1 = rf69_read_reg(spi, REG_TESTPA1);
 377        test_pa2 = rf69_read_reg(spi, REG_TESTPA2);
 378        high_power = (ocp == 0x0f) && (test_pa1 == 0x5d) && (test_pa2 == 0x7c);
 379
 380        if (pa0 && !pa1 && !pa2) {
 381                power_level += 18;
 382                min_power_level = 0;
 383        } else if (!pa0 && pa1 && !pa2) {
 384                power_level += 18;
 385                min_power_level = 16;
 386        } else if (!pa0 && pa1 && pa2) {
 387                if (high_power)
 388                        power_level += 11;
 389                else
 390                        power_level += 14;
 391                min_power_level = 16;
 392        } else {
 393                goto failed;
 394        }
 395
 396        // check input value
 397        if (power_level > 0x1f)
 398                goto failed;
 399
 400        if (power_level < min_power_level)
 401                goto failed;
 402
 403        // write value
 404        return rf69_read_mod_write(spi, REG_PALEVEL, MASK_PALEVEL_OUTPUT_POWER,
 405                                   power_level);
 406failed:
 407        dev_dbg(&spi->dev, "set: illegal power level %u", power_level);
 408        return -EINVAL;
 409}
 410
 411int rf69_set_pa_ramp(struct spi_device *spi, enum pa_ramp pa_ramp)
 412{
 413        static const u8 pa_ramp_map[] = {
 414                [ramp3400] = PARAMP_3400,
 415                [ramp2000] = PARAMP_2000,
 416                [ramp1000] = PARAMP_1000,
 417                [ramp500] = PARAMP_500,
 418                [ramp250] = PARAMP_250,
 419                [ramp125] = PARAMP_125,
 420                [ramp100] = PARAMP_100,
 421                [ramp62] = PARAMP_62,
 422                [ramp50] = PARAMP_50,
 423                [ramp40] = PARAMP_40,
 424                [ramp31] = PARAMP_31,
 425                [ramp25] = PARAMP_25,
 426                [ramp20] = PARAMP_20,
 427                [ramp15] = PARAMP_15,
 428                [ramp10] = PARAMP_10,
 429        };
 430
 431        if (unlikely(pa_ramp >= ARRAY_SIZE(pa_ramp_map))) {
 432                dev_dbg(&spi->dev, "set: illegal pa_ramp %u", pa_ramp);
 433                return -EINVAL;
 434        }
 435
 436        return rf69_write_reg(spi, REG_PARAMP, pa_ramp_map[pa_ramp]);
 437}
 438
 439int rf69_set_antenna_impedance(struct spi_device *spi,
 440                               enum antenna_impedance antenna_impedance)
 441{
 442        switch (antenna_impedance) {
 443        case fifty_ohm:
 444                return rf69_clear_bit(spi, REG_LNA, MASK_LNA_ZIN);
 445        case two_hundred_ohm:
 446                return rf69_set_bit(spi, REG_LNA, MASK_LNA_ZIN);
 447        default:
 448                dev_dbg(&spi->dev, "set: illegal antenna impedance %u", antenna_impedance);
 449                return -EINVAL;
 450        }
 451}
 452
 453int rf69_set_lna_gain(struct spi_device *spi, enum lna_gain lna_gain)
 454{
 455        static const u8 lna_gain_map[] = {
 456                [automatic] = LNA_GAIN_AUTO,
 457                [max] = LNA_GAIN_MAX,
 458                [max_minus_6] = LNA_GAIN_MAX_MINUS_6,
 459                [max_minus_12] = LNA_GAIN_MAX_MINUS_12,
 460                [max_minus_24] = LNA_GAIN_MAX_MINUS_24,
 461                [max_minus_36] = LNA_GAIN_MAX_MINUS_36,
 462                [max_minus_48] = LNA_GAIN_MAX_MINUS_48,
 463        };
 464
 465        if (unlikely(lna_gain >= ARRAY_SIZE(lna_gain_map))) {
 466                dev_dbg(&spi->dev, "set: illegal lna gain %u", lna_gain);
 467                return -EINVAL;
 468        }
 469
 470        return rf69_read_mod_write(spi, REG_LNA, MASK_LNA_GAIN,
 471                                   lna_gain_map[lna_gain]);
 472}
 473
 474static int rf69_set_bandwidth_intern(struct spi_device *spi, u8 reg,
 475                                     enum mantisse mantisse, u8 exponent)
 476{
 477        u8 bandwidth;
 478
 479        // check value for mantisse and exponent
 480        if (exponent > 7) {
 481                dev_dbg(&spi->dev, "set: illegal bandwidth exponent %u", exponent);
 482                return -EINVAL;
 483        }
 484
 485        if (mantisse != mantisse16 &&
 486            mantisse != mantisse20 &&
 487            mantisse != mantisse24) {
 488                dev_dbg(&spi->dev, "set: illegal bandwidth mantisse %u", mantisse);
 489                return -EINVAL;
 490        }
 491
 492        // read old value
 493        bandwidth = rf69_read_reg(spi, reg);
 494
 495        // "delete" mantisse and exponent = just keep the DCC setting
 496        bandwidth = bandwidth & MASK_BW_DCC_FREQ;
 497
 498        // add new mantisse
 499        switch (mantisse) {
 500        case mantisse16:
 501                bandwidth = bandwidth | BW_MANT_16;
 502                break;
 503        case mantisse20:
 504                bandwidth = bandwidth | BW_MANT_20;
 505                break;
 506        case mantisse24:
 507                bandwidth = bandwidth | BW_MANT_24;
 508                break;
 509        }
 510
 511        // add new exponent
 512        bandwidth = bandwidth | exponent;
 513
 514        // write back
 515        return rf69_write_reg(spi, reg, bandwidth);
 516}
 517
 518int rf69_set_bandwidth(struct spi_device *spi, enum mantisse mantisse,
 519                       u8 exponent)
 520{
 521        return rf69_set_bandwidth_intern(spi, REG_RXBW, mantisse, exponent);
 522}
 523
 524int rf69_set_bandwidth_during_afc(struct spi_device *spi,
 525                                  enum mantisse mantisse,
 526                                  u8 exponent)
 527{
 528        return rf69_set_bandwidth_intern(spi, REG_AFCBW, mantisse, exponent);
 529}
 530
 531int rf69_set_ook_threshold_dec(struct spi_device *spi,
 532                               enum threshold_decrement threshold_decrement)
 533{
 534        static const u8 td_map[] = {
 535                [dec_every8th] = OOKPEAK_THRESHDEC_EVERY_8TH,
 536                [dec_every4th] = OOKPEAK_THRESHDEC_EVERY_4TH,
 537                [dec_every2nd] = OOKPEAK_THRESHDEC_EVERY_2ND,
 538                [dec_once] = OOKPEAK_THRESHDEC_ONCE,
 539                [dec_twice] = OOKPEAK_THRESHDEC_TWICE,
 540                [dec_4times] = OOKPEAK_THRESHDEC_4_TIMES,
 541                [dec_8times] = OOKPEAK_THRESHDEC_8_TIMES,
 542                [dec_16times] = OOKPEAK_THRESHDEC_16_TIMES,
 543        };
 544
 545        if (unlikely(threshold_decrement >= ARRAY_SIZE(td_map))) {
 546                dev_dbg(&spi->dev, "set: illegal OOK threshold decrement %u", threshold_decrement);
 547                return -EINVAL;
 548        }
 549
 550        return rf69_read_mod_write(spi, REG_OOKPEAK, MASK_OOKPEAK_THRESDEC,
 551                                   td_map[threshold_decrement]);
 552}
 553
 554int rf69_set_dio_mapping(struct spi_device *spi, u8 dio_number, u8 value)
 555{
 556        u8 mask;
 557        u8 shift;
 558        u8 dio_addr;
 559        u8 dio_value;
 560
 561        switch (dio_number) {
 562        case 0:
 563                mask = MASK_DIO0;
 564                shift = SHIFT_DIO0;
 565                dio_addr = REG_DIOMAPPING1;
 566                break;
 567        case 1:
 568                mask = MASK_DIO1;
 569                shift = SHIFT_DIO1;
 570                dio_addr = REG_DIOMAPPING1;
 571                break;
 572        case 2:
 573                mask = MASK_DIO2;
 574                shift = SHIFT_DIO2;
 575                dio_addr = REG_DIOMAPPING1;
 576                break;
 577        case 3:
 578                mask = MASK_DIO3;
 579                shift = SHIFT_DIO3;
 580                dio_addr = REG_DIOMAPPING1;
 581                break;
 582        case 4:
 583                mask = MASK_DIO4;
 584                shift = SHIFT_DIO4;
 585                dio_addr = REG_DIOMAPPING2;
 586                break;
 587        case 5:
 588                mask = MASK_DIO5;
 589                shift = SHIFT_DIO5;
 590                dio_addr = REG_DIOMAPPING2;
 591                break;
 592        default:
 593                dev_dbg(&spi->dev, "set: illegal dio number %u", dio_number);
 594                return -EINVAL;
 595        }
 596
 597        // read reg
 598        dio_value = rf69_read_reg(spi, dio_addr);
 599        // delete old value
 600        dio_value = dio_value & ~mask;
 601        // add new value
 602        dio_value = dio_value | value << shift;
 603        // write back
 604        return rf69_write_reg(spi, dio_addr, dio_value);
 605}
 606
 607bool rf69_get_flag(struct spi_device *spi, enum flag flag)
 608{
 609        switch (flag) {
 610        case mode_switch_completed:
 611                return (rf69_read_reg(spi, REG_IRQFLAGS1) & MASK_IRQFLAGS1_MODE_READY);
 612        case ready_to_receive:
 613                return (rf69_read_reg(spi, REG_IRQFLAGS1) & MASK_IRQFLAGS1_RX_READY);
 614        case ready_to_send:
 615                return (rf69_read_reg(spi, REG_IRQFLAGS1) & MASK_IRQFLAGS1_TX_READY);
 616        case pll_locked:
 617                return (rf69_read_reg(spi, REG_IRQFLAGS1) & MASK_IRQFLAGS1_PLL_LOCK);
 618        case rssi_exceeded_threshold:
 619                return (rf69_read_reg(spi, REG_IRQFLAGS1) & MASK_IRQFLAGS1_RSSI);
 620        case timeout:
 621                return (rf69_read_reg(spi, REG_IRQFLAGS1) & MASK_IRQFLAGS1_TIMEOUT);
 622        case automode:
 623                return (rf69_read_reg(spi, REG_IRQFLAGS1) & MASK_IRQFLAGS1_AUTOMODE);
 624        case sync_address_match:
 625                return (rf69_read_reg(spi, REG_IRQFLAGS1) & MASK_IRQFLAGS1_SYNC_ADDRESS_MATCH);
 626        case fifo_full:
 627                return (rf69_read_reg(spi, REG_IRQFLAGS2) & MASK_IRQFLAGS2_FIFO_FULL);
 628/*
 629 *      case fifo_not_empty:
 630 *              return (rf69_read_reg(spi, REG_IRQFLAGS2) & MASK_IRQFLAGS2_FIFO_NOT_EMPTY);
 631 */
 632        case fifo_empty:
 633                return !(rf69_read_reg(spi, REG_IRQFLAGS2) & MASK_IRQFLAGS2_FIFO_NOT_EMPTY);
 634        case fifo_level_below_threshold:
 635                return (rf69_read_reg(spi, REG_IRQFLAGS2) & MASK_IRQFLAGS2_FIFO_LEVEL);
 636        case fifo_overrun:
 637                return (rf69_read_reg(spi, REG_IRQFLAGS2) & MASK_IRQFLAGS2_FIFO_OVERRUN);
 638        case packet_sent:
 639                return (rf69_read_reg(spi, REG_IRQFLAGS2) & MASK_IRQFLAGS2_PACKET_SENT);
 640        case payload_ready:
 641                return (rf69_read_reg(spi, REG_IRQFLAGS2) & MASK_IRQFLAGS2_PAYLOAD_READY);
 642        case crc_ok:
 643                return (rf69_read_reg(spi, REG_IRQFLAGS2) & MASK_IRQFLAGS2_CRC_OK);
 644        case battery_low:
 645                return (rf69_read_reg(spi, REG_IRQFLAGS2) & MASK_IRQFLAGS2_LOW_BAT);
 646        default:                         return false;
 647        }
 648}
 649
 650int rf69_set_rssi_threshold(struct spi_device *spi, u8 threshold)
 651{
 652        /* no value check needed - u8 exactly matches register size */
 653
 654        return rf69_write_reg(spi, REG_RSSITHRESH, threshold);
 655}
 656
 657int rf69_set_preamble_length(struct spi_device *spi, u16 preamble_length)
 658{
 659        int retval;
 660        u8 msb, lsb;
 661
 662        /* no value check needed - u16 exactly matches register size */
 663
 664        /* calculate reg settings */
 665        msb = (preamble_length & 0xff00) >> 8;
 666        lsb = (preamble_length & 0xff);
 667
 668        /* transmit to chip */
 669        retval = rf69_write_reg(spi, REG_PREAMBLE_MSB, msb);
 670        if (retval)
 671                return retval;
 672        return rf69_write_reg(spi, REG_PREAMBLE_LSB, lsb);
 673}
 674
 675int rf69_enable_sync(struct spi_device *spi)
 676{
 677        return rf69_set_bit(spi, REG_SYNC_CONFIG, MASK_SYNC_CONFIG_SYNC_ON);
 678}
 679
 680int rf69_disable_sync(struct spi_device *spi)
 681{
 682        return rf69_clear_bit(spi, REG_SYNC_CONFIG, MASK_SYNC_CONFIG_SYNC_ON);
 683}
 684
 685int rf69_set_fifo_fill_condition(struct spi_device *spi,
 686                                 enum fifo_fill_condition fifo_fill_condition)
 687{
 688        switch (fifo_fill_condition) {
 689        case always:
 690                return rf69_set_bit(spi, REG_SYNC_CONFIG,
 691                                    MASK_SYNC_CONFIG_FIFO_FILL_CONDITION);
 692        case after_sync_interrupt:
 693                return rf69_clear_bit(spi, REG_SYNC_CONFIG,
 694                                      MASK_SYNC_CONFIG_FIFO_FILL_CONDITION);
 695        default:
 696                dev_dbg(&spi->dev, "set: illegal fifo fill condition %u", fifo_fill_condition);
 697                return -EINVAL;
 698        }
 699}
 700
 701int rf69_set_sync_size(struct spi_device *spi, u8 sync_size)
 702{
 703        // check input value
 704        if (sync_size > 0x07) {
 705                dev_dbg(&spi->dev, "set: illegal sync size %u", sync_size);
 706                return -EINVAL;
 707        }
 708
 709        // write value
 710        return rf69_read_mod_write(spi, REG_SYNC_CONFIG,
 711                                   MASK_SYNC_CONFIG_SYNC_SIZE,
 712                                   (sync_size << 3));
 713}
 714
 715int rf69_set_sync_values(struct spi_device *spi, u8 sync_values[8])
 716{
 717        int retval = 0;
 718
 719        retval += rf69_write_reg(spi, REG_SYNCVALUE1, sync_values[0]);
 720        retval += rf69_write_reg(spi, REG_SYNCVALUE2, sync_values[1]);
 721        retval += rf69_write_reg(spi, REG_SYNCVALUE3, sync_values[2]);
 722        retval += rf69_write_reg(spi, REG_SYNCVALUE4, sync_values[3]);
 723        retval += rf69_write_reg(spi, REG_SYNCVALUE5, sync_values[4]);
 724        retval += rf69_write_reg(spi, REG_SYNCVALUE6, sync_values[5]);
 725        retval += rf69_write_reg(spi, REG_SYNCVALUE7, sync_values[6]);
 726        retval += rf69_write_reg(spi, REG_SYNCVALUE8, sync_values[7]);
 727
 728        return retval;
 729}
 730
 731int rf69_set_packet_format(struct spi_device *spi,
 732                           enum packet_format packet_format)
 733{
 734        switch (packet_format) {
 735        case packet_length_var:
 736                return rf69_set_bit(spi, REG_PACKETCONFIG1,
 737                                    MASK_PACKETCONFIG1_PACKET_FORMAT_VARIABLE);
 738        case packet_length_fix:
 739                return rf69_clear_bit(spi, REG_PACKETCONFIG1,
 740                                      MASK_PACKETCONFIG1_PACKET_FORMAT_VARIABLE);
 741        default:
 742                dev_dbg(&spi->dev, "set: illegal packet format %u", packet_format);
 743                return -EINVAL;
 744        }
 745}
 746
 747int rf69_enable_crc(struct spi_device *spi)
 748{
 749        return rf69_set_bit(spi, REG_PACKETCONFIG1, MASK_PACKETCONFIG1_CRC_ON);
 750}
 751
 752int rf69_disable_crc(struct spi_device *spi)
 753{
 754        return rf69_clear_bit(spi, REG_PACKETCONFIG1, MASK_PACKETCONFIG1_CRC_ON);
 755}
 756
 757int rf69_set_address_filtering(struct spi_device *spi,
 758                               enum address_filtering address_filtering)
 759{
 760        static const u8 af_map[] = {
 761                [filtering_off] = PACKETCONFIG1_ADDRESSFILTERING_OFF,
 762                [node_address] = PACKETCONFIG1_ADDRESSFILTERING_NODE,
 763                [node_or_broadcast_address] =
 764                        PACKETCONFIG1_ADDRESSFILTERING_NODEBROADCAST,
 765        };
 766
 767        if (unlikely(address_filtering >= ARRAY_SIZE(af_map))) {
 768                dev_dbg(&spi->dev, "set: illegal address filtering %u", address_filtering);
 769                return -EINVAL;
 770        }
 771
 772        return rf69_read_mod_write(spi, REG_PACKETCONFIG1,
 773                                   MASK_PACKETCONFIG1_ADDRESSFILTERING,
 774                                   af_map[address_filtering]);
 775}
 776
 777int rf69_set_payload_length(struct spi_device *spi, u8 payload_length)
 778{
 779        return rf69_write_reg(spi, REG_PAYLOAD_LENGTH, payload_length);
 780}
 781
 782int rf69_set_node_address(struct spi_device *spi, u8 node_address)
 783{
 784        return rf69_write_reg(spi, REG_NODEADRS, node_address);
 785}
 786
 787int rf69_set_broadcast_address(struct spi_device *spi, u8 broadcast_address)
 788{
 789        return rf69_write_reg(spi, REG_BROADCASTADRS, broadcast_address);
 790}
 791
 792int rf69_set_tx_start_condition(struct spi_device *spi,
 793                                enum tx_start_condition tx_start_condition)
 794{
 795        switch (tx_start_condition) {
 796        case fifo_level:
 797                return rf69_clear_bit(spi, REG_FIFO_THRESH,
 798                                      MASK_FIFO_THRESH_TXSTART);
 799        case fifo_not_empty:
 800                return rf69_set_bit(spi, REG_FIFO_THRESH,
 801                                    MASK_FIFO_THRESH_TXSTART);
 802        default:
 803                dev_dbg(&spi->dev, "set: illegal tx start condition %u", tx_start_condition);
 804                return -EINVAL;
 805        }
 806}
 807
 808int rf69_set_fifo_threshold(struct spi_device *spi, u8 threshold)
 809{
 810        int retval;
 811
 812        /* check input value */
 813        if (threshold & 0x80) {
 814                dev_dbg(&spi->dev, "set: illegal fifo threshold %u", threshold);
 815                return -EINVAL;
 816        }
 817
 818        /* write value */
 819        retval = rf69_read_mod_write(spi, REG_FIFO_THRESH,
 820                                     MASK_FIFO_THRESH_VALUE,
 821                                     threshold);
 822        if (retval)
 823                return retval;
 824
 825        /*
 826         * access the fifo to activate new threshold
 827         * retval (mis-) used as buffer here
 828         */
 829        return rf69_read_fifo(spi, (u8 *)&retval, 1);
 830}
 831
 832int rf69_set_dagc(struct spi_device *spi, enum dagc dagc)
 833{
 834        static const u8 dagc_map[] = {
 835                [normal_mode] = DAGC_NORMAL,
 836                [improve] = DAGC_IMPROVED_LOWBETA0,
 837                [improve_for_low_modulation_index] = DAGC_IMPROVED_LOWBETA1,
 838        };
 839
 840        if (unlikely(dagc >= ARRAY_SIZE(dagc_map))) {
 841                dev_dbg(&spi->dev, "set: illegal dagc %u", dagc);
 842                return -EINVAL;
 843        }
 844
 845        return rf69_write_reg(spi, REG_TESTDAGC, dagc_map[dagc]);
 846}
 847
 848/*-------------------------------------------------------------------------*/
 849
 850int rf69_read_fifo(struct spi_device *spi, u8 *buffer, unsigned int size)
 851{
 852#ifdef DEBUG_FIFO_ACCESS
 853        int i;
 854#endif
 855        struct spi_transfer transfer;
 856        u8 local_buffer[FIFO_SIZE + 1];
 857        int retval;
 858
 859        if (size > FIFO_SIZE) {
 860                dev_dbg(&spi->dev,
 861                        "read fifo: passed in buffer bigger then internal buffer\n");
 862                return -EMSGSIZE;
 863        }
 864
 865        /* prepare a bidirectional transfer */
 866        local_buffer[0] = REG_FIFO;
 867        memset(&transfer, 0, sizeof(transfer));
 868        transfer.tx_buf = local_buffer;
 869        transfer.rx_buf = local_buffer;
 870        transfer.len    = size + 1;
 871
 872        retval = spi_sync_transfer(spi, &transfer, 1);
 873
 874#ifdef DEBUG_FIFO_ACCESS
 875        for (i = 0; i < size; i++)
 876                dev_dbg(&spi->dev, "%d - 0x%x\n", i, local_buffer[i + 1]);
 877#endif
 878
 879        memcpy(buffer, &local_buffer[1], size);
 880
 881        return retval;
 882}
 883
 884int rf69_write_fifo(struct spi_device *spi, u8 *buffer, unsigned int size)
 885{
 886#ifdef DEBUG_FIFO_ACCESS
 887        int i;
 888#endif
 889        u8 local_buffer[FIFO_SIZE + 1];
 890
 891        if (size > FIFO_SIZE) {
 892                dev_dbg(&spi->dev,
 893                        "read fifo: passed in buffer bigger then internal buffer\n");
 894                return -EMSGSIZE;
 895        }
 896
 897        local_buffer[0] = REG_FIFO | WRITE_BIT;
 898        memcpy(&local_buffer[1], buffer, size);
 899
 900#ifdef DEBUG_FIFO_ACCESS
 901        for (i = 0; i < size; i++)
 902                dev_dbg(&spi->dev, "0x%x\n", buffer[i]);
 903#endif
 904
 905        return spi_write(spi, local_buffer, size + 1);
 906}
 907
 908