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