58#define LOG_MODULE "AT86RF215"
59#define LOG_LEVEL AT86RF215_LOG_LEVEL
68#if AT86RF215_FREQUENCY_BAND == FREQ_BAND_24GHZ
71 #define RG_RFn_STATE RG_RF24_STATE
72 #define RG_RFn_CMD RG_RF24_CMD
75 #define RG_RFn_IRQS RG_RF24_IRQS
76 #define RG_BBCn_IRQS RG_BBC1_IRQS
79 #define RG_BBCn_FBRXS RG_BBC1_FBRXS
80 #define RG_BBCn_FBRXE RG_BBC1_FBRXE
81 #define RG_BBCn_FBTXS RG_BBC1_FBTXS
82 #define RG_BBCn_FBTXE RG_BBC1_FBTXE
85 #define RG_BBCn_RXFLL RG_BBC1_RXFLL
86 #define RG_BBCn_RXFLH RG_BBC1_RXFLH
87 #define RG_BBCn_TXFLL RG_BBC1_TXFLL
88 #define RG_BBCn_TXFLH RG_BBC1_TXFLH
91 #define SR_BBCn_FCSOK SR_BBC1_FCSOK
92 #define SR_BBCn_FCSFE SR_BBC1_FCSFE
93 #define SR_BBCn_TXAFCS SR_BBC1_TXAFCS
94 #define SR_BBCn_FCST SR_BBC1_FCST
95 #define SR_BBCn_BBEN SR_BBC1_BBEN
98 #define RG_RFn_EDV RG_RF24_EDV
99 #define RG_RFn_RSSI RG_RF24_RSSI
102 #define SR_RFn_TXPWR SR_RF24_TXPWR
105 #define RG_BBCn_PS RG_BBC1_PS
108 #define RG_BBCn_AFC0 RG_BBC1_AFC0
109 #define RG_BBCn_MACPID0F0 RG_BBC1_MACPID0F0
110 #define RG_BBCn_MACPID1F0 RG_BBC1_MACPID1F0
111 #define RG_BBCn_MACSHA0F0 RG_BBC1_MACSHA0F0
112 #define RG_BBCn_MACSHA1F0 RG_BBC1_MACSHA1F0
113 #define RG_BBCn_MACEA0 RG_BBC1_MACEA0
116 #define RG_RFn_EDC RG_RF24_EDC
119 #define RG_BBCn_AMAACKTL RG_BBC1_AMAACKTL
120 #define RG_BBCn_AMAACKTH RG_BBC1_AMAACKTH
121 #define SR_BBCn_AACK SR_BBC1_AACK
124#error "SUB GHZ band not tested yet!"
144volatile static at86rf215_flags_t
flags;
150static uint8_t radio_mode_frame_filter = 0;
151static uint8_t radio_mode_aack = 0;
152static uint8_t radio_mode_poll_mode = 0;
157static void set_frame_filtering(uint8_t enable);
158static void set_poll_mode(uint8_t enable);
159static void set_send_on_cca(uint8_t enable);
160static void set_cca_threshold(uint8_t threshold);
161static uint8_t get_cca_threshold(
void);
162static void set_pan_ID(uint16_t pan);
163static uint16_t get_pan_ID(
void);
164static void set_short_addr(uint16_t
addr);
165static uint16_t get_short_addr(
void);
166static void set_long_addr(
const uint8_t *
addr, uint8_t len);
167static void get_long_addr(uint8_t *
addr, uint8_t len);
168static void set_tx_power(int8_t power);
169static int8_t get_tx_power(
void);
170static void set_channel(uint8_t channel);
171static uint8_t get_channel(
void);
176static uint8_t
regRead(uint16_t address);
177static void regWrite(uint16_t address, uint8_t data);
178static uint8_t
bitRead(uint16_t address, uint8_t mask, uint8_t offset);
179static void bitWrite(uint16_t address, uint8_t mask, uint8_t offset, uint8_t value);
180static void burstRead(uint16_t address, uint8_t *data, uint16_t len);
181static void burstWrite(uint16_t address, uint8_t *data, uint16_t len);
182static void frameRead(uint8_t *frame, uint16_t *frame_len);
183static void frameWrite(uint8_t *frame, uint16_t frame_len);
186PROCESS(at86rf215_process,
"AT86RF215 radio driver");
196 LOG_DBG(
"Initializing AT86RF215 radio ...\n");
206 LOG_DBG(
"Detecting radio ...\n");
213 regWrite(RG_RFn_CMD, RF_CMD_TRXOFF);
217#if AT86RF215_FREQUENCY_BAND == FREQ_BAND_24GHZ
221 for (uint8_t i = 0; i < (
sizeof(AT86RF215_RADIO_CONFIGURATION)/
sizeof(at86rf215_radio_config_t)); i++) {
222 regWrite(AT86RF215_RADIO_CONFIGURATION[i].address, AT86RF215_RADIO_CONFIGURATION[i].value);
226 LOG_ERR(
"SUB GHZ band not tested yet!\n");
230#if AT86RF215_AUTO_CRC
250#if AT86RF215_FREQUENCY_BAND == FREQ_BAND_24GHZ
258 uint8_t dummy __attribute__((unused));
272 regWrite(RG_RFn_CMD, RF_CMD_TXPREP);
282 LOG_DBG(
"%s\n", __func__);
285 flags.RECEIVE_ON = 1;
289#if MAC_CONF_WITH_CSMA
292 flags.PACKET_PEN = 0;
301 LOG_DBG(
"%s\n", __func__);
302 regWrite(RG_RFn_CMD, RF_CMD_TRXOFF);
304 flags.RECEIVE_ON = 0;
310at86rf215_prepare(
const void *payload,
unsigned short payload_len)
312 LOG_DBG(
"%s\n", __func__);
316 if(payload_len > AT86RF215_MAX_PAYLOAD_SIZE) {
317 LOG_ERR(
"Payload larger than radio buffer: %u > %u\n", payload_len, AT86RF215_MAX_PAYLOAD_SIZE);
325 memcpy(buffer, payload, payload_len);
328#if !AT86RF215_AUTO_CRC
329 uint16_t crc =
crc16_data(payload, payload_len, 0);
330 buffer[payload_len] = (uint8_t)(crc & 0x00FF);
331 buffer[payload_len + 1] = (uint8_t)((crc & 0xFF00) >> 8);
334 buffer[payload_len] = 0x00;
335 buffer[payload_len + 1] = 0x00;
347at86rf215_transmit(
unsigned short payload_len)
349 LOG_DBG(
"%s\n", __func__);
351 regWrite(RG_RFn_CMD, RF_CMD_TXPREP);
360 while(!
flags.TX_END){
366 LOG_DBG(
"No IRQ \n");
373 if(
flags.RECEIVE_ON){
378 LOG_WARN(
"TX - Underrun \n");
387at86rf215_send(
const void *payload,
unsigned short payload_len)
389 LOG_DBG(
"%s\n", __func__);
391 at86rf215_prepare(payload, payload_len);
392 return at86rf215_transmit(payload_len);
397at86rf215_read(
void *buf,
unsigned short buf_len)
404 flags.PACKET_PEN = 0;
410 if(len < 3 || len > 127){
411 LOG_WARN(
"Read - invalid length \n");
418#if AT86RF215_AUTO_CRC
419 if(
bitRead(SR_BBCn_FCSOK) != 1){
424 uint16_t frame_crc = (uint16_t)(buffer[len-1] << 8) | (buffer[len]);
426 if(crc != frame_crc){
427 LOG_WARN(
"Read - wrong CRC \n");
433 memcpy(buf, buffer, len);
440 LOG_DBG(
"Read %d bytes \n", len);
447at86rf215_receiving_packet(
void)
472 if(radio_mode_frame_filter){
478 LOG_DBG(
"%s = %d \n", __func__,
flags.RX_START);
479 return flags.RX_START;
483at86rf215_pending_packet(
void)
485 LOG_DBG(
"%s = %d \n", __func__,
flags.PACKET_PEN);
501 return flags.PACKET_PEN;
521 LOG_DBG(
"%s = ", __func__);
558at86rf215_get_value(radio_param_t param,
radio_value_t *value)
572 case RF_STATE_TXPREP:
628 *value = AT86RF215_RF_CHANNEL_MIN;
632 *value = AT86RF215_RF_CHANNEL_MAX;
636 *value = AT86RF215_OUTPUT_POWER_MIN;
640 *value = AT86RF215_OUTPUT_POWER_MAX;
663 case RADIO_CONST_MAX_PAYLOAD_LEN:
708 set_short_addr(value);
726 set_cca_threshold(value);
740at86rf215_get_object(radio_param_t param,
void *dest,
size_t size)
747 get_long_addr((uint8_t *)dest, (uint8_t)size);
751 *(rtimer_clock_t *)dest =
rx_frame.timestamp;
754 #if MAC_CONF_WITH_TSCH
755 case RADIO_CONST_TSCH_TIMING:
766at86rf215_set_object(radio_param_t param,
const void *src,
size_t size)
773 set_long_addr((
const uint8_t *)src, (uint8_t)size);
784 .
init = at86rf215_init,
785 .prepare = at86rf215_prepare,
786 .transmit = at86rf215_transmit,
787 .send = at86rf215_send,
788 .read = at86rf215_read,
790 .receiving_packet = at86rf215_receiving_packet,
791 .pending_packet = at86rf215_pending_packet,
793 .off = at86rf215_off,
794 .get_value = at86rf215_get_value,
795 .set_value = at86rf215_set_value,
796 .get_object = at86rf215_get_object,
797 .set_object = at86rf215_set_object,
813 at86rf215_rf_irq_t rf_irq;
814 at86rf215_bbc_irq_t bbc_irq;
816 uint8_t dummy __attribute__((unused));
819 rf_irq.value =
regRead(RG_RF24_IRQS);
820 bbc_irq.value =
regRead(RG_BBC1_IRQS);
826 if(rf_irq.IRQ2_TRXRDY){
829 if(rf_irq.IRQ5_TRXERR){
831 LOG_WARN(
"PLL ERR\n");
837 if(bbc_irq.IRQ1_RXFS){
844 if(bbc_irq.IRQ3_RXAM){
847 if(bbc_irq.IRQ2_RXFE){
849 flags.PACKET_PEN = 1;
851 if(!radio_mode_poll_mode){
855 if(bbc_irq.IRQ5_TXFE){
874 LOG_INFO(
"AT86RF215 driver process started!\n");
880 LOG_DBG(
"Packet detected ... address match = %d \n",
flags.AMI);
882 if(radio_mode_frame_filter && (
flags.AMI != 1)){
890 packetbuf_set_attr(PACKETBUF_ATTR_RSSI,
rx_frame.rssi);
891 packetbuf_set_attr(PACKETBUF_ATTR_LINK_QUALITY,
rx_frame.lqi);
902 NETSTACK_MAC.
input();
920set_send_on_cca(uint8_t enable)
922 LOG_DBG(
"%s(%d)\n", __func__, enable);
933 LOG_INFO(
"%s(%d)\n", __func__, enable);
935 radio_mode_aack = enable;
937 if(!radio_mode_frame_filter){
938 LOG_WARN(
"Enabeling frame filter \n");
939 set_frame_filtering(1);
954set_frame_filtering(uint8_t enable)
956 LOG_INFO(
"%s(%d)\n", __func__, enable);
958 radio_mode_frame_filter = enable;
981set_poll_mode(uint8_t enable)
983 LOG_INFO(
"%s(%d)\n", __func__, enable);
985 radio_mode_poll_mode = enable;
996set_cca_threshold(uint8_t threshold)
1003get_cca_threshold(
void)
1015 uint16_t panid = ((uint16_t)
regRead(RG_BBCn_MACPID1F0) << 8) & 0xFF00;
1016 panid |=
regRead(RG_BBCn_MACPID0F0) & 0xFF;
1021set_pan_ID(uint16_t pan)
1024 regWrite(RG_BBCn_MACPID0F0, (uint8_t) pan & 0xFF);
1025 regWrite(RG_BBCn_MACPID1F0, (uint8_t) (pan >> 8) & 0xFF);
1031 uint16_t
addr = ((uint16_t)
regRead(RG_BBCn_MACSHA1F0) << 8) & 0xFF00;
1037set_short_addr(uint16_t
addr)
1041 regWrite(RG_BBCn_MACSHA1F0, (uint8_t) (
addr >> 8) & 0xFF);
1045get_long_addr(uint8_t *
addr, uint8_t len)
1047 if (len > 8) len = 8;
1048 for (uint8_t i=0; i<len; i++) {
1054set_long_addr(
const uint8_t *
addr, uint8_t len)
1057 if (len > 8) len = 8;
1058 for(uint8_t i=0; i<len; i++) {
1068set_tx_power(int8_t power)
1071 if (power < AT86RF215_OUTPUT_POWER_MIN || power > AT86RF215_OUTPUT_POWER_MAX) {
1072 p = AT86RF215_OUTPUT_POWER_MAX;
1073 LOG_WARN(
"Invalid power setting (%d)\n", power);
1084 return (
bitRead(SR_RFn_TXPWR) - 16);
1095 LOG_DBG(
"%s(%d)\n", __func__, channel);
1100 if(
flags.RECEIVE_ON){
1101 regWrite(RG_RFn_CMD, RF_CMD_TXPREP);
1104#if AT86RF215_FREQUENCY_BAND == FREQ_BAND_24GHZ
1106 if(channel < AT86RF215_RF_CHANNEL_MIN || channel > AT86RF215_RF_CHANNEL_MAX) {
1107 LOG_WARN(
"Invalid channel %u", channel);
1108 channel = AT86RF215_RF_CHANNEL_MIN;
1113 regWrite(RG_RF24_CNL, (uint8_t)(channel - 11));
1125 if(
flags.RECEIVE_ON){
1155 uint32_t N = ((freq - 2366) * 65536) / 26;
1163 LOG_WARN(
"Freq to high\n");
1167 LOG_WARN(
"Freq to low\n");
1170 printf(
"N: %lu\n", N);
1172 regWrite(RG_RF24_CNL, (uint8_t)( N & 0x00FF));
1173 regWrite(RG_RF24_CCF0L, (uint8_t)((N & 0xFF00) >> 8));
1174 regWrite(RG_RF24_CCF0H, (uint8_t)((N & 0xFF0000) >> 16));
1218bitRead(uint16_t address, uint8_t mask, uint8_t offset){
1219 uint8_t tmp =
regRead(address);
1220 return ((tmp & mask) >> offset);
1230bitWrite(uint16_t address, uint8_t mask, uint8_t offset, uint8_t value){
1231 uint8_t tmp =
regRead(address);
1232 tmp = (tmp & ~mask) | ((value << offset) & mask);
1240static void burstRead(uint16_t address, uint8_t *data, uint16_t len)
1246 for (uint8_t i = 0; i < len; i++)
1261 uint8_t dummy __attribute__((unused));
1266 for(uint8_t i = 0; i < len; i++) {
1279 uint8_t len_h =
regRead(RG_BBCn_RXFLH);
1280 uint8_t len_l =
regRead(RG_BBCn_RXFLL);
1282 uint16_t len = (uint16_t)len_l | ((uint16_t) (len_h & 0x07) << 8);
1295 regWrite(RG_BBCn_TXFLL, (uint8_t)(frame_len & 0xFF));
1296 regWrite(RG_BBCn_TXFLH, (uint8_t)((frame_len >> 8) & 0x07));
Header file for the at86rf215-arch.c - architecture dependent code.
void at86rf215_arch_clear_RSTN(void)
Release the radio from the reset mode.
void at86rf215_arch_enable_EXTI(void)
Enable the radio's IRQ line.
void at86rf215_arch_spi_select(void)
Select the radio's SPI chip select.
void at86rf215_arch_init(void)
Initialize the radio's I/O periphery.
uint8_t at86rf215_arch_spi_txrx(uint8_t b)
Transfer and receive a single byte over SPI.
void at86rf215_arch_set_RSTN(void)
Reset the radio.
void at86rf215_arch_spi_deselect(void)
Deselect the radio's SPI chip select.
Configuration file for the AT86RF215 radio drivers.
#define AT86RF215_SEND_ON_CCA
Do a CCA manually before sending a packet.
#define AT86RF215_CRC_16BIT
Select either 16-bit (1) or 32-bit (0) CRC.
#define AT86RF215_POLL_MODE
Radio poll mode - should disable interrupts and enable upper levels to poll the radio for events.
#define AT86RF215_CCA_THRESHOLD
CCA threshold in dBm.
#define AT86RF215_AUTO_ACK
If driver is used for CSMA (default)
#define AT86RF215_FRAME_FILTER
Enable/disable address filter mode, where radio only accepts frames with matching address.
#define AT86RF215_FREQUENCY_BAND
Select the Frequency band to use: 0 = Sub-GHz, 1 = 2.4 GHz.
AT86RF215 radio constants and defines.
#define AT86RF215_DELAY_BEFORE_RX
The delay between radio Rx request and start listening 1) transition to RX --> 90 us.
#define AT86RF215_BYTE_AIR_TIME
The air time for one byte in microsecond: 1 / (250kbps/8) == 32 us/byte.
#define AT86RF215_PHY_OVERHEAD
The number of header and footer bytes of overhead at the PHY layer after SFD (1 length + 2 CRC)
#define AT86RF215_DELAY_BEFORE_DETECT
The delay between the end of SFD reception and the radio returning 1 to receiving_packet().
#define AT86RF215_DELAY_BEFORE_TX
The delay between radio Tx request and SFD sent 1) transition to TXPREP --> done in prepare(),...
Registermap for the AT86RF215.
static void frameRead(uint8_t *frame, uint16_t *frame_len)
Custom fuction to read a packet frame from the radio's memory.
static uint8_t current_channel
It is easier to store the current channel in a global variable than to read it from the radio registe...
static uint8_t radio_send_on_cca
Radio configuration parameters according to the Contiki-NG radio API.
const struct radio_driver at86rf215_driver
The NETSTACK data structure for the AT86RF215 driver.
static at86rf215_rx_frame_t rx_frame
Contiki-NG requires that the driver stores the values of last RSSI, LQI and timestamp -> we are using...
int at86rf215_channel_clear(void)
static uint8_t regRead(uint16_t address)
Read a single register (16-bit) from the AT86RF215 Implementation of the so called single access mode...
static volatile at86rf215_flags_t flags
The radio driver uses the following flags to keep track of the current state of the radio and IRQ eve...
static void regWrite(uint16_t address, uint8_t data)
Write a single register (16-bit) to the AT86RF215.
static void bitWrite(uint16_t address, uint8_t mask, uint8_t offset, uint8_t value)
Write one ore multiple bits to the radio's register.
static void burstRead(uint16_t address, uint8_t *data, uint16_t len)
Read a burst of data from the AT86RF215 registers.
static void set_auto_ack(uint8_t enable)
void at86rf215_isr(void)
Interrupt service routine for the AT86RF215.
static void set_frequency(uint16_t freq, uint8_t decimal)
Set frequency via fine resolution obtion.
static void frameWrite(uint8_t *frame, uint16_t frame_len)
Custom fuction to write a packet frame to the radio's memory.
#define RG_RFn_STATE
Current drivers support only one BBC (RF band) at a time.
static void burstWrite(uint16_t address, uint8_t *data, uint16_t len)
Write a burst of data to the AT86RF215 registers.
static uint8_t bitRead(uint16_t address, uint8_t mask, uint8_t offset)
Read one ore multiple bits from the radio's register.
Header file for the at86rf215.c.
void clock_delay_usec(uint16_t dt)
Delay a given number of microseconds.
static uint8_t get_channel()
Get the current operating channel.
static void set_channel(uint8_t channel)
Set the current operating channel.
unsigned short crc16_data(const unsigned char *data, int len, unsigned short acc)
Calculate the CRC16 over a data area.
void packetbuf_set_datalen(uint16_t len)
Set the length of the data in the packetbuf.
void * packetbuf_dataptr(void)
Get a pointer to the data in the packetbuf.
#define PACKETBUF_SIZE
The size of the packetbuf, in bytes.
void packetbuf_clear(void)
Clear and reset the packetbuf.
#define PROCESS(name, strname)
Declare a process.
#define PROCESS_BEGIN()
Define the beginning of a process.
#define PROCESS_END()
Define the end of a process.
void process_start(struct process *p, process_data_t data)
Start a process.
#define PROCESS_THREAD(name, ev, data)
Define the body of a process.
#define PROCESS_YIELD_UNTIL(c)
Yield the currently running process until a condition occurs.
void process_poll(struct process *p)
Request a process to be polled.
#define RADIO_RX_MODE_ADDRESS_FILTER
Enable address-based frame filtering.
#define RADIO_RX_MODE_POLL_MODE
Enable/disable/get the state of radio driver poll mode operation.
#define RADIO_TX_MODE_SEND_ON_CCA
Radio TX mode control / retrieval.
enum radio_result_e radio_result_t
Radio return values when setting or getting radio parameters.
int radio_value_t
Each radio has a set of parameters that designate the current configuration and state of the radio.
#define RADIO_RX_MODE_AUTOACK
Enable automatic transmission of ACK frames.
@ RADIO_RESULT_ERROR
An error occurred when getting/setting the parameter, but the arguments were otherwise correct.
@ RADIO_RESULT_NOT_SUPPORTED
The parameter is not supported.
@ RADIO_RESULT_INVALID_VALUE
The value argument was incorrect.
@ RADIO_RESULT_OK
The parameter was set/read successfully.
@ RADIO_PARAM_POWER_MODE
When getting the value of this parameter, the radio driver should indicate whether the radio is on or...
@ RADIO_CONST_PHY_OVERHEAD
The physical layer header (PHR) + MAC layer footer (MFR) overhead in bytes.
@ RADIO_PARAM_RSSI
Received signal strength indicator in dBm.
@ RADIO_PARAM_LAST_PACKET_TIMESTAMP
Last packet timestamp, of type rtimer_clock_t.
@ RADIO_PARAM_LAST_RSSI
The RSSI value of the last received packet.
@ RADIO_CONST_BYTE_AIR_TIME
The air time of one byte in usec, e.g.
@ RADIO_PARAM_RX_MODE
Radio receiver mode determines if the radio has address filter (RADIO_RX_MODE_ADDRESS_FILTER) and aut...
@ RADIO_PARAM_CHANNEL
Channel used for radio communication.
@ RADIO_PARAM_SHR_SEARCH
For enabling and disabling the SHR search.
@ RADIO_PARAM_LAST_LINK_QUALITY
Link quality indicator of the last received packet.
@ RADIO_CONST_DELAY_BEFORE_RX
The delay in usec between turning on the radio and it being actually listening (able to hear a preamb...
@ RADIO_PARAM_TXPOWER
Transmission power in dBm.
@ RADIO_PARAM_64BIT_ADDR
Long (64 bits) address for the radio, which is used by the address filter.
@ RADIO_CONST_DELAY_BEFORE_TX
The delay in usec between a call to the radio API's transmit function and the end of SFD transmission...
@ RADIO_CONST_CHANNEL_MAX
The highest radio channel number.
@ RADIO_PARAM_PAN_ID
The personal area network identifier (PAN ID), which is used by the h/w frame filtering functionality...
@ RADIO_PARAM_CCA_THRESHOLD
Clear channel assessment threshold in dBm.
@ RADIO_CONST_TXPOWER_MIN
The minimum transmission power in dBm.
@ RADIO_CONST_CHANNEL_MIN
The lowest radio channel number.
@ RADIO_CONST_TXPOWER_MAX
The maximum transmission power in dBm.
@ RADIO_CONST_DELAY_BEFORE_DETECT
The delay in usec between the end of SFD reception for an incoming frame and the radio API starting t...
@ RADIO_PARAM_16BIT_ADDR
The short address (16 bits) for the radio, which is used by the h/w filter.
@ RADIO_PARAM_TX_MODE
Radio transmission mode determines if the radio has send on CCA (RADIO_TX_MODE_SEND_ON_CCA) enabled o...
@ RADIO_POWER_MODE_CARRIER_OFF
Radio powered on, but not emitting unmodulated carriers.
@ RADIO_POWER_MODE_OFF
Radio powered off and in the lowest possible power consumption state.
@ RADIO_POWER_MODE_ON
Radio powered on and able to receive frames.
@ RADIO_POWER_MODE_CARRIER_ON
Radio powered on and emitting unmodulated carriers.
@ RADIO_TX_ERR
An error occurred during transmission.
@ RADIO_TX_OK
TX was successful and where an ACK was requested one was received.
#define RTIMER_NOW()
Get the current clock time.
const tsch_timeslot_timing_usec tsch_timeslot_timing_us_10000
TSCH timing attributes and description.
Header file for the logging system.
#define IEEE802154_DEFAULT_CHANNEL
The default channel for IEEE 802.15.4 networks.
Include file for the Contiki low-layer network stack (NETSTACK)
Header file for the radio API.
void(* input)(void)
Callback for getting notified of incoming packet.
The structure of a Contiki-NG radio device driver.
int(* init)(void)
Initialise the radio hardware.
Main API declarations for TSCH.
static uip_ds6_addr_t * addr
Pointer to a nbr cache entry.