Loading...
Searching...
No Matches
cc2538_rf.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2016 MUTEX NZ Ltd.
3 * Copyright (C) 2015 Loci Controls Inc.
4 *
5 * This file is subject to the terms and conditions of the GNU Lesser
6 * General Public License v2.1. See the file LICENSE in the top level
7 * directory for more details.
8 *
9 */
10
22#ifndef CC2538_RF_H
23#define CC2538_RF_H
24
25#include <stdbool.h>
26
27#include "board.h"
28#include "cc2538_rfcore.h"
29
30#include "net/ieee802154.h"
31#include "kernel_defines.h"
32
33#include "net/ieee802154/radio.h"
34
35#include "net/netopt.h"
36
37#ifdef __cplusplus
38extern "C" {
39#endif
40
41#define CC2538_AUTOCRC_LEN (2)
42#define CC2538_RF_FIFO_SIZE (128)
43#define CC2538_PACKET_LENGTH_SIZE (1)
44#define CC2538_LENGTH_BYTE_MASK (0x7F)
46#define CC2538_RF_MAX_DATA_LEN (CC2538_RF_FIFO_SIZE - CC2538_PACKET_LENGTH_SIZE)
47
48/* TODO: Move these to sys/include/net/ieee802154.h somehow */
49/* IEEE 802.15.4 defined constants (2.4 GHz logical channels) */
50#define IEEE802154_MIN_FREQ (2405)
51#define IEEE802154_MAX_FREQ (2480)
53#define IEEE802154_CHANNEL_SPACING (5)
55#define IEEE802154_CHAN2FREQ(chan) ( IEEE802154_MIN_FREQ + ((chan) - IEEE802154_CHANNEL_MIN) * IEEE802154_CHANNEL_SPACING )
56#define IEEE802154_FREQ2CHAN(freq) ( IEEE802154_CHANNEL_MIN + ((freq) - IEEE802154_MIN_FREQ) / IEEE802154_CHANNEL_SPACING )
57/* /TODO */
58
59#define CC2538_MIN_FREQ (2394)
60#define CC2538_MAX_FREQ (2507)
61
62#define CC2538_RF_POWER_DEFAULT (CONFIG_IEEE802154_DEFAULT_TXPOWER)
63#define CC2538_RF_CHANNEL_DEFAULT (CONFIG_IEEE802154_DEFAULT_CHANNEL)
64
65#define OUTPUT_POWER_MIN (-24)
66#define OUTPUT_POWER_MAX (7)
67#define NUM_POWER_LEVELS ( OUTPUT_POWER_MAX - OUTPUT_POWER_MIN + 1 )
68
69#define CC2538_CORR_VAL_MIN (50U)
70#define CC2538_CORR_VAL_MAX (110U)
71#define CC2538_CORR_VAL_MASK (0x7F)
72
73#define CC2538_CRC_BIT_MASK (0x80)
74
75#define CC2538_CCA_THR_MASK (0x000000FF)
77#define CC2538_CCA_MODE_MASK (0x18)
78#define CC2538_CCA_MODE_POS (3U)
80#define CC2538_CSP_SKIP_INST_MASK (0x70)
81#define CC2538_CSP_SKIP_INST_POS (4U)
83#define CC2538_CSP_SKIP_N_MASK (0x08)
85#define CC2538_CSP_SKIP_COND_CCA (0x00)
86#define CC2538_CSP_SKIP_COND_CSPZ (0x06)
87#define CC2538_CSP_SKIP_COND_RSSI (0x07)
89#define CC2538_SFR_MTMSEL_MASK (0x7)
90#define CC2538_SFR_MTMSEL_TIMER_P (0x2)
91#define CC2538_MCTRL_SYNC_MASK (0x2)
92#define CC2538_MCTRL_RUN_MASK (0x1)
94#define CC2538_CSP_MCU_CTRL_MASK (0x1)
96#define CC2538_CSP_INCMAXY_MAX_MASK (0x7)
99#define CC2538_RXENABLE_RXON_MASK (0x80)
101#define CC2538_RSSI_OFFSET (-73)
102#define CC2538_RF_SENSITIVITY (-97)
104#define CC2538_ACCEPT_FT_0_BEACON (1 << 3)
105#define CC2538_ACCEPT_FT_1_DATA (1 << 4)
106#define CC2538_ACCEPT_FT_2_ACK (1 << 5)
107#define CC2538_ACCEPT_FT_3_CMD (1 << 6)
108#define CC2538_STATE_SFD_WAIT_RANGE_MIN (0x03U)
109#define CC2538_STATE_SFD_WAIT_RANGE_MAX (0x06U)
110#define CC2538_FRMCTRL1_PENDING_OR_MASK (0x04)
112#define CC2538_FRMCTRL0_RX_MODE_DIS (0xC)
115#define RFCORE_ASSERT(expr) (void)( (expr) || RFCORE_ASSERT_failure(#expr, __FUNCTION__, __LINE__) )
116
117#if DEVELHELP
118#define RFCORE_WAIT_UNTIL(expr) while (!(expr)) { \
119 DEBUG("RFCORE_WAIT_UNTIL(%s) at line %u in %s()\n", #expr, __LINE__, __FUNCTION__); \
120 thread_yield(); \
121}
122#else
123#define RFCORE_WAIT_UNTIL(expr) while (!(expr)) thread_yield()
124#endif
125
126#define RFCORE_FLUSH_RECEIVE_FIFO() rfcore_strobe(ISFLUSHRX)
127
128#define ABS_DIFF(x, y) ( ((x) < (y))? ((y) - (x)) : ((x) - (y)) )
129#define BOOLEAN(x) ( (x) != 0 )
130#define NOT(x) ( (x) == 0 )
131#define GET_BYTE(buffer, index) ( (unsigned char*)(buffer) )[index]
132
133#define BIT(n) ( 1 << (n) )
134
135enum {
136 FSM_STATE_IDLE = 0,
137 FSM_STATE_RX_CALIBRATION = 2,
138 FSM_STATE_TX_CALIBRATION = 32,
139};
140
144enum {
145 STROBE_ERR = BIT(6),
146 TXUNDERF = BIT(5),
147 TXOVERF = BIT(4),
148 RXUNDERF = BIT(3),
149 RXOVERF = BIT(2),
150 RXABO = BIT(1),
151 NLOCK = BIT(0),
152};
153
157enum {
158 SET_RXENMASK_ON_TX = BIT(0),
159 IGNORE_TX_UNDERF = BIT(1),
160 PENDING_OR = BIT(2),
161};
162
166enum {
167 ENERGY_SCAN = BIT(4),
168 AUTOACK = BIT(5),
169 AUTOCRC = BIT(6),
170 APPEND_DATA_MODE = BIT(7),
171};
172
176enum {
177 ACT_UNUSED = BIT(0),
178 SFD = BIT(1),
179 FIFOP = BIT(2),
180 SRC_MATCH_DONE = BIT(3),
181 SRC_MATCH_FOUND = BIT(4),
182 FRAME_ACCEPTED = BIT(5),
183 RXPKTDONE = BIT(6),
184 RXMASKZERO = BIT(7),
185};
186
190enum {
191 TXACKDONE = BIT(0),
192 TXDONE = BIT(1),
193 RF_IDLE = BIT(2),
194 CSP_MANINT = BIT(3),
195 CSP_STOP = BIT(4),
196 CSP_WAIT = BIT(5),
197};
198
202enum {
203 rfc_obs_sig0 = 0,
204 rfc_obs_sig1 = 1,
205 rfc_obs_sig2 = 2,
206};
207
211enum {
214 rfc_sniff_data = 0x08,
217 rssi_valid = 0x0c,
220 demod_cca = 0x0d,
223 sampled_cca = 0x0e,
226 sfd_sync = 0x0f,
230 tx_active = 0x10,
232 rx_active = 0x11,
234 ffctrl_fifo = 0x12,
236 ffctrl_fifop = 0x13,
242 packet_done = 0x14,
245 rfc_xor_rand_i_q = 0x16,
247 rfc_rand_q = 0x17,
249 rfc_rand_i = 0x18,
251 lock_status = 0x19,
252 pa_pd = 0x20,
253 lna_pd = 0x2a,
254 disabled = 0xff,
255};
256
260#ifndef CONFIG_CC2538_RF_OBS_0
261#define CONFIG_CC2538_RF_OBS_0 tx_active
262#endif
263#ifndef CONFIG_CC2538_RF_OBS_1
264#define CONFIG_CC2538_RF_OBS_1 rx_active
265#endif
266#ifndef CONFIG_CC2538_RF_OBS_2
267#define CONFIG_CC2538_RF_OBS_2 rssi_valid
268#endif
269
270/* Default configuration for cc2538dk or similar */
271#ifndef CONFIG_CC2538_RF_OBS_SIG_0_PCX
272#define CONFIG_CC2538_RF_OBS_SIG_0_PCX 0 /* PC0 = LED_1 (red) */
273#endif
274#ifndef CONFIG_CC2538_RF_OBS_SIG_1_PCX
275#define CONFIG_CC2538_RF_OBS_SIG_1_PCX 1 /* PC0 = LED_2 (red) */
276#endif
277#ifndef CONFIG_CC2538_RF_OBS_SIG_2_PCX
278#define CONFIG_CC2538_RF_OBS_SIG_2_PCX 2 /* PC0 = LED_3 (red) */
279#endif
280#if ((CONFIG_CC2538_RF_OBS_SIG_2_PCX > 7) || \
281 (CONFIG_CC2538_RF_OBS_SIG_1_PCX > 7) || \
282 (CONFIG_CC2538_RF_OBS_SIG_0_PCX > 7))
283#error "CONFIG_CC2538_RF_OBS_SIG_X_PCX must be between 0-7 (PC0-PC7)"
284#endif
285
289typedef struct {
290 uint8_t state;
292
301
305static inline void cc2538_rf_enable_irq(void)
306{
307 RFCORE_XREG_RFIRQM1 = TXDONE | CSP_STOP | TXACKDONE;
309}
310
314static inline void cc2538_rf_disable_irq(void)
315{
318}
319
325
333
339void cc2538_get_addr_long(uint8_t *addr);
340
346void cc2538_get_addr_short(uint8_t *addr);
347
353unsigned int cc2538_get_chan(void);
354
362
368uint16_t cc2538_get_pan(void);
369
376
381void cc2538_init(void);
382
389bool cc2538_is_on(void);
390
395void cc2538_off(void);
396
401bool cc2538_on(void);
402
409
415void cc2538_set_addr_short(const uint8_t *addr);
416
422void cc2538_set_addr_long(const uint8_t *addr);
423
429void cc2538_set_chan(unsigned int chan);
430
436void cc2538_set_freq(unsigned int MHz);
437
443void cc2538_set_monitor(bool mode);
444
450void cc2538_set_pan(uint16_t pan);
451
459
466
467#ifdef __cplusplus
468}
469#endif
470
471#endif /* CC2538_RF_H */
#define RFCORE_XREG_RFIRQM0
RF interrupt masks.
Definition cc2538.h:384
#define RFCORE_XREG_RFIRQM1
RF interrupt masks.
Definition cc2538.h:385
void cc2538_set_pan(uint16_t pan)
Set the PAN ID of the device.
void cc2538_set_addr_long(const uint8_t *addr)
Set the long address of the device.
unsigned int cc2538_get_chan(void)
Get the configured channel number of the device.
void cc2538_off(void)
Deactivate the CC2538 radio device.
bool cc2538_on(void)
Activate the CC2538 radio device.
void cc2538_rf_hal_setup(ieee802154_dev_t *hal)
Setup CC2538 in order to be used with the IEEE 802.15.4 Radio HAL.
void cc2538_irq_handler(void)
IRQ handler for RF events.
bool cc2538_channel_clear(void)
Trigger a clear channel assessment.
void cc2538_set_addr_short(const uint8_t *addr)
Set the short address of the device.
void cc2538_set_chan(unsigned int chan)
Set the channel number of the device.
static void cc2538_rf_enable_irq(void)
Enable CC2538 RF IRQs.
Definition cc2538_rf.h:305
void cc2538_init(void)
Initialise the CC2538 radio hardware.
uint16_t cc2538_get_pan(void)
Get the configured PAN ID of the device.
void cc2538_set_tx_power(int dBm)
Set the transmission power for the device.
void cc2538_set_monitor(bool mode)
Enable/disable monitor (promiscuous) mode for the device.
@ RXPKTDONE
End of frame event.
Definition cc2538_rf.h:183
@ SFD
Start of frame event.
Definition cc2538_rf.h:178
void cc2538_get_addr_short(uint8_t *addr)
Get the configured short address of the device.
static void cc2538_rf_disable_irq(void)
Disable CC2538 RF IRQs.
Definition cc2538_rf.h:314
bool cc2538_is_on(void)
Check if device is active.
bool cc2538_get_monitor(void)
Check if device is in monitor (promiscuous) mode.
void cc2538_set_state(cc2538_rf_t *dev, netopt_state_t state)
Set the state of the device.
@ rfc_rand_i
Random data output from the I channel of the receiver.
Definition cc2538_rf.h:249
@ lna_pd
LNA power-down signal.
Definition cc2538_rf.h:253
@ rssi_valid
Pin is high when the RSSI value has been updated at least once since RX was started.
Definition cc2538_rf.h:217
@ packet_done
A complete frame has been received.
Definition cc2538_rf.h:242
@ rx_active
Indicates that FFCTRL is in one of the RX states.
Definition cc2538_rf.h:232
@ disabled
disabled
Definition cc2538_rf.h:254
@ constant_value_0
Constant value 0.
Definition cc2538_rf.h:212
@ sampled_cca
A sampled version of the CCA bit from demodulator.
Definition cc2538_rf.h:223
@ rfc_xor_rand_i_q
XOR between I and Q random outputs.
Definition cc2538_rf.h:245
@ rfc_sniff_data
Data from packet sniffer.
Definition cc2538_rf.h:214
@ ffctrl_fifop
Pin is high when the number of bytes in the RXFIFO exceeds the programmable threshold or at least one...
Definition cc2538_rf.h:236
@ pa_pd
Power amplifier power-down signal.
Definition cc2538_rf.h:252
@ sfd_sync
Pin is high when a SFD has been received or transmitted.
Definition cc2538_rf.h:226
@ demod_cca
Clear channel assessment.
Definition cc2538_rf.h:220
@ constant_value_1
Constant value 1.
Definition cc2538_rf.h:213
@ tx_active
Indicates that FFCTRL is in one of the TX states.
Definition cc2538_rf.h:230
@ ffctrl_fifo
Pin is high when one or more bytes are in the RXFIFO.
Definition cc2538_rf.h:234
@ rfc_rand_q
Random data output from the Q channel of the receiver.
Definition cc2538_rf.h:247
@ rfc_sniff_clk
250kHz clock for packet sniffer data.
Definition cc2538_rf.h:216
@ lock_status
1 when PLL is in lock, otherwise 0
Definition cc2538_rf.h:251
void cc2538_set_freq(unsigned int MHz)
Set the frequency of the device.
void cc2538_get_addr_long(uint8_t *addr)
Get the configured long address of the device.
int cc2538_get_tx_power(void)
Get the configured transmission power of the device.
void cc2538_setup(cc2538_rf_t *dev)
Setup a CC2538 radio device.
CC2538 RF core interface.
netopt_state_t
Option parameter to be used with NETOPT_STATE to set or get the state of a network device or protocol...
Definition netopt.h:894
Common macros and compiler attributes/pragmas configuration.
Definition of global configuration options.
Device descriptor for CC2538 transceiver.
Definition cc2538_rf.h:289
uint8_t state
current state of the radio
Definition cc2538_rf.h:290
the IEEE802.15.4 device descriptor
Definition radio.h:415
IEEE 802.15.4 header definitions.