47 #include "dev/watchdog.h"
53 #include "sys/clock.h"
63 #include "hw_rfc_dbell.h"
64 #include "hw_rfc_pwr.h"
67 #include "rf-core/api/mailbox.h"
68 #include "rf-core/api/common_cmd.h"
69 #include "rf-core/api/data_entry.h"
70 #include "rf-core/api/prop_mailbox.h"
71 #include "rf-core/api/prop_cmd.h"
74 #include "rf_patches/rf_patch_cpe_genfsk.h"
76 #include "rf-core/smartrf-settings.h"
85 #define PRINTF(...) printf(__VA_ARGS__)
91 #define DATA_ENTRY_STATUS_PENDING 0x00
92 #define DATA_ENTRY_STATUS_ACTIVE 0x01
93 #define DATA_ENTRY_STATUS_BUSY 0x02
94 #define DATA_ENTRY_STATUS_FINISHED 0x03
95 #define DATA_ENTRY_STATUS_UNFINISHED 0x04
98 #ifdef PROP_MODE_CONF_DW
99 #define PROP_MODE_DW PROP_MODE_CONF_DW
101 #define PROP_MODE_DW 0
104 #ifdef PROP_MODE_CONF_USE_CRC16
105 #define PROP_MODE_USE_CRC16 PROP_MODE_CONF_USE_CRC16
107 #define PROP_MODE_USE_CRC16 0
110 #ifdef PROP_MODE_CONF_SNIFFER
111 #define PROP_MODE_SNIFFER PROP_MODE_CONF_SNIFFER
113 #define PROP_MODE_SNIFFER 0
116 #if PROP_MODE_SNIFFER
117 static const uint8_t magic[] = { 0x53, 0x6E, 0x69, 0x66 };
128 #define RF_RADIO_OP_GET_STATUS(a) GET_FIELD_V(a, radioOp, status)
131 #define RF_CMD_CCA_REQ_RSSI_UNKNOWN -128
134 #define RF_CCA_CLEAR 1
135 #define RF_CCA_BUSY 0
138 #define RF_GET_CCA_INFO_ERROR 0xFF
144 #define RF_CMD_CCA_REQ_CCA_STATE_IDLE 0
145 #define RF_CMD_CCA_REQ_CCA_STATE_BUSY 1
146 #define RF_CMD_CCA_REQ_CCA_STATE_INVALID 2
148 #ifdef PROP_MODE_CONF_RSSI_THRESHOLD
149 #define PROP_MODE_RSSI_THRESHOLD PROP_MODE_CONF_RSSI_THRESHOLD
151 #define PROP_MODE_RSSI_THRESHOLD 0xA6
154 static int8_t rssi_threshold = PROP_MODE_RSSI_THRESHOLD;
157 static int off(
void);
159 static rfc_propRxOutput_t rx_stats;
162 #define DOT_4G_MAX_FRAME_LEN 2047
163 #define DOT_4G_PHR_LEN 2
166 #define DOT_4G_PHR_CRC16 0x10
167 #define DOT_4G_PHR_DW 0x08
169 #if PROP_MODE_USE_CRC16
171 #define DOT_4G_PHR_CRC_BIT DOT_4G_PHR_CRC16
175 #define DOT_4G_PHR_CRC_BIT 0
180 #define DOT_4G_PHR_DW_BIT DOT_4G_PHR_DW
182 #define DOT_4G_PHR_DW_BIT 0
186 #define TX_WAIT_TIMEOUT (RTIMER_SECOND >> 11)
189 #define ENTER_RX_WAIT_TIMEOUT (RTIMER_SECOND >> 10)
192 typedef struct output_config {
197 static const output_config_t output_power[] = {
216 #define OUTPUT_CONFIG_COUNT (sizeof(output_power) / sizeof(output_config_t))
219 #define OUTPUT_POWER_MIN (output_power[OUTPUT_CONFIG_COUNT - 1].dbm)
220 #define OUTPUT_POWER_MAX (output_power[0].dbm)
221 #define OUTPUT_POWER_UNKNOWN 0xFFFF
224 const output_config_t *tx_power_current = &output_power[1];
226 #ifdef PROP_MODE_CONF_LO_DIVIDER
227 #define PROP_MODE_LO_DIVIDER PROP_MODE_CONF_LO_DIVIDER
229 #define PROP_MODE_LO_DIVIDER 0x05
232 #define DATA_ENTRY_LENSZ_NONE 0
233 #define DATA_ENTRY_LENSZ_BYTE 1
234 #define DATA_ENTRY_LENSZ_WORD 2
236 #define RX_BUF_SIZE 140
238 static uint8_t rx_buf_0[RX_BUF_SIZE] CC_ALIGN(4);
239 static uint8_t rx_buf_1[RX_BUF_SIZE] CC_ALIGN(4);
242 static dataQueue_t rx_data_queue = { 0 };
245 volatile static uint8_t *rx_read_entry;
248 #define TX_BUF_PAYLOAD_LEN 180
249 #define TX_BUF_HDR_LEN 2
251 static uint8_t tx_buf[TX_BUF_HDR_LEN + TX_BUF_PAYLOAD_LEN] CC_ALIGN(4);
260 return smartrf_settings_cmd_prop_rx_adv.status == RF_CORE_RADIO_OP_STATUS_ACTIVE;
266 return smartrf_settings_cmd_prop_tx_adv.status == RF_CORE_RADIO_OP_STATUS_ACTIVE;
275 rfc_CMD_GET_RSSI_t cmd;
280 if(on() != RF_CORE_CMD_OK) {
281 PRINTF(
"get_rssi: on() failed\n");
282 return RF_CMD_CCA_REQ_RSSI_UNKNOWN;
286 memset(&cmd, 0x00,
sizeof(cmd));
287 cmd.commandNo = CMD_GET_RSSI;
289 rssi = RF_CMD_CCA_REQ_RSSI_UNKNOWN;
293 rssi = (cmd_status >> 16) & 0xFF;
309 freq_khz = smartrf_settings_cmd_fs.frequency * 1000;
317 freq_khz += (((smartrf_settings_cmd_fs.fractFreq * 1000) + 65535) / 65536);
319 return (freq_khz - DOT_15_4G_CHAN0_FREQUENCY) / DOT_15_4G_CHANNEL_SPACING;
323 set_channel(uint8_t channel)
328 new_freq = DOT_15_4G_CHAN0_FREQUENCY + (channel * DOT_15_4G_CHANNEL_SPACING);
330 freq = (uint16_t)(new_freq / 1000);
331 frac = (new_freq - (freq * 1000)) * 65536 / 1000;
333 PRINTF(
"set_channel: %u = 0x%04x.0x%04x (%lu)\n", channel, freq, frac,
336 smartrf_settings_cmd_prop_radio_div_setup.centerFreq = freq;
337 smartrf_settings_cmd_fs.frequency = freq;
338 smartrf_settings_cmd_fs.fractFreq = frac;
345 return tx_power_current->dbm;
357 for(i = OUTPUT_CONFIG_COUNT - 1; i >= 0; --i) {
358 if(power <= output_power[i].dbm) {
364 tx_power_current = &output_power[i];
372 prop_div_radio_setup(
void)
375 rfc_radioOp_t *cmd = (rfc_radioOp_t *)&smartrf_settings_cmd_prop_radio_div_setup;
378 smartrf_settings_cmd_prop_radio_div_setup.loDivider = PROP_MODE_LO_DIVIDER;
381 smartrf_settings_cmd_prop_radio_div_setup.txPower = tx_power_current->tx_power;
385 PRINTF(
"prop_div_radio_setup: DIV_SETUP, CMDSTA=0x%08lx, status=0x%04x\n",
386 cmd_status, cmd->status);
387 return RF_CORE_CMD_ERROR;
392 PRINTF(
"prop_div_radio_setup: DIV_SETUP wait, CMDSTA=0x%08lx,"
393 "status=0x%04x\n", cmd_status, cmd->status);
394 return RF_CORE_CMD_ERROR;
397 return RF_CORE_CMD_OK;
405 volatile rfc_CMD_PROP_RX_ADV_t *cmd_rx_adv;
408 cmd_rx_adv = (rfc_CMD_PROP_RX_ADV_t *)&smartrf_settings_cmd_prop_rx_adv;
409 cmd_rx_adv->status = RF_CORE_RADIO_OP_STATUS_IDLE;
415 cmd_rx_adv->maxPktLen = DOT_4G_MAX_FRAME_LEN - cmd_rx_adv->lenOffset;
419 if(ret != RF_CORE_CMD_OK) {
420 PRINTF(
"rf_cmd_prop_rx: send_cmd ret=%d, CMDSTA=0x%08lx, status=0x%04x\n",
421 ret, cmd_status, cmd_rx_adv->status);
422 return RF_CORE_CMD_ERROR;
427 while(cmd_rx_adv->status != RF_CORE_RADIO_OP_STATUS_ACTIVE &&
428 (RTIMER_CLOCK_LT(
RTIMER_NOW(), t0 + ENTER_RX_WAIT_TIMEOUT)));
431 if(cmd_rx_adv->status != RF_CORE_RADIO_OP_STATUS_ACTIVE) {
432 PRINTF(
"rf_cmd_prop_rx: CMDSTA=0x%08lx, status=0x%04x\n",
433 cmd_status, cmd_rx_adv->status);
434 return RF_CORE_CMD_ERROR;
446 PRINTF(
"rx_on_prop: We were on. PD=%u, RX=0x%04x\n",
448 return RF_CORE_CMD_OK;
452 ret = rf_cmd_prop_rx();
455 ENERGEST_ON(ENERGEST_TYPE_LISTEN);
469 return RF_CORE_CMD_OK;
473 if(
rf_core_send_cmd(CMDR_DIR_CMD(CMD_ABORT), &cmd_status) != RF_CORE_CMD_OK) {
474 PRINTF(
"rx_off_prop: CMD_ABORT status=0x%08lx\n", cmd_status);
480 if(smartrf_settings_cmd_prop_rx_adv.status == PROP_DONE_STOPPED ||
481 smartrf_settings_cmd_prop_rx_adv.status == PROP_DONE_ABORT) {
483 ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
484 ret = RF_CORE_CMD_OK;
486 PRINTF(
"rx_off_prop: status=0x%04x\n",
487 smartrf_settings_cmd_prop_rx_adv.status);
488 ret = RF_CORE_CMD_ERROR;
502 return LPM_MODE_SLEEP;
505 return LPM_MODE_MAX_SUPPORTED;
514 rfc_radioOp_t *cmd = (rfc_radioOp_t *)&smartrf_settings_cmd_fs;
518 PRINTF(
"prop_fs: CMD_FS, CMDSTA=0x%08lx, status=0x%04x\n",
519 cmd_status, cmd->status);
520 return RF_CORE_CMD_ERROR;
525 PRINTF(
"prop_fs: CMD_FS wait, CMDSTA=0x%08lx, status=0x%04x\n",
526 cmd_status, cmd->status);
527 return RF_CORE_CMD_ERROR;
530 return RF_CORE_CMD_OK;
544 if(
rf_core_send_cmd(CMDR_DIR_CMD(CMD_ABORT), &cmd_status) != RF_CORE_CMD_OK) {
545 PRINTF(
"soft_off_prop: CMD_ABORT status=0x%08lx\n", cmd_status);
549 while((cmd->status & RF_CORE_RADIO_OP_MASKED_STATUS) ==
550 RF_CORE_RADIO_OP_MASKED_STATUS_RUNNING);
556 if(prop_div_radio_setup() != RF_CORE_CMD_OK) {
557 PRINTF(
"soft_on_prop: prop_div_radio_setup() failed\n");
558 return RF_CORE_CMD_ERROR;
561 if(prop_fs() != RF_CORE_CMD_OK) {
562 PRINTF(
"soft_on_prop: prop_fs() failed\n");
563 return RF_CORE_CMD_ERROR;
577 rfc_dataEntry_t *entry;
581 if(ti_lib_chipinfo_chip_family_is_cc13xx() ==
false) {
582 return RF_CORE_CMD_ERROR;
588 memset(rx_buf_0, 0, RX_BUF_SIZE);
589 memset(rx_buf_1, 0, RX_BUF_SIZE);
591 entry = (rfc_dataEntry_t *)rx_buf_0;
592 entry->status = DATA_ENTRY_STATUS_PENDING;
593 entry->config.type = DATA_ENTRY_TYPE_GEN;
594 entry->config.lenSz = DATA_ENTRY_LENSZ_WORD;
595 entry->length = RX_BUF_SIZE - 8;
596 entry->pNextEntry = rx_buf_1;
598 entry = (rfc_dataEntry_t *)rx_buf_1;
599 entry->status = DATA_ENTRY_STATUS_PENDING;
600 entry->config.type = DATA_ENTRY_TYPE_GEN;
601 entry->config.lenSz = DATA_ENTRY_LENSZ_WORD;
602 entry->length = RX_BUF_SIZE - 8;
603 entry->pNextEntry = rx_buf_0;
606 rx_data_queue.pCurrEntry = rx_buf_0;
607 rx_data_queue.pLastEntry =
NULL;
610 rx_read_entry = rx_buf_0;
612 smartrf_settings_cmd_prop_rx_adv.pQueue = &rx_data_queue;
613 smartrf_settings_cmd_prop_rx_adv.pOutput = (uint8_t *)&rx_stats;
615 set_channel(RF_CORE_CHANNEL);
617 if(on() != RF_CORE_CMD_OK) {
618 PRINTF(
"init: on() failed\n");
619 return RF_CORE_CMD_ERROR;
622 ENERGEST_ON(ENERGEST_TYPE_LISTEN);
632 prepare(
const void *payload,
unsigned short payload_len)
634 int len = MIN(payload_len, TX_BUF_PAYLOAD_LEN);
636 memcpy(&tx_buf[TX_BUF_HDR_LEN], payload, len);
637 return RF_CORE_CMD_OK;
641 transmit(
unsigned short transmit_len)
646 volatile rfc_CMD_PROP_TX_ADV_t *cmd_tx_adv;
649 uint16_t total_length;
653 if(on() != RF_CORE_CMD_OK) {
654 PRINTF(
"transmit: on() failed\n");
667 total_length = transmit_len + CRC_LEN;
669 tx_buf[0] = total_length & 0xFF;
670 tx_buf[1] = (total_length >> 8) + DOT_4G_PHR_DW_BIT + DOT_4G_PHR_CRC_BIT;
673 cmd_tx_adv = (rfc_CMD_PROP_TX_ADV_t *)&smartrf_settings_cmd_prop_tx_adv;
679 cmd_tx_adv->pktLen = transmit_len + DOT_4G_PHR_LEN;
680 cmd_tx_adv->pPkt = tx_buf;
692 ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
693 ENERGEST_ON(ENERGEST_TYPE_TRANSMIT);
698 while((cmd_tx_adv->status & RF_CORE_RADIO_OP_MASKED_STATUS)
699 == RF_CORE_RADIO_OP_MASKED_STATUS_RUNNING) {
703 if(cmd_tx_adv->status == RF_CORE_RADIO_OP_STATUS_PROP_DONE_OK) {
709 PRINTF(
"transmit: Not Sent OK status=0x%04x\n",
715 PRINTF(
"transmit: PROP_TX_ERR ret=%d, CMDSTA=0x%08lx, status=0x%04x\n",
716 ret, cmd_status, cmd_tx_adv->status);
724 ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT);
725 ENERGEST_ON(ENERGEST_TYPE_LISTEN);
734 cmd_tx_adv->status = RF_CORE_RADIO_OP_STATUS_IDLE;
746 send(
const void *payload,
unsigned short payload_len)
748 prepare(payload, payload_len);
749 return transmit(payload_len);
753 read_frame(
void *buf,
unsigned short buf_len)
755 rfc_dataEntryGeneral_t *entry = (rfc_dataEntryGeneral_t *)rx_read_entry;
756 uint8_t *data_ptr = &entry->data;
759 if(entry->status == DATA_ENTRY_STATUS_FINISHED) {
766 len = (*(uint16_t *)data_ptr);
772 memcpy(buf, data_ptr, len);
775 packetbuf_set_attr(PACKETBUF_ATTR_RSSI, (int8_t)data_ptr[len]);
777 #if PROP_MODE_SNIFFER
788 for(i = 0; i < len; ++i) {
801 rx_read_entry = entry->pNextEntry;
802 entry->status = DATA_ENTRY_STATUS_PENDING;
813 int8_t rssi = RF_CMD_CCA_REQ_RSSI_UNKNOWN;
825 if(on() != RF_CORE_CMD_OK) {
826 PRINTF(
"channel_clear: on() failed\n");
834 PRINTF(
"channel_clear: called while in TX\n");
839 while(rssi == RF_CMD_CCA_REQ_RSSI_UNKNOWN || rssi == 0) {
845 rssi = (cmd_status >> 16) & 0xFF;
852 if(rssi >= rssi_threshold) {
860 receiving_packet(
void)
866 if(channel_clear() == RF_CCA_CLEAR) {
877 volatile rfc_dataEntry_t *entry = (rfc_dataEntry_t *)rx_data_queue.pCurrEntry;
881 if(entry->status == DATA_ENTRY_STATUS_FINISHED) {
886 entry = (rfc_dataEntry_t *)entry->pNextEntry;
887 }
while(entry != (rfc_dataEntry_t *)rx_data_queue.pCurrEntry);
901 return RF_CORE_CMD_OK;
912 smartrf_settings_cmd_prop_rx_adv.status);
913 return RF_CORE_CMD_OK;
918 PRINTF(
"on: rf_core_power_up() failed\n");
922 return RF_CORE_CMD_ERROR;
925 rf_patch_cpe_genfsk();
928 PRINTF(
"on: rf_core_start_rat() failed\n");
932 return RF_CORE_CMD_ERROR;
945 if(prop_div_radio_setup() != RF_CORE_CMD_OK) {
946 PRINTF(
"on: prop_div_radio_setup() failed\n");
947 return RF_CORE_CMD_ERROR;
950 if(prop_fs() != RF_CORE_CMD_OK) {
951 PRINTF(
"on: prop_fs() failed\n");
952 return RF_CORE_CMD_ERROR;
961 rfc_dataEntry_t *entry;
968 return RF_CORE_CMD_OK;
974 ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
980 smartrf_settings_cmd_prop_rx_adv.status = RF_CORE_RADIO_OP_STATUS_IDLE;
982 entry = (rfc_dataEntry_t *)rx_buf_0;
983 entry->status = DATA_ENTRY_STATUS_PENDING;
985 entry = (rfc_dataEntry_t *)rx_buf_1;
986 entry->status = DATA_ENTRY_STATUS_PENDING;
988 return RF_CORE_CMD_OK;
991 static radio_result_t
995 return RADIO_RESULT_INVALID_VALUE;
999 case RADIO_PARAM_POWER_MODE:
1001 *value =
rf_is_on() ? RADIO_POWER_MODE_ON : RADIO_POWER_MODE_OFF;
1002 return RADIO_RESULT_OK;
1003 case RADIO_PARAM_CHANNEL:
1005 return RADIO_RESULT_OK;
1006 case RADIO_PARAM_TXPOWER:
1007 *value = get_tx_power();
1008 return RADIO_RESULT_OK;
1009 case RADIO_PARAM_CCA_THRESHOLD:
1010 *value = rssi_threshold;
1011 return RADIO_RESULT_OK;
1012 case RADIO_PARAM_RSSI:
1013 *value = get_rssi();
1015 if(*value == RF_CMD_CCA_REQ_RSSI_UNKNOWN) {
1016 return RADIO_RESULT_ERROR;
1018 return RADIO_RESULT_OK;
1020 case RADIO_CONST_CHANNEL_MIN:
1022 return RADIO_RESULT_OK;
1023 case RADIO_CONST_CHANNEL_MAX:
1024 *value = DOT_15_4G_CHANNEL_MAX;
1025 return RADIO_RESULT_OK;
1026 case RADIO_CONST_TXPOWER_MIN:
1027 *value = OUTPUT_POWER_MIN;
1028 return RADIO_RESULT_OK;
1029 case RADIO_CONST_TXPOWER_MAX:
1030 *value = OUTPUT_POWER_MAX;
1031 return RADIO_RESULT_OK;
1033 return RADIO_RESULT_NOT_SUPPORTED;
1037 static radio_result_t
1040 uint8_t was_off = 0;
1041 radio_result_t rv = RADIO_RESULT_OK;
1044 case RADIO_PARAM_POWER_MODE:
1045 if(value == RADIO_POWER_MODE_ON) {
1046 if(on() != RF_CORE_CMD_OK) {
1047 PRINTF(
"set_value: on() failed (1)\n");
1048 return RADIO_RESULT_ERROR;
1050 return RADIO_RESULT_OK;
1052 if(value == RADIO_POWER_MODE_OFF) {
1054 return RADIO_RESULT_OK;
1056 return RADIO_RESULT_INVALID_VALUE;
1057 case RADIO_PARAM_CHANNEL:
1059 value > DOT_15_4G_CHANNEL_MAX) {
1060 return RADIO_RESULT_INVALID_VALUE;
1063 if(get_channel() == (uint8_t)value) {
1066 return RADIO_RESULT_OK;
1069 set_channel((uint8_t)value);
1071 case RADIO_PARAM_TXPOWER:
1072 if(value < OUTPUT_POWER_MIN || value > OUTPUT_POWER_MAX) {
1073 return RADIO_RESULT_INVALID_VALUE;
1078 set_tx_power(value);
1080 if(soft_on_prop() != RF_CORE_CMD_OK) {
1081 PRINTF(
"set_value: soft_on_prop() failed\n");
1082 rv = RADIO_RESULT_ERROR;
1085 return RADIO_RESULT_OK;
1086 case RADIO_PARAM_CCA_THRESHOLD:
1087 rssi_threshold = (int8_t)value;
1090 return RADIO_RESULT_NOT_SUPPORTED;
1096 if(on() != RF_CORE_CMD_OK) {
1097 PRINTF(
"set_value: on() failed (2)\n");
1098 return RADIO_RESULT_ERROR;
1102 if(rx_off_prop() != RF_CORE_CMD_OK) {
1103 PRINTF(
"set_value: rx_off_prop() failed\n");
1104 rv = RADIO_RESULT_ERROR;
1107 if(rx_on_prop() != RF_CORE_CMD_OK) {
1108 PRINTF(
"set_value: rx_on_prop() failed\n");
1109 rv = RADIO_RESULT_ERROR;
1120 static radio_result_t
1121 get_object(radio_param_t param,
void *dest,
size_t size)
1123 return RADIO_RESULT_NOT_SUPPORTED;
1126 static radio_result_t
1127 set_object(radio_param_t param,
const void *src,
size_t size)
1129 return RADIO_RESULT_NOT_SUPPORTED;
void process_poll(struct process *p)
Request a process to be polled.
Header file for the real-time timer module.
void rf_core_power_down()
Disable RFCORE clock domain in the MCU VD and turn off the RFCORE PD.
Header file for the radio API
Header file with macros which rename TI CC26xxware functions.
uint8_t cc26xx_uart_busy(void)
Returns the UART busy status.
#define RTIMER_NOW()
Get the current clock time.
void lpm_sleep(void)
Enter sleep mode.
int(* channel_clear)(void)
Perform a Clear-Channel Assessment (CCA) to find out if there is a packet in the air or not...
Default definitions of C compiler quirk work-arounds.
Header file for the CC13xx/CC26xx BLE driver.
int(* prepare)(const void *payload, unsigned short payload_len)
Prepare the radio with a packet to be sent.
void cc26xx_uart_write_byte(uint8_t c)
Sends a single character down the UART.
int(* receiving_packet)(void)
Check if the radio driver is currently receiving a packet.
uint8_t rf_ble_is_active()
Check whether the BLE beacond is currently active.
void oscillators_switch_to_hf_xosc(void)
Performs the switch to the XOSC.
Header file for the energy estimation mechanism
The structure of a device driver for a radio in Contiki.
void lpm_register_module(lpm_registered_module_t *module)
Register a module for LPM notifications.
Header file with descriptors for the various modes of operation defined in IEEE 802.15.4g.
int(* pending_packet)(void)
Check if the radio driver has just received a packet.
Header file for the Rime buffer (packetbuf) management
#define LPM_MODULE(n, m, s, w, l)
Declare a variable to be used in order to get notifications from LPM.
radio_result_t(* set_value)(radio_param_t param, radio_value_t value)
Set a radio parameter value.
void rf_core_setup_interrupts()
Setup RF core interrupts.
Header file for the CC13xx/CC26xx RF core driver.
Header file for the Rime address representation
int(* off)(void)
Turn the radio off.
uint8_t rf_core_is_accessible()
Check whether the RF core is accessible.
#define NULL
The null pointer.
void oscillators_switch_to_hf_rc(void)
Switches MF and HF clock source to be the HF RC OSC.
int radio_value_t
Each radio has a set of parameters that designate the current configuration and state of the radio...
uint8_t rf_core_set_modesel()
Initialise RF APIs in the RF core.
static uint8_t transmitting(void)
Check the RF's TX status.
void rf_core_cmd_done_en(bool fg)
Enable interrupt on command done.
void watchdog_periodic(void)
Writes the WDT clear sequence.
radio_result_t(* get_object)(radio_param_t param, void *dest, size_t size)
Get a radio parameter object.
int rf_core_power_up()
Turn on power to the RFC and boot it.
int(* on)(void)
Turn the radio on.
void rf_core_primary_mode_register(const rf_core_primary_mode_t *mode)
Register a primary mode for radio operation.
static uint8_t rf_is_on(void)
Checks whether the RFC domain is accessible and the RFC is in IEEE RX.
uint_fast8_t rf_core_send_cmd(uint32_t cmd, uint32_t *status)
Sends a command to the RF core.
void process_start(struct process *p, process_data_t data)
Start a process.
radio_result_t(* get_value)(radio_param_t param, radio_value_t *value)
Get a radio parameter value.
int(* send)(const void *payload, unsigned short payload_len)
Prepare & transmit a packet.
rfc_radioOp_t * rf_core_get_last_radio_op()
Returns a pointer to the most recent proto-dependent Radio Op.
Header file for Rime statistics
Header file for the CC13xx/CC26xx UART driver.
uint8_t rf_core_start_rat()
Start the CM0 RAT.
Header file for the CC13xx/CC26xx oscillator control.
void oscillators_request_hf_xosc(void)
Requests the HF XOSC as the source for the HF clock, but does not perform the actual switch...
int(* transmit)(unsigned short transmit_len)
Send the packet that has previously been prepared.
void rf_core_cmd_done_dis()
Disable the LAST_CMD_DONE and LAST_FG_CMD_DONE interrupts.
Include file for the Contiki low-layer network stack (NETSTACK)
radio_result_t(* set_object)(radio_param_t param, const void *src, size_t size)
Set a radio parameter object.
A data strcuture representing the radio's primary mode of operation.
uint_fast8_t rf_core_wait_cmd_done(void *cmd)
Block and wait for a Radio op to complete.