Contiki-NG
cc2538-rf.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * 3. Neither the name of the copyright holder nor the names of its
15 * contributors may be used to endorse or promote products derived
16 * from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
27 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
29 * OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31/**
32 * \addtogroup cc2538-rf
33 * @{
34 *
35 * \file
36 * Implementation of the cc2538 RF driver
37 */
38#include "contiki.h"
39#include "dev/radio.h"
40#include "sys/clock.h"
41#include "sys/rtimer.h"
42#include "net/packetbuf.h"
43#include "net/linkaddr.h"
44#include "net/netstack.h"
45#include "net/mac/tsch/tsch.h"
46#include "sys/energest.h"
47#include "dev/cc2538-rf.h"
48#include "dev/rfcore.h"
49#include "dev/sys-ctrl.h"
50#include "dev/udma.h"
51#include "reg.h"
52#include "lib/iq-seeder.h"
53
54#include <string.h>
55/*---------------------------------------------------------------------------*/
56#define CHECKSUM_LEN 2
57
58/* uDMA channel control persistent flags */
59#define UDMA_TX_FLAGS (UDMA_CHCTL_ARBSIZE_128 | UDMA_CHCTL_XFERMODE_AUTO \
60 | UDMA_CHCTL_SRCSIZE_8 | UDMA_CHCTL_DSTSIZE_8 \
61 | UDMA_CHCTL_SRCINC_8 | UDMA_CHCTL_DSTINC_NONE)
62
63#define UDMA_RX_FLAGS (UDMA_CHCTL_ARBSIZE_128 | UDMA_CHCTL_XFERMODE_AUTO \
64 | UDMA_CHCTL_SRCSIZE_8 | UDMA_CHCTL_DSTSIZE_8 \
65 | UDMA_CHCTL_SRCINC_NONE | UDMA_CHCTL_DSTINC_8)
66
67/*
68 * uDMA transfer threshold. DMA will only be used to read an incoming frame
69 * if its size is above this threshold
70 */
71#define UDMA_RX_SIZE_THRESHOLD 3
72/*---------------------------------------------------------------------------*/
73/* Log configuration */
74#include "sys/log.h"
75#define LOG_MODULE "cc2538-rf"
76#define LOG_LEVEL LOG_LEVEL_NONE
77/*---------------------------------------------------------------------------*/
78/* Local RF Flags */
79#define RX_ACTIVE 0x80
80#define RF_MUST_RESET 0x40
81#define RF_ON 0x01
82
83/* Bit Masks for the last byte in the RX FIFO */
84#define CRC_BIT_MASK 0x80
85#define LQI_BIT_MASK 0x7F
86/* RSSI Offset */
87#define RSSI_OFFSET 73
88#define RSSI_INVALID -128
89
90/* 192 usec off -> on interval (RX Callib -> SFD Wait). We wait a bit more */
91#define ONOFF_TIME RTIMER_ARCH_SECOND / 3125
92/*---------------------------------------------------------------------------*/
93#ifdef CC2538_RF_CONF_AUTOACK
94#define CC2538_RF_AUTOACK CC2538_RF_CONF_AUTOACK
95#else
96#define CC2538_RF_AUTOACK 1
97#endif
98/*---------------------------------------------------------------------------
99 * MAC timer
100 *---------------------------------------------------------------------------*/
101/* Timer conversion */
102#define RADIO_TO_RTIMER(X) ((uint32_t)((uint64_t)(X) * RTIMER_ARCH_SECOND / SYS_CTRL_32MHZ))
103
104#define CLOCK_STABLE() do { \
105 while ( !(REG(SYS_CTRL_CLOCK_STA) & (SYS_CTRL_CLOCK_STA_XOSC_STB))); \
106 } while(0)
107/*---------------------------------------------------------------------------*/
108/* Are we currently in poll mode? Disabled by default */
109static uint8_t volatile poll_mode = 0;
110/* Do we perform a CCA before sending? Enabled by default. */
111static uint8_t send_on_cca = 1;
112static int8_t rssi;
113static uint8_t crc_corr;
114/*---------------------------------------------------------------------------*/
115static uint8_t rf_flags;
116static uint8_t rf_channel = IEEE802154_DEFAULT_CHANNEL;
117
118static int on(void);
119static int off(void);
120/*---------------------------------------------------------------------------*/
121/* TX Power dBm lookup table. Values from SmartRF Studio v1.16.0 */
122typedef struct output_config {
123 radio_value_t power;
124 uint8_t txpower_val;
125} output_config_t;
126
127static const output_config_t output_power[] = {
128 { 7, 0xFF },
129 { 5, 0xED },
130 { 3, 0xD5 },
131 { 1, 0xC5 },
132 { 0, 0xB6 },
133 { -1, 0xB0 },
134 { -3, 0xA1 },
135 { -5, 0x91 },
136 { -7, 0x88 },
137 { -9, 0x72 },
138 {-11, 0x62 },
139 {-13, 0x58 },
140 {-15, 0x42 },
141 {-24, 0x00 },
142};
143
144static radio_result_t get_value(radio_param_t param, radio_value_t *value);
145
146#define OUTPUT_CONFIG_COUNT (sizeof(output_power) / sizeof(output_config_t))
147
148/* Max and Min Output Power in dBm */
149#define OUTPUT_POWER_MIN (output_power[OUTPUT_CONFIG_COUNT - 1].power)
150#define OUTPUT_POWER_MAX (output_power[0].power)
151/*---------------------------------------------------------------------------*/
152/*
153 * The maximum number of bytes this driver can accept from the MAC layer for
154 * transmission or will deliver to the MAC layer after reception. Includes
155 * the MAC header and payload, but not the FCS.
156 */
157#define MAX_PAYLOAD_LEN (CC2538_RF_MAX_PACKET_LEN - CHECKSUM_LEN)
158/*---------------------------------------------------------------------------*/
159PROCESS(cc2538_rf_process, "cc2538 RF driver");
160/*---------------------------------------------------------------------------*/
161/**
162 * \brief Get the current operating channel
163 * \return Returns a value in [11,26] representing the current channel
164 */
165static uint8_t
167{
168 return rf_channel;
169}
170/*---------------------------------------------------------------------------*/
171/**
172 * \brief Set the current operating channel
173 * \param channel The desired channel as a value in [11,26]
174 */
175static void
176set_channel(uint8_t channel)
177{
178 uint8_t was_on = 0;
179
180 LOG_INFO("Set Channel\n");
181
182 /* Changes to FREQCTRL take effect after the next recalibration */
183
184 /* If we are off, save state, otherwise switch off and save state */
186 was_on = 1;
187 off();
188 }
189 REG(RFCORE_XREG_FREQCTRL) = CC2538_RF_CHANNEL_MIN +
190 (channel - CC2538_RF_CHANNEL_MIN) * CC2538_RF_CHANNEL_SPACING;
191
192 /* switch radio back on only if radio was on before - otherwise will turn on radio foor sleepy nodes */
193 if(was_on) {
194 on();
195 }
196
197 rf_channel = channel;
198}
199/*---------------------------------------------------------------------------*/
200static radio_value_t
201get_pan_id(void)
202{
203 return (radio_value_t)(REG(RFCORE_FFSM_PAN_ID1) << 8 | REG(RFCORE_FFSM_PAN_ID0));
204}
205/*---------------------------------------------------------------------------*/
206static void
207set_pan_id(uint16_t pan)
208{
209 REG(RFCORE_FFSM_PAN_ID0) = pan & 0xFF;
210 REG(RFCORE_FFSM_PAN_ID1) = pan >> 8;
211}
212/*---------------------------------------------------------------------------*/
213static radio_value_t
214get_short_addr(void)
215{
217}
218/*---------------------------------------------------------------------------*/
219static void
220set_short_addr(uint16_t addr)
221{
222 REG(RFCORE_FFSM_SHORT_ADDR0) = addr & 0xFF;
223 REG(RFCORE_FFSM_SHORT_ADDR1) = addr >> 8;
224}
225/*---------------------------------------------------------------------------*/
226/**
227 * \brief Reads the current signal strength (RSSI)
228 * \return The current RSSI in dBm
229 *
230 * This function reads the current RSSI on the currently configured
231 * channel.
232 */
233static radio_value_t
235{
236 int8_t rssi;
237 uint8_t was_off = 0;
238
239 /* If we are off, turn on first */
241 was_off = 1;
242 on();
243 }
244
245 /* Wait for a valid RSSI reading */
246 do {
247 rssi = REG(RFCORE_XREG_RSSI);
248 } while(rssi == RSSI_INVALID);
249 rssi -= RSSI_OFFSET;
250
251 /* If we were off, turn back off */
252 if(was_off) {
253 off();
254 }
255
256 return rssi;
257}
258/*---------------------------------------------------------------------------*/
259/**
260 * \brief Reads the current I/Q data of the received signal.
261 * \param value The least significant bit (LSB) of the I coordinate and the LSB
262 * of the Q coordinate are concatenated and stored here.
263 *
264 * If not done already, this function first enables the RX mode and waits for
265 * the RSSI_VALID bit to go high. Hence, this function should only be called
266 * at start up or by the MAC protocol to avoid conflicts.
267 */
268static void
270{
271 uint8_t was_off = 0;
272
273 /* If we are off, turn on first */
275 was_off = 1;
276 on();
277 }
278
279 /* Wait on RSSI_VALID */
281
282 /* Wait until the channel seems clear for better randomness */
284
285 /* Read I/Q LSBs */
286 *value = REG(RFCORE_XREG_RFRND)
288
289 /* If we were off, turn back off */
290 if(was_off) {
291 off();
292 }
293}
294/*---------------------------------------------------------------------------*/
295/* Returns the current CCA threshold in dBm */
296static radio_value_t
297get_cca_threshold(void)
298{
299 return (int8_t)(REG(RFCORE_XREG_CCACTRL0) & RFCORE_XREG_CCACTRL0_CCA_THR) - RSSI_OFFSET;
300}
301/*---------------------------------------------------------------------------*/
302/* Sets the CCA threshold in dBm */
303static void
304set_cca_threshold(radio_value_t value)
305{
306 REG(RFCORE_XREG_CCACTRL0) = (value & 0xFF) + RSSI_OFFSET;
307}
308/*---------------------------------------------------------------------------*/
309/* Returns the current TX power in dBm */
310static radio_value_t
311get_tx_power(void)
312{
313 int i;
314 uint8_t reg_val = REG(RFCORE_XREG_TXPOWER) & 0xFF;
315
316 /*
317 * Find the TXPOWER value in the lookup table
318 * If the value has been written with set_tx_power, we should be able to
319 * find the exact value. However, in case the register has been written in
320 * a different fashion, we return the immediately lower value of the lookup
321 */
322 for(i = 0; i < OUTPUT_CONFIG_COUNT; i++) {
323 if(reg_val >= output_power[i].txpower_val) {
324 return output_power[i].power;
325 }
326 }
327 return OUTPUT_POWER_MIN;
328}
329/*---------------------------------------------------------------------------*/
330/*
331 * Set TX power to 'at least' power dBm
332 * This works with a lookup table. If the value of 'power' does not exist in
333 * the lookup table, TXPOWER will be set to the immediately higher available
334 * value
335 */
336static void
337set_tx_power(radio_value_t power)
338{
339 int i;
340
341 for(i = OUTPUT_CONFIG_COUNT - 1; i >= 0; --i) {
342 if(power <= output_power[i].power) {
343 REG(RFCORE_XREG_TXPOWER) = output_power[i].txpower_val;
344 return;
345 }
346 }
347}
348/*---------------------------------------------------------------------------*/
349static void
350set_frame_filtering(uint8_t enable)
351{
352 if(enable) {
354 } else {
355 REG(RFCORE_XREG_FRMFILT0) &= ~RFCORE_XREG_FRMFILT0_FRAME_FILTER_EN;
356 }
357}
358/*---------------------------------------------------------------------------*/
359static void
360set_shr_search(int enable)
361{
362 if(enable) {
363 REG(RFCORE_XREG_FRMCTRL0) &= ~RFCORE_XREG_FRMCTRL0_RX_MODE;
364 } else {
366 }
367}
368/*---------------------------------------------------------------------------*/
369static void
370mac_timer_init(void)
371{
372 CLOCK_STABLE();
376 REG(RFCORE_SFR_MTCTRL) &= ~RFCORE_SFR_MTCTRL_RUN;
381}
382/*---------------------------------------------------------------------------*/
383static void
384set_poll_mode(uint8_t enable)
385{
386 poll_mode = enable;
387
388 if(enable) {
389 mac_timer_init();
390 REG(RFCORE_XREG_RFIRQM0) &= ~RFCORE_XREG_RFIRQM0_FIFOP; /* mask out FIFOP interrupt source */
391 REG(RFCORE_SFR_RFIRQF0) &= ~RFCORE_SFR_RFIRQF0_FIFOP; /* clear pending FIFOP interrupt */
392 NVIC_DisableIRQ(RF_TX_RX_IRQn); /* disable RF interrupts */
393 } else {
394 REG(RFCORE_XREG_RFIRQM0) |= RFCORE_XREG_RFIRQM0_FIFOP; /* enable FIFOP interrupt source */
395 NVIC_EnableIRQ(RF_TX_RX_IRQn); /* enable RF interrupts */
396 }
397}
398/*---------------------------------------------------------------------------*/
399static void
400set_send_on_cca(uint8_t enable)
401{
402 send_on_cca = enable;
403}
404/*---------------------------------------------------------------------------*/
405static void
406set_auto_ack(uint8_t enable)
407{
408 if(enable) {
410 } else {
411 REG(RFCORE_XREG_FRMCTRL0) &= ~RFCORE_XREG_FRMCTRL0_AUTOACK;
412 }
413}
414/*---------------------------------------------------------------------------*/
415static uint32_t
416get_sfd_timestamp(void)
417{
418 uint64_t sfd, timer_val, buffer;
419
420 REG(RFCORE_SFR_MTMSEL) = (REG(RFCORE_SFR_MTMSEL) & ~RFCORE_SFR_MTMSEL_MTMSEL) | 0x00000000;
422 timer_val = REG(RFCORE_SFR_MTM0) & RFCORE_SFR_MTM0_MTM0;
423 timer_val |= ((REG(RFCORE_SFR_MTM1) & RFCORE_SFR_MTM1_MTM1) << 8);
424 REG(RFCORE_SFR_MTMSEL) = (REG(RFCORE_SFR_MTMSEL) & ~RFCORE_SFR_MTMSEL_MTMOVFSEL) | 0x00000000;
425 timer_val |= ((REG(RFCORE_SFR_MTMOVF0) & RFCORE_SFR_MTMOVF0_MTMOVF0) << 16);
426 timer_val |= ((REG(RFCORE_SFR_MTMOVF1) & RFCORE_SFR_MTMOVF1_MTMOVF1) << 24);
428 timer_val |= (buffer << 32);
429
430 REG(RFCORE_SFR_MTMSEL) = (REG(RFCORE_SFR_MTMSEL) & ~RFCORE_SFR_MTMSEL_MTMSEL) | 0x00000001;
433 sfd |= ((REG(RFCORE_SFR_MTM1) & RFCORE_SFR_MTM1_MTM1) << 8);
434 REG(RFCORE_SFR_MTMSEL) = (REG(RFCORE_SFR_MTMSEL) & ~RFCORE_SFR_MTMSEL_MTMOVFSEL) | 0x00000010;
435 sfd |= ((REG(RFCORE_SFR_MTMOVF0) & RFCORE_SFR_MTMOVF0_MTMOVF0) << 16);
436 sfd |= ((REG(RFCORE_SFR_MTMOVF1) & RFCORE_SFR_MTMOVF1_MTMOVF1) << 24);
438 sfd |= (buffer << 32);
439
440 return RTIMER_NOW() - RADIO_TO_RTIMER(timer_val - sfd);
441}
442/*---------------------------------------------------------------------------*/
443/* Enable or disable radio test mode emmiting modulated or unmodulated
444 * (carrier) signal. See User's Guide pages 719 and 741.
445 */
446static uint32_t prev_FRMCTRL0, prev_MDMTEST1;
447static uint8_t was_on;
448
449static void
450set_test_mode(uint8_t enable, uint8_t modulated)
451{
452 radio_value_t mode;
453 get_value(RADIO_PARAM_POWER_MODE, &mode);
454
455 if(enable) {
456 if(mode == RADIO_POWER_MODE_CARRIER_ON) {
457 return;
458 }
459 was_on = (mode == RADIO_POWER_MODE_ON);
460 off();
461 prev_FRMCTRL0 = REG(RFCORE_XREG_FRMCTRL0);
462 /* This constantly transmits random data */
463 REG(RFCORE_XREG_FRMCTRL0) = 0x00000042;
464 if(!modulated) {
465 prev_MDMTEST1 = REG(RFCORE_XREG_MDMTEST1);
466 /* ...adding this we send an unmodulated carrier instead */
467 REG(RFCORE_XREG_MDMTEST1) = 0x00000018;
468 }
470 } else {
471 if(mode != RADIO_POWER_MODE_CARRIER_ON) {
472 return;
473 }
475 REG(RFCORE_XREG_FRMCTRL0) = prev_FRMCTRL0;
476 if(!modulated) {
477 REG(RFCORE_XREG_MDMTEST1) = prev_MDMTEST1;
478 }
479 if(was_on) {
480 on();
481 }
482 }
483}
484/*---------------------------------------------------------------------------*/
485/* Netstack API radio driver functions */
486/*---------------------------------------------------------------------------*/
487static int
488channel_clear(void)
489{
490 int cca;
491 uint8_t was_off = 0;
492
493 LOG_INFO("CCA\n");
494
495 /* If we are off, turn on first */
497 was_off = 1;
498 on();
499 }
500
501 /* Wait on RSSI_VALID */
503
505 cca = CC2538_RF_CCA_CLEAR;
506 } else {
507 cca = CC2538_RF_CCA_BUSY;
508 }
509
510 /* If we were off, turn back off */
511 if(was_off) {
512 off();
513 }
514
515 return cca;
516}
517/*---------------------------------------------------------------------------*/
518static int
519on(void)
520{
521 LOG_INFO("On\n");
522
523 if(!(rf_flags & RX_ACTIVE)) {
526
527 rf_flags |= RX_ACTIVE;
528 }
529
530 ENERGEST_ON(ENERGEST_TYPE_LISTEN);
531 return 1;
532}
533/*---------------------------------------------------------------------------*/
534static int
535off(void)
536{
537 LOG_INFO("Off\n");
538
539 /* Wait for ongoing TX to complete (e.g. this could be an outgoing ACK) */
541
544 }
545
546 /* Don't turn off if we are off as this will trigger a Strobe Error */
547 if(REG(RFCORE_XREG_RXENABLE) != 0) {
549 }
550
551 rf_flags &= ~RX_ACTIVE;
552
553 ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
554 return 1;
555}
556/*---------------------------------------------------------------------------*/
557static int
558init(void)
559{
560 LOG_INFO("Init\n");
561
562 if(rf_flags & RF_ON) {
563 return 0;
564 }
565
566 /* Enable clock for the RF Core while Running, in Sleep and Deep Sleep */
567 REG(SYS_CTRL_RCGCRFC) = 1;
568 REG(SYS_CTRL_SCGCRFC) = 1;
569 REG(SYS_CTRL_DCGCRFC) = 1;
570
571 REG(RFCORE_XREG_CCACTRL0) = CC2538_RF_CCA_THRES;
572
573 /*
574 * Changes from default values
575 * See User Guide, section "Register Settings Update"
576 */
577 REG(RFCORE_XREG_TXFILTCFG) = 0x09; /** TX anti-aliasing filter bandwidth */
578 REG(RFCORE_XREG_AGCCTRL1) = 0x15; /** AGC target value */
579 REG(ANA_REGS_IVCTRL) = 0x0B; /** Bias currents */
580 REG(RFCORE_XREG_FSCAL1) = 0x01; /** Tune frequency calibration */
581
582 /*
583 * Defaults:
584 * Auto CRC; Append RSSI, CRC-OK and Corr. Val.; CRC calculation;
585 * RX and TX modes with FIFOs
586 */
588
589#if CC2538_RF_AUTOACK
591#endif
592
593 /* Disable source address matching and autopend */
594 REG(RFCORE_XREG_SRCMATCH) = 0;
595
596 /* MAX FIFOP threshold */
597 REG(RFCORE_XREG_FIFOPCTRL) = CC2538_RF_MAX_PACKET_LEN;
598
599 /* Set TX Power */
600 REG(RFCORE_XREG_TXPOWER) = CC2538_RF_TX_POWER;
601
602 set_channel(rf_channel);
603
604 /* Enable SHR search */
605 set_shr_search(RADIO_SHR_SEARCH_EN);
606
607 /* Acknowledge all RF Error interrupts */
609 NVIC_EnableIRQ(RF_ERR_IRQn);
610
612 /* Disable peripheral triggers for the channel */
614
615 /*
616 * Set the channel's DST. SRC can not be set yet since it will change for
617 * each transfer
618 */
620 }
621
623 /* Disable peripheral triggers for the channel */
625
626 /*
627 * Set the channel's SRC. DST can not be set yet since it will change for
628 * each transfer
629 */
631 }
632
633 set_poll_mode(poll_mode);
634
635#if CSPRNG_ENABLED
637#endif /* CSPRNG_ENABLED */
638
639 process_start(&cc2538_rf_process, NULL);
640
641 rf_flags |= RF_ON;
642
643 return 1;
644}
645/*---------------------------------------------------------------------------*/
646static int
647prepare(const void *payload, unsigned short payload_len)
648{
649 uint8_t i;
650
651 if(payload_len > MAX_PAYLOAD_LEN) {
652 return RADIO_TX_ERR;
653 }
654
655 LOG_INFO("Prepare 0x%02x bytes\n", payload_len + CHECKSUM_LEN);
656
657 /*
658 * When we transmit in very quick bursts, make sure previous transmission
659 * is not still in progress before re-writing to the TX FIFO
660 */
662
663 if((rf_flags & RX_ACTIVE) == 0) {
664 on();
665 }
666
668
669 LOG_INFO("data = ");
670 /* Send the phy length byte first */
671 REG(RFCORE_SFR_RFDATA) = payload_len + CHECKSUM_LEN;
672
674 LOG_INFO_("<uDMA payload>");
675
676 /* Set the transfer source's end address */
678 (uint32_t)(payload) + payload_len - 1);
679
680 /* Configure the control word */
682 UDMA_TX_FLAGS | udma_xfer_size(payload_len));
683
684 /* Enabled the RF TX uDMA channel */
686
687 /* Trigger the uDMA transfer */
689
690 /*
691 * No need to wait for this to end. Even if transmit() gets called
692 * immediately, the uDMA controller will stream the frame to the TX FIFO
693 * faster than transmit() can empty it
694 */
695 } else {
696 for(i = 0; i < payload_len; i++) {
697 REG(RFCORE_SFR_RFDATA) = ((unsigned char *)(payload))[i];
698 LOG_INFO_("%02x", ((unsigned char *)(payload))[i]);
699 }
700 }
701 LOG_INFO_("\n");
702
703 return 0;
704}
705/*---------------------------------------------------------------------------*/
706static int
707transmit(unsigned short transmit_len)
708{
709 uint8_t counter;
710 int ret = RADIO_TX_ERR;
711 rtimer_clock_t t0;
712 uint8_t was_off = 0;
713
714 LOG_INFO("Transmit\n");
715
716 if(transmit_len > MAX_PAYLOAD_LEN) {
717 return RADIO_TX_ERR;
718 }
719
720 if(!(rf_flags & RX_ACTIVE)) {
721 t0 = RTIMER_NOW();
722 on();
723 was_off = 1;
724 while(RTIMER_CLOCK_LT(RTIMER_NOW(), t0 + ONOFF_TIME));
725 }
726
727 if(send_on_cca) {
728 if(channel_clear() == CC2538_RF_CCA_BUSY) {
729 return RADIO_TX_COLLISION;
730 }
731 }
732
733 /*
734 * prepare() double checked that TX_ACTIVE is low. If SFD is high we are
735 * receiving. Abort transmission and bail out with RADIO_TX_COLLISION
736 */
738 return RADIO_TX_COLLISION;
739 }
740
741 /* Start the transmission */
742 ENERGEST_SWITCH(ENERGEST_TYPE_LISTEN, ENERGEST_TYPE_TRANSMIT);
743
745
746 counter = 0;
748 && (counter++ < 3)) {
750 }
751
753 LOG_ERR("TX never active.\n");
755 ret = RADIO_TX_ERR;
756 } else {
757 /* Wait for the transmission to finish */
759 ret = RADIO_TX_OK;
760 }
761 ENERGEST_SWITCH(ENERGEST_TYPE_TRANSMIT, ENERGEST_TYPE_LISTEN);
762
763 if(was_off) {
764 off();
765 }
766
767 return ret;
768}
769/*---------------------------------------------------------------------------*/
770static int
771send(const void *payload, unsigned short payload_len)
772{
773 prepare(payload, payload_len);
774 return transmit(payload_len);
775}
776/*---------------------------------------------------------------------------*/
777static int
778read(void *buf, unsigned short bufsize)
779{
780 uint8_t i;
781 uint8_t len;
782
783 LOG_INFO("Read\n");
784
786 return 0;
787 }
788
789 /* Check the length */
790 len = REG(RFCORE_SFR_RFDATA);
791
792 /* Check for validity */
793 if(len > CC2538_RF_MAX_PACKET_LEN) {
794 /* Oops, we must be out of sync. */
795 LOG_ERR("RF: bad sync\n");
796
798 return 0;
799 }
800
801 if(len <= CC2538_RF_MIN_PACKET_LEN) {
802 LOG_ERR("RF: too short\n");
803
805 return 0;
806 }
807
808 if(len - CHECKSUM_LEN > bufsize) {
809 LOG_ERR("RF: too long\n");
810
812 return 0;
813 }
814
815 /* If we reach here, chances are the FIFO is holding a valid frame */
816 LOG_INFO("read (0x%02x bytes) = ", len);
817 len -= CHECKSUM_LEN;
818
819 /* Don't bother with uDMA for short frames (e.g. ACKs) */
820 if(CC2538_RF_CONF_RX_USE_DMA && len > UDMA_RX_SIZE_THRESHOLD) {
821 LOG_INFO_("<uDMA payload>");
822
823 /* Set the transfer destination's end address */
825 (uint32_t)(buf) + len - 1);
826
827 /* Configure the control word */
829 UDMA_RX_FLAGS | udma_xfer_size(len));
830
831 /* Enabled the RF RX uDMA channel */
833
834 /* Trigger the uDMA transfer */
836
837 /* Wait for the transfer to complete. */
839 } else {
840 for(i = 0; i < len; ++i) {
841 ((unsigned char *)(buf))[i] = REG(RFCORE_SFR_RFDATA);
842 LOG_INFO_("%02x", ((unsigned char *)(buf))[i]);
843 }
844 }
845
846 /* Read the RSSI and CRC/Corr bytes */
847 rssi = ((int8_t)REG(RFCORE_SFR_RFDATA)) - RSSI_OFFSET;
848 crc_corr = REG(RFCORE_SFR_RFDATA);
849
850 LOG_INFO_("%02x%02x\n", (uint8_t)rssi, crc_corr);
851
852 /* MS bit CRC OK/Not OK, 7 LS Bits, Correlation value */
853 if(crc_corr & CRC_BIT_MASK) {
854 packetbuf_set_attr(PACKETBUF_ATTR_RSSI, rssi);
855 packetbuf_set_attr(PACKETBUF_ATTR_LINK_QUALITY, crc_corr & LQI_BIT_MASK);
856 } else {
857 LOG_ERR("Bad CRC\n");
859 return 0;
860 }
861
862 if(!poll_mode) {
863 /* If FIFOP==1 and FIFO==0 then we had a FIFO overflow at some point. */
866 process_poll(&cc2538_rf_process);
867 } else {
869 }
870 }
871 }
872
873 return len;
874}
875/*---------------------------------------------------------------------------*/
876static int
877receiving_packet(void)
878{
879 LOG_INFO("Receiving\n");
880
881 /*
882 * SFD high while transmitting and receiving.
883 * TX_ACTIVE high only when transmitting
884 *
885 * FSMSTAT1 & (TX_ACTIVE | SFD) == SFD <=> receiving
886 */
887 return (REG(RFCORE_XREG_FSMSTAT1)
890}
891/*---------------------------------------------------------------------------*/
892static int
893pending_packet(void)
894{
895 LOG_INFO("Pending\n");
896
898}
899/*---------------------------------------------------------------------------*/
900static radio_result_t
901get_value(radio_param_t param, radio_value_t *value)
902{
903 if(!value) {
905 }
906
907 switch(param) {
910 *value = RADIO_POWER_MODE_OFF;
911 } else {
914 }
915 return RADIO_RESULT_OK;
917 *value = (radio_value_t)get_channel();
918 return RADIO_RESULT_OK;
920 *value = get_pan_id();
921 return RADIO_RESULT_OK;
923 *value = get_short_addr();
924 return RADIO_RESULT_OK;
926 *value = 0;
929 }
931 *value |= RADIO_RX_MODE_AUTOACK;
932 }
933 if(poll_mode) {
934 *value |= RADIO_RX_MODE_POLL_MODE;
935 }
936 return RADIO_RESULT_OK;
938 *value = 0;
939 if(send_on_cca) {
941 }
942 return RADIO_RESULT_OK;
944 *value = get_tx_power();
945 return RADIO_RESULT_OK;
947 *value = get_cca_threshold();
948 return RADIO_RESULT_OK;
949 case RADIO_PARAM_RSSI:
950 *value = get_rssi();
951 return RADIO_RESULT_OK;
953 *value = rssi;
954 return RADIO_RESULT_OK;
956 *value = crc_corr & LQI_BIT_MASK;
957 return RADIO_RESULT_OK;
959 get_iq_lsbs(value);
960 return RADIO_RESULT_OK;
962 *value = CC2538_RF_CHANNEL_MIN;
963 return RADIO_RESULT_OK;
965 *value = CC2538_RF_CHANNEL_MAX;
966 return RADIO_RESULT_OK;
968 *value = OUTPUT_POWER_MIN;
969 return RADIO_RESULT_OK;
971 *value = OUTPUT_POWER_MAX;
972 return RADIO_RESULT_OK;
974 *value = (radio_value_t)3; /* 1 len byte, 2 bytes CRC */
975 return RADIO_RESULT_OK;
977 *value = (radio_value_t)32; /* 250kbps data rate. One byte = 32us.*/
978 return RADIO_RESULT_OK;
980 *value = (radio_value_t)CC2538_DELAY_BEFORE_TX;
981 return RADIO_RESULT_OK;
983 *value = (radio_value_t)CC2538_DELAY_BEFORE_RX;
984 return RADIO_RESULT_OK;
986 *value = (radio_value_t)CC2538_DELAY_BEFORE_DETECT;
987 return RADIO_RESULT_OK;
988 case RADIO_CONST_MAX_PAYLOAD_LEN:
989 *value = (radio_value_t)MAX_PAYLOAD_LEN;
990 return RADIO_RESULT_OK;
991 default:
993 }
994}
995/*---------------------------------------------------------------------------*/
996static radio_result_t
997set_value(radio_param_t param, radio_value_t value)
998{
999 switch(param) {
1001 if(value == RADIO_POWER_MODE_ON) {
1002 on();
1003 return RADIO_RESULT_OK;
1004 }
1005 if(value == RADIO_POWER_MODE_OFF) {
1006 off();
1007 return RADIO_RESULT_OK;
1008 }
1009 if(value == RADIO_POWER_MODE_CARRIER_ON ||
1011 set_test_mode((value == RADIO_POWER_MODE_CARRIER_ON), 0);
1012 return RADIO_RESULT_OK;
1013 }
1016 if(value < CC2538_RF_CHANNEL_MIN ||
1017 value > CC2538_RF_CHANNEL_MAX) {
1019 }
1020 set_channel(value);
1021 return RADIO_RESULT_OK;
1022 case RADIO_PARAM_PAN_ID:
1023 set_pan_id(value & 0xffff);
1024 return RADIO_RESULT_OK;
1026 set_short_addr(value & 0xffff);
1027 return RADIO_RESULT_OK;
1029 if(value & ~(RADIO_RX_MODE_ADDRESS_FILTER |
1033 }
1034
1035 set_frame_filtering((value & RADIO_RX_MODE_ADDRESS_FILTER) != 0);
1036 set_auto_ack((value & RADIO_RX_MODE_AUTOACK) != 0);
1037 set_poll_mode((value & RADIO_RX_MODE_POLL_MODE) != 0);
1038
1039 return RADIO_RESULT_OK;
1041 if(value & ~(RADIO_TX_MODE_SEND_ON_CCA)) {
1043 }
1044 set_send_on_cca((value & RADIO_TX_MODE_SEND_ON_CCA) != 0);
1045 return RADIO_RESULT_OK;
1047 if(value < OUTPUT_POWER_MIN || value > OUTPUT_POWER_MAX) {
1049 }
1050
1051 set_tx_power(value);
1052 return RADIO_RESULT_OK;
1054 set_cca_threshold(value);
1055 return RADIO_RESULT_OK;
1057 if((value != RADIO_SHR_SEARCH_EN) && (value != RADIO_SHR_SEARCH_DIS)) {
1059 }
1060 set_shr_search(value);
1061 return RADIO_RESULT_OK;
1062 default:
1064 }
1065}
1066/*---------------------------------------------------------------------------*/
1067static radio_result_t
1068get_object(radio_param_t param, void *dest, size_t size)
1069{
1070 uint8_t *target;
1071 int i;
1072
1073 if(param == RADIO_PARAM_64BIT_ADDR) {
1074 if(size != 8 || !dest) {
1076 }
1077
1078 target = dest;
1079 for(i = 0; i < 8; i++) {
1080 target[i] = ((uint32_t *)RFCORE_FFSM_EXT_ADDR0)[7 - i] & 0xFF;
1081 }
1082
1083 return RADIO_RESULT_OK;
1084 }
1085
1087 if(size != sizeof(rtimer_clock_t) || !dest) {
1089 }
1090 *(rtimer_clock_t *)dest = get_sfd_timestamp();
1091 return RADIO_RESULT_OK;
1092 }
1093
1094#if MAC_CONF_WITH_TSCH
1095 if(param == RADIO_CONST_TSCH_TIMING) {
1096 if(size != sizeof(uint16_t *) || !dest) {
1098 }
1099 /* Assigned value: a pointer to the TSCH timing in usec */
1100 *(const uint16_t **)dest = tsch_timeslot_timing_us_10000;
1101 return RADIO_RESULT_OK;
1102 }
1103#endif /* MAC_CONF_WITH_TSCH */
1104
1106}
1107/*---------------------------------------------------------------------------*/
1108static radio_result_t
1109set_object(radio_param_t param, const void *src, size_t size)
1110{
1111 int i;
1112
1113 if(param == RADIO_PARAM_64BIT_ADDR) {
1114 if(size != 8 || !src) {
1116 }
1117
1118 for(i = 0; i < 8; i++) {
1119 ((uint32_t *)RFCORE_FFSM_EXT_ADDR0)[i] = ((uint8_t *)src)[7 - i];
1120 }
1121
1122 return RADIO_RESULT_OK;
1123 }
1125}
1126/*---------------------------------------------------------------------------*/
1128 init,
1129 prepare,
1130 transmit,
1131 send,
1132 read,
1136 on,
1137 off,
1138 get_value,
1139 set_value,
1140 get_object,
1142};
1143/*---------------------------------------------------------------------------*/
1144/**
1145 * \brief Implementation of the cc2538 RF driver process
1146 *
1147 * This process is started by init(). It simply sits there waiting for
1148 * an event. Upon frame reception, the RX ISR will poll this process.
1149 * Subsequently, the contiki core will generate an event which will
1150 * call this process so that the received frame can be picked up from
1151 * the RF RX FIFO
1152 *
1153 */
1154PROCESS_THREAD(cc2538_rf_process, ev, data)
1155{
1156 int len;
1157 PROCESS_BEGIN();
1158
1159 while(1) {
1160 /* Only if we are not in poll mode oder we are in poll mode and transceiver has to be reset */
1161 PROCESS_YIELD_UNTIL((!poll_mode || (poll_mode && (rf_flags & RF_MUST_RESET))) && (ev == PROCESS_EVENT_POLL));
1162
1163 if(!poll_mode) {
1166
1167 if(len > 0) {
1169
1170 NETSTACK_MAC.input();
1171 }
1172 }
1173
1174 /* If we were polled due to an RF error, reset the transceiver */
1175 if(rf_flags & RF_MUST_RESET) {
1176 uint8_t was_on;
1177 rf_flags = 0;
1178
1179 /* save state so we know if to switch on again after re-init */
1181 was_on = 0;
1182 } else {
1183 was_on = 1;
1184 }
1185 off();
1186 init();
1187 if(was_on) {
1188 /* switch back on */
1189 on();
1190 }
1191 }
1192 }
1193
1194 PROCESS_END();
1195}
1196/*---------------------------------------------------------------------------*/
1197/**
1198 * \brief The cc2538 RF RX/TX ISR
1199 *
1200 * This is the interrupt service routine for all RF interrupts relating
1201 * to RX and TX. Error conditions are handled by cc2538_rf_err_isr().
1202 * Currently, we only acknowledge the FIFOP interrupt source.
1203 */
1204void
1206{
1207 if(!poll_mode) {
1208 process_poll(&cc2538_rf_process);
1209 }
1210
1211 /* We only acknowledge FIFOP so we can safely wipe out the entire SFR */
1212 REG(RFCORE_SFR_RFIRQF0) = 0;
1213}
1214/*---------------------------------------------------------------------------*/
1215/**
1216 * \brief The cc2538 RF Error ISR
1217 *
1218 * This is the interrupt service routine for all RF errors. We
1219 * acknowledge every error type and instead of trying to be smart and
1220 * act differently depending on error condition, we simply reset the
1221 * transceiver. RX FIFO overflow is an exception, we ignore this error
1222 * since read() handles it anyway.
1223 *
1224 * However, we don't want to reset within this ISR. If the error occurs
1225 * while we are reading a frame out of the FIFO, trashing the FIFO in
1226 * the middle of read(), would result in further errors (RX underflows).
1227 *
1228 * Instead, we set a flag and poll the driver process. The process will
1229 * reset the transceiver without any undesirable consequences.
1230 */
1231void
1233{
1234 LOG_ERR("Error 0x%08lx occurred\n", REG(RFCORE_SFR_RFERRF));
1235
1236 /* If the error is not an RX FIFO overflow, set a flag */
1238 rf_flags |= RF_MUST_RESET;
1239 }
1240
1241 REG(RFCORE_SFR_RFERRF) = 0;
1242
1243 process_poll(&cc2538_rf_process);
1244}
1245/*---------------------------------------------------------------------------*/
1246
1247/** @} */
Header file for the cc2538 RF driver.
Header file for the energy estimation mechanism.
@ RF_ERR_IRQn
RF Error Interrupt.
Definition: cc2538_cm3.h:110
@ RF_TX_RX_IRQn
RF Tx/Rx Interrupt.
Definition: cc2538_cm3.h:109
void clock_delay_usec(uint16_t dt)
Delay a given number of microseconds.
Definition: clock.c:150
void cc2538_rf_rx_tx_isr(void)
The cc2538 RF RX/TX ISR.
Definition: cc2538-rf.c:1205
static radio_value_t get_rssi(void)
Reads the current signal strength (RSSI)
Definition: cc2538-rf.c:234
#define CC2538_RF_CSP_ISRFOFF()
Send a RF OFF command strobe to the CSP.
Definition: cc2538-rf.h:107
#define CC2538_RF_CSP_ISRXON()
Send an RX ON command strobe to the CSP.
Definition: cc2538-rf.h:95
static void get_iq_lsbs(radio_value_t *value)
Reads the current I/Q data of the received signal.
Definition: cc2538-rf.c:269
#define CC2538_RF_CSP_ISFLUSHTX()
Flush the TX FIFO.
Definition: cc2538-rf.h:120
static uint8_t get_channel()
Get the current operating channel.
Definition: cc2538-rf.c:166
const struct radio_driver cc2538_rf_driver
The NETSTACK data structure for the cc2538 RF driver.
Definition: cc2538-rf.c:1127
static void set_channel(uint8_t channel)
Set the current operating channel.
Definition: cc2538-rf.c:176
#define CC2538_RF_CSP_ISFLUSHRX()
Flush the RX FIFO.
Definition: cc2538-rf.h:113
#define CC2538_RF_CSP_ISTXON()
Send a TX ON command strobe to the CSP.
Definition: cc2538-rf.h:101
void cc2538_rf_err_isr(void)
The cc2538 RF Error ISR.
Definition: cc2538-rf.c:1232
PROCESS_THREAD(cc2538_rf_process, ev, data)
Implementation of the cc2538 RF driver process.
Definition: cc2538-rf.c:1154
static int init(void)
Definition: cc2538-rf.c:558
#define RFCORE_FFSM_PAN_ID0
Local address information.
Definition: rfcore-ffsm.h:62
#define RFCORE_XREG_FSMSTAT1_SFD
SFD was sent/received.
Definition: rfcore-xreg.h:283
#define RFCORE_SFR_MTM1
MAC Timer MUX register 1.
Definition: rfcore-sfr.h:51
#define RFCORE_SFR_MTMOVF2_MTMOVF2
Register[23:16].
Definition: rfcore-sfr.h:117
#define RFCORE_XREG_CCACTRL0
CCA threshold.
Definition: rfcore-xreg.h:66
#define RFCORE_SFR_MTMOVF1_MTMOVF1
Register[15:8].
Definition: rfcore-sfr.h:123
#define RFCORE_SFR_MTCTRL_STATE
State of MAC Timer.
Definition: rfcore-sfr.h:78
#define RFCORE_XREG_FRMCTRL0
Frame handling.
Definition: rfcore-xreg.h:53
#define RFCORE_XREG_FSMSTAT1
Radio status register.
Definition: rfcore-xreg.h:63
#define RFCORE_XREG_SRCMATCH
Source address matching.
Definition: rfcore-xreg.h:46
#define RFCORE_XREG_RXENABLE_RXENMASK
Enables the receiver.
Definition: rfcore-xreg.h:228
#define RFCORE_XREG_FRMFILT0
Frame filtering control.
Definition: rfcore-xreg.h:44
#define RFCORE_SFR_MTM0_MTM0
Register[7:0].
Definition: rfcore-sfr.h:115
#define RFCORE_XREG_FRMCTRL0_RX_MODE
Set RX modes.
Definition: rfcore-xreg.h:213
#define RFCORE_XREG_RFERRM_RFERRM
RF error interrupt mask.
Definition: rfcore-xreg.h:393
#define RFCORE_XREG_FSMSTAT0
Radio status register.
Definition: rfcore-xreg.h:62
#define RFCORE_SFR_MTCTRL_SYNC
Timer start/stop timing.
Definition: rfcore-sfr.h:79
#define RFCORE_XREG_RFERRM
RF error interrupt mask.
Definition: rfcore-xreg.h:81
#define RFCORE_XREG_RFRND_QRND
Random bit from the Q channel.
Definition: rfcore-xreg.h:412
#define RFCORE_XREG_TXPOWER
Controls the output power.
Definition: rfcore-xreg.h:60
#define RFCORE_SFR_MTMSEL
MAC Timer multiplex select.
Definition: rfcore-sfr.h:49
#define RFCORE_SFR_MTMOVF0_MTMOVF0
Register[7:0].
Definition: rfcore-sfr.h:124
#define RFCORE_XREG_FRMCTRL0_AUTOACK
Transmit ACK frame enable.
Definition: rfcore-xreg.h:211
#define RFCORE_XREG_RSSISTAT
RSSI valid status register.
Definition: rfcore-xreg.h:69
#define RFCORE_SFR_MTMOVF2
MAC Timer MUX overflow 2.
Definition: rfcore-sfr.h:52
#define RFCORE_SFR_MTCTRL_RUN
Timer start/stop.
Definition: rfcore-sfr.h:80
#define RFCORE_XREG_RFRND_IRND
Random bit from the I channel.
Definition: rfcore-xreg.h:413
#define RFCORE_SFR_MTM0
MAC Timer MUX register 0.
Definition: rfcore-sfr.h:50
#define RFCORE_XREG_MDMTEST1
Test Register for Modem.
Definition: rfcore-xreg.h:100
#define RFCORE_SFR_RFERRF_RXOVERF
RX FIFO overflowed.
Definition: rfcore-sfr.h:140
#define RFCORE_XREG_FSMSTAT1_FIFOP
FIFOP status.
Definition: rfcore-xreg.h:282
#define RFCORE_FFSM_EXT_ADDR0
Local address information.
Definition: rfcore-ffsm.h:54
#define RFCORE_SFR_MTMOVF0
MAC Timer MUX overflow 0.
Definition: rfcore-sfr.h:54
#define RFCORE_SFR_MTMOVF1
MAC Timer MUX overflow 1.
Definition: rfcore-sfr.h:53
#define RFCORE_XREG_FSMSTAT1_TX_ACTIVE
Status signal - TX states.
Definition: rfcore-xreg.h:287
#define RFCORE_XREG_RFIRQM0
RF interrupt masks.
Definition: rfcore-xreg.h:79
#define RFCORE_XREG_FSMSTAT1_CCA
Clear channel assessment.
Definition: rfcore-xreg.h:284
#define RFCORE_XREG_FRMCTRL0_AUTOCRC
Auto CRC generation / checking.
Definition: rfcore-xreg.h:210
#define RFCORE_XREG_RSSI
RSSI status register.
Definition: rfcore-xreg.h:68
#define RFCORE_SFR_MTCTRL_LATCH_MODE
OVF counter latch mode.
Definition: rfcore-sfr.h:77
#define RFCORE_FFSM_PAN_ID1
Local address information.
Definition: rfcore-ffsm.h:63
#define RFCORE_XREG_AGCCTRL1
AGC reference level.
Definition: rfcore-xreg.h:93
#define RFCORE_FFSM_SHORT_ADDR1
Local address information.
Definition: rfcore-ffsm.h:65
#define RFCORE_SFR_RFERRF
RF error interrupt flags.
Definition: rfcore-sfr.h:61
#define RFCORE_XREG_FIFOPCTRL
FIFOP threshold.
Definition: rfcore-xreg.h:64
#define RFCORE_SFR_RFDATA
TX/RX FIFO data.
Definition: rfcore-sfr.h:60
#define RFCORE_SFR_MTM1_MTM1
Register[15:8].
Definition: rfcore-sfr.h:116
#define RFCORE_XREG_FSMSTAT0_FSM_FFCTRL_STATE
FIFO and FFCTRL status.
Definition: rfcore-xreg.h:275
#define RFCORE_XREG_FRMCTRL0_TX_MODE
Set test modes for TX.
Definition: rfcore-xreg.h:214
#define RFCORE_XREG_RXENABLE
RX enabling.
Definition: rfcore-xreg.h:55
#define RFCORE_XREG_FRMFILT0_FRAME_FILTER_EN
Enables frame filtering.
Definition: rfcore-xreg.h:149
#define RFCORE_FFSM_SHORT_ADDR0
Local address information.
Definition: rfcore-ffsm.h:64
#define RFCORE_SFR_RFIRQF0
RF interrupt flags.
Definition: rfcore-sfr.h:63
#define RFCORE_XREG_CCACTRL0_CCA_THR
Clear-channel-assessment.
Definition: rfcore-xreg.h:307
#define RFCORE_XREG_FREQCTRL
Controls the RF frequency.
Definition: rfcore-xreg.h:59
#define RFCORE_SFR_MTCTRL
MAC Timer control register.
Definition: rfcore-sfr.h:46
#define RFCORE_XREG_FSMSTAT1_FIFO
FIFO status.
Definition: rfcore-xreg.h:281
#define RFCORE_XREG_RSSISTAT_RSSI_VALID
RSSI value is valid.
Definition: rfcore-xreg.h:327
#define RFCORE_XREG_TXFILTCFG
TX filter configuration.
Definition: rfcore-xreg.h:141
#define RFCORE_XREG_RFIRQM0_FIFOP
RX FIFO exceeded threshold.
Definition: rfcore-xreg.h:373
#define RFCORE_XREG_RFRND
Random data.
Definition: rfcore-xreg.h:83
#define RFCORE_XREG_FSCAL1
Tune frequency calibration.
Definition: rfcore-xreg.h:89
#define SYS_CTRL_DCGCRFC
RF Core clocks - PM0.
Definition: sys-ctrl.h:95
#define SYS_CTRL_RCGCRFC
RF Core clocks - active mode.
Definition: sys-ctrl.h:93
#define SYS_CTRL_SCGCRFC
RF Core clocks - Sleep mode.
Definition: sys-ctrl.h:94
void udma_set_channel_dst(uint8_t channel, uint32_t dst_end)
Sets the channel's destination address.
Definition: udma.c:80
void udma_channel_mask_set(uint8_t channel)
Disable peripheral triggers for a uDMA channel.
Definition: udma.c:204
void udma_channel_enable(uint8_t channel)
Enables a uDMA channel.
Definition: udma.c:120
uint8_t udma_channel_get_mode(uint8_t channel)
Retrieve the current mode for a channel.
Definition: udma.c:235
void udma_channel_sw_request(uint8_t channel)
Generate a software trigger to start a transfer.
Definition: udma.c:225
void udma_set_channel_control_word(uint8_t channel, uint32_t ctrl)
Configure the channel's control word.
Definition: udma.c:90
#define udma_xfer_size(len)
Calculate the value of the xfersize field in the control structure.
Definition: udma.h:697
void udma_set_channel_src(uint8_t channel, uint32_t src_end)
Sets the channels source address.
Definition: udma.c:70
#define CC2538_RF_CONF_RX_USE_DMA
RF RX over DMA.
Definition: cc2538-conf.h:231
#define CC2538_RF_CONF_TX_USE_DMA
RF TX over DMA.
Definition: cc2538-conf.h:227
#define CC2538_RF_CONF_TX_DMA_CHAN
RF -> RAM DMA channel.
Definition: cc2538-conf.h:95
#define CC2538_RF_CONF_RX_DMA_CHAN
RAM -> RF DMA channel.
Definition: cc2538-conf.h:96
void iq_seeder_seed(void)
This function will feed the CSPRNG with a new seed.
Definition: iq-seeder.c:142
void packetbuf_set_datalen(uint16_t len)
Set the length of the data in the packetbuf.
Definition: packetbuf.c:136
void * packetbuf_dataptr(void)
Get a pointer to the data in the packetbuf.
Definition: packetbuf.c:143
#define PACKETBUF_SIZE
The size of the packetbuf, in bytes.
Definition: packetbuf.h:67
void packetbuf_clear(void)
Clear and reset the packetbuf.
Definition: packetbuf.c:75
#define PROCESS(name, strname)
Declare a process.
Definition: process.h:307
#define PROCESS_BEGIN()
Define the beginning of a process.
Definition: process.h:120
#define PROCESS_END()
Define the end of a process.
Definition: process.h:131
void process_start(struct process *p, process_data_t data)
Start a process.
Definition: process.c:99
#define PROCESS_YIELD_UNTIL(c)
Yield the currently running process until a condition occurs.
Definition: process.h:178
void process_poll(struct process *p)
Request a process to be polled.
Definition: process.c:371
#define RADIO_RX_MODE_ADDRESS_FILTER
Enable address-based frame filtering.
Definition: radio.h:451
#define RADIO_RX_MODE_POLL_MODE
Enable/disable/get the state of radio driver poll mode operation.
Definition: radio.h:461
#define RADIO_TX_MODE_SEND_ON_CCA
Radio TX mode control / retrieval.
Definition: radio.h:474
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.
Definition: radio.h:88
#define RADIO_RX_MODE_AUTOACK
Enable automatic transmission of ACK frames.
Definition: radio.h:456
@ RADIO_RESULT_NOT_SUPPORTED
The parameter is not supported.
Definition: radio.h:481
@ RADIO_RESULT_INVALID_VALUE
The value argument was incorrect.
Definition: radio.h:482
@ RADIO_RESULT_OK
The parameter was set/read successfully.
Definition: radio.h:480
@ RADIO_PARAM_POWER_MODE
When getting the value of this parameter, the radio driver should indicate whether the radio is on or...
Definition: radio.h:119
@ RADIO_CONST_PHY_OVERHEAD
The physical layer header (PHR) + MAC layer footer (MFR) overhead in bytes.
Definition: radio.h:338
@ RADIO_PARAM_RSSI
Received signal strength indicator in dBm.
Definition: radio.h:218
@ RADIO_PARAM_LAST_PACKET_TIMESTAMP
Last packet timestamp, of type rtimer_clock_t.
Definition: radio.h:286
@ RADIO_PARAM_IQ_LSBS
The current I/Q LSBs.
Definition: radio.h:234
@ RADIO_PARAM_LAST_RSSI
The RSSI value of the last received packet.
Definition: radio.h:226
@ RADIO_CONST_BYTE_AIR_TIME
The air time of one byte in usec, e.g.
Definition: radio.h:343
@ RADIO_PARAM_RX_MODE
Radio receiver mode determines if the radio has address filter (RADIO_RX_MODE_ADDRESS_FILTER) and aut...
Definition: radio.h:173
@ RADIO_PARAM_CHANNEL
Channel used for radio communication.
Definition: radio.h:134
@ RADIO_PARAM_SHR_SEARCH
For enabling and disabling the SHR search.
Definition: radio.h:304
@ RADIO_PARAM_LAST_LINK_QUALITY
Link quality indicator of the last received packet.
Definition: radio.h:244
@ RADIO_CONST_DELAY_BEFORE_RX
The delay in usec between turning on the radio and it being actually listening (able to hear a preamb...
Definition: radio.h:355
@ RADIO_PARAM_TXPOWER
Transmission power in dBm.
Definition: radio.h:192
@ RADIO_PARAM_64BIT_ADDR
Long (64 bits) address for the radio, which is used by the address filter.
Definition: radio.h:263
@ 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...
Definition: radio.h:349
@ RADIO_CONST_CHANNEL_MAX
The highest radio channel number.
Definition: radio.h:316
@ RADIO_PARAM_PAN_ID
The personal area network identifier (PAN ID), which is used by the h/w frame filtering functionality...
Definition: radio.h:150
@ RADIO_PARAM_CCA_THRESHOLD
Clear channel assessment threshold in dBm.
Definition: radio.h:205
@ RADIO_CONST_TXPOWER_MIN
The minimum transmission power in dBm.
Definition: radio.h:321
@ RADIO_CONST_CHANNEL_MIN
The lowest radio channel number.
Definition: radio.h:311
@ RADIO_CONST_TXPOWER_MAX
The maximum transmission power in dBm.
Definition: radio.h:326
@ 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...
Definition: radio.h:361
@ RADIO_PARAM_16BIT_ADDR
The short address (16 bits) for the radio, which is used by the h/w filter.
Definition: radio.h:166
@ RADIO_PARAM_TX_MODE
Radio transmission mode determines if the radio has send on CCA (RADIO_TX_MODE_SEND_ON_CCA) enabled o...
Definition: radio.h:180
@ RADIO_SHR_SEARCH_EN
Enable SHR search or SHR search is enabled.
Definition: radio.h:419
@ RADIO_SHR_SEARCH_DIS
Disable SHR search or SHR search is enabled.
Definition: radio.h:418
@ RADIO_POWER_MODE_CARRIER_OFF
Radio powered on, but not emitting unmodulated carriers.
Definition: radio.h:410
@ RADIO_POWER_MODE_OFF
Radio powered off and in the lowest possible power consumption state.
Definition: radio.h:395
@ RADIO_POWER_MODE_ON
Radio powered on and able to receive frames.
Definition: radio.h:400
@ RADIO_POWER_MODE_CARRIER_ON
Radio powered on and emitting unmodulated carriers.
Definition: radio.h:405
@ RADIO_TX_COLLISION
TX failed due to a collision.
Definition: radio.h:511
@ RADIO_TX_ERR
An error occurred during transmission.
Definition: radio.h:506
@ RADIO_TX_OK
TX was successful and where an ACK was requested one was received.
Definition: radio.h:498
#define RTIMER_NOW()
Get the current clock time.
Definition: rtimer.h:185
const tsch_timeslot_timing_usec tsch_timeslot_timing_us_10000
TSCH timing attributes and description.
I/Q data-based seeder.
Header file for the link-layer address representation.
Header file for the logging system.
#define IEEE802154_DEFAULT_CHANNEL
The default channel for IEEE 802.15.4 networks.
Definition: mac.h:52
Include file for the Contiki low-layer network stack (NETSTACK)
Header file for the Packet buffer (packetbuf) management.
Header file for the radio API.
Header file with register manipulation macro definitions.
Top-level header file for cc2538 RF Core registers.
Header file for the real-time timer module.
void(* input)(void)
Callback for getting notified of incoming packet.
Definition: mac.h:72
The structure of a Contiki-NG radio device driver.
Definition: radio.h:534
radio_result_t(* get_object)(radio_param_t param, void *dest, size_t size)
Get a radio parameter object.
Definition: radio.h:770
int(* read)(void *buf, unsigned short buf_len)
Read a received packet into a buffer.
Definition: radio.h:655
int(* prepare)(const void *payload, unsigned short payload_len)
Prepare the radio with a packet to be sent.
Definition: radio.h:580
radio_result_t(* set_value)(radio_param_t param, radio_value_t value)
Set a radio parameter value.
Definition: radio.h:756
int(* off)(void)
Turn the radio off.
Definition: radio.h:729
int(* send)(const void *payload, unsigned short payload_len)
Prepare & transmit a packet.
Definition: radio.h:631
int(* receiving_packet)(void)
Check if the radio driver is currently receiving a packet.
Definition: radio.h:684
radio_result_t(* set_object)(radio_param_t param, const void *src, size_t size)
Set a radio parameter object.
Definition: radio.h:787
int(* on)(void)
Turn the radio on.
Definition: radio.h:711
int(* transmit)(unsigned short transmit_len)
Send the packet that has previously been prepared.
Definition: radio.h:619
int(* pending_packet)(void)
Check if a packet has been received and is available in the radio driver's buffers.
Definition: radio.h:697
radio_result_t(* get_value)(radio_param_t param, radio_value_t *value)
Get a radio parameter value.
Definition: radio.h:741
int(* channel_clear)(void)
Perform a Clear-Channel Assessment (CCA) to find out if there is a packet in the air or not.
Definition: radio.h:672
Header file for the cc2538 System Control driver.
Main API declarations for TSCH.
Header file with register, macro and function declarations for the cc2538 micro-DMA controller module...
static uip_ds6_addr_t * addr
Pointer to a nbr cache entry.
Definition: uip-nd6.c:107