Loading...
Searching...
No Matches
at86rf2xx.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2015 Freie Universität Berlin
3 * SPDX-License-Identifier: LGPL-2.1-only
4 */
5
6#pragma once
7
27
28#include <stdint.h>
29#include <stdbool.h>
30
31#include "board.h"
32#include "kernel_defines.h"
33#include "net/netdev.h"
35#include "net/gnrc/nettype.h"
36
37/* we need no peripherals for memory mapped radios */
38#if !defined(MODULE_AT86RFA1) && !defined(MODULE_AT86RFR2)
39#include "periph/spi.h"
40#include "periph/gpio.h"
41#endif
42
43#ifdef __cplusplus
44extern "C" {
45#endif
46
50#define AT86RF2XX_MAX_PKT_LENGTH (IEEE802154_FRAME_LEN_MAX)
51
56#ifdef MODULE_AT86RF212B
57/* the AT86RF212B has a sub-1GHz radio */
58#define AT86RF2XX_MIN_CHANNEL (IEEE802154_CHANNEL_MIN_SUBGHZ)
59#define AT86RF2XX_MAX_CHANNEL (IEEE802154_CHANNEL_MAX_SUBGHZ)
60#define AT86RF2XX_DEFAULT_CHANNEL (CONFIG_IEEE802154_DEFAULT_SUBGHZ_CHANNEL)
61/* Page 2 is O-QPSK 100 kbit/s (channel 0), or 250 kbit/s (channels 1-10) */
62#define AT86RF2XX_DEFAULT_PAGE (CONFIG_IEEE802154_DEFAULT_SUBGHZ_PAGE)
63#else
64#define AT86RF2XX_MIN_CHANNEL (IEEE802154_CHANNEL_MIN)
65#define AT86RF2XX_MAX_CHANNEL (IEEE802154_CHANNEL_MAX)
66#define AT86RF2XX_DEFAULT_CHANNEL (CONFIG_IEEE802154_DEFAULT_CHANNEL)
67#define AT86RF2XX_DEFAULT_PAGE (0)
68/* Only page 0 is supported in the 2.4 GHz band */
69#endif
71
75#define AT86RF2XX_DEFAULT_TXPOWER (CONFIG_IEEE802154_DEFAULT_TXPOWER)
76
80#if MODULE_AT86RF233
81# define RSSI_BASE_VAL (-94)
82#elif MODULE_AT86RF212B
87# define RSSI_BASE_VAL (-98)
88#elif MODULE_AT86RFA1 || MODULE_AT86RFR2
89# define RSSI_BASE_VAL (-90)
90#else
91# define RSSI_BASE_VAL (-91)
92#endif
93
97#if MODULE_AT86RF233
98# define MIN_RX_SENSITIVITY (-101)
99#elif MODULE_AT86RF212B
100# define MIN_RX_SENSITIVITY (-110)
101#elif MODULE_AT86RFA1 || MODULE_AT86RFR2
102# define MIN_RX_SENSITIVITY (-100)
103#else
104# define MIN_RX_SENSITIVITY (-101)
105#endif
106
110#if IS_USED(MODULE_AT86RFA1) || IS_USED(MODULE_AT86RFR2)
111#define AT86RF2XX_IS_PERIPH (1)
112#else
113#define AT86RF2XX_IS_PERIPH (0)
114#endif
115
119#if defined(MODULE_AT86RF231) || IS_ACTIVE(AT86RF2XX_PERIPH)
120#define AT86RF2XX_HAVE_ED_REGISTER (1)
121#else
122#define AT86RF2XX_HAVE_ED_REGISTER (0)
123#endif
124
128#ifdef MODULE_AT86RF212B
129#define AT86RF2XX_HAVE_SUBGHZ (1)
130#else
131#define AT86RF2XX_HAVE_SUBGHZ (0)
132#endif
133
134#if defined(DOXYGEN) || defined(MODULE_AT86RF232) || defined(MODULE_AT86RF233) || defined(MODULE_AT86RFR2)
141#define AT86RF2XX_HAVE_RETRIES (1)
142#else
143#define AT86RF2XX_HAVE_RETRIES (0)
144#endif
145
152#if AT86RF2XX_HAVE_RETRIES && defined(AT86RF2XX_REG__XAH_CTRL_2)
153#define AT86RF2XX_HAVE_RETRIES_REG (1)
154#else
155#define AT86RF2XX_HAVE_RETRIES_REG (0)
156#endif
157
161#ifdef AT86RF2XX_REG__IRQ_MASK1
162#define AT86RF2XX_HAVE_TX_START_IRQ (1)
163#else
164#define AT86RF2XX_HAVE_TX_START_IRQ (0)
165#endif
166
174#if defined(MODULE_AT86RF233) || defined(MODULE_AT86RF231) || defined(MODULE_AT86RFA1) || defined(MODULE_AT86RFR2)
175#ifndef AT86RF2XX_RANDOM_NUMBER_GENERATOR
176#define AT86RF2XX_RANDOM_NUMBER_GENERATOR (1)
177#endif
178#else
179#ifndef AT86RF2XX_RANDOM_NUMBER_GENERATOR
180#define AT86RF2XX_RANDOM_NUMBER_GENERATOR (0)
181#endif
182#endif
183
192#if defined(MODULE_AT86RF233) || defined(MODULE_AT86RFR2)
193#ifndef AT86RF2XX_SMART_IDLE_LISTENING
194#define AT86RF2XX_SMART_IDLE_LISTENING (1)
195#endif
196#else
197#define AT86RF2XX_SMART_IDLE_LISTENING (0)
198#endif
199
204#define AT86RF2XX_STATE_P_ON (0x00)
205#define AT86RF2XX_STATE_BUSY_RX (0x01)
206#define AT86RF2XX_STATE_BUSY_TX (0x02)
207#define AT86RF2XX_STATE_FORCE_TRX_OFF (0x03)
208#define AT86RF2XX_STATE_RX_ON (0x06)
209#define AT86RF2XX_STATE_TRX_OFF (0x08)
210#define AT86RF2XX_STATE_PLL_ON (0x09)
211#define AT86RF2XX_STATE_SLEEP (0x0f)
212#define AT86RF2XX_STATE_BUSY_RX_AACK (0x11)
213#define AT86RF2XX_STATE_BUSY_TX_ARET (0x12)
214#define AT86RF2XX_STATE_RX_AACK_ON (0x16)
215#define AT86RF2XX_STATE_TX_ARET_ON (0x19)
216#define AT86RF2XX_STATE_IN_PROGRESS (0x1f)
218
223#define AT86RF2XX_OPT_CSMA (0x0010)
224#define AT86RF2XX_OPT_PROMISCUOUS (0x0020)
225#define AT86RF2XX_OPT_PRELOADING (0x0040)
226#define AT86RF2XX_OPT_AUTOACK (0x0080)
227#define AT86RF2XX_OPT_ACK_PENDING (0x0100)
228
230
231#if IS_ACTIVE(AT86RF2XX_BASIC_MODE) || defined(DOXYGEN)
235#define AT86RF2XX_PHY_STATE_RX AT86RF2XX_STATE_RX_ON
239#define AT86RF2XX_PHY_STATE_RX_BUSY AT86RF2XX_STATE_BUSY_RX
243#define AT86RF2XX_PHY_STATE_TX AT86RF2XX_STATE_PLL_ON
247#define AT86RF2XX_PHY_STATE_TX_BUSY AT86RF2XX_STATE_BUSY_TX
248#else
249#define AT86RF2XX_PHY_STATE_RX AT86RF2XX_STATE_RX_AACK_ON
250#define AT86RF2XX_PHY_STATE_RX_BUSY AT86RF2XX_STATE_BUSY_RX_AACK
251#define AT86RF2XX_PHY_STATE_TX AT86RF2XX_STATE_TX_ARET_ON
252#define AT86RF2XX_PHY_STATE_TX_BUSY AT86RF2XX_STATE_BUSY_TX_ARET
253#endif /* IS_ACTIVE(AT86RF2XX_BASIC_MODE) */
254
255#if AT86RF2XX_IS_PERIPH
259typedef void at86rf2xx_params_t;
260#else
272#endif
273
279typedef struct {
281#if AT86RF2XX_IS_PERIPH
282 /* ATmega256rfr2 signals transceiver events with different interrupts
283 * they have to be stored to mimic the same flow as external transceiver
284 * Use irq_status to map saved interrupts of SOC transceiver,
285 * as they clear after IRQ callback.
286 *
287 * irq_status = IRQ_STATUS
288 */
289 uint8_t irq_status;
290#else
291 /* device specific fields */
293#endif
294 uint16_t flags;
295 uint8_t state;
296 uint8_t tx_frame_len;
297#ifdef MODULE_AT86RF212B
298 /* Only AT86RF212B supports multiple pages (PHY modes) */
299 uint8_t page;
300#endif
301 uint8_t idle_state;
302 uint8_t pending_tx;
305#if AT86RF2XX_HAVE_RETRIES
306 /* Only radios with the XAH_CTRL_2 register support frame retry reporting */
307 int8_t tx_retries;
308#endif
310
319void at86rf2xx_setup(at86rf2xx_t *dev, const at86rf2xx_params_t *params, uint8_t index);
320
327
335
343
351
360
375int at86rf2xx_set_rate(at86rf2xx_t *dev, uint8_t rate);
376
383void at86rf2xx_set_pan(at86rf2xx_t *dev, uint16_t pan);
384
397void at86rf2xx_set_txpower(const at86rf2xx_t *dev, int16_t txpower, uint8_t channel);
398
407
419void at86rf2xx_set_rxsensitivity(const at86rf2xx_t *dev, int8_t rxsens);
420
429
440void at86rf2xx_set_max_retries(const at86rf2xx_t *dev, uint8_t max);
441
450
462void at86rf2xx_set_csma_max_retries(const at86rf2xx_t *dev, int8_t retries);
463
475 uint8_t min, uint8_t max);
476
483void at86rf2xx_set_csma_seed(const at86rf2xx_t *dev, const uint8_t entropy[2]);
484
493
500void at86rf2xx_set_cca_threshold(const at86rf2xx_t *dev, int8_t value);
501
510
518void at86rf2xx_set_option(at86rf2xx_t *dev, uint16_t option, bool state);
519
528uint8_t at86rf2xx_set_state(at86rf2xx_t *dev, uint8_t state);
529
539
550size_t at86rf2xx_tx_load(at86rf2xx_t *dev, const uint8_t *data,
551 size_t len, size_t offset);
552
559
571
581
589
590#ifdef __cplusplus
591}
592#endif
593
spi_clk_t
Definition periph_cpu.h:348
be_uint16_t network_uint16_t
A 16 bit integer in network byte order.
Definition byteorder.h:107
Definitions for netdev common IEEE 802.15.4 code.
Definitions low-level network driver interface.
Low-level GPIO peripheral driver interface definitions.
int at86rf2xx_set_rate(at86rf2xx_t *dev, uint8_t rate)
Set the current O-QPSK rate mode of the PHY rate modes > 0 are proprietary.
void at86rf2xx_reset(at86rf2xx_t *dev)
Trigger a hardware reset and configure radio with default values.
int8_t at86rf2xx_get_cca_threshold(const at86rf2xx_t *dev)
Get the CCA threshold value.
void at86rf2xx_disable_smart_idle(at86rf2xx_t *dev)
Disable the smart receive technology (SRT)
void at86rf2xx_tx_prepare(at86rf2xx_t *dev)
Prepare for sending of data.
void at86rf2xx_set_pan(at86rf2xx_t *dev, uint16_t pan)
Set the PAN ID of the given device.
bool at86rf2xx_cca(at86rf2xx_t *dev)
Perform one manual channel clear assessment (CCA)
size_t at86rf2xx_tx_load(at86rf2xx_t *dev, const uint8_t *data, size_t len, size_t offset)
Load chunks of data into the transmit buffer of the given device.
void at86rf2xx_set_cca_threshold(const at86rf2xx_t *dev, int8_t value)
Set the CCA threshold value.
void at86rf2xx_tx_exec(at86rf2xx_t *dev)
Trigger sending of data previously loaded into transmit buffer.
void at86rf2xx_set_addr_long(at86rf2xx_t *dev, const eui64_t *addr)
Set the long address of the given device.
void at86rf2xx_set_csma_max_retries(const at86rf2xx_t *dev, int8_t retries)
Set the maximum number of channel access attempts per frame (CSMA)
uint8_t at86rf2xx_get_rate(at86rf2xx_t *dev)
Get the current O-QPSK rate mode of the PHY.
void at86rf2xx_set_csma_seed(const at86rf2xx_t *dev, const uint8_t entropy[2])
Set seed for CSMA random backoff.
uint8_t at86rf2xx_get_phy_mode(at86rf2xx_t *dev)
Get the PHY mode of the given device.
uint8_t at86rf2xx_set_state(at86rf2xx_t *dev, uint8_t state)
Set the state of the given device (trigger a state change)
void at86rf2xx_setup(at86rf2xx_t *dev, const at86rf2xx_params_t *params, uint8_t index)
Setup an AT86RF2xx based device state.
int8_t at86rf2xx_get_rxsensitivity(const at86rf2xx_t *dev)
Get the configured receiver sensitivity of the given device [in dBm].
uint8_t at86rf2xx_get_csma_max_retries(const at86rf2xx_t *dev)
Get the maximum number of channel access attempts per frame (CSMA)
struct at86rf2xx_params at86rf2xx_params_t
struct holding all params needed for device initialization
void at86rf2xx_enable_smart_idle(at86rf2xx_t *dev)
Enable the smart receive technology (SRT)
void at86rf2xx_set_max_retries(const at86rf2xx_t *dev, uint8_t max)
Set the maximum number of retransmissions.
void at86rf2xx_set_csma_backoff_exp(const at86rf2xx_t *dev, uint8_t min, uint8_t max)
Set the min and max backoff exponent for CSMA/CA.
void at86rf2xx_set_option(at86rf2xx_t *dev, uint16_t option, bool state)
Enable or disable driver specific options.
uint8_t at86rf2xx_get_max_retries(const at86rf2xx_t *dev)
Get the maximum number of retransmissions.
void at86rf2xx_set_addr_short(at86rf2xx_t *dev, const network_uint16_t *addr)
Set the short address of the given device.
void at86rf2xx_set_txpower(const at86rf2xx_t *dev, int16_t txpower, uint8_t channel)
Set the transmission power of the given device [in dBm].
void at86rf2xx_set_rxsensitivity(const at86rf2xx_t *dev, int8_t rxsens)
Set the receiver sensitivity of the given device [in dBm].
int8_t at86rf2xx_get_ed_level(at86rf2xx_t *dev)
Get the latest ED level measurement.
gpio_t spi_cs_t
Chip select pin type overlaps with gpio_t so it can be casted to this.
Definition spi.h:157
Common macros and compiler attributes/pragmas configuration.
Protocol type definitions.
Low-level SPI peripheral driver interface definition.
struct holding all params needed for device initialization
Definition at86rf2xx.h:264
spi_t spi
SPI bus the device is connected to.
Definition at86rf2xx.h:265
spi_cs_t cs_pin
GPIO pin connected to chip select.
Definition at86rf2xx.h:267
gpio_t reset_pin
GPIO pin connected to the reset pin.
Definition at86rf2xx.h:270
gpio_t sleep_pin
GPIO pin connected to the sleep pin.
Definition at86rf2xx.h:269
gpio_t int_pin
GPIO pin connected to the interrupt pin.
Definition at86rf2xx.h:268
spi_clk_t spi_clk
SPI clock speed to use.
Definition at86rf2xx.h:266
Device descriptor for AT86RF2XX radio devices.
Definition at86rf2xx.h:279
uint8_t pending_tx
keep track of pending TX calls this is required to know when to return to at86rf2xx_t::idle_state
Definition at86rf2xx.h:302
uint8_t tx_frame_len
length of the current TX frame
Definition at86rf2xx.h:296
netdev_ieee802154_t netdev
netdev parent struct
Definition at86rf2xx.h:280
uint8_t idle_state
state to return to after sending
Definition at86rf2xx.h:301
uint8_t state
current state of the radio
Definition at86rf2xx.h:295
at86rf2xx_params_t params
parameters for initialization
Definition at86rf2xx.h:292
uint16_t flags
Device specific flags.
Definition at86rf2xx.h:294
Extended structure to hold IEEE 802.15.4 driver state.
Definition ieee802154.h:97
uint8_t page
channel page
Definition ieee802154.h:123
Data type to represent an EUI-64.
Definition eui64.h:55