2 * abstraction of the spi interface of HopeRf rf69 radio module
4 * Copyright (C) 2016 Wolf-Entwicklungen
5 * Marcus Wolf <linux@wolf-entwicklungen.de>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
18 /* enable prosa debug info */
20 /* enable print of values on reg access */
22 /* enable print of values on fifo access */
23 #undef DEBUG_FIFO_ACCESS
25 #include <linux/types.h>
26 #include <linux/spi/spi.h>
29 #include "rf69_registers.h"
31 #define F_OSC 32000000 /* in Hz */
32 #define FIFO_SIZE 66 /* in byte */
34 /*-------------------------------------------------------------------------*/
36 #define READ_REG(x) rf69_read_reg (spi, x)
37 #define WRITE_REG(x, y) rf69_write_reg(spi, x, y)
39 /*-------------------------------------------------------------------------*/
41 int rf69_set_mode(struct spi_device
*spi
, enum mode mode
)
44 dev_dbg(&spi
->dev
, "set: mode");
48 case transmit
: return WRITE_REG(REG_OPMODE
, (READ_REG(REG_OPMODE
) & ~MASK_OPMODE_MODE
) | OPMODE_MODE_TRANSMIT
);
49 case receive
: return WRITE_REG(REG_OPMODE
, (READ_REG(REG_OPMODE
) & ~MASK_OPMODE_MODE
) | OPMODE_MODE_RECEIVE
);
50 case synthesizer
: return WRITE_REG(REG_OPMODE
, (READ_REG(REG_OPMODE
) & ~MASK_OPMODE_MODE
) | OPMODE_MODE_SYNTHESIZER
);
51 case standby
: return WRITE_REG(REG_OPMODE
, (READ_REG(REG_OPMODE
) & ~MASK_OPMODE_MODE
) | OPMODE_MODE_STANDBY
);
52 case mode_sleep
: return WRITE_REG(REG_OPMODE
, (READ_REG(REG_OPMODE
) & ~MASK_OPMODE_MODE
) | OPMODE_MODE_SLEEP
);
54 dev_dbg(&spi
->dev
, "set: illegal input param");
58 // we are using packet mode, so this check is not really needed
59 // but waiting for mode ready is necessary when going from sleep because the FIFO may not be immediately available from previous mode
60 //while (_mode == RF69_MODE_SLEEP && (READ_REG(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00); // Wait for ModeReady
64 int rf69_set_data_mode(struct spi_device
*spi
, enum dataMode dataMode
)
67 dev_dbg(&spi
->dev
, "set: data mode");
71 case packet
: return WRITE_REG(REG_DATAMODUL
, (READ_REG(REG_DATAMODUL
) & ~MASK_DATAMODUL_MODE
) | DATAMODUL_MODE_PACKET
);
72 case continuous
: return WRITE_REG(REG_DATAMODUL
, (READ_REG(REG_DATAMODUL
) & ~MASK_DATAMODUL_MODE
) | DATAMODUL_MODE_CONTINUOUS
);
73 case continuousNoSync
: return WRITE_REG(REG_DATAMODUL
, (READ_REG(REG_DATAMODUL
) & ~MASK_DATAMODUL_MODE
) | DATAMODUL_MODE_CONTINUOUS_NOSYNC
);
75 dev_dbg(&spi
->dev
, "set: illegal input param");
80 int rf69_set_modulation(struct spi_device
*spi
, enum modulation modulation
)
83 dev_dbg(&spi
->dev
, "set: modulation");
87 case OOK
: return WRITE_REG(REG_DATAMODUL
, (READ_REG(REG_DATAMODUL
) & ~MASK_DATAMODUL_MODULATION_TYPE
) | DATAMODUL_MODULATION_TYPE_OOK
);
88 case FSK
: return WRITE_REG(REG_DATAMODUL
, (READ_REG(REG_DATAMODUL
) & ~MASK_DATAMODUL_MODULATION_TYPE
) | DATAMODUL_MODULATION_TYPE_FSK
);
90 dev_dbg(&spi
->dev
, "set: illegal input param");
95 enum modulation
rf69_get_modulation(struct spi_device
*spi
)
100 dev_dbg(&spi
->dev
, "get: mode");
103 currentValue
= READ_REG(REG_DATAMODUL
);
105 switch (currentValue
& MASK_DATAMODUL_MODULATION_TYPE
>> 3) { // TODO improvement: change 3 to define
106 case DATAMODUL_MODULATION_TYPE_OOK
: return OOK
;
107 case DATAMODUL_MODULATION_TYPE_FSK
: return FSK
;
108 default: return undefined
;
112 int rf69_set_modulation_shaping(struct spi_device
*spi
, enum modShaping modShaping
)
115 dev_dbg(&spi
->dev
, "set: mod shaping");
118 if (rf69_get_modulation(spi
) == FSK
) {
119 switch (modShaping
) {
120 case shapingOff
: return WRITE_REG(REG_DATAMODUL
, (READ_REG(REG_DATAMODUL
) & ~MASK_DATAMODUL_MODULATION_SHAPE
) | DATAMODUL_MODULATION_SHAPE_NONE
);
121 case shaping1_0
: return WRITE_REG(REG_DATAMODUL
, (READ_REG(REG_DATAMODUL
) & ~MASK_DATAMODUL_MODULATION_SHAPE
) | DATAMODUL_MODULATION_SHAPE_1_0
);
122 case shaping0_5
: return WRITE_REG(REG_DATAMODUL
, (READ_REG(REG_DATAMODUL
) & ~MASK_DATAMODUL_MODULATION_SHAPE
) | DATAMODUL_MODULATION_SHAPE_0_3
);
123 case shaping0_3
: return WRITE_REG(REG_DATAMODUL
, (READ_REG(REG_DATAMODUL
) & ~MASK_DATAMODUL_MODULATION_SHAPE
) | DATAMODUL_MODULATION_SHAPE_0_5
);
125 dev_dbg(&spi
->dev
, "set: illegal input param");
129 switch (modShaping
) {
130 case shapingOff
: return WRITE_REG(REG_DATAMODUL
, (READ_REG(REG_DATAMODUL
) & ~MASK_DATAMODUL_MODULATION_SHAPE
) | DATAMODUL_MODULATION_SHAPE_NONE
);
131 case shapingBR
: return WRITE_REG(REG_DATAMODUL
, (READ_REG(REG_DATAMODUL
) & ~MASK_DATAMODUL_MODULATION_SHAPE
) | DATAMODUL_MODULATION_SHAPE_BR
);
132 case shaping2BR
: return WRITE_REG(REG_DATAMODUL
, (READ_REG(REG_DATAMODUL
) & ~MASK_DATAMODUL_MODULATION_SHAPE
) | DATAMODUL_MODULATION_SHAPE_2BR
);
134 dev_dbg(&spi
->dev
, "set: illegal input param");
140 int rf69_set_bit_rate(struct spi_device
*spi
, u16 bitRate
)
149 dev_dbg(&spi
->dev
, "set: bit rate");
153 bitRate_min
= F_OSC
/ 8388608; // 8388608 = 2^23;
154 if (bitRate
< bitRate_min
) {
155 dev_dbg(&spi
->dev
, "setBitRate: illegal input param");
159 // calculate reg settings
160 bitRate_reg
= (F_OSC
/ bitRate
);
162 msb
= (bitRate_reg
&0xff00) >> 8;
163 lsb
= (bitRate_reg
&0xff);
166 retval
= WRITE_REG(REG_BITRATE_MSB
, msb
);
170 retval
= WRITE_REG(REG_BITRATE_LSB
, lsb
);
177 int rf69_set_deviation(struct spi_device
*spi
, u32 deviation
)
180 // u32 f_max; TODO: Abhängigkeit von Bitrate beachten!!
185 u64 factor
= 1000000; // to improve precision of calculation
188 dev_dbg(&spi
->dev
, "set: deviation");
191 if (deviation
< 600 || deviation
> 500000) { //TODO: Abhängigkeit von Bitrate beachten!!
192 dev_dbg(&spi
->dev
, "set_deviation: illegal input param");
197 f_step
= F_OSC
* factor
;
198 do_div(f_step
, 524288); // 524288 = 2^19
200 // calculate register settings
201 f_reg
= deviation
* factor
;
202 do_div(f_reg
, f_step
);
204 msb
= (f_reg
&0xff00) >> 8;
208 if (msb
& ~FDEVMASB_MASK
) {
209 dev_dbg(&spi
->dev
, "set_deviation: err in calc of msb");
214 retval
= WRITE_REG(REG_FDEV_MSB
, msb
);
218 retval
= WRITE_REG(REG_FDEV_LSB
, lsb
);
225 int rf69_set_frequency(struct spi_device
*spi
, u32 frequency
)
234 u64 factor
= 1000000; // to improve precision of calculation
237 dev_dbg(&spi
->dev
, "set: frequency");
241 f_step
= F_OSC
* factor
;
242 do_div(f_step
, 524288); // 524288 = 2^19
245 f_max
= div_u64(f_step
* 8388608, factor
);
246 if (frequency
> f_max
) {
247 dev_dbg(&spi
->dev
, "setFrequency: illegal input param");
251 // calculate reg settings
252 f_reg
= frequency
* factor
;
253 do_div(f_reg
, f_step
);
255 msb
= (f_reg
&0xff0000) >> 16;
256 mid
= (f_reg
&0xff00) >> 8;
260 retval
= WRITE_REG(REG_FRF_MSB
, msb
);
264 retval
= WRITE_REG(REG_FRF_MID
, mid
);
268 retval
= WRITE_REG(REG_FRF_LSB
, lsb
);
275 int rf69_set_amplifier_0(struct spi_device
*spi
, enum optionOnOff optionOnOff
)
278 dev_dbg(&spi
->dev
, "set: amp #0");
281 switch (optionOnOff
) {
282 case optionOn
: return WRITE_REG(REG_PALEVEL
, (READ_REG(REG_PALEVEL
) | MASK_PALEVEL_PA0
));
283 case optionOff
: return WRITE_REG(REG_PALEVEL
, (READ_REG(REG_PALEVEL
) & ~MASK_PALEVEL_PA0
));
285 dev_dbg(&spi
->dev
, "set: illegal input param");
290 int rf69_set_amplifier_1(struct spi_device
*spi
, enum optionOnOff optionOnOff
)
293 dev_dbg(&spi
->dev
, "set: amp #1");
296 switch (optionOnOff
) {
297 case optionOn
: return WRITE_REG(REG_PALEVEL
, (READ_REG(REG_PALEVEL
) | MASK_PALEVEL_PA1
));
298 case optionOff
: return WRITE_REG(REG_PALEVEL
, (READ_REG(REG_PALEVEL
) & ~MASK_PALEVEL_PA1
));
300 dev_dbg(&spi
->dev
, "set: illegal input param");
305 int rf69_set_amplifier_2(struct spi_device
*spi
, enum optionOnOff optionOnOff
)
308 dev_dbg(&spi
->dev
, "set: amp #2");
311 switch (optionOnOff
) {
312 case optionOn
: return WRITE_REG(REG_PALEVEL
, (READ_REG(REG_PALEVEL
) | MASK_PALEVEL_PA2
));
313 case optionOff
: return WRITE_REG(REG_PALEVEL
, (READ_REG(REG_PALEVEL
) & ~MASK_PALEVEL_PA2
));
315 dev_dbg(&spi
->dev
, "set: illegal input param");
320 int rf69_set_output_power_level(struct spi_device
*spi
, u8 powerLevel
)
323 dev_dbg(&spi
->dev
, "set: power level");
326 powerLevel
+= 18; // TODO Abhängigkeit von PA0,1,2 setting
329 if (powerLevel
> 0x1f) {
330 dev_dbg(&spi
->dev
, "set: illegal input param");
335 return WRITE_REG(REG_PALEVEL
, (READ_REG(REG_PALEVEL
) & ~MASK_PALEVEL_OUTPUT_POWER
) | powerLevel
);
338 int rf69_set_pa_ramp(struct spi_device
*spi
, enum paRamp paRamp
)
341 dev_dbg(&spi
->dev
, "set: pa ramp");
345 case ramp3400
: return WRITE_REG(REG_PARAMP
, PARAMP_3400
);
346 case ramp2000
: return WRITE_REG(REG_PARAMP
, PARAMP_2000
);
347 case ramp1000
: return WRITE_REG(REG_PARAMP
, PARAMP_1000
);
348 case ramp500
: return WRITE_REG(REG_PARAMP
, PARAMP_500
);
349 case ramp250
: return WRITE_REG(REG_PARAMP
, PARAMP_250
);
350 case ramp125
: return WRITE_REG(REG_PARAMP
, PARAMP_125
);
351 case ramp100
: return WRITE_REG(REG_PARAMP
, PARAMP_100
);
352 case ramp62
: return WRITE_REG(REG_PARAMP
, PARAMP_62
);
353 case ramp50
: return WRITE_REG(REG_PARAMP
, PARAMP_50
);
354 case ramp40
: return WRITE_REG(REG_PARAMP
, PARAMP_40
);
355 case ramp31
: return WRITE_REG(REG_PARAMP
, PARAMP_31
);
356 case ramp25
: return WRITE_REG(REG_PARAMP
, PARAMP_25
);
357 case ramp20
: return WRITE_REG(REG_PARAMP
, PARAMP_20
);
358 case ramp15
: return WRITE_REG(REG_PARAMP
, PARAMP_15
);
359 case ramp12
: return WRITE_REG(REG_PARAMP
, PARAMP_12
);
360 case ramp10
: return WRITE_REG(REG_PARAMP
, PARAMP_10
);
362 dev_dbg(&spi
->dev
, "set: illegal input param");
367 int rf69_set_antenna_impedance(struct spi_device
*spi
, enum antennaImpedance antennaImpedance
)
370 dev_dbg(&spi
->dev
, "set: antenna impedance");
373 switch (antennaImpedance
) {
374 case fiftyOhm
: return WRITE_REG(REG_LNA
, (READ_REG(REG_LNA
) & ~MASK_LNA_ZIN
));
375 case twohundretOhm
: return WRITE_REG(REG_LNA
, (READ_REG(REG_LNA
) | MASK_LNA_ZIN
));
377 dev_dbg(&spi
->dev
, "set: illegal input param");
382 int rf69_set_lna_gain(struct spi_device
*spi
, enum lnaGain lnaGain
)
385 dev_dbg(&spi
->dev
, "set: lna gain");
389 case automatic
: return WRITE_REG(REG_LNA
, ((READ_REG(REG_LNA
) & ~MASK_LNA_GAIN
) & LNA_GAIN_AUTO
));
390 case max
: return WRITE_REG(REG_LNA
, ((READ_REG(REG_LNA
) & ~MASK_LNA_GAIN
) & LNA_GAIN_MAX
));
391 case maxMinus6
: return WRITE_REG(REG_LNA
, ((READ_REG(REG_LNA
) & ~MASK_LNA_GAIN
) & LNA_GAIN_MAX_MINUS_6
));
392 case maxMinus12
: return WRITE_REG(REG_LNA
, ((READ_REG(REG_LNA
) & ~MASK_LNA_GAIN
) & LNA_GAIN_MAX_MINUS_12
));
393 case maxMinus24
: return WRITE_REG(REG_LNA
, ((READ_REG(REG_LNA
) & ~MASK_LNA_GAIN
) & LNA_GAIN_MAX_MINUS_24
));
394 case maxMinus36
: return WRITE_REG(REG_LNA
, ((READ_REG(REG_LNA
) & ~MASK_LNA_GAIN
) & LNA_GAIN_MAX_MINUS_36
));
395 case maxMinus48
: return WRITE_REG(REG_LNA
, ((READ_REG(REG_LNA
) & ~MASK_LNA_GAIN
) & LNA_GAIN_MAX_MINUS_48
));
397 dev_dbg(&spi
->dev
, "set: illegal input param");
402 enum lnaGain
rf69_get_lna_gain(struct spi_device
*spi
)
407 dev_dbg(&spi
->dev
, "get: lna gain");
410 currentValue
= READ_REG(REG_LNA
);
412 switch (currentValue
& MASK_LNA_CURRENT_GAIN
>> 3) { // improvement: change 3 to define
413 case LNA_GAIN_AUTO
: return automatic
;
414 case LNA_GAIN_MAX
: return max
;
415 case LNA_GAIN_MAX_MINUS_6
: return maxMinus6
;
416 case LNA_GAIN_MAX_MINUS_12
: return maxMinus12
;
417 case LNA_GAIN_MAX_MINUS_24
: return maxMinus24
;
418 case LNA_GAIN_MAX_MINUS_36
: return maxMinus36
;
419 case LNA_GAIN_MAX_MINUS_48
: return maxMinus48
;
420 default: return undefined
;
424 int rf69_set_dc_cut_off_frequency_intern(struct spi_device
*spi
, u8 reg
, enum dccPercent dccPercent
)
426 switch (dccPercent
) {
427 case dcc16Percent
: return WRITE_REG(reg
, ((READ_REG(reg
) & ~MASK_BW_DCC_FREQ
) | BW_DCC_16_PERCENT
));
428 case dcc8Percent
: return WRITE_REG(reg
, ((READ_REG(reg
) & ~MASK_BW_DCC_FREQ
) | BW_DCC_8_PERCENT
));
429 case dcc4Percent
: return WRITE_REG(reg
, ((READ_REG(reg
) & ~MASK_BW_DCC_FREQ
) | BW_DCC_4_PERCENT
));
430 case dcc2Percent
: return WRITE_REG(reg
, ((READ_REG(reg
) & ~MASK_BW_DCC_FREQ
) | BW_DCC_2_PERCENT
));
431 case dcc1Percent
: return WRITE_REG(reg
, ((READ_REG(reg
) & ~MASK_BW_DCC_FREQ
) | BW_DCC_1_PERCENT
));
432 case dcc0_5Percent
: return WRITE_REG(reg
, ((READ_REG(reg
) & ~MASK_BW_DCC_FREQ
) | BW_DCC_0_5_PERCENT
));
433 case dcc0_25Percent
: return WRITE_REG(reg
, ((READ_REG(reg
) & ~MASK_BW_DCC_FREQ
) | BW_DCC_0_25_PERCENT
));
434 case dcc0_125Percent
: return WRITE_REG(reg
, ((READ_REG(reg
) & ~MASK_BW_DCC_FREQ
) | BW_DCC_0_125_PERCENT
));
436 dev_dbg(&spi
->dev
, "set: illegal input param");
441 int rf69_set_dc_cut_off_frequency(struct spi_device
*spi
, enum dccPercent dccPercent
)
444 dev_dbg(&spi
->dev
, "set: cut off freq");
447 return rf69_set_dc_cut_off_frequency_intern(spi
, REG_RXBW
, dccPercent
);
450 int rf69_set_dc_cut_off_frequency_during_afc(struct spi_device
*spi
, enum dccPercent dccPercent
)
453 dev_dbg(&spi
->dev
, "set: cut off freq during afc");
456 return rf69_set_dc_cut_off_frequency_intern(spi
, REG_AFCBW
, dccPercent
);
459 static int rf69_set_bandwidth_intern(struct spi_device
*spi
, u8 reg
,
460 enum mantisse mantisse
, u8 exponent
)
464 // check value for mantisse and exponent
466 dev_dbg(&spi
->dev
, "set: illegal input param");
470 if ((mantisse
!= mantisse16
) &&
471 (mantisse
!= mantisse20
) &&
472 (mantisse
!= mantisse24
)) {
473 dev_dbg(&spi
->dev
, "set: illegal input param");
478 newValue
= READ_REG(reg
);
480 // "delete" mantisse and exponent = just keep the DCC setting
481 newValue
= newValue
& MASK_BW_DCC_FREQ
;
486 newValue
= newValue
| BW_MANT_16
;
489 newValue
= newValue
| BW_MANT_20
;
492 newValue
= newValue
| BW_MANT_24
;
497 newValue
= newValue
| exponent
;
500 return WRITE_REG(reg
, newValue
);
503 int rf69_set_bandwidth(struct spi_device
*spi
, enum mantisse mantisse
, u8 exponent
)
506 dev_dbg(&spi
->dev
, "set: band width");
509 return rf69_set_bandwidth_intern(spi
, REG_RXBW
, mantisse
, exponent
);
512 int rf69_set_bandwidth_during_afc(struct spi_device
*spi
, enum mantisse mantisse
, u8 exponent
)
515 dev_dbg(&spi
->dev
, "set: band width during afc");
518 return rf69_set_bandwidth_intern(spi
, REG_AFCBW
, mantisse
, exponent
);
521 int rf69_set_ook_threshold_type(struct spi_device
*spi
, enum thresholdType thresholdType
)
524 dev_dbg(&spi
->dev
, "set: threshold type");
527 switch (thresholdType
) {
528 case fixed
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESTYPE
) | OOKPEAK_THRESHTYPE_FIXED
));
529 case peak
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESTYPE
) | OOKPEAK_THRESHTYPE_PEAK
));
530 case average
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESTYPE
) | OOKPEAK_THRESHTYPE_AVERAGE
));
532 dev_dbg(&spi
->dev
, "set: illegal input param");
537 int rf69_set_ook_threshold_step(struct spi_device
*spi
, enum thresholdStep thresholdStep
)
540 dev_dbg(&spi
->dev
, "set: threshold step");
543 switch (thresholdStep
) {
544 case step_0_5db
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESSTEP
) | OOKPEAK_THRESHSTEP_0_5_DB
));
545 case step_1_0db
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESSTEP
) | OOKPEAK_THRESHSTEP_1_0_DB
));
546 case step_1_5db
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESSTEP
) | OOKPEAK_THRESHSTEP_1_5_DB
));
547 case step_2_0db
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESSTEP
) | OOKPEAK_THRESHSTEP_2_0_DB
));
548 case step_3_0db
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESSTEP
) | OOKPEAK_THRESHSTEP_3_0_DB
));
549 case step_4_0db
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESSTEP
) | OOKPEAK_THRESHSTEP_4_0_DB
));
550 case step_5_0db
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESSTEP
) | OOKPEAK_THRESHSTEP_5_0_DB
));
551 case step_6_0db
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESSTEP
) | OOKPEAK_THRESHSTEP_6_0_DB
));
553 dev_dbg(&spi
->dev
, "set: illegal input param");
558 int rf69_set_ook_threshold_dec(struct spi_device
*spi
, enum thresholdDecrement thresholdDecrement
)
561 dev_dbg(&spi
->dev
, "set: threshold decrement");
564 switch (thresholdDecrement
) {
565 case dec_every8th
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESDEC
) | OOKPEAK_THRESHDEC_EVERY_8TH
));
566 case dec_every4th
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESDEC
) | OOKPEAK_THRESHDEC_EVERY_4TH
));
567 case dec_every2nd
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESDEC
) | OOKPEAK_THRESHDEC_EVERY_2ND
));
568 case dec_once
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESDEC
) | OOKPEAK_THRESHDEC_ONCE
));
569 case dec_twice
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESDEC
) | OOKPEAK_THRESHDEC_TWICE
));
570 case dec_4times
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESDEC
) | OOKPEAK_THRESHDEC_4_TIMES
));
571 case dec_8times
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESDEC
) | OOKPEAK_THRESHDEC_8_TIMES
));
572 case dec_16times
: return WRITE_REG(REG_OOKPEAK
, ((READ_REG(REG_OOKPEAK
) & ~MASK_OOKPEAK_THRESDEC
) | OOKPEAK_THRESHDEC_16_TIMES
));
574 dev_dbg(&spi
->dev
, "set: illegal input param");
579 int rf69_set_dio_mapping(struct spi_device
*spi
, u8 DIONumber
, u8 value
)
587 dev_dbg(&spi
->dev
, "set: DIO mapping");
592 mask
= MASK_DIO0
; shift
= SHIFT_DIO0
; regaddr
= REG_DIOMAPPING1
;
595 mask
= MASK_DIO1
; shift
= SHIFT_DIO1
; regaddr
= REG_DIOMAPPING1
;
598 mask
= MASK_DIO2
; shift
= SHIFT_DIO2
; regaddr
= REG_DIOMAPPING1
;
601 mask
= MASK_DIO3
; shift
= SHIFT_DIO3
; regaddr
= REG_DIOMAPPING1
;
604 mask
= MASK_DIO4
; shift
= SHIFT_DIO4
; regaddr
= REG_DIOMAPPING2
;
607 mask
= MASK_DIO5
; shift
= SHIFT_DIO5
; regaddr
= REG_DIOMAPPING2
;
610 dev_dbg(&spi
->dev
, "set: illegal input param");
615 regValue
= READ_REG(regaddr
);
617 regValue
= regValue
& ~mask
;
619 regValue
= regValue
| value
<< shift
;
621 return WRITE_REG(regaddr
, regValue
);
624 bool rf69_get_flag(struct spi_device
*spi
, enum flag flag
)
627 dev_dbg(&spi
->dev
, "get: flag");
631 case modeSwitchCompleted
: return (READ_REG(REG_IRQFLAGS1
) & MASK_IRQFLAGS1_MODE_READY
);
632 case readyToReceive
: return (READ_REG(REG_IRQFLAGS1
) & MASK_IRQFLAGS1_RX_READY
);
633 case readyToSend
: return (READ_REG(REG_IRQFLAGS1
) & MASK_IRQFLAGS1_TX_READY
);
634 case pllLocked
: return (READ_REG(REG_IRQFLAGS1
) & MASK_IRQFLAGS1_PLL_LOCK
);
635 case rssiExceededThreshold
: return (READ_REG(REG_IRQFLAGS1
) & MASK_IRQFLAGS1_RSSI
);
636 case timeout
: return (READ_REG(REG_IRQFLAGS1
) & MASK_IRQFLAGS1_TIMEOUT
);
637 case automode
: return (READ_REG(REG_IRQFLAGS1
) & MASK_IRQFLAGS1_AUTOMODE
);
638 case syncAddressMatch
: return (READ_REG(REG_IRQFLAGS1
) & MASK_IRQFLAGS1_SYNC_ADDRESS_MATCH
);
639 case fifoFull
: return (READ_REG(REG_IRQFLAGS2
) & MASK_IRQFLAGS2_FIFO_FULL
);
640 /* case fifoNotEmpty: return (READ_REG(REG_IRQFLAGS2) & MASK_IRQFLAGS2_FIFO_NOT_EMPTY); */
641 case fifoEmpty
: return !(READ_REG(REG_IRQFLAGS2
) & MASK_IRQFLAGS2_FIFO_NOT_EMPTY
);
642 case fifoLevelBelowThreshold
: return (READ_REG(REG_IRQFLAGS2
) & MASK_IRQFLAGS2_FIFO_LEVEL
);
643 case fifoOverrun
: return (READ_REG(REG_IRQFLAGS2
) & MASK_IRQFLAGS2_FIFO_OVERRUN
);
644 case packetSent
: return (READ_REG(REG_IRQFLAGS2
) & MASK_IRQFLAGS2_PACKET_SENT
);
645 case payloadReady
: return (READ_REG(REG_IRQFLAGS2
) & MASK_IRQFLAGS2_PAYLOAD_READY
);
646 case crcOk
: return (READ_REG(REG_IRQFLAGS2
) & MASK_IRQFLAGS2_CRC_OK
);
647 case batteryLow
: return (READ_REG(REG_IRQFLAGS2
) & MASK_IRQFLAGS2_LOW_BAT
);
648 default: return false;
652 int rf69_reset_flag(struct spi_device
*spi
, enum flag flag
)
655 dev_dbg(&spi
->dev
, "reset: flag");
659 case rssiExceededThreshold
: return WRITE_REG(REG_IRQFLAGS1
, MASK_IRQFLAGS1_RSSI
);
660 case syncAddressMatch
: return WRITE_REG(REG_IRQFLAGS1
, MASK_IRQFLAGS1_SYNC_ADDRESS_MATCH
);
661 case fifoOverrun
: return WRITE_REG(REG_IRQFLAGS2
, MASK_IRQFLAGS2_FIFO_OVERRUN
);
663 dev_dbg(&spi
->dev
, "set: illegal input param");
668 int rf69_set_rssi_threshold(struct spi_device
*spi
, u8 threshold
)
671 dev_dbg(&spi
->dev
, "set: rssi threshold");
674 /* no value check needed - u8 exactly matches register size */
676 return WRITE_REG(REG_RSSITHRESH
, threshold
);
679 int rf69_set_rx_start_timeout(struct spi_device
*spi
, u8 timeout
)
682 dev_dbg(&spi
->dev
, "set: start timeout");
685 /* no value check needed - u8 exactly matches register size */
687 return WRITE_REG(REG_RXTIMEOUT1
, timeout
);
690 int rf69_set_rssi_timeout(struct spi_device
*spi
, u8 timeout
)
693 dev_dbg(&spi
->dev
, "set: rssi timeout");
696 /* no value check needed - u8 exactly matches register size */
698 return WRITE_REG(REG_RXTIMEOUT2
, timeout
);
701 int rf69_set_preamble_length(struct spi_device
*spi
, u16 preambleLength
)
707 dev_dbg(&spi
->dev
, "set: preamble length");
710 /* no value check needed - u16 exactly matches register size */
712 /* calculate reg settings */
713 msb
= (preambleLength
&0xff00) >> 8;
714 lsb
= (preambleLength
&0xff);
716 /* transmit to chip */
717 retval
= WRITE_REG(REG_PREAMBLE_MSB
, msb
);
720 return WRITE_REG(REG_PREAMBLE_LSB
, lsb
);
723 int rf69_set_sync_enable(struct spi_device
*spi
, enum optionOnOff optionOnOff
)
726 dev_dbg(&spi
->dev
, "set: sync enable");
729 switch (optionOnOff
) {
730 case optionOn
: return WRITE_REG(REG_SYNC_CONFIG
, (READ_REG(REG_SYNC_CONFIG
) | MASK_SYNC_CONFIG_SYNC_ON
));
731 case optionOff
: return WRITE_REG(REG_SYNC_CONFIG
, (READ_REG(REG_SYNC_CONFIG
) & ~MASK_SYNC_CONFIG_SYNC_ON
));
733 dev_dbg(&spi
->dev
, "set: illegal input param");
738 int rf69_set_fifo_fill_condition(struct spi_device
*spi
, enum fifoFillCondition fifoFillCondition
)
741 dev_dbg(&spi
->dev
, "set: fifo fill condition");
744 switch (fifoFillCondition
) {
745 case always
: return WRITE_REG(REG_SYNC_CONFIG
, (READ_REG(REG_SYNC_CONFIG
) | MASK_SYNC_CONFIG_FIFO_FILL_CONDITION
));
746 case afterSyncInterrupt
: return WRITE_REG(REG_SYNC_CONFIG
, (READ_REG(REG_SYNC_CONFIG
) & ~MASK_SYNC_CONFIG_FIFO_FILL_CONDITION
));
748 dev_dbg(&spi
->dev
, "set: illegal input param");
753 int rf69_set_sync_size(struct spi_device
*spi
, u8 syncSize
)
756 dev_dbg(&spi
->dev
, "set: sync size");
760 if (syncSize
> 0x07) {
761 dev_dbg(&spi
->dev
, "set: illegal input param");
766 return WRITE_REG(REG_SYNC_CONFIG
, (READ_REG(REG_SYNC_CONFIG
) & ~MASK_SYNC_CONFIG_SYNC_SIZE
) | (syncSize
<< 3));
769 int rf69_set_sync_tolerance(struct spi_device
*spi
, u8 syncTolerance
)
772 dev_dbg(&spi
->dev
, "set: sync tolerance");
776 if (syncTolerance
> 0x07) {
777 dev_dbg(&spi
->dev
, "set: illegal input param");
782 return WRITE_REG(REG_SYNC_CONFIG
, (READ_REG(REG_SYNC_CONFIG
) & ~MASK_SYNC_CONFIG_SYNC_SIZE
) | syncTolerance
);
785 int rf69_set_sync_values(struct spi_device
*spi
, u8 syncValues
[8])
790 dev_dbg(&spi
->dev
, "set: sync values");
793 retval
+= WRITE_REG(REG_SYNCVALUE1
, syncValues
[0]);
794 retval
+= WRITE_REG(REG_SYNCVALUE2
, syncValues
[1]);
795 retval
+= WRITE_REG(REG_SYNCVALUE3
, syncValues
[2]);
796 retval
+= WRITE_REG(REG_SYNCVALUE4
, syncValues
[3]);
797 retval
+= WRITE_REG(REG_SYNCVALUE5
, syncValues
[4]);
798 retval
+= WRITE_REG(REG_SYNCVALUE6
, syncValues
[5]);
799 retval
+= WRITE_REG(REG_SYNCVALUE7
, syncValues
[6]);
800 retval
+= WRITE_REG(REG_SYNCVALUE8
, syncValues
[7]);
805 int rf69_set_packet_format(struct spi_device
*spi
, enum packetFormat packetFormat
)
808 dev_dbg(&spi
->dev
, "set: packet format");
811 switch (packetFormat
) {
812 case packetLengthVar
: return WRITE_REG(REG_PACKETCONFIG1
, (READ_REG(REG_PACKETCONFIG1
) | MASK_PACKETCONFIG1_PAKET_FORMAT_VARIABLE
));
813 case packetLengthFix
: return WRITE_REG(REG_PACKETCONFIG1
, (READ_REG(REG_PACKETCONFIG1
) & ~MASK_PACKETCONFIG1_PAKET_FORMAT_VARIABLE
));
815 dev_dbg(&spi
->dev
, "set: illegal input param");
820 int rf69_set_crc_enable(struct spi_device
*spi
, enum optionOnOff optionOnOff
)
823 dev_dbg(&spi
->dev
, "set: crc enable");
826 switch (optionOnOff
) {
827 case optionOn
: return WRITE_REG(REG_PACKETCONFIG1
, (READ_REG(REG_PACKETCONFIG1
) | MASK_PACKETCONFIG1_CRC_ON
));
828 case optionOff
: return WRITE_REG(REG_PACKETCONFIG1
, (READ_REG(REG_PACKETCONFIG1
) & ~MASK_PACKETCONFIG1_CRC_ON
));
830 dev_dbg(&spi
->dev
, "set: illegal input param");
835 int rf69_set_adressFiltering(struct spi_device
*spi
, enum addressFiltering addressFiltering
)
838 dev_dbg(&spi
->dev
, "set: address filtering");
841 switch (addressFiltering
) {
842 case filteringOff
: return WRITE_REG(REG_PACKETCONFIG1
, ((READ_REG(REG_PACKETCONFIG1
) & ~MASK_PACKETCONFIG1_ADDRESSFILTERING
) | PACKETCONFIG1_ADDRESSFILTERING_OFF
));
843 case nodeAddress
: return WRITE_REG(REG_PACKETCONFIG1
, ((READ_REG(REG_PACKETCONFIG1
) & ~MASK_PACKETCONFIG1_ADDRESSFILTERING
) | PACKETCONFIG1_ADDRESSFILTERING_NODE
));
844 case nodeOrBroadcastAddress
: return WRITE_REG(REG_PACKETCONFIG1
, ((READ_REG(REG_PACKETCONFIG1
) & ~MASK_PACKETCONFIG1_ADDRESSFILTERING
) | PACKETCONFIG1_ADDRESSFILTERING_NODEBROADCAST
));
846 dev_dbg(&spi
->dev
, "set: illegal input param");
851 int rf69_set_payload_length(struct spi_device
*spi
, u8 payloadLength
)
854 dev_dbg(&spi
->dev
, "set: payload length");
857 return WRITE_REG(REG_PAYLOAD_LENGTH
, payloadLength
);
860 u8
rf69_get_payload_length(struct spi_device
*spi
)
863 dev_dbg(&spi
->dev
, "get: payload length");
866 return (u8
) READ_REG(REG_PAYLOAD_LENGTH
);
869 int rf69_set_node_address(struct spi_device
*spi
, u8 nodeAddress
)
872 dev_dbg(&spi
->dev
, "set: node address");
875 return WRITE_REG(REG_NODEADRS
, nodeAddress
);
878 int rf69_set_broadcast_address(struct spi_device
*spi
, u8 broadcastAddress
)
881 dev_dbg(&spi
->dev
, "set: broadcast address");
884 return WRITE_REG(REG_BROADCASTADRS
, broadcastAddress
);
887 int rf69_set_tx_start_condition(struct spi_device
*spi
, enum txStartCondition txStartCondition
)
890 dev_dbg(&spi
->dev
, "set: start condition");
893 switch (txStartCondition
) {
894 case fifoLevel
: return WRITE_REG(REG_FIFO_THRESH
, (READ_REG(REG_FIFO_THRESH
) & ~MASK_FIFO_THRESH_TXSTART
));
895 case fifoNotEmpty
: return WRITE_REG(REG_FIFO_THRESH
, (READ_REG(REG_FIFO_THRESH
) | MASK_FIFO_THRESH_TXSTART
));
897 dev_dbg(&spi
->dev
, "set: illegal input param");
902 int rf69_set_fifo_threshold(struct spi_device
*spi
, u8 threshold
)
907 dev_dbg(&spi
->dev
, "set: fifo threshold");
911 if (threshold
& 0x80) {
912 dev_dbg(&spi
->dev
, "set: illegal input param");
917 retval
= WRITE_REG(REG_FIFO_THRESH
, (READ_REG(REG_FIFO_THRESH
) & ~MASK_FIFO_THRESH_VALUE
) | threshold
);
921 // access the fifo to activate new threshold
922 return rf69_read_fifo(spi
, (u8
*)&retval
, 1); // retval used as buffer
925 int rf69_set_dagc(struct spi_device
*spi
, enum dagc dagc
)
928 dev_dbg(&spi
->dev
, "set: dagc");
932 case normalMode
: return WRITE_REG(REG_TESTDAGC
, DAGC_NORMAL
);
933 case improve
: return WRITE_REG(REG_TESTDAGC
, DAGC_IMPROVED_LOWBETA0
);
934 case improve4LowModulationIndex
: return WRITE_REG(REG_TESTDAGC
, DAGC_IMPROVED_LOWBETA1
);
936 dev_dbg(&spi
->dev
, "set: illegal input param");
941 /*-------------------------------------------------------------------------*/
943 int rf69_read_fifo (struct spi_device
*spi
, u8
*buffer
, unsigned int size
)
945 #ifdef DEBUG_FIFO_ACCESS
948 struct spi_transfer transfer
;
949 u8 local_buffer
[FIFO_SIZE
+ 1];
952 if (size
> FIFO_SIZE
) {
954 dev_dbg(&spi
->dev
, "read fifo: passed in buffer bigger then internal buffer \n");
959 /* prepare a bidirectional transfer */
960 local_buffer
[0] = REG_FIFO
;
961 memset(&transfer
, 0, sizeof(transfer
));
962 transfer
.tx_buf
= local_buffer
;
963 transfer
.rx_buf
= local_buffer
;
964 transfer
.len
= size
+1;
966 retval
= spi_sync_transfer(spi
, &transfer
, 1);
968 #ifdef DEBUG_FIFO_ACCESS
969 for (i
= 0; i
< size
; i
++)
970 dev_dbg(&spi
->dev
, "%d - 0x%x\n", i
, local_buffer
[i
+1]);
973 memcpy(buffer
, &local_buffer
[1], size
); // TODO: ohne memcopy wäre schöner
978 int rf69_write_fifo(struct spi_device
*spi
, u8
*buffer
, unsigned int size
)
980 #ifdef DEBUG_FIFO_ACCESS
983 char spi_address
= REG_FIFO
| WRITE_BIT
;
984 u8 local_buffer
[FIFO_SIZE
+ 1];
986 if (size
> FIFO_SIZE
) {
988 dev_dbg(&spi
->dev
, "read fifo: passed in buffer bigger then internal buffer \n");
993 local_buffer
[0] = spi_address
;
994 memcpy(&local_buffer
[1], buffer
, size
); // TODO: ohne memcopy wäre schöner
996 #ifdef DEBUG_FIFO_ACCESS
997 for (i
= 0; i
< size
; i
++)
998 dev_dbg(&spi
->dev
, "0x%x\n", buffer
[i
]);
1001 return spi_write (spi
, local_buffer
, size
+ 1);
1004 /*-------------------------------------------------------------------------*/
1006 u8
rf69_read_reg(struct spi_device
*spi
, u8 addr
)
1010 retval
= spi_w8r8(spi
, addr
);
1014 /* should never happen, since we already checked,
1015 * that module is connected. Therefore no error
1016 * handling, just an optional error message...
1018 dev_dbg(&spi
->dev
, "read 0x%x FAILED\n",
1021 dev_dbg(&spi
->dev
, "read 0x%x from reg 0x%x\n",
1029 int rf69_write_reg(struct spi_device
*spi
, u8 addr
, u8 value
)
1034 buffer
[0] = addr
| WRITE_BIT
;
1037 retval
= spi_write(spi
, &buffer
, 2);
1041 /* should never happen, since we already checked,
1042 * that module is connected. Therefore no error
1043 * handling, just an optional error message...
1045 dev_dbg(&spi
->dev
, "write 0x%x to 0x%x FAILED\n",
1049 dev_dbg(&spi
->dev
, "wrote 0x%x to reg 0x%x\n",